This commit is contained in:
Thomas Baruchel 2023-11-22 15:15:29 +01:00
parent 528cb76db3
commit dedf79490b

View File

@ -332,6 +332,14 @@ Qed.
(** * Various general properties (** * Various general properties
*) *)
Theorem subsequence_id {X: Type} :
forall u : list X, subsequence u u.
Proof.
intro u. apply subsequence_eq_def_3.
induction u. easy. exists nil. exists u.
split; easy.
Qed.
Theorem subsequence_app {X: Type} : Theorem subsequence_app {X: Type} :
forall l1 s1 l2 s2 : list X, forall l1 s1 l2 s2 : list X,
subsequence l1 s1 -> subsequence l2 s2 -> subsequence (l1++l2) (s1++s2). subsequence l1 s1 -> subsequence l2 s2 -> subsequence (l1++l2) (s1++s2).
@ -442,7 +450,7 @@ Proof.
Qed. Qed.
Theorem subsequence_id {X: Type} : Theorem subsequence_eq {X: Type} :
forall (u v: list X), forall (u v: list X),
subsequence u v -> subsequence v u -> u = v. subsequence u v -> subsequence v u -> u = v.
Proof. Proof.
@ -499,6 +507,39 @@ Proof.
contradiction H5. assumption. contradiction H5. assumption.
Qed. Qed.
Theorem subsequence_reverse {X: Type} :
forall (u v: list X), subsequence u v -> subsequence (rev u) (rev v).
Proof.
intros u v. intro H.
apply subsequence_eq_def_3. apply subsequence_eq_def_2.
apply subsequence_eq_def_1 in H. destruct H. destruct H.
exists (rev x). split. rewrite rev_length. rewrite rev_length.
assumption. rewrite H0.
assert (LEMMA : forall (l1: list bool) (l2: list X),
length l1 = length l2
-> combine (rev l1) (rev l2) = rev (combine l1 l2)).
intro l1. induction l1; intro l2; intro I. reflexivity.
destruct l2. inversion I. inversion I. apply IHl1 in H2.
simpl.
assert (LEMMA2 : forall (u w : list bool) (v x : list X),
length u = length v
-> combine (u ++ w) (v ++ x) = (combine u v) ++ (combine w x)).
intro u0. induction u0; intros w v0 x1; intro J.
symmetry in J. apply length_zero_iff_nil in J. rewrite J.
reflexivity. destruct v0. inversion J. inversion J.
apply IHu0 with (w := w) (x := x1) in H3. simpl. rewrite H3.
reflexivity. rewrite LEMMA2. rewrite IHl1. reflexivity.
inversion I. reflexivity. rewrite rev_length. rewrite rev_length.
inversion I. reflexivity. rewrite LEMMA. rewrite <- map_rev.
assert (LEMMA3: forall v (w: list (bool * X)),
rev (filter v w) = filter v (rev w)).
intros v0 w. induction w. reflexivity. simpl. rewrite filter_app.
simpl. destruct (v0 a). simpl. rewrite IHw. reflexivity.
rewrite IHw. symmetry. apply app_nil_r. rewrite LEMMA3.
reflexivity. assumption.
Qed.
@ -526,3 +567,107 @@ Proof.
exists [true; false; true; false; true]. exists [true; false; true; false; true].
split; reflexivity. split; reflexivity.
Qed. Qed.
Fixpoint smerge {X: Type} (l s1 s2 : list X) : Prop :=
match l with
| nil => s1 = nil /\ s2 = nil
| hd::tl => match s1, s2 with
| nil, nil => False
| nil, _ => hd::tl = s2
| _, nil => hd::tl = s1
| hd1::tl1, hd2::tl2 =>
(hd1 = hd2 /\ hd = hd1 /\ smerge tl tl1 tl2)
\/ (hd1 <> hd2 /\ hd = hd1 /\ smerge tl tl1 s2)
\/ (hd1 <> hd2 /\ hd = hd2 /\ smerge tl s1 tl2)
end
end.
Theorem smerge_exchange {X: Type}:
forall (l s1 s2: list X), smerge l s1 s2 -> smerge l s2 s1.
Proof.
intro l. induction l; intros s1 s2; intro H.
destruct s1; destruct s2. split; reflexivity.
destruct H. symmetry in H0. apply nil_cons in H0. contradiction H0.
destruct H. symmetry in H. apply nil_cons in H. contradiction H.
destruct H. symmetry in H. apply nil_cons in H. contradiction H.
destruct s1; destruct s2. assumption.
rewrite H. reflexivity. rewrite H. reflexivity.
destruct H. destruct H. destruct H0.
rewrite H0. rewrite H. apply IHl in H1. simpl. left.
split. reflexivity. split. reflexivity. assumption.
destruct H. destruct H. destruct H0. rewrite H0.
apply IHl in H1. right. right.
split. symmetry. assumption. split. reflexivity. assumption.
destruct H. destruct H0. apply IHl in H1. rewrite H0.
right. left. split. symmetry. assumption.
split. reflexivity. assumption.
Qed.
Theorem smerge_subsequence {X: Type}:
(forall x y : X, {x = y} + {x <> y})
-> forall (l s1 s2: list X),
smerge l s1 s2 -> subsequence l s1.
Proof.
intro H. intro l. induction l; intros s1 s2; intro I.
destruct s1. apply subsequence_nil_r.
destruct I. symmetry in H0. apply nil_cons in H0. contradiction H0.
destruct s1; destruct s2.
apply subsequence_nil_r. apply subsequence_nil_r.
assert ({a = x} + {a <> x}). apply H. destruct H0. rewrite e in I.
rewrite e. simpl in I. rewrite I. apply subsequence_id.
simpl in I. inversion I. apply n in H1. contradiction H1.
assert ({a = x} + {a <> x}). apply H. destruct H0. rewrite e in I.
simpl in I. destruct I. destruct H0. destruct H1. apply IHl in H2.
rewrite e.
apply subsequence_eq_def_3. simpl. exists nil. exists l.
split. easy. apply subsequence_eq_def_2. apply subsequence_eq_def_1.
assumption.
destruct H0. destruct H0. destruct H1. apply IHl in H2.
rewrite e.
apply subsequence_eq_def_3. simpl. exists nil. exists l.
split. easy. apply subsequence_eq_def_2. apply subsequence_eq_def_1.
assumption. destruct H0. destruct H1. apply H0 in H1. contradiction H1.
destruct I. destruct H0. destruct H1. apply IHl in H2.
rewrite H1.
apply subsequence_eq_def_3. simpl. exists nil. exists l.
split. easy. apply subsequence_eq_def_2. apply subsequence_eq_def_1.
assumption. destruct H0. destruct H0. destruct H1.
apply n in H1. contradiction H1.
destruct H0. destruct H1. apply IHl in H2.
apply subsequence_cons_l. assumption.
Qed.
Theorem smerge_subsequence2 {X: Type}:
(forall x y : X, {x = y} + {x <> y})
-> forall (l s1 s2: list X), smerge l s1 s2 -> subsequence l s2.
Proof.
intros. apply smerge_exchange in H.
apply smerge_subsequence with (s2 := s1); assumption.
Qed.
Example test4: smerge [1; 2; 3; 2; 1] [1;2;1] [3;2].
Proof.
simpl. right. left. split. easy.
split. reflexivity. right. left.
split. easy. split. reflexivity.
right. right. split. easy. split. easy.
right. right. split; easy.
Qed.