mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			313 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Coq
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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.
 |