@@ -43,4 +43,254 @@ Module Facts (Db : DB) (Sql : SQL Db).
43
43
destruct (Rel.T_eqb (g x) t) eqn:e; rewrite <- H in e; exact e.
44
44
Qed .
45
45
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
+
46
296
End Facts.
0 commit comments