Update
This commit is contained in:
parent
f5c5c7928e
commit
7c41d5c354
|
@ -23,13 +23,13 @@ Definition subsequence3 (l s : list Type) :=
|
|||
exists f, s = fst (partition f l).
|
||||
*)
|
||||
|
||||
Theorem subsequence_nil_r : forall (l : list Type), subsequence l nil.
|
||||
Theorem subsequence_nil_r {X: Type}: forall (l : list X), subsequence l nil.
|
||||
Proof.
|
||||
intro l. exists l. exists nil. rewrite app_nil_r. split; easy.
|
||||
Qed.
|
||||
|
||||
|
||||
Theorem subsequence_nil_cons_r : forall (l: list Type) (a:Type),
|
||||
Theorem subsequence_nil_cons_r {X: Type}: forall (l: list X) (a:X),
|
||||
~ subsequence nil (a::l).
|
||||
Proof.
|
||||
intros l a. unfold not. intro H.
|
||||
|
@ -41,7 +41,7 @@ Proof.
|
|||
Qed.
|
||||
|
||||
|
||||
Theorem subsequence2_nil_r : forall (l : list Type), subsequence2 l nil.
|
||||
Theorem subsequence2_nil_r {X: Type} : forall (l : list X), subsequence2 l nil.
|
||||
Proof.
|
||||
intro l.
|
||||
exists (repeat false (length l)). rewrite repeat_length.
|
||||
|
@ -50,7 +50,7 @@ Proof.
|
|||
Qed.
|
||||
|
||||
|
||||
Theorem subsequence2_nil_cons_r : forall (l: list Type) (a:Type),
|
||||
Theorem subsequence2_nil_cons_r {X: Type}: forall (l: list X) (a:X),
|
||||
~ subsequence2 nil (a::l).
|
||||
Proof.
|
||||
intros l a. unfold not. intro H. destruct H.
|
||||
|
@ -60,7 +60,7 @@ Proof.
|
|||
Qed.
|
||||
|
||||
|
||||
Theorem subsequence_cons_l : forall (l s: list Type) (a: Type),
|
||||
Theorem subsequence_cons_l {X: Type}: forall (l s: list X) (a: X),
|
||||
subsequence l s -> subsequence (a::l) s.
|
||||
Proof.
|
||||
intros l s a. intro H.
|
||||
|
@ -70,7 +70,7 @@ Proof.
|
|||
Qed.
|
||||
|
||||
|
||||
Theorem subsequence2_cons_l : forall (l s: list Type) (a: Type),
|
||||
Theorem subsequence2_cons_l {X: Type} : forall (l s: list X) (a: X),
|
||||
subsequence2 l s -> subsequence2 (a::l) s.
|
||||
Proof.
|
||||
intros l s a. intro H.
|
||||
|
@ -80,7 +80,7 @@ Proof.
|
|||
Qed.
|
||||
|
||||
|
||||
Theorem subsequence_cons_r : forall (l s: list Type) (a: Type),
|
||||
Theorem subsequence_cons_r {X: Type} : forall (l s: list X) (a: X),
|
||||
subsequence l (a::s) -> subsequence l s.
|
||||
Proof.
|
||||
intros l s a. intro H. destruct H. destruct H. destruct H.
|
||||
|
@ -90,7 +90,7 @@ Proof.
|
|||
Qed.
|
||||
|
||||
|
||||
Theorem subsequence2_cons_r : forall (l s: list Type) (a: Type),
|
||||
Theorem subsequence2_cons_r {X: Type} : forall (l s: list X) (a: X),
|
||||
subsequence2 l (a::s) -> subsequence2 l s.
|
||||
Proof.
|
||||
intro l. induction l. intros. apply subsequence2_nil_cons_r in H.
|
||||
|
@ -104,7 +104,7 @@ Proof.
|
|||
Qed.
|
||||
|
||||
|
||||
Theorem subsequence_cons_eq : forall (l1 l2: list Type) (a: Type),
|
||||
Theorem subsequence_cons_eq {X: Type} : forall (l1 l2: list X) (a: X),
|
||||
subsequence (a::l1) (a::l2) <-> subsequence l1 l2.
|
||||
Proof.
|
||||
intros l s a. split. intro H.
|
||||
|
@ -115,7 +115,7 @@ Proof.
|
|||
inversion H. rewrite H3. split; reflexivity.
|
||||
destruct x0. simpl in H0.
|
||||
apply PeanoNat.Nat.neq_succ_0 in H. contradiction H.
|
||||
exists (x ++ (a::l0)). exists x0. inversion H. rewrite H2. split. reflexivity.
|
||||
exists (x1 ++ (a::l0)). exists x0. inversion H. rewrite H2. split. reflexivity.
|
||||
inversion H0. rewrite <- app_assoc. apply app_inv_head_iff.
|
||||
rewrite app_comm_cons. reflexivity.
|
||||
|
||||
|
@ -125,7 +125,7 @@ Proof.
|
|||
Qed.
|
||||
|
||||
|
||||
Theorem subsequence2_cons_eq : forall (l1 l2: list Type) (a: Type),
|
||||
Theorem subsequence2_cons_eq {X: Type}: forall (l1 l2: list X) (a: X),
|
||||
subsequence2 (a::l1) (a::l2) <-> subsequence2 l1 l2.
|
||||
Proof.
|
||||
intros l s a. split. intro H. unfold subsequence2 in H.
|
||||
|
@ -167,9 +167,9 @@ Qed.
|
|||
*)
|
||||
|
||||
|
||||
Theorem subsequence2_dec :
|
||||
(forall x y : Type, {x = y} + {x <> y})
|
||||
-> forall (l s : list Type), { subsequence2 l s } + { ~ subsequence2 l s }.
|
||||
Theorem subsequence2_dec {X: Type}:
|
||||
(forall x y : X, {x = y} + {x <> y})
|
||||
-> forall (l s : list X), { subsequence2 l s } + { ~ subsequence2 l s }.
|
||||
Proof.
|
||||
intro H.
|
||||
intros l. induction l. intro s. destruct s. left. apply subsequence2_nil_r.
|
||||
|
@ -182,25 +182,25 @@ Proof.
|
|||
apply subsequence2_cons_r in s0. left. assumption.
|
||||
|
||||
destruct s. left. apply subsequence2_nil_r.
|
||||
assert ({T=a}+{T<>a}). apply H. destruct H0. rewrite e.
|
||||
assert ({x=a}+{x<>a}). apply H. destruct H0. rewrite e.
|
||||
destruct IHl with (s := s).
|
||||
left. rewrite subsequence2_cons_eq. assumption.
|
||||
right. rewrite subsequence2_cons_eq. assumption.
|
||||
|
||||
right. unfold not in n. unfold not. intro I.
|
||||
destruct I. destruct H0. destruct x.
|
||||
destruct I. destruct H0. destruct x0.
|
||||
symmetry in H1. apply nil_cons in H1. contradiction H1.
|
||||
destruct b.
|
||||
inversion H1. rewrite H3 in n0. contradiction n0. reflexivity.
|
||||
|
||||
assert (subsequence2 l (T::s)). exists x. split.
|
||||
assert (subsequence2 l (x::s)). exists x0. split.
|
||||
inversion H0. reflexivity. assumption. apply n in H2. contradiction H2.
|
||||
Qed.
|
||||
|
||||
|
||||
Theorem subsequence_eq_def :
|
||||
(forall x y : Type, {x = y} + {x <> y})
|
||||
-> (forall l s : list Type, subsequence l s <-> subsequence2 l s).
|
||||
Theorem subsequence_eq_def {X: Type} :
|
||||
(forall (x y : X), {x = y} + {x <> y})
|
||||
-> (forall l s : list X, subsequence l s <-> subsequence2 l s).
|
||||
Proof.
|
||||
intro I. intro l. induction l.
|
||||
(* first part of the induction *)
|
||||
|
@ -218,7 +218,7 @@ Proof.
|
|||
symmetry in H2. apply nil_cons in H2. contradiction H2.
|
||||
exists nil. exists nil. destruct s. simpl. easy.
|
||||
destruct H. destruct H.
|
||||
assert (x = nil). destruct x. reflexivity. simpl in H.
|
||||
assert (x0 = nil). destruct x0. reflexivity. simpl in H.
|
||||
apply PeanoNat.Nat.neq_succ_0 in H. contradiction H.
|
||||
rewrite H1 in H0. simpl in H0.
|
||||
symmetry in H0. apply nil_cons in H0. contradiction H0.
|
||||
|
@ -227,38 +227,38 @@ Proof.
|
|||
exists (repeat false (S (length l))). rewrite repeat_length.
|
||||
split. easy. simpl.
|
||||
assert (forall u,
|
||||
(nil: list Type)
|
||||
(nil: list X)
|
||||
= map snd (filter fst (combine (repeat false (length u)) u))).
|
||||
intro u. induction u. reflexivity. simpl. assumption. apply H0.
|
||||
exists (a::l). exists (nil). simpl. split; try rewrite app_nil_r; reflexivity.
|
||||
(* deux cas : a = n ou non *)
|
||||
assert ({a=T} + {a<>T}). apply I. destruct H.
|
||||
assert ({a=x} + {a<>x}). apply I. destruct H.
|
||||
rewrite e. rewrite subsequence2_cons_eq. rewrite <- IHl.
|
||||
rewrite subsequence_cons_eq. split; intro; assumption.
|
||||
|
||||
split; intro H. apply subsequence2_cons_l. apply IHl.
|
||||
destruct H. destruct H. destruct H.
|
||||
destruct x. destruct x0.
|
||||
destruct x0. destruct x1.
|
||||
apply PeanoNat.Nat.neq_succ_0 in H. contradiction H.
|
||||
simpl in H0. inversion H0. rewrite H2 in n. contradiction n.
|
||||
reflexivity. inversion H0.
|
||||
exists x. exists x0. split. assumption.
|
||||
exists x2. exists x1. split. assumption.
|
||||
reflexivity.
|
||||
|
||||
apply subsequence_cons_l. apply IHl.
|
||||
destruct H. destruct H.
|
||||
destruct x. simpl in H0.
|
||||
destruct x0. simpl in H0.
|
||||
symmetry in H0. apply nil_cons in H0. contradiction H0.
|
||||
destruct b. simpl in H0. inversion H0. rewrite H2 in n.
|
||||
contradiction n. reflexivity.
|
||||
exists x. inversion H. inversion H0.
|
||||
exists x0. inversion H. inversion H0.
|
||||
split; reflexivity.
|
||||
Qed.
|
||||
|
||||
|
||||
Theorem subsequence_dec :
|
||||
(forall x y : Type, {x = y} + {x <> y})
|
||||
-> forall (l s : list Type), { subsequence l s } + { ~ subsequence l s }.
|
||||
Theorem subsequence_dec {X: Type}:
|
||||
(forall x y : X, {x = y} + {x <> y})
|
||||
-> forall (l s : list X), { subsequence l s } + { ~ subsequence l s }.
|
||||
Proof.
|
||||
intro H. intros l s.
|
||||
assert ({ subsequence2 l s } + { ~ subsequence2 l s }).
|
||||
|
@ -285,3 +285,7 @@ Proof.
|
|||
exists [1].
|
||||
exists [[3];[5]]. simpl. easy.
|
||||
Qed.
|
||||
|
||||
Example test3: subsequence [1;2;3;4;5] [1;3;5].
|
||||
Proof.
|
||||
rewrite subsequence_eq_def.
|
||||
|
|
Loading…
Reference in New Issue