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.
 |