1
<html xmlns="http://www.w3.org/1999/xhtml">
3
<meta http-equiv="Content-Type" content="text/html; charset="><link rel="stylesheet" href="style.css" type="text/css"><title>Coq.IntMap.Mapfold</title>
8
<h1>Library Coq.IntMap.Mapfold</h1>
11
<code class="keyword">Require</code> <code class="keyword">Import</code> Bool.<br/>
12
<code class="keyword">Require</code> <code class="keyword">Import</code> Sumbool.<br/>
13
<code class="keyword">Require</code> <code class="keyword">Import</code> ZArith.<br/>
14
<code class="keyword">Require</code> <code class="keyword">Import</code> Addr.<br/>
15
<code class="keyword">Require</code> <code class="keyword">Import</code> Adist.<br/>
16
<code class="keyword">Require</code> <code class="keyword">Import</code> Addec.<br/>
17
<code class="keyword">Require</code> <code class="keyword">Import</code> Map.<br/>
18
<code class="keyword">Require</code> <code class="keyword">Import</code> Fset.<br/>
19
<code class="keyword">Require</code> <code class="keyword">Import</code> Mapaxioms.<br/>
20
<code class="keyword">Require</code> <code class="keyword">Import</code> Mapiter.<br/>
21
<code class="keyword">Require</code> <code class="keyword">Import</code> Lsort.<br/>
22
<code class="keyword">Require</code> <code class="keyword">Import</code> Mapsubset.<br/>
23
<code class="keyword">Require</code> <code class="keyword">Import</code> List.<br/>
26
<code class="keyword">Section</code> MapFoldResults.<br/>
29
<code class="keyword">Variable</code> A : Set.<br/>
32
<code class="keyword">Variable</code> M : Set.<br/>
33
<code class="keyword">Variable</code> neutral : M.<br/>
34
<code class="keyword">Variable</code> op : M -> M -> M.<br/>
37
<code class="keyword">Variable</code> nleft : forall a:M, op neutral a = a.<br/>
38
<code class="keyword">Variable</code> nright : forall a:M, op a neutral = a.<br/>
39
<code class="keyword">Variable</code> assoc : forall a b c:M, op (op a b) c = op a (op b c).<br/>
42
<code class="keyword">Lemma</code> <a name="MapFold_ext"></a>MapFold_ext :<br/>
43
forall (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (m m':<a href="Coq.IntMap.Map.html#Map">Map</a> A),<br/>
44
<a href="Coq.IntMap.Mapaxioms.html#eqmap">eqmap</a> A m m' -> <a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> _ _ neutral op f m = <a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> _ _ neutral op f m'.<br/>
45
<code class="keyword">Proof</code>.<br/>
46
intros. rewrite (<a href="Coq.IntMap.Mapiter.html#MapFold_as_fold">MapFold_as_fold</a> A M neutral op assoc nleft nright f m).<br/>
47
rewrite (<a href="Coq.IntMap.Mapiter.html#MapFold_as_fold">MapFold_as_fold</a> A M neutral op assoc nleft nright f m').<br/>
48
cut (<a href="Coq.IntMap.Mapiter.html#alist_of_Map">alist_of_Map</a> A m = <a href="Coq.IntMap.Mapiter.html#alist_of_Map">alist_of_Map</a> A m'). intro. rewrite H0. reflexivity.<br/>
49
apply <a href="Coq.IntMap.Lsort.html#alist_canonical">alist_canonical</a>. unfold eqmap in H. apply <a href="Coq.IntMap.Mapaxioms.html#eqm_trans">eqm_trans</a> with (f':= <a href="Coq.IntMap.Map.html#MapGet">MapGet</a> A m).<br/>
50
apply <a href="Coq.IntMap.Mapaxioms.html#eqm_sym">eqm_sym</a>. apply <a href="Coq.IntMap.Mapiter.html#alist_of_Map_semantics">alist_of_Map_semantics</a>.<br/>
51
apply <a href="Coq.IntMap.Mapaxioms.html#eqm_trans">eqm_trans</a> with (f':= <a href="Coq.IntMap.Map.html#MapGet">MapGet</a> A m'). assumption.<br/>
52
apply <a href="Coq.IntMap.Mapiter.html#alist_of_Map_semantics">alist_of_Map_semantics</a>.<br/>
53
apply <a href="Coq.IntMap.Lsort.html#alist_of_Map_sorts2">alist_of_Map_sorts2</a>.<br/>
54
apply <a href="Coq.IntMap.Lsort.html#alist_of_Map_sorts2">alist_of_Map_sorts2</a>.<br/>
55
<code class="keyword">Qed</code>.<br/>
58
<code class="keyword">Lemma</code> <a name="MapFold_ext_f_1"></a>MapFold_ext_f_1 :<br/>
59
forall (m:<a href="Coq.IntMap.Map.html#Map">Map</a> A) (f g:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (pf:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> <a href="Coq.IntMap.Addr.html#ad">ad</a>),<br/>
60
(forall (a:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (y:A), <a href="Coq.IntMap.Map.html#MapGet">MapGet</a> _ m a = <a href="Coq.IntMap.Map.html#SOME">SOME</a> _ y -> f (pf a) y = g (pf a) y) -><br/>
61
<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> _ _ neutral op f pf m = <a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> _ _ neutral op g pf m.<br/>
62
<code class="keyword">Proof</code>.<br/>
63
simple induction m. trivial.<br/>
64
simpl in |- *. intros. apply H. rewrite (<a href="Coq.IntMap.Addec.html#ad_eq_correct">ad_eq_correct</a> a). reflexivity.<br/>
65
intros. simpl in |- *. rewrite (H f g (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf (<a href="Coq.IntMap.Addr.html#ad_double">ad_double</a> a0))).<br/>
66
rewrite (H0 f g (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf (<a href="Coq.IntMap.Addr.html#ad_double_plus_un">ad_double_plus_un</a> a0))). reflexivity.<br/>
67
intros. apply H1. rewrite <a href="Coq.IntMap.Map.html#MapGet_M2_bit_0_1">MapGet_M2_bit_0_1</a>. rewrite <a href="Coq.IntMap.Addr.html#ad_double_plus_un_div_2">ad_double_plus_un_div_2</a>. assumption.<br/>
68
apply <a href="Coq.IntMap.Addr.html#ad_double_plus_un_bit_0">ad_double_plus_un_bit_0</a>.<br/>
69
intros. apply H1. rewrite <a href="Coq.IntMap.Map.html#MapGet_M2_bit_0_0">MapGet_M2_bit_0_0</a>. rewrite <a href="Coq.IntMap.Addr.html#ad_double_div_2">ad_double_div_2</a>. assumption.<br/>
70
apply <a href="Coq.IntMap.Addr.html#ad_double_bit_0">ad_double_bit_0</a>.<br/>
71
<code class="keyword">Qed</code>.<br/>
74
<code class="keyword">Lemma</code> <a name="MapFold_ext_f"></a>MapFold_ext_f :<br/>
75
forall (f g:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (m:<a href="Coq.IntMap.Map.html#Map">Map</a> A),<br/>
76
(forall (a:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (y:A), <a href="Coq.IntMap.Map.html#MapGet">MapGet</a> _ m a = <a href="Coq.IntMap.Map.html#SOME">SOME</a> _ y -> f a y = g a y) -><br/>
77
<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> _ _ neutral op f m = <a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> _ _ neutral op g m.<br/>
78
<code class="keyword">Proof</code>.<br/>
79
intros. exact (<a href="Coq.IntMap.Mapfold.html#MapFold_ext_f_1">MapFold_ext_f_1</a> m f g (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => a0) H).<br/>
80
<code class="keyword">Qed</code>.<br/>
83
<code class="keyword">Lemma</code> <a name="MapFold1_as_Fold_1"></a>MapFold1_as_Fold_1 :<br/>
84
forall (m:<a href="Coq.IntMap.Map.html#Map">Map</a> A) (f f':<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (pf pf':<a href="Coq.IntMap.Addr.html#ad">ad</a> -> <a href="Coq.IntMap.Addr.html#ad">ad</a>),<br/>
85
(forall (a:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (y:A), f (pf a) y = f' (pf' a) y) -><br/>
86
<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> _ _ neutral op f pf m = <a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> _ _ neutral op f' pf' m.<br/>
87
<code class="keyword">Proof</code>.<br/>
88
simple induction m. trivial.<br/>
89
intros. simpl in |- *. apply H.<br/>
90
intros. simpl in |- *.<br/>
91
rewrite<br/>
92
(H f f' (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf (<a href="Coq.IntMap.Addr.html#ad_double">ad_double</a> a0))<br/>
93
(fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf' (<a href="Coq.IntMap.Addr.html#ad_double">ad_double</a> a0))).<br/>
94
rewrite<br/>
95
(H0 f f' (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf (<a href="Coq.IntMap.Addr.html#ad_double_plus_un">ad_double_plus_un</a> a0))<br/>
96
(fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf' (<a href="Coq.IntMap.Addr.html#ad_double_plus_un">ad_double_plus_un</a> a0))).<br/>
97
reflexivity.<br/>
98
intros. apply H1.<br/>
99
intros. apply H1.<br/>
100
<code class="keyword">Qed</code>.<br/>
103
<code class="keyword">Lemma</code> <a name="MapFold1_as_Fold"></a>MapFold1_as_Fold :<br/>
104
forall (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (pf:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> <a href="Coq.IntMap.Addr.html#ad">ad</a>) (m:<a href="Coq.IntMap.Map.html#Map">Map</a> A),<br/>
105
<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> _ _ neutral op f pf m =<br/>
106
<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> _ _ neutral op (fun (a:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (y:A) => f (pf a) y) m.<br/>
107
<code class="keyword">Proof</code>.<br/>
108
intros. unfold MapFold in |- *. apply <a href="Coq.IntMap.Mapfold.html#MapFold1_as_Fold_1">MapFold1_as_Fold_1</a>. trivial.<br/>
109
<code class="keyword">Qed</code>.<br/>
112
<code class="keyword">Lemma</code> <a name="MapFold1_ext"></a>MapFold1_ext :<br/>
113
forall (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (m m':<a href="Coq.IntMap.Map.html#Map">Map</a> A),<br/>
114
<a href="Coq.IntMap.Mapaxioms.html#eqmap">eqmap</a> A m m' -><br/>
115
forall pf:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> <a href="Coq.IntMap.Addr.html#ad">ad</a>,<br/>
116
<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> _ _ neutral op f pf m = <a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> _ _ neutral op f pf m'.<br/>
117
<code class="keyword">Proof</code>.<br/>
118
intros. rewrite <a href="Coq.IntMap.Mapfold.html#MapFold1_as_Fold">MapFold1_as_Fold</a>. rewrite <a href="Coq.IntMap.Mapfold.html#MapFold1_as_Fold">MapFold1_as_Fold</a>. apply <a href="Coq.IntMap.Mapfold.html#MapFold_ext">MapFold_ext</a>. assumption.<br/>
119
<code class="keyword">Qed</code>.<br/>
122
<code class="keyword">Variable</code> comm : forall a b:M, op a b = op b a.<br/>
125
<code class="keyword">Lemma</code> <a name="MapFold_Put_disjoint_1"></a>MapFold_Put_disjoint_1 :<br/>
126
forall (p:<a href="Coq.NArith.BinPos.html#positive">positive</a>) (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (pf:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> <a href="Coq.IntMap.Addr.html#ad">ad</a>) <br/>
127
(a1 a2:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (y1 y2:A),<br/>
128
<a href="Coq.IntMap.Addr.html#ad_xor">ad_xor</a> a1 a2 = <a href="Coq.IntMap.Addr.html#ad_x">ad_x</a> p -><br/>
129
<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> A M neutral op f pf (<a href="Coq.IntMap.Map.html#MapPut1">MapPut1</a> A a1 y1 a2 y2 p) =<br/>
130
op (f (pf a1) y1) (f (pf a2) y2).<br/>
131
<code class="keyword">Proof</code>.<br/>
132
simple induction p. intros. simpl in |- *. elim (<a href="Coq.Bool.Sumbool.html#sumbool_of_bool">sumbool_of_bool</a> (<a href="Coq.IntMap.Addr.html#ad_bit_0">ad_bit_0</a> a1)). intro H1. rewrite H1.<br/>
133
simpl in |- *. rewrite <a href="Coq.IntMap.Addr.html#ad_div_2_double_plus_un">ad_div_2_double_plus_un</a>. rewrite <a href="Coq.IntMap.Addr.html#ad_div_2_double">ad_div_2_double</a>. apply comm.<br/>
134
change (<a href="Coq.IntMap.Addr.html#ad_bit_0">ad_bit_0</a> a2 = <a href="Coq.Bool.Bool.html#negb">negb</a> <a href="Coq.Init.Datatypes.html#true">true</a>) in |- *. rewrite <- H1. rewrite (<a href="Coq.IntMap.Addr.html#ad_neg_bit_0_2">ad_neg_bit_0_2</a> _ _ _ H0).<br/>
135
rewrite <a href="Coq.Bool.Bool.html#negb_elim">negb_elim</a>. reflexivity.<br/>
136
assumption.<br/>
137
intro H1. rewrite H1. simpl in |- *. rewrite <a href="Coq.IntMap.Addr.html#ad_div_2_double">ad_div_2_double</a>. rewrite <a href="Coq.IntMap.Addr.html#ad_div_2_double_plus_un">ad_div_2_double_plus_un</a>.<br/>
138
reflexivity.<br/>
139
change (<a href="Coq.IntMap.Addr.html#ad_bit_0">ad_bit_0</a> a2 = <a href="Coq.Bool.Bool.html#negb">negb</a> <a href="Coq.Init.Datatypes.html#false">false</a>) in |- *. rewrite <- H1. rewrite (<a href="Coq.IntMap.Addr.html#ad_neg_bit_0_2">ad_neg_bit_0_2</a> _ _ _ H0).<br/>
140
rewrite <a href="Coq.Bool.Bool.html#negb_elim">negb_elim</a>. reflexivity.<br/>
141
assumption.<br/>
142
simpl in |- *. intros. elim (<a href="Coq.Bool.Sumbool.html#sumbool_of_bool">sumbool_of_bool</a> (<a href="Coq.IntMap.Addr.html#ad_bit_0">ad_bit_0</a> a1)). intro H1. rewrite H1. simpl in |- *.<br/>
143
rewrite nleft.<br/>
144
rewrite<br/>
145
(H f (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf (<a href="Coq.IntMap.Addr.html#ad_double_plus_un">ad_double_plus_un</a> a0)) (<br/>
146
<a href="Coq.IntMap.Addr.html#ad_div_2">ad_div_2</a> a1) (<a href="Coq.IntMap.Addr.html#ad_div_2">ad_div_2</a> a2) y1 y2).<br/>
147
rewrite <a href="Coq.IntMap.Addr.html#ad_div_2_double_plus_un">ad_div_2_double_plus_un</a>. rewrite <a href="Coq.IntMap.Addr.html#ad_div_2_double_plus_un">ad_div_2_double_plus_un</a>. reflexivity.<br/>
148
rewrite <- (<a href="Coq.IntMap.Addr.html#ad_same_bit_0">ad_same_bit_0</a> _ _ _ H0). assumption.<br/>
149
assumption.<br/>
150
rewrite <- <a href="Coq.IntMap.Addr.html#ad_xor_div_2">ad_xor_div_2</a>. rewrite H0. reflexivity.<br/>
151
intro H1. rewrite H1. simpl in |- *. rewrite nright.<br/>
152
rewrite<br/>
153
(H f (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf (<a href="Coq.IntMap.Addr.html#ad_double">ad_double</a> a0)) (<a href="Coq.IntMap.Addr.html#ad_div_2">ad_div_2</a> a1) (<a href="Coq.IntMap.Addr.html#ad_div_2">ad_div_2</a> a2) y1 y2)<br/>
154
.<br/>
155
rewrite <a href="Coq.IntMap.Addr.html#ad_div_2_double">ad_div_2_double</a>. rewrite <a href="Coq.IntMap.Addr.html#ad_div_2_double">ad_div_2_double</a>. reflexivity.<br/>
156
rewrite <- (<a href="Coq.IntMap.Addr.html#ad_same_bit_0">ad_same_bit_0</a> _ _ _ H0). assumption.<br/>
157
assumption.<br/>
158
rewrite <- <a href="Coq.IntMap.Addr.html#ad_xor_div_2">ad_xor_div_2</a>. rewrite H0. reflexivity.<br/>
159
intros. simpl in |- *. elim (<a href="Coq.Bool.Sumbool.html#sumbool_of_bool">sumbool_of_bool</a> (<a href="Coq.IntMap.Addr.html#ad_bit_0">ad_bit_0</a> a1)). intro H0. rewrite H0. simpl in |- *.<br/>
160
rewrite <a href="Coq.IntMap.Addr.html#ad_div_2_double">ad_div_2_double</a>. rewrite <a href="Coq.IntMap.Addr.html#ad_div_2_double_plus_un">ad_div_2_double_plus_un</a>. apply comm.<br/>
161
assumption.<br/>
162
change (<a href="Coq.IntMap.Addr.html#ad_bit_0">ad_bit_0</a> a2 = <a href="Coq.Bool.Bool.html#negb">negb</a> <a href="Coq.Init.Datatypes.html#true">true</a>) in |- *. rewrite <- H0. rewrite (<a href="Coq.IntMap.Addr.html#ad_neg_bit_0_1">ad_neg_bit_0_1</a> _ _ H).<br/>
163
rewrite <a href="Coq.Bool.Bool.html#negb_elim">negb_elim</a>. reflexivity.<br/>
164
intro H0. rewrite H0. simpl in |- *. rewrite <a href="Coq.IntMap.Addr.html#ad_div_2_double">ad_div_2_double</a>. rewrite <a href="Coq.IntMap.Addr.html#ad_div_2_double_plus_un">ad_div_2_double_plus_un</a>.<br/>
165
reflexivity.<br/>
166
change (<a href="Coq.IntMap.Addr.html#ad_bit_0">ad_bit_0</a> a2 = <a href="Coq.Bool.Bool.html#negb">negb</a> <a href="Coq.Init.Datatypes.html#false">false</a>) in |- *. rewrite <- H0. rewrite (<a href="Coq.IntMap.Addr.html#ad_neg_bit_0_1">ad_neg_bit_0_1</a> _ _ H).<br/>
167
rewrite <a href="Coq.Bool.Bool.html#negb_elim">negb_elim</a>. reflexivity.<br/>
168
assumption.<br/>
169
<code class="keyword">Qed</code>.<br/>
172
<code class="keyword">Lemma</code> <a name="MapFold_Put_disjoint_2"></a>MapFold_Put_disjoint_2 :<br/>
173
forall (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (m:<a href="Coq.IntMap.Map.html#Map">Map</a> A) (a:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (y:A) (pf:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> <a href="Coq.IntMap.Addr.html#ad">ad</a>),<br/>
174
<a href="Coq.IntMap.Map.html#MapGet">MapGet</a> A m a = <a href="Coq.IntMap.Map.html#NONE">NONE</a> A -><br/>
175
<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> A M neutral op f pf (<a href="Coq.IntMap.Map.html#MapPut">MapPut</a> A m a y) =<br/>
176
op (f (pf a) y) (<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> A M neutral op f pf m).<br/>
177
<code class="keyword">Proof</code>.<br/>
178
simple induction m. intros. simpl in |- *. rewrite (nright (f (pf a) y)). reflexivity.<br/>
179
intros a1 y1 a2 y2 pf H. simpl in |- *. elim (<a href="Coq.IntMap.Addr.html#ad_sum">ad_sum</a> (<a href="Coq.IntMap.Addr.html#ad_xor">ad_xor</a> a1 a2)). intro H0. elim H0.<br/>
180
intros p H1. rewrite H1. rewrite comm. exact (<a href="Coq.IntMap.Mapfold.html#MapFold_Put_disjoint_1">MapFold_Put_disjoint_1</a> p f pf a1 a2 y1 y2 H1).<br/>
181
intro H0. rewrite (<a href="Coq.IntMap.Addec.html#ad_eq_complete">ad_eq_complete</a> _ _ (<a href="Coq.IntMap.Addec.html#ad_xor_eq_true">ad_xor_eq_true</a> _ _ H0)) in H.<br/>
182
rewrite (<a href="Coq.IntMap.Map.html#M1_semantics_1">M1_semantics_1</a> A a2 y1) in H. discriminate H.<br/>
183
intros. elim (<a href="Coq.Bool.Sumbool.html#sumbool_of_bool">sumbool_of_bool</a> (<a href="Coq.IntMap.Addr.html#ad_bit_0">ad_bit_0</a> a)). intro H2.<br/>
184
cut (<a href="Coq.IntMap.Map.html#MapPut">MapPut</a> A (<a href="Coq.IntMap.Map.html#M2">M2</a> A m0 m1) a y = <a href="Coq.IntMap.Map.html#M2">M2</a> A m0 (<a href="Coq.IntMap.Map.html#MapPut">MapPut</a> A m1 (<a href="Coq.IntMap.Addr.html#ad_div_2">ad_div_2</a> a) y)). intro.<br/>
185
rewrite H3. simpl in |- *. rewrite (H0 (<a href="Coq.IntMap.Addr.html#ad_div_2">ad_div_2</a> a) y (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf (<a href="Coq.IntMap.Addr.html#ad_double_plus_un">ad_double_plus_un</a> a0))).<br/>
186
rewrite <a href="Coq.IntMap.Addr.html#ad_div_2_double_plus_un">ad_div_2_double_plus_un</a>. rewrite <- assoc.<br/>
187
rewrite<br/>
188
(comm (<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> A M neutral op f (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf (<a href="Coq.IntMap.Addr.html#ad_double">ad_double</a> a0)) m0)<br/>
189
(f (pf a) y)).<br/>
190
rewrite assoc. reflexivity.<br/>
191
assumption.<br/>
192
rewrite (<a href="Coq.IntMap.Map.html#MapGet_M2_bit_0_1">MapGet_M2_bit_0_1</a> A a H2 m0 m1) in H1. assumption.<br/>
193
simpl in |- *. elim (<a href="Coq.IntMap.Addr.html#ad_sum">ad_sum</a> a). intro H3. elim H3. intro p. elim p. intros p0 H4 H5. rewrite H5.<br/>
194
reflexivity.<br/>
195
intros p0 H4 H5. rewrite H5 in H2. discriminate H2.<br/>
196
intro H4. rewrite H4. reflexivity.<br/>
197
intro H3. rewrite H3 in H2. discriminate H2.<br/>
198
intro H2. cut (<a href="Coq.IntMap.Map.html#MapPut">MapPut</a> A (<a href="Coq.IntMap.Map.html#M2">M2</a> A m0 m1) a y = <a href="Coq.IntMap.Map.html#M2">M2</a> A (<a href="Coq.IntMap.Map.html#MapPut">MapPut</a> A m0 (<a href="Coq.IntMap.Addr.html#ad_div_2">ad_div_2</a> a) y) m1).<br/>
199
intro. rewrite H3. simpl in |- *. rewrite (H (<a href="Coq.IntMap.Addr.html#ad_div_2">ad_div_2</a> a) y (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf (<a href="Coq.IntMap.Addr.html#ad_double">ad_double</a> a0))).<br/>
200
rewrite <a href="Coq.IntMap.Addr.html#ad_div_2_double">ad_div_2_double</a>. rewrite <- assoc. reflexivity.<br/>
201
assumption.<br/>
202
rewrite (<a href="Coq.IntMap.Map.html#MapGet_M2_bit_0_0">MapGet_M2_bit_0_0</a> A a H2 m0 m1) in H1. assumption.<br/>
203
simpl in |- *. elim (<a href="Coq.IntMap.Addr.html#ad_sum">ad_sum</a> a). intro H3. elim H3. intro p. elim p. intros p0 H4 H5. rewrite H5 in H2.<br/>
204
discriminate H2.<br/>
205
intros p0 H4 H5. rewrite H5. reflexivity.<br/>
206
intro H4. rewrite H4 in H2. discriminate H2.<br/>
207
intro H3. rewrite H3. reflexivity.<br/>
208
<code class="keyword">Qed</code>.<br/>
211
<code class="keyword">Lemma</code> <a name="MapFold_Put_disjoint"></a>MapFold_Put_disjoint :<br/>
212
forall (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (m:<a href="Coq.IntMap.Map.html#Map">Map</a> A) (a:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (y:A),<br/>
213
<a href="Coq.IntMap.Map.html#MapGet">MapGet</a> A m a = <a href="Coq.IntMap.Map.html#NONE">NONE</a> A -><br/>
214
<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> A M neutral op f (<a href="Coq.IntMap.Map.html#MapPut">MapPut</a> A m a y) =<br/>
215
op (f a y) (<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> A M neutral op f m).<br/>
216
<code class="keyword">Proof</code>.<br/>
217
intros. exact (<a href="Coq.IntMap.Mapfold.html#MapFold_Put_disjoint_2">MapFold_Put_disjoint_2</a> f m a y (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => a0) H).<br/>
218
<code class="keyword">Qed</code>.<br/>
221
<code class="keyword">Lemma</code> <a name="MapFold_Put_behind_disjoint_2"></a>MapFold_Put_behind_disjoint_2 :<br/>
222
forall (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (m:<a href="Coq.IntMap.Map.html#Map">Map</a> A) (a:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (y:A) (pf:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> <a href="Coq.IntMap.Addr.html#ad">ad</a>),<br/>
223
<a href="Coq.IntMap.Map.html#MapGet">MapGet</a> A m a = <a href="Coq.IntMap.Map.html#NONE">NONE</a> A -><br/>
224
<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> A M neutral op f pf (<a href="Coq.IntMap.Map.html#MapPut_behind">MapPut_behind</a> A m a y) =<br/>
225
op (f (pf a) y) (<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> A M neutral op f pf m).<br/>
226
<code class="keyword">Proof</code>.<br/>
227
intros. cut (<a href="Coq.IntMap.Mapaxioms.html#eqmap">eqmap</a> A (<a href="Coq.IntMap.Map.html#MapPut_behind">MapPut_behind</a> A m a y) (<a href="Coq.IntMap.Map.html#MapPut">MapPut</a> A m a y)). intro.<br/>
228
rewrite (<a href="Coq.IntMap.Mapfold.html#MapFold1_ext">MapFold1_ext</a> f _ _ H0 pf). apply <a href="Coq.IntMap.Mapfold.html#MapFold_Put_disjoint_2">MapFold_Put_disjoint_2</a>. assumption.<br/>
229
apply <a href="Coq.IntMap.Mapaxioms.html#eqmap_trans">eqmap_trans</a> with (m':= <a href="Coq.IntMap.Map.html#MapMerge">MapMerge</a> A (<a href="Coq.IntMap.Map.html#M1">M1</a> A a y) m). apply <a href="Coq.IntMap.Mapaxioms.html#MapPut_behind_as_Merge">MapPut_behind_as_Merge</a>.<br/>
230
apply <a href="Coq.IntMap.Mapaxioms.html#eqmap_trans">eqmap_trans</a> with (m':= <a href="Coq.IntMap.Map.html#MapMerge">MapMerge</a> A m (<a href="Coq.IntMap.Map.html#M1">M1</a> A a y)).<br/>
231
apply <a href="Coq.IntMap.Mapaxioms.html#eqmap_trans">eqmap_trans</a> with (m':= <a href="Coq.IntMap.Map.html#MapDelta">MapDelta</a> A (<a href="Coq.IntMap.Map.html#M1">M1</a> A a y) m). apply <a href="Coq.IntMap.Mapaxioms.html#eqmap_sym">eqmap_sym</a>. apply <a href="Coq.IntMap.Mapsubset.html#MapDelta_disjoint">MapDelta_disjoint</a>.<br/>
232
unfold MapDisjoint in |- *. unfold in_dom in |- *. simpl in |- *. intros. elim (<a href="Coq.Bool.Sumbool.html#sumbool_of_bool">sumbool_of_bool</a> (<a href="Coq.IntMap.Addec.html#ad_eq">ad_eq</a> a a0)).<br/>
233
intro H2. rewrite (<a href="Coq.IntMap.Addec.html#ad_eq_complete">ad_eq_complete</a> _ _ H2) in H. rewrite H in H1. discriminate H1.<br/>
234
intro H2. rewrite H2 in H0. discriminate H0.<br/>
235
apply <a href="Coq.IntMap.Mapaxioms.html#eqmap_trans">eqmap_trans</a> with (m':= <a href="Coq.IntMap.Map.html#MapDelta">MapDelta</a> A m (<a href="Coq.IntMap.Map.html#M1">M1</a> A a y)). apply <a href="Coq.IntMap.Mapaxioms.html#MapDelta_sym">MapDelta_sym</a>.<br/>
236
apply <a href="Coq.IntMap.Mapsubset.html#MapDelta_disjoint">MapDelta_disjoint</a>. unfold MapDisjoint in |- *. unfold in_dom in |- *. simpl in |- *. intros.<br/>
237
elim (<a href="Coq.Bool.Sumbool.html#sumbool_of_bool">sumbool_of_bool</a> (<a href="Coq.IntMap.Addec.html#ad_eq">ad_eq</a> a a0)). intro H2. rewrite (<a href="Coq.IntMap.Addec.html#ad_eq_complete">ad_eq_complete</a> _ _ H2) in H.<br/>
238
rewrite H in H0. discriminate H0.<br/>
239
intro H2. rewrite H2 in H1. discriminate H1.<br/>
240
apply <a href="Coq.IntMap.Mapaxioms.html#eqmap_sym">eqmap_sym</a>. apply <a href="Coq.IntMap.Mapaxioms.html#MapPut_as_Merge">MapPut_as_Merge</a>.<br/>
241
<code class="keyword">Qed</code>.<br/>
244
<code class="keyword">Lemma</code> <a name="MapFold_Put_behind_disjoint"></a>MapFold_Put_behind_disjoint :<br/>
245
forall (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (m:<a href="Coq.IntMap.Map.html#Map">Map</a> A) (a:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (y:A),<br/>
246
<a href="Coq.IntMap.Map.html#MapGet">MapGet</a> A m a = <a href="Coq.IntMap.Map.html#NONE">NONE</a> A -><br/>
247
<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> A M neutral op f (<a href="Coq.IntMap.Map.html#MapPut_behind">MapPut_behind</a> A m a y) =<br/>
248
op (f a y) (<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> A M neutral op f m).<br/>
249
<code class="keyword">Proof</code>.<br/>
250
intros. exact (<a href="Coq.IntMap.Mapfold.html#MapFold_Put_behind_disjoint_2">MapFold_Put_behind_disjoint_2</a> f m a y (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => a0) H).<br/>
251
<code class="keyword">Qed</code>.<br/>
254
<code class="keyword">Lemma</code> <a name="MapFold_Merge_disjoint_1"></a>MapFold_Merge_disjoint_1 :<br/>
255
forall (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (m1 m2:<a href="Coq.IntMap.Map.html#Map">Map</a> A) (pf:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> <a href="Coq.IntMap.Addr.html#ad">ad</a>),<br/>
256
<a href="Coq.IntMap.Mapsubset.html#MapDisjoint">MapDisjoint</a> A A m1 m2 -><br/>
257
<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> A M neutral op f pf (<a href="Coq.IntMap.Map.html#MapMerge">MapMerge</a> A m1 m2) =<br/>
258
op (<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> A M neutral op f pf m1) (<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> A M neutral op f pf m2).<br/>
259
<code class="keyword">Proof</code>.<br/>
260
simple induction m1. simpl in |- *. intros. rewrite nleft. reflexivity.<br/>
261
intros. unfold MapMerge in |- *. apply (<a href="Coq.IntMap.Mapfold.html#MapFold_Put_behind_disjoint_2">MapFold_Put_behind_disjoint_2</a> f m2 a a0 pf).<br/>
262
apply <a href="Coq.IntMap.Fset.html#in_dom_none">in_dom_none</a>. exact (<a href="Coq.IntMap.Mapsubset.html#MapDisjoint_M1_l">MapDisjoint_M1_l</a> _ _ m2 a a0 H).<br/>
263
simple induction m2. intros. simpl in |- *. rewrite nright. reflexivity.<br/>
264
intros. unfold MapMerge in |- *. rewrite (<a href="Coq.IntMap.Mapfold.html#MapFold_Put_disjoint_2">MapFold_Put_disjoint_2</a> f (<a href="Coq.IntMap.Map.html#M2">M2</a> A m m0) a a0 pf). apply comm.<br/>
265
apply <a href="Coq.IntMap.Fset.html#in_dom_none">in_dom_none</a>. exact (<a href="Coq.IntMap.Mapsubset.html#MapDisjoint_M1_r">MapDisjoint_M1_r</a> _ _ (<a href="Coq.IntMap.Map.html#M2">M2</a> A m m0) a a0 H1).<br/>
266
intros. simpl in |- *. rewrite (H m3 (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf (<a href="Coq.IntMap.Addr.html#ad_double">ad_double</a> a0))).<br/>
267
rewrite (H0 m4 (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf (<a href="Coq.IntMap.Addr.html#ad_double_plus_un">ad_double_plus_un</a> a0))).<br/>
268
cut (forall a b c d:M, op (op a b) (op c d) = op (op a c) (op b d)). intro. apply H4.<br/>
269
intros. rewrite assoc. rewrite <- (assoc b c d). rewrite (comm b c). rewrite (assoc c b d).<br/>
270
rewrite assoc. reflexivity.<br/>
271
exact (<a href="Coq.IntMap.Mapsubset.html#MapDisjoint_M2_r">MapDisjoint_M2_r</a> _ _ _ _ _ _ H3).<br/>
272
exact (<a href="Coq.IntMap.Mapsubset.html#MapDisjoint_M2_l">MapDisjoint_M2_l</a> _ _ _ _ _ _ H3).<br/>
273
<code class="keyword">Qed</code>.<br/>
276
<code class="keyword">Lemma</code> <a name="MapFold_Merge_disjoint"></a>MapFold_Merge_disjoint :<br/>
277
forall (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (m1 m2:<a href="Coq.IntMap.Map.html#Map">Map</a> A),<br/>
278
<a href="Coq.IntMap.Mapsubset.html#MapDisjoint">MapDisjoint</a> A A m1 m2 -><br/>
279
<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> A M neutral op f (<a href="Coq.IntMap.Map.html#MapMerge">MapMerge</a> A m1 m2) =<br/>
280
op (<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> A M neutral op f m1) (<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> A M neutral op f m2).<br/>
281
<code class="keyword">Proof</code>.<br/>
282
intros. exact (<a href="Coq.IntMap.Mapfold.html#MapFold_Merge_disjoint_1">MapFold_Merge_disjoint_1</a> f m1 m2 (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => a0) H).<br/>
283
<code class="keyword">Qed</code>.<br/>
285
<code class="keyword">End</code> MapFoldResults.<br/>
288
<code class="keyword">Section</code> MapFoldDistr.<br/>
291
<code class="keyword">Variable</code> A : Set.<br/>
294
<code class="keyword">Variable</code> M : Set.<br/>
295
<code class="keyword">Variable</code> neutral : M.<br/>
296
<code class="keyword">Variable</code> op : M -> M -> M.<br/>
299
<code class="keyword">Variable</code> M' : Set.<br/>
300
<code class="keyword">Variable</code> neutral' : M'.<br/>
301
<code class="keyword">Variable</code> op' : M' -> M' -> M'.<br/>
304
<code class="keyword">Variable</code> N : Set.<br/>
307
<code class="keyword">Variable</code> times : M -> N -> M'.<br/>
310
<code class="keyword">Variable</code> absorb : forall c:N, times neutral c = neutral'.<br/>
311
<code class="keyword">Variable</code><br/>
312
distr :<br/>
313
forall (a b:M) (c:N), times (op a b) c = op' (times a c) (times b c).<br/>
316
<code class="keyword">Lemma</code> <a name="MapFold_distr_r_1"></a>MapFold_distr_r_1 :<br/>
317
forall (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (m:<a href="Coq.IntMap.Map.html#Map">Map</a> A) (c:N) (pf:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> <a href="Coq.IntMap.Addr.html#ad">ad</a>),<br/>
318
times (<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> A M neutral op f pf m) c =<br/>
319
<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> A M' neutral' op' (fun (a:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (y:A) => times (f a y) c) pf m.<br/>
320
<code class="keyword">Proof</code>.<br/>
321
simple induction m. intros. exact (absorb c).<br/>
322
trivial.<br/>
323
intros. simpl in |- *. rewrite distr. rewrite H. rewrite H0. reflexivity.<br/>
324
<code class="keyword">Qed</code>.<br/>
327
<code class="keyword">Lemma</code> <a name="MapFold_distr_r"></a>MapFold_distr_r :<br/>
328
forall (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (m:<a href="Coq.IntMap.Map.html#Map">Map</a> A) (c:N),<br/>
329
times (<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> A M neutral op f m) c =<br/>
330
<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> A M' neutral' op' (fun (a:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (y:A) => times (f a y) c) m.<br/>
331
<code class="keyword">Proof</code>.<br/>
332
intros. exact (<a href="Coq.IntMap.Mapfold.html#MapFold_distr_r_1">MapFold_distr_r_1</a> f m c (fun a:<a href="Coq.IntMap.Addr.html#ad">ad</a> => a)).<br/>
333
<code class="keyword">Qed</code>.<br/>
336
<code class="keyword">End</code> MapFoldDistr.<br/>
339
<code class="keyword">Section</code> MapFoldDistrL.<br/>
342
<code class="keyword">Variable</code> A : Set.<br/>
345
<code class="keyword">Variable</code> M : Set.<br/>
346
<code class="keyword">Variable</code> neutral : M.<br/>
347
<code class="keyword">Variable</code> op : M -> M -> M.<br/>
350
<code class="keyword">Variable</code> M' : Set.<br/>
351
<code class="keyword">Variable</code> neutral' : M'.<br/>
352
<code class="keyword">Variable</code> op' : M' -> M' -> M'.<br/>
355
<code class="keyword">Variable</code> N : Set.<br/>
358
<code class="keyword">Variable</code> times : N -> M -> M'.<br/>
361
<code class="keyword">Variable</code> absorb : forall c:N, times c neutral = neutral'.<br/>
362
<code class="keyword">Variable</code><br/>
363
distr :<br/>
364
forall (a b:M) (c:N), times c (op a b) = op' (times c a) (times c b).<br/>
367
<code class="keyword">Lemma</code> <a name="MapFold_distr_l"></a>MapFold_distr_l :<br/>
368
forall (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> M) (m:<a href="Coq.IntMap.Map.html#Map">Map</a> A) (c:N),<br/>
369
times c (<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> A M neutral op f m) =<br/>
370
<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> A M' neutral' op' (fun (a:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (y:A) => times c (f a y)) m.<br/>
371
<code class="keyword">Proof</code>.<br/>
372
intros. apply <a href="Coq.IntMap.Mapfold.html#MapFold_distr_r">MapFold_distr_r</a> with (times:= fun (a:M) (b:N) => times b a);<br/>
373
assumption.<br/>
374
<code class="keyword">Qed</code>.<br/>
377
<code class="keyword">End</code> MapFoldDistrL.<br/>
380
<code class="keyword">Section</code> MapFoldExists.<br/>
383
<code class="keyword">Variable</code> A : Set.<br/>
386
<code class="keyword">Lemma</code> <a name="MapFold_orb_1"></a>MapFold_orb_1 :<br/>
387
forall (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> <a href="Coq.Init.Datatypes.html#bool">bool</a>) (m:<a href="Coq.IntMap.Map.html#Map">Map</a> A) (pf:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> <a href="Coq.IntMap.Addr.html#ad">ad</a>),<br/>
388
<a href="Coq.IntMap.Mapiter.html#MapFold1">MapFold1</a> A <a href="Coq.Init.Datatypes.html#bool">bool</a> <a href="Coq.Init.Datatypes.html#false">false</a> <a href="Coq.Bool.Bool.html#orb">orb</a> f pf m =<br/>
389
match <a href="Coq.IntMap.Mapiter.html#MapSweep1">MapSweep1</a> A f pf m with<br/>
390
| <a href="Coq.IntMap.Map.html#SOME">SOME</a> _ => <a href="Coq.Init.Datatypes.html#true">true</a><br/>
391
| _ => <a href="Coq.Init.Datatypes.html#false">false</a><br/>
392
end.<br/>
393
<code class="keyword">Proof</code>.<br/>
394
simple induction m. trivial.<br/>
395
intros a y pf. simpl in |- *. unfold MapSweep2 in |- *. case (f (pf a) y); reflexivity.<br/>
396
intros. simpl in |- *. rewrite (H (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf (<a href="Coq.IntMap.Addr.html#ad_double">ad_double</a> a0))).<br/>
397
rewrite (H0 (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf (<a href="Coq.IntMap.Addr.html#ad_double_plus_un">ad_double_plus_un</a> a0))).<br/>
398
case (<a href="Coq.IntMap.Mapiter.html#MapSweep1">MapSweep1</a> A f (fun a0:<a href="Coq.IntMap.Addr.html#ad">ad</a> => pf (<a href="Coq.IntMap.Addr.html#ad_double">ad_double</a> a0)) m0); reflexivity.<br/>
399
<code class="keyword">Qed</code>.<br/>
402
<code class="keyword">Lemma</code> <a name="MapFold_orb"></a>MapFold_orb :<br/>
403
forall (f:<a href="Coq.IntMap.Addr.html#ad">ad</a> -> A -> <a href="Coq.Init.Datatypes.html#bool">bool</a>) (m:<a href="Coq.IntMap.Map.html#Map">Map</a> A),<br/>
404
<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> A <a href="Coq.Init.Datatypes.html#bool">bool</a> <a href="Coq.Init.Datatypes.html#false">false</a> <a href="Coq.Bool.Bool.html#orb">orb</a> f m =<br/>
405
match <a href="Coq.IntMap.Mapiter.html#MapSweep">MapSweep</a> A f m with<br/>
406
| <a href="Coq.IntMap.Map.html#SOME">SOME</a> _ => <a href="Coq.Init.Datatypes.html#true">true</a><br/>
407
| _ => <a href="Coq.Init.Datatypes.html#false">false</a><br/>
408
end.<br/>
409
<code class="keyword">Proof</code>.<br/>
410
intros. exact (<a href="Coq.IntMap.Mapfold.html#MapFold_orb_1">MapFold_orb_1</a> f m (fun a:<a href="Coq.IntMap.Addr.html#ad">ad</a> => a)).<br/>
411
<code class="keyword">Qed</code>.<br/>
414
<code class="keyword">End</code> MapFoldExists.<br/>
417
<code class="keyword">Section</code> DMergeDef.<br/>
420
<code class="keyword">Variable</code> A : Set.<br/>
423
<code class="keyword">Definition</code> <a name="DMerge"></a>DMerge :=<br/>
424
<a href="Coq.IntMap.Mapiter.html#MapFold">MapFold</a> (<a href="Coq.IntMap.Map.html#Map">Map</a> A) (<a href="Coq.IntMap.Map.html#Map">Map</a> A) (<a href="Coq.IntMap.Map.html#M0">M0</a> A) (<a href="Coq.IntMap.Map.html#MapMerge">MapMerge</a> A) (fun (_:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (m:<a href="Coq.IntMap.Map.html#Map">Map</a> A) => m).<br/>
427
<code class="keyword">Lemma</code> <a name="in_dom_DMerge_1"></a>in_dom_DMerge_1 :<br/>
428
forall (m:<a href="Coq.IntMap.Map.html#Map">Map</a> (<a href="Coq.IntMap.Map.html#Map">Map</a> A)) (a:<a href="Coq.IntMap.Addr.html#ad">ad</a>),<br/>
429
<a href="Coq.IntMap.Fset.html#in_dom">in_dom</a> A a (<a href="Coq.IntMap.Mapfold.html#DMerge">DMerge</a> m) =<br/>
430
match <a href="Coq.IntMap.Mapiter.html#MapSweep">MapSweep</a> _ (fun (_:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (m0:<a href="Coq.IntMap.Map.html#Map">Map</a> A) => <a href="Coq.IntMap.Fset.html#in_dom">in_dom</a> A a m0) m with<br/>
431
| <a href="Coq.IntMap.Map.html#SOME">SOME</a> _ => <a href="Coq.Init.Datatypes.html#true">true</a><br/>
432
| _ => <a href="Coq.Init.Datatypes.html#false">false</a><br/>
433
end.<br/>
434
<code class="keyword">Proof</code>.<br/>
435
unfold DMerge in |- *. intros.<br/>
436
rewrite<br/>
437
(<a href="Coq.IntMap.Mapfold.html#MapFold_distr_l">MapFold_distr_l</a> (<a href="Coq.IntMap.Map.html#Map">Map</a> A) (<a href="Coq.IntMap.Map.html#Map">Map</a> A) (<a href="Coq.IntMap.Map.html#M0">M0</a> A) (<a href="Coq.IntMap.Map.html#MapMerge">MapMerge</a> A) <a href="Coq.Init.Datatypes.html#bool">bool</a> <a href="Coq.Init.Datatypes.html#false">false</a> <a href="Coq.Bool.Bool.html#orb">orb</a> <a href="Coq.IntMap.Addr.html#ad">ad</a><br/>
438
(<a href="Coq.IntMap.Fset.html#in_dom">in_dom</a> A) (fun c:<a href="Coq.IntMap.Addr.html#ad">ad</a> => <a href="Coq.Init.Logic.html#refl_equal">refl_equal</a> _) (<a href="Coq.IntMap.Fset.html#in_dom_merge">in_dom_merge</a> A))<br/>
439
.<br/>
440
apply <a href="Coq.IntMap.Mapfold.html#MapFold_orb">MapFold_orb</a>.<br/>
441
<code class="keyword">Qed</code>.<br/>
444
<code class="keyword">Lemma</code> <a name="in_dom_DMerge_2"></a>in_dom_DMerge_2 :<br/>
445
forall (m:<a href="Coq.IntMap.Map.html#Map">Map</a> (<a href="Coq.IntMap.Map.html#Map">Map</a> A)) (a:<a href="Coq.IntMap.Addr.html#ad">ad</a>),<br/>
446
<a href="Coq.IntMap.Fset.html#in_dom">in_dom</a> A a (<a href="Coq.IntMap.Mapfold.html#DMerge">DMerge</a> m) = <a href="Coq.Init.Datatypes.html#true">true</a> -><br/>
447
{b : <a href="Coq.IntMap.Addr.html#ad">ad</a> & <br/>
448
{m0 : <a href="Coq.IntMap.Map.html#Map">Map</a> A | <a href="Coq.IntMap.Map.html#MapGet">MapGet</a> _ m b = <a href="Coq.IntMap.Map.html#SOME">SOME</a> _ m0 /\ <a href="Coq.IntMap.Fset.html#in_dom">in_dom</a> A a m0 = <a href="Coq.Init.Datatypes.html#true">true</a>}}.<br/>
449
<code class="keyword">Proof</code>.<br/>
450
intros m a. rewrite <a href="Coq.IntMap.Mapfold.html#in_dom_DMerge_1">in_dom_DMerge_1</a>.<br/>
451
elim<br/>
452
(<a href="Coq.IntMap.Map.html#option_sum">option_sum</a> _<br/>
453
(<a href="Coq.IntMap.Mapiter.html#MapSweep">MapSweep</a> (<a href="Coq.IntMap.Map.html#Map">Map</a> A) (fun (_:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (m0:<a href="Coq.IntMap.Map.html#Map">Map</a> A) => <a href="Coq.IntMap.Fset.html#in_dom">in_dom</a> A a m0) m)).<br/>
454
intro H. elim H. intro r. elim r. intros b m0 H0. intro. split with b. split with m0.<br/>
455
split. exact (<a href="Coq.IntMap.Mapiter.html#MapSweep_semantics_2">MapSweep_semantics_2</a> _ _ _ _ _ H0).<br/>
456
exact (<a href="Coq.IntMap.Mapiter.html#MapSweep_semantics_1">MapSweep_semantics_1</a> _ _ _ _ _ H0).<br/>
457
intro H. rewrite H. intro. discriminate H0.<br/>
458
<code class="keyword">Qed</code>.<br/>
461
<code class="keyword">Lemma</code> <a name="in_dom_DMerge_3"></a>in_dom_DMerge_3 :<br/>
462
forall (m:<a href="Coq.IntMap.Map.html#Map">Map</a> (<a href="Coq.IntMap.Map.html#Map">Map</a> A)) (a b:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (m0:<a href="Coq.IntMap.Map.html#Map">Map</a> A),<br/>
463
<a href="Coq.IntMap.Map.html#MapGet">MapGet</a> _ m a = <a href="Coq.IntMap.Map.html#SOME">SOME</a> _ m0 -><br/>
464
<a href="Coq.IntMap.Fset.html#in_dom">in_dom</a> A b m0 = <a href="Coq.Init.Datatypes.html#true">true</a> -> <a href="Coq.IntMap.Fset.html#in_dom">in_dom</a> A b (<a href="Coq.IntMap.Mapfold.html#DMerge">DMerge</a> m) = <a href="Coq.Init.Datatypes.html#true">true</a>.<br/>
465
<code class="keyword">Proof</code>.<br/>
466
intros m a b m0 H H0. rewrite <a href="Coq.IntMap.Mapfold.html#in_dom_DMerge_1">in_dom_DMerge_1</a>.<br/>
467
elim<br/>
468
(<a href="Coq.IntMap.Mapiter.html#MapSweep_semantics_4">MapSweep_semantics_4</a> _ (fun (_:<a href="Coq.IntMap.Addr.html#ad">ad</a>) (m'0:<a href="Coq.IntMap.Map.html#Map">Map</a> A) => <a href="Coq.IntMap.Fset.html#in_dom">in_dom</a> A b m'0) _ _ _<br/>
469
H H0).<br/>
470
intros a' H1. elim H1. intros m'0 H2. rewrite H2. reflexivity.<br/>
471
<code class="keyword">Qed</code>.<br/>
474
<code class="keyword">End</code> DMergeDef.</code>
475
<hr/><a href="index.html">Index</a><hr/><font size="-1">This page has been generated by <a href="http://www.lri.fr/~filliatr/coqdoc/">coqdoc</a></font>
b'\\ No newline at end of file'