diff options
| author | Joshua Peek <josh@joshpeek.com> | 2012-07-23 15:52:49 -0500 |
|---|---|---|
| committer | Joshua Peek <josh@joshpeek.com> | 2012-07-23 15:52:49 -0500 |
| commit | 7b6caa0f6c7603aabb5e6ed657e24aaddbeafc78 (patch) | |
| tree | ec0522eae75bb04ae73d28ae3f599682a2bfdaeb /samples/Coq/Rel.v | |
| parent | 314f0e485227915931db361be14d308a210bedea (diff) | |
Rename samples subdirectories
Diffstat (limited to 'samples/Coq/Rel.v')
| -rwxr-xr-x | samples/Coq/Rel.v | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/samples/Coq/Rel.v b/samples/Coq/Rel.v new file mode 100755 index 0000000..9449cbf --- /dev/null +++ b/samples/Coq/Rel.v @@ -0,0 +1,312 @@ +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. |
