-
Notifications
You must be signed in to change notification settings - Fork 0
/
Ci.v
104 lines (98 loc) · 1.92 KB
/
Ci.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
Require Import List.
Fixpoint SerialMerge (eat: list nat -> bool) branch input_commits :=
match input_commits with
| nil => branch
| h :: t =>
match eat (h :: branch) with
| false => SerialMerge eat branch t
| true => SerialMerge eat (h :: branch) t
end
end.
Lemma AllSerialMergeOk: forall (eat: list nat -> bool) (branch commits: list nat),
eat branch = true -> eat (SerialMerge eat branch commits) = true.
Proof. Admitted.
Lemma LengthNextLt: forall (a n: nat) (tl: list nat),
length (a :: tl) <= S n -> length tl <= n.
Proof.
intros.
destruct tl.
simpl. apply Le.le_0_n.
simpl.
assert (H4: length (a:: n0 :: tl) = S (S (length tl))).
simpl.
reflexivity.
rewrite H4 in H.
apply Le.le_S_n in H.
apply H.
Qed.
Lemma AllSerialMergeOk_size: forall (eat: list nat -> bool) (branch: list nat) (commits: list nat) (n:nat),
length commits <= n /\ eat branch = true -> eat (SerialMerge eat branch commits) = true.
Proof.
intros.
induction n.
assert (H3: commits = nil).
inversion H.
inversion H0.
destruct commits.
reflexivity.
inversion H3.
rewrite H3.
unfold SerialMerge.
inversion H.
apply H1.
inversion H.
clear H.
inversion H0.
Focus 2.
apply IHn.
apply conj.
apply H2.
apply H1.
Focus 1.
clear H0.
induction commits.
inversion H2.
clear IHn.
unfold SerialMerge.
destruct (eat (a::branch)).
Focus 2.
apply IHcommits.
Focus 2.
inversion H2.
simpl.
(* we arrive at False *)
Admitted.
(*(* now the overall reccursion *)
induction commits.
(* commit = nil *)
apply IHn.
destruct H.
split.
simpl.
apply Le.le_0_n.
apply H0.
(* commit = hd :: tail *)
inversion H.
apply LengthNextLt in H0.
unfold SerialMerge.
destruct (eat (a :: branch)).
Focus 2.
apply IHcommits.
apply conj.
apply le_S.
apply H0.
apply H1.
intros.
inversion H2.
apply IHcommits.
apply conj.
apply le_S.
apply H0.
apply H1.
(*assert (H5: eat (SerialMerge eat branch commits) = true).
apply IHcommits.
apply conj.
apply le_S.
apply H0.
apply H1.
intros.*) *)