Files
linguist/samples/Coq/Rel.v
2012-07-23 15:52:49 -05:00

313 lines
5.5 KiB
Coq
Executable File

Require Export Logic.
Import Playground1.
Definition relation (X:Type) := X -> X -> Prop.
Definition partial_function {X:Type} (R: relation X) :=
forall x y1 y2 : X, R x y1 -> R x y2 -> y1 = y2.
Theorem next_nat_partial_function :
partial_function next_nat.
Proof.
unfold partial_function.
intros x y1 y2 P Q.
inversion P.
inversion Q.
reflexivity.
Qed.
Theorem le_not_a_partial_function :
~ (partial_function le).
Proof.
unfold not.
unfold partial_function.
intros H.
assert (O = S O) as Nonsense.
Case "Proof of assertion.".
apply H with O.
apply le_n.
apply le_S.
apply le_n.
inversion Nonsense.
Qed.
Theorem total_relation_not_partial_function :
~ (partial_function total_relation).
Proof.
unfold not.
unfold partial_function.
intros H.
assert (O = S O) as Nonsense.
apply H with O.
apply total_relation1.
apply total_relation1.
inversion Nonsense.
Qed.
Theorem empty_relation_not_partial_funcion :
partial_function empty_relation.
Proof.
unfold partial_function.
intros x y1 y2.
intros H.
inversion H.
Qed.
Definition reflexive {X:Type} (R: relation X) :=
forall a : X, R a a.
Theorem le_reflexive :
reflexive le.
Proof.
unfold reflexive.
intros n. apply le_n.
Qed.
Definition transitive {X:Type} (R: relation X) :=
forall a b c : X, (R a b) -> (R b c) -> (R a c).
Theorem le_trans:
transitive le.
Proof.
intros n m o Hnm Hmo.
induction Hmo.
Case "le_n". apply Hnm.
Case "le_S". apply le_S. apply IHHmo.
Qed.
Theorem lt_trans:
transitive lt.
Proof.
unfold lt. unfold transitive.
intros n m o Hnm Hmo.
apply le_S in Hnm.
apply le_trans with (a := (S n)) (b := (S m)) (c := o).
apply Hnm.
apply Hmo.
Qed.
Theorem lt_trans' :
transitive lt.
Proof.
unfold lt. unfold transitive.
intros n m o Hnm Hmo.
induction Hmo as [| m' Hm'o].
apply le_S.
apply Hnm.
apply le_S.
apply IHHm'o.
Qed.
Theorem le_Sn_le: forall n m, S n <= m -> n <= m.
Proof.
intros n m H. apply le_trans with (S n).
apply le_S. apply le_n.
apply H. Qed.
Theorem le_S_n : forall n m,
(S n <= S m) -> (n <= m).
Proof.
intros n m H.
apply Sn_le_Sm__n_le_m.
apply H.
Qed.
Theorem le_Sn_n : forall n,
~ (S n <= n).
Proof.
induction n.
intros H.
inversion H.
unfold not in IHn.
intros H.
apply le_S_n in H.
apply IHn.
apply H.
Qed.
(*
TODO
Theorem lt_trans'' :
transitive lt.
Proof.
unfold lt. unfold transitive.
intros n m o Hnm Hmo.
induction o as [| o'].
*)
Definition symmetric {X: Type} (R: relation X) :=
forall a b : X, (R a b) -> (R b a).
Definition antisymmetric {X : Type} (R: relation X) :=
forall a b : X, (R a b) -> (R b a) -> a = b.
Theorem le_antisymmetric :
antisymmetric le.
Proof.
intros a b.
generalize dependent a.
induction b.
intros a.
intros H.
intros H1.
inversion H.
reflexivity.
intros a H1 H2.
destruct a.
inversion H2.
apply Sn_le_Sm__n_le_m in H1.
apply Sn_le_Sm__n_le_m in H2.
apply IHb in H1.
rewrite H1 in |- *.
reflexivity.
apply H2.
Qed.
(*
TODO
Theorem le_step : forall n m p,
n < m ->
n <= S p ->
n <= p.
Proof.
*)
Definition equivalence {X:Type} (R: relation X) :=
(reflexive R) /\ (symmetric R) /\ (transitive R).
Definition order {X:Type} (R: relation X) :=
(reflexive R) /\ (antisymmetric R) /\ (transitive R).
Definition preorder {X:Type} (R: relation X) :=
(reflexive R) /\ (transitive R).
Theorem le_order :
order le.
Proof.
unfold order. split.
Case "refl". apply le_reflexive.
split.
Case "antisym". apply le_antisymmetric.
Case "transitive". apply le_trans. Qed.
Inductive clos_refl_trans {A:Type} (R: relation A) : relation A :=
| rt_step : forall x y, R x y -> clos_refl_trans R x y
| rt_refl : forall x, clos_refl_trans R x x
| rt_trans : forall x y z,
clos_refl_trans R x y -> clos_refl_trans R y z -> clos_refl_trans R x z.
Theorem next_nat_closure_is_le : forall n m,
(n <= m) <-> ((clos_refl_trans next_nat) n m).
Proof.
intros n m.
split.
intro H.
induction H.
apply rt_refl.
apply rt_trans with m.
apply IHle.
apply rt_step.
apply nn.
intro H.
induction H.
inversion H.
apply le_S.
apply le_n.
apply le_n.
apply le_trans with y.
apply IHclos_refl_trans1.
apply IHclos_refl_trans2.
Qed.
Inductive refl_step_closure {X : Type} (R: relation X)
: X -> X -> Prop :=
| rsc_refl : forall (x : X), refl_step_closure R x x
| rsc_step : forall (x y z : X), R x y ->
refl_step_closure R y z ->
refl_step_closure R x z.
Tactic Notation "rt_cases" tactic(first) ident(c) :=
first;
[ Case_aux c "rt_step" | Case_aux c "rt_refl" | Case_aux c "rt_trans" ].
Tactic Notation "rsc_cases" tactic(first) ident(c) :=
first;
[ Case_aux c "rsc_refl" | Case_aux c "rsc_step" ].
Theorem rsc_R : forall (X:Type) (R:relation X) (x y:X),
R x y -> refl_step_closure R x y.
Proof.
intros X R x y r.
apply rsc_step with y.
apply r.
apply rsc_refl.
Qed.
Theorem rsc_trans :
forall (X : Type) (R : relation X) (x y z : X),
refl_step_closure R x y ->
refl_step_closure R y z ->
refl_step_closure R x z.
Proof.
intros X.
intros R x y z.
intros H.
induction H.
intros H1.
apply H1.
intros H1.
apply IHrefl_step_closure in H1.
apply rsc_step with y.
apply H.
apply H1.
Qed.
Theorem rtc_rsc_coincide:
forall (X:Type) (R: relation X) (x y : X),
clos_refl_trans R x y <-> refl_step_closure R x y.
Proof.
intros X R x y.
split.
intros H.
induction H.
apply rsc_step with y.
apply H.
apply rsc_refl.
apply rsc_refl.
apply rsc_trans with y.
apply IHclos_refl_trans1.
apply IHclos_refl_trans2.
intros H1.
induction H1.
apply rt_refl.
apply rt_trans with y.
apply rt_step.
apply H.
apply IHrefl_step_closure.
Qed.