This commit is contained in:
Thomas Baruchel 2023-11-01 22:51:16 +01:00
parent d1927fca71
commit 528cb76db3

View File

@ -427,6 +427,80 @@ Proof.
inversion I; inversion J; reflexivity.
rewrite H4; try rewrite H1; try rewrite H; reflexivity.
Qed.
Lemma subsequence_length {X: Type} :
forall (u v: list X), subsequence u v -> length v <= length u.
Proof.
intros u v. generalize u. induction v; intro u0; intro H. apply Nat.le_0_l.
apply subsequence_eq_def_1 in H. apply subsequence_eq_def_2 in H.
destruct H. destruct H. destruct H. apply subsequence_eq_def_3 in H0.
apply IHv in H0. simpl. apply Nat.le_succ_l. rewrite H.
rewrite app_length. apply Nat.lt_lt_add_l.
rewrite <- Nat.le_succ_l. simpl. rewrite <- Nat.succ_le_mono.
assumption.
Qed.
Theorem subsequence_id {X: Type} :
forall (u v: list X),
subsequence u v -> subsequence v u -> u = v.
Proof.
intro u. induction u; intro v; intros H I;
apply subsequence_eq_def_1 in H; apply subsequence_eq_def_1 in I.
destruct v. reflexivity.
apply subsequence2_nil_cons_r in H. contradiction H.
destruct v. apply subsequence2_nil_cons_r in I. contradiction I.
destruct H. destruct H. destruct I. destruct H1.
destruct x0. apply O_S in H. contradiction H.
destruct x1. apply O_S in H1. contradiction H1.
destruct b; destruct b0.
assert (subsequence2 u v). exists x0.
split; inversion H; inversion H0; reflexivity.
assert (subsequence2 v u). exists x1.
split; inversion H1; inversion H2; reflexivity.
apply subsequence_eq_def_2 in H3; apply subsequence_eq_def_3 in H3.
apply subsequence_eq_def_2 in H4; apply subsequence_eq_def_3 in H4.
apply IHu in H4. rewrite H4. inversion H0. reflexivity. assumption.
assert (subsequence2 u v). exists x0.
split; inversion H; inversion H0; reflexivity.
assert (subsequence2 v (a::u)). exists x1.
split; inversion H1; inversion H2; reflexivity.
assert (subsequence u (a::u)). apply subsequence_trans with (l2 := v);
apply subsequence_eq_def_3; apply subsequence_eq_def_2; assumption.
apply subsequence_length in H5. apply Nat.nle_succ_diag_l in H5.
contradiction H5.
assert (subsequence2 u (x::v)). exists x0.
split; inversion H; inversion H0; reflexivity.
assert (subsequence2 v u). exists x1.
split; inversion H1; inversion H2; reflexivity.
assert (subsequence v (x::v)). apply subsequence_trans with (l2 := u);
apply subsequence_eq_def_3; apply subsequence_eq_def_2; assumption.
apply subsequence_length in H5. apply Nat.nle_succ_diag_l in H5.
contradiction H5.
assert (subsequence2 u (x::v)). exists x0.
split; inversion H; inversion H0; reflexivity.
assert (subsequence2 v (a::u)). exists x1.
split; inversion H1; inversion H2; reflexivity.
apply subsequence2_cons_r in H3. apply subsequence2_cons_r in H4.
apply subsequence_eq_def_2 in H3. apply subsequence_eq_def_2 in H4.
apply subsequence_eq_def_3 in H3. apply subsequence_eq_def_3 in H4.
apply IHu in H4. rewrite H4 in H0. rewrite H4 in H.
simpl in H0. assert (subsequence2 v (x::v)). exists x0.
split. inversion H. reflexivity. assumption.
apply subsequence_eq_def_2 in H5. apply subsequence_eq_def_3 in H5.
apply subsequence_length in H5. apply Nat.nle_succ_diag_l in H5.
contradiction H5. assumption.
Qed.
(** * Tests