Skip to content

Commit bcec8f4

Browse files
author
wricciot
committed
Completes the refactoring.
1 parent 04ff1a5 commit bcec8f4

File tree

6 files changed

+1341
-1109
lines changed

6 files changed

+1341
-1109
lines changed

RelFacts.v

+250
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,254 @@ Module Facts (Db : DB) (Sql : SQL Db).
4343
destruct (Rel.T_eqb (g x) t) eqn:e; rewrite <- H in e; exact e.
4444
Qed.
4545

46+
Lemma memb_sum_tech {m} {n} (R : Rel.R m) (f : Rel.T m -> Rel.T n) l1 :
47+
NoDup l1 -> forall l2, incl l2 (Rel.supp R) -> NoDup l2 ->
48+
(forall t u, List.In t l1 -> List.In u (Rel.supp R) -> f u = t -> List.In u l2) ->
49+
(forall u, List.In u l2 -> List.In (f u) l1) ->
50+
list_sum (List.map (Rel.memb (Rel.sum R f)) l1) = list_sum (List.map (Rel.memb R) l2).
51+
Proof.
52+
elim l1.
53+
+ intros. replace l2 with (@List.nil (Rel.T m)). reflexivity.
54+
destruct l2; auto. contradiction (H3 t). left. reflexivity.
55+
+ intros t l1' IH Hl1' l2 Hsupp Hl2 H1 H2. simpl.
56+
replace (list_sum (List.map (Rel.memb R) l2)) with
57+
(list_sum (List.map (Rel.memb R) (filter (fun x => Rel.T_eqb (f x) t) l2)) +
58+
list_sum (List.map (Rel.memb R) (filter (fun x => negb (Rel.T_eqb (f x) t)) l2))).
59+
- f_equal.
60+
* rewrite Rel.p_sum. apply (list_sum_ext Nat.eq_dec).
61+
generalize (Rel.p_nodup _ R) l2 Hsupp Hl2 H1; clear l2 Hsupp Hl2 H1 H2; elim (Rel.supp R).
62+
++ simpl. intros _ l2 Hincl. replace l2 with (@List.nil (Rel.T m)). reflexivity.
63+
destruct l2; auto. contradiction (Hincl t0). left. reflexivity.
64+
++ intros x l3' IHin Hnodup l2 Hincl Hl2 H1 y. simpl. destruct (Rel.T_eqb (f x) t) eqn:Heq; simpl.
65+
-- destruct (Nat.eq_dec (Rel.memb R x) y); simpl.
66+
** assert (exists n, count_occ Nat.eq_dec
67+
(List.map (Rel.memb R) (filter (fun x0 : Rel.T m => Rel.T_eqb (f x0) t) l2)) y = S n).
68+
apply count_occ_In_Sn. rewrite <- e. apply in_map. apply filter_In. split; auto.
69+
eapply H1. left. reflexivity. left. reflexivity. apply Rel.T_eqb_eq. exact Heq.
70+
destruct H. rewrite (count_occ_rmone_r _ _ _ _ _ H). f_equal.
71+
transitivity (count_occ Nat.eq_dec (List.map (Rel.memb R)
72+
(filter (fun x1 => Rel.T_eqb (f x1) t) (rmone _ (Rel.T_dec _) x l2))) y).
73+
+++ apply IHin.
74+
--- inversion Hnodup. exact H4.
75+
--- eapply incl_rmone; assumption.
76+
--- apply nodup_rmone. exact Hl2.
77+
--- intros. apply in_rmone_neq.
78+
*** inversion Hnodup. intro. rewrite H8 in H6. contradiction H6.
79+
*** eapply H1. exact H0. right. exact H2. exact H3.
80+
+++ apply map_filter_tech. exact Heq. rewrite e. reflexivity.
81+
eapply H1. left. reflexivity. left. reflexivity. apply Rel.T_eqb_eq. exact Heq.
82+
** replace (count_occ Nat.eq_dec (List.map (Rel.memb R) (filter (fun x0 => Rel.T_eqb (f x0) t) l2)) y)
83+
with (count_occ Nat.eq_dec (List.map (Rel.memb R) (filter (fun x0 => Rel.T_eqb (f x0) t) (rmone _ (Rel.T_dec _) x l2))) y).
84+
apply IHin.
85+
+++ inversion Hnodup. exact H3.
86+
+++ eapply incl_rmone; assumption.
87+
+++ apply nodup_rmone. exact Hl2.
88+
+++ intros. apply in_rmone_neq.
89+
--- inversion Hnodup. intro. rewrite H7 in H5. contradiction H5.
90+
--- eapply H1. exact H. right. exact H0. exact H2.
91+
+++ apply count_occ_map_filter_rmone_tech. exact n0.
92+
-- replace (count_occ Nat.eq_dec (List.map (Rel.memb R) (filter (fun x0 => Rel.T_eqb (f x0) t) l2)) y)
93+
with (count_occ Nat.eq_dec (List.map (Rel.memb R) (filter (fun x0 => Rel.T_eqb (f x0) t) (rmone _ (Rel.T_dec _) x l2))) y). apply IHin.
94+
*** inversion Hnodup. exact H3.
95+
*** eapply incl_rmone; assumption.
96+
*** apply nodup_rmone. exact Hl2.
97+
*** intros. apply in_rmone_neq.
98+
+++ inversion Hnodup. intro. rewrite H7 in H5. contradiction H5.
99+
+++ eapply H1. exact H. right. exact H0. exact H2.
100+
*** rewrite filter_rmone_false. reflexivity. exact Heq.
101+
* apply IH.
102+
++ inversion Hl1'; assumption.
103+
++ intro x. intro Hx. apply Hsupp.
104+
destruct (proj1 (filter_In (fun x => negb (Rel.T_eqb (f x) t)) x l2) Hx). exact H.
105+
++ apply NoDup_filter. exact Hl2.
106+
++ intros. apply filter_In. split.
107+
-- eapply H1. right. exact H. exact H0. exact H3.
108+
-- apply Bool.negb_true_iff. destruct (Rel.T_dec _ (f u) t).
109+
** inversion Hl1'. rewrite <- e in H6. rewrite H3 in H6. contradiction H6.
110+
** destruct (Rel.T_eqb (f u) t) eqn:ed; auto. contradiction n0. apply Rel.T_eqb_eq. exact ed.
111+
++ intros. assert (List.In u l2 /\ negb (Rel.T_eqb (f u) t) = true).
112+
-- apply (proj1 (filter_In (fun x => negb (Rel.T_eqb (f x) t)) u l2) H).
113+
-- destruct H0. assert (f u <> t). intro.
114+
pose (H4' := proj2 (Rel.T_eqb_eq _ (f u) t) H4); clearbody H4'.
115+
rewrite H4' in H3. discriminate H3.
116+
pose (H2' := H2 _ H0); clearbody H2'. inversion H2'; auto. contradiction H4. symmetry. exact H5.
117+
- elim l2; auto.
118+
intros x l2' IHin. simpl. destruct (Rel.T_eqb (f x) t); simpl.
119+
* rewrite <- IHin. omega.
120+
* rewrite <- IHin. omega.
121+
Qed.
122+
123+
Lemma card_sum : forall m n (f : Rel.T m -> Rel.T n) S, Rel.card (Rel.sum S f) = Rel.card S.
124+
Proof.
125+
intros. unfold Rel.card. do 2 rewrite Rel.p_sum.
126+
rewrite filter_true. rewrite filter_true.
127+
+ apply memb_sum_tech.
128+
- apply Rel.p_nodup.
129+
- apply incl_refl.
130+
- apply Rel.p_nodup.
131+
- intros. exact H0.
132+
- intros. assert (Rel.memb (Rel.sum S f) (f u) > 0).
133+
* rewrite Rel.p_sum. rewrite (count_occ_list_sum Nat.eq_dec (Rel.memb S u)).
134+
++ apply lt_plus_trans. apply Rel.p_fs_r. exact H.
135+
++ apply count_occ_In. apply in_map. apply filter_In; split; auto.
136+
apply Rel.T_eqb_eq. reflexivity.
137+
* apply Rel.p_fs. exact H0.
138+
+ intros. apply Rel.T_eqb_eq. reflexivity.
139+
+ intros. apply Rel.T_eqb_eq. reflexivity.
140+
Qed.
141+
142+
Lemma Rel_times_Rone n (r : Rel.R n) : Rel.times r Rel.Rone ~= r.
143+
Proof.
144+
apply p_ext_dep. omega.
145+
intros t1 t2 et1t2.
146+
enough (forall t0, t1 = append t2 t0 -> Rel.memb (Rel.times r Rel.Rone) t1 = Rel.memb r t2).
147+
apply (H (Vector.nil _)). symmetry. apply JMeq_eq. apply (JMeq_trans (vector_append_nil_r _)).
148+
symmetry. exact et1t2.
149+
intros. rewrite H. rewrite (Rel.p_times _ _ _ _ _ _ _ eq_refl).
150+
eapply (case0 (fun x => Rel.memb r t2 * Rel.memb Rel.Rone x = Rel.memb r t2) _ t0). Unshelve. simpl. rewrite Rel.p_one. omega.
151+
Qed.
152+
153+
Lemma Rel_sum_sum n1 n2 n3 (r : Rel.R n1)
154+
(f : Rel.T n1 -> Rel.T n2) (g : Rel.T n2 -> Rel.T n3)
155+
: Rel.sum (Rel.sum r f) g = Rel.sum r (fun x => g (f x)).
156+
Proof.
157+
apply Rel.p_ext. intro.
158+
repeat rewrite Rel.p_sum. apply memb_sum_tech.
159+
+ apply NoDup_filter. apply Rel.p_nodup.
160+
+ unfold incl. intros. destruct (proj1 (filter_In _ _ _) H). exact H0.
161+
+ apply NoDup_filter. apply Rel.p_nodup.
162+
+ intros. apply filter_In. destruct (proj1 (filter_In _ _ _) H). split; intuition.
163+
rewrite H1. exact H3.
164+
+ intros. apply filter_In. destruct (proj1 (filter_In _ _ _) H). split; intuition.
165+
assert (Rel.memb (Rel.sum r f) (f u) > 0).
166+
* rewrite Rel.p_sum. rewrite (count_occ_list_sum Nat.eq_dec (Rel.memb r u)).
167+
++ apply lt_plus_trans. apply Rel.p_fs_r. exact H0.
168+
++ apply count_occ_In. apply in_map. apply filter_In; split; auto.
169+
apply Rel.T_eqb_eq. reflexivity.
170+
* apply Rel.p_fs. exact H2.
171+
Qed.
172+
173+
Lemma eq_sum_dep m1 m2 n1 n2 (e1 : m1 = m2) (e2 : n1 = n2) :
174+
forall (r1 : Rel.R m1) (r2 : Rel.R m2) (f : Rel.T m1 -> Rel.T n1) (g : Rel.T m2 -> Rel.T n2),
175+
r1 ~= r2 -> f ~= g -> Rel.sum r1 f ~= Rel.sum r2 g.
176+
Proof.
177+
rewrite e1, e2. intros. rewrite H, H0. reflexivity.
178+
Qed.
179+
180+
Lemma eq_sel_dep m n (e : m = n) :
181+
forall (r1 : Rel.R m) (r2 : Rel.R n) (p : Rel.T m -> bool) (q : Rel.T n -> bool),
182+
r1 ~= r2 -> p ~= q -> Rel.sel r1 p ~= Rel.sel r2 q.
183+
Proof.
184+
rewrite e. intros. rewrite H, H0. reflexivity.
185+
Qed.
186+
187+
Lemma sel_true {n} (S : Rel.R n) p : (forall r, List.In r (Rel.supp S) -> p r = true) -> Rel.sel S p = S.
188+
Proof.
189+
intro. apply Rel.p_ext. intro. destruct (p t) eqn:ept.
190+
+ rewrite Rel.p_selt; auto.
191+
+ rewrite Rel.p_self; auto. destruct (Rel.memb S t) eqn:eSt; auto.
192+
erewrite H in ept. discriminate ept.
193+
apply Rel.p_fs. rewrite eSt. omega.
194+
Qed.
195+
196+
Lemma eq_memb_dep_elim1 : forall (P : nat -> Prop) m n (S1:Rel.R m) (S2 : Rel.R n) r2,
197+
m = n -> S1 ~= S2 ->
198+
(forall r1, r1 ~= r2 -> P (Rel.memb S1 r1)) ->
199+
P (Rel.memb S2 r2).
200+
Proof.
201+
intros. generalize S1, H0, H1. clear S1 H0 H1.
202+
rewrite H. intros. rewrite <- H0.
203+
apply H1. reflexivity.
204+
Qed.
205+
206+
Lemma sum_ext_dep m1 m2 n1 n2 R1 R2 (f : Rel.T m1 -> Rel.T m2) (g : Rel.T n1 -> Rel.T n2) :
207+
m1 = n1 -> m2 = n2 -> R1 ~= R2 -> (forall x y, x ~= y -> f x ~= g y) -> Rel.sum R1 f ~= Rel.sum R2 g.
208+
Proof.
209+
intros. subst. rewrite H1. apply eq_JMeq. apply Rel.p_ext. intro.
210+
do 2 rewrite Rel.p_sum. repeat f_equal. extensionality x.
211+
rewrite (H2 x x). reflexivity. reflexivity.
212+
Qed.
213+
214+
Lemma sum_ext_dep_elim1 m1 m2 n1 n2 f1 f2 (R2 : Rel.R m2) (P: forall n, Rel.R n -> Prop) :
215+
m1 = m2 -> n1 = n2 -> f1 ~= f2 ->
216+
(forall (R1 : Rel.R m1), R1 ~= R2 -> P n1 (Rel.sum R1 f1)) ->
217+
P n2 (Rel.sum R2 f2).
218+
Proof.
219+
intros; subst. rewrite <- H1. apply H2. reflexivity.
220+
Qed.
221+
222+
Lemma filter_supp_eq_tech n (al : list (Rel.T n)) x (Hal : NoDup al) :
223+
(List.In x al -> filter (fun x0 => Rel.T_eqb x0 x) al = x::List.nil)
224+
/\ (~List.In x al -> filter (fun x0 => Rel.T_eqb x0 x) al = List.nil).
225+
Proof.
226+
induction Hal.
227+
+ split; intro.
228+
contradiction H. reflexivity.
229+
+ destruct IHHal. split; intro.
230+
- inversion H2. simpl. replace (Rel.T_eqb x0 x) with true.
231+
rewrite H3. f_equal. apply H1. rewrite <- H3. exact H.
232+
symmetry. apply Rel.T_eqb_eq. exact H3.
233+
simpl. replace (Rel.T_eqb x0 x) with false. apply H0. exact H3.
234+
destruct (Rel.T_eqb x0 x) eqn:e; intuition. replace x with x0 in H3. contradiction H.
235+
apply Rel.T_eqb_eq. exact e.
236+
- simpl. replace (Rel.T_eqb x0 x) with false. apply H1. intro. apply H2. right. exact H3.
237+
destruct (Rel.T_eqb x0 x) eqn:e; intuition. replace x with x0 in H2. contradiction H2. left. reflexivity.
238+
apply Rel.T_eqb_eq. exact e.
239+
Qed.
240+
241+
Lemma filter_supp_elim n R r (P : list (Rel.T n) -> Prop) :
242+
(List.In r (Rel.supp R) -> P (r::List.nil)) ->
243+
(~ List.In r (Rel.supp R) -> P List.nil) ->
244+
P (filter (fun (x0 : Rel.T n) => Rel.T_eqb x0 r) (Rel.supp R)).
245+
Proof.
246+
destruct (filter_supp_eq_tech _ (Rel.supp R) r (Rel.p_nodup _ R)).
247+
destruct (List.in_dec (Rel.T_dec _) r (Rel.supp R)); intros.
248+
rewrite H. apply H1. exact i. exact i.
249+
rewrite H0. apply H2. exact n0. exact n0.
250+
Qed.
251+
252+
Lemma filter_supp_elim' m n R r (P : list (Rel.T (m+n)) -> Prop) :
253+
(List.In (flip r) (Rel.supp R) -> P (flip r::List.nil)) ->
254+
(~ List.In (flip r) (Rel.supp R) -> P List.nil) ->
255+
P (filter (fun x0 => Rel.T_eqb (flip x0) r) (Rel.supp R)).
256+
Proof.
257+
replace (fun x0 => Rel.T_eqb (flip x0) r) with (fun x0 => Rel.T_eqb x0 (flip r)). apply filter_supp_elim.
258+
extensionality x0. apply eq_T_eqb_iff. split; intro.
259+
+ symmetry. apply flip_inv. symmetry. exact H.
260+
+ apply flip_inv. exact H.
261+
Qed.
262+
263+
Lemma p_ext' :
264+
forall m n, forall e : m = n, forall r : Rel.R m, forall s : Rel.R n,
265+
(forall t, Rel.memb r t = Rel.memb s (eq_rect _ _ t _ e)) -> r ~= s.
266+
intros m n e. rewrite e. simpl.
267+
intros. rewrite (Rel.p_ext n r s). constructor. exact H.
268+
Qed.
269+
270+
Lemma eq_sel m n (e : m = n) : forall (S1 : Rel.R m) (S2 : Rel.R n) p q,
271+
(forall r1 r2, r1 ~= r2 -> Rel.memb S1 r1 = Rel.memb S2 r2) ->
272+
(forall r1 r2, r1 ~= r2 -> p r1 = q r2) ->
273+
Rel.sel S1 p ~= Rel.sel S2 q.
274+
Proof.
275+
rewrite e. intros.
276+
apply eq_JMeq. f_equal.
277+
+ apply Rel.p_ext. intro. apply H. reflexivity.
278+
+ extensionality r. apply H0. reflexivity.
279+
Qed.
280+
281+
Lemma eq_card_dep m n (e : m = n) : forall (S1 : Rel.R m) (S2 : Rel.R n),
282+
S1 ~= S2 -> Rel.card S1 = Rel.card S2.
283+
Proof.
284+
rewrite e. intros. rewrite H. reflexivity.
285+
Qed.
286+
287+
Lemma pred_impl_fs_sel n S p q :
288+
(forall (t : Rel.T n), p t = true -> q t = true) ->
289+
forall x, Rel.memb (Rel.sel S p) x <= Rel.memb (Rel.sel S q) x.
290+
Proof.
291+
intros Hpq x. destruct (p x) eqn:ep.
292+
+ rewrite (Rel.p_selt _ _ _ _ ep). rewrite (Rel.p_selt _ _ _ _ (Hpq _ ep)). reflexivity.
293+
+ rewrite (Rel.p_self _ _ _ _ ep). intuition.
294+
Qed.
295+
46296
End Facts.

0 commit comments

Comments
 (0)