11require open Stdlib .Prop Stdlib .FOL Stdlib .Epsilon ;
22
3- // procedure for skolemizing all existentials
3+ // procedure for skolemizing all existentials ( no proof provided )
44// /!\ WARNING : this is a sequential symbol
55
66private sequential symbol skolem : Prop → Prop ;
7- private sequential symbol skolem -: Prop → Prop ;
87
9- rule skolem (∀ $p ) ↪ `∀ x , skolem ($p x )
10- with skolem (∃ $p ) ↪ skolem ($p (ε $ p ) )
8+ rule skolem (∃ $p ) ↪ skolem ($p (ε $ p ) )
9+ with skolem (∀ $p ) ↪ `∀ x , skolem ($p x )
1110with skolem ($p ∧ $q ) ↪ skolem $p ∧ skolem $q
1211with skolem ($p ∨ $q ) ↪ skolem $p ∨ skolem $q
13- with skolem ($p ⇒ $q ) ↪ skolem - $p ⇒ skolem $q
1412with skolem $p ↪ $p
15-
16- with skolem - (∀ $p ) ↪ skolem - ($p (ε $p ))
17- with skolem - (∃ $p ) ↪ `∃ x , skolem - ($p x )
18- with skolem - ($p ∧ $q ) ↪ skolem - $p ∧ skolem - $q
19- with skolem - ($p ∨ $q ) ↪ skolem - $p ∨ skolem - $q
20- with skolem - ($p ⇒ $q ) ↪ skolem $p ⇒ skolem - $q
21- with skolem - $p ↪ $p ;
13+ ;
2214
2315// example
2416
@@ -56,7 +48,6 @@ symbol ind_Prop (p:Prop → Prop):
5648(Π a f , π((`∀ x :τ a , p (f x )) ⇒ p (∀ f ))) →
5749(Π f g , π(p f ⇒ p g ⇒ p (f ∧ g ))) →
5850(Π f g , π(p f ⇒ p g ⇒ p (f ∨ g ))) →
59- (Π f g , π(p f ⇒ p g ⇒ p (f ⇒ g ))) →
6051Π f :Prop , π(p f );
6152
6253// positions in a proposition
@@ -69,8 +60,7 @@ inductive Pos : TYPE ≔
6960| and2 : Pos → Pos
7061| or1 : Pos → Pos
7162| or2 : Pos → Pos
72- | imp1 : Pos → Pos
73- | imp2 : Pos → Pos ;
63+ ;
7464
7565// valid positions
7666
@@ -124,20 +114,6 @@ with valid (or2 _) (∀ _) ↪ ⊥
124114with valid (or2 _) (_ ∧ _) ↪ ⊥
125115with valid (or2 $i ) (_ ∨ $f ) ↪ valid $i $f
126116with valid (or2 _) (_ ⇒ _) ↪ ⊥
127-
128- with valid (imp1 _) (at _) ↪ ⊥
129- with valid (imp1 _) (∃ _) ↪ ⊥
130- with valid (imp1 _) (∀ _) ↪ ⊥
131- with valid (imp1 _) (_ ∧ _) ↪ ⊥
132- with valid (imp1 _) (_ ∨ _) ↪ ⊥
133- with valid (imp1 $i ) ($f ⇒ _) ↪ valid $i $f
134-
135- with valid (imp2 _) (at _) ↪ ⊥
136- with valid (imp2 _) (∃ _) ↪ ⊥
137- with valid (imp2 _) (∀ _) ↪ ⊥
138- with valid (imp2 _) (_ ∧ _) ↪ ⊥
139- with valid (imp2 _) (_ ∨ _) ↪ ⊥
140- with valid (imp2 $i ) (_ ⇒ $f ) ↪ valid $i $f
141117;
142118
143119// induction principle on valid positions
@@ -154,134 +130,95 @@ opaque symbol ind_valid (p:Pos → Prop → Prop):
154130(Π i f g , π(valid i g ⇒ p i g ⇒ p (and2 i ) (f ∧ g ))) →
155131(Π i f g , π(valid i f ⇒ p i f ⇒ p (or1 i ) (f ∨ g ))) →
156132(Π i f g , π(valid i g ⇒ p i g ⇒ p (or2 i ) (f ∨ g ))) →
157- (Π i f g , π(valid i f ⇒ p i f ⇒ p (imp1 i ) (f ⇒ g ))) →
158- (Π i f g , π(valid i g ⇒ p i g ⇒ p (imp2 i ) (f ⇒ g ))) →
159133Π i f , π(valid i f ⇒ p i f ) ≔
160134begin
161- assume p ptop pall pex pand1 pand2 por1 por2 pimp1 pimp2 ; induction
135+ assume p ptop pall pex pand1 pand2 por1 por2 ; induction
162136// top
163- { refine ind_Prop _ _ _ _ _ _ _
137+ { refine ind_Prop _ _ _ _ _ _
164138 { assume k v ; apply ⊥ₑ v }
165139 { assume a f hf v ; apply ptop }
166140 { assume a f hf v ; apply ⊥ₑ v }
167141 { assume f g hf hg v ; apply ⊥ₑ v }
168142 { assume f g hf hg v ; apply ⊥ₑ v }
169- { assume f g hf hg v ; apply ⊥ₑ v }
170143}
171144// all
172- { assume i hi ; refine ind_Prop _ _ _ _ _ _ _
145+ { assume i hi ; refine ind_Prop _ _ _ _ _ _
173146 { assume k v ; apply ⊥ₑ v }
174147 { assume a f hf v ; apply ⊥ₑ v }
175148 { assume a f hf v ; apply pall i a f v ; assume x ; apply hi ; refine (v x ) }
176149 { assume f g hf hg v ; apply ⊥ₑ v }
177150 { assume f g hf hg v ; apply ⊥ₑ v }
178- { assume f g hf hg v ; apply ⊥ₑ v }
179151}
180152// ex
181- { assume i hi ; refine ind_Prop _ _ _ _ _ _ _
153+ { assume i hi ; refine ind_Prop _ _ _ _ _ _
182154 { assume k v ; apply ⊥ₑ v }
183155 { assume a f hf v ; apply pex i a f v ; assume x ; apply hi ; refine (v x ) }
184156 { assume a f hf v ; apply ⊥ₑ v }
185157 { assume f g hf hg v ; apply ⊥ₑ v }
186158 { assume f g hf hg v ; apply ⊥ₑ v }
187- { assume f g hf hg v ; apply ⊥ₑ v }
188159}
189160// and1
190- { assume i hi ; refine ind_Prop _ _ _ _ _ _ _
161+ { assume i hi ; refine ind_Prop _ _ _ _ _ _
191162 { assume k v ; apply ⊥ₑ v }
192163 { assume a f hf v ; apply ⊥ₑ v }
193164 { assume a f hf v ; apply ⊥ₑ v }
194165 { assume f g hf hg v ; apply pand1 i f g v (hi f v ) }
195166 { assume f g hf hg v ; apply ⊥ₑ v }
196- { assume f g hf hg v ; apply ⊥ₑ v }
197167}
198168// and2
199- { assume i hi ; refine ind_Prop _ _ _ _ _ _ _
169+ { assume i hi ; refine ind_Prop _ _ _ _ _ _
200170 { assume k v ; apply ⊥ₑ v }
201171 { assume a f hf v ; apply ⊥ₑ v }
202172 { assume a f hf v ; apply ⊥ₑ v }
203173 { assume f g hf hg v ; apply pand2 i f g v (hi g v ) }
204174 { assume f g hf hg v ; apply ⊥ₑ v }
205- { assume f g hf hg v ; apply ⊥ₑ v }
206175}
207176// or1
208- { assume i hi ; refine ind_Prop _ _ _ _ _ _ _
177+ { assume i hi ; refine ind_Prop _ _ _ _ _ _
209178 { assume k v ; apply ⊥ₑ v }
210179 { assume a f hf v ; apply ⊥ₑ v }
211180 { assume a f hf v ; apply ⊥ₑ v }
212181 { assume f g hf hg v ; apply ⊥ₑ v }
213182 { assume f g hf hg v ; apply por1 i f g v (hi f v ) }
214- { assume f g hf hg v ; apply ⊥ₑ v }
215183}
216184// or2
217- { assume i hi ; refine ind_Prop _ _ _ _ _ _ _
185+ { assume i hi ; refine ind_Prop _ _ _ _ _ _
218186 { assume k v ; apply ⊥ₑ v }
219187 { assume a f hf v ; apply ⊥ₑ v }
220188 { assume a f hf v ; apply ⊥ₑ v }
221189 { assume f g hf hg v ; apply ⊥ₑ v }
222190 { assume f g hf hg v ; apply por2 i f g v (hi g v ) }
223- { assume f g hf hg v ; apply ⊥ₑ v }
224- }
225- // imp1
226- { assume i hi ; refine ind_Prop _ _ _ _ _ _ _
227- { assume k v ; apply ⊥ₑ v }
228- { assume a f hf v ; apply ⊥ₑ v }
229- { assume a f hf v ; apply ⊥ₑ v }
230- { assume f g hf hg v ; apply ⊥ₑ v }
231- { assume f g hf hg v ; apply ⊥ₑ v }
232- { assume f g hf hg v ; apply pimp1 i f g v (hi f v ) }
233- }
234- // imp2
235- { assume i hi ; refine ind_Prop _ _ _ _ _ _ _
236- { assume k v ; apply ⊥ₑ v }
237- { assume a f hf v ; apply ⊥ₑ v }
238- { assume a f hf v ; apply ⊥ₑ v }
239- { assume f g hf hg v ; apply ⊥ₑ v }
240- { assume f g hf hg v ; apply ⊥ₑ v }
241- { assume f g hf hg v ; apply pimp2 i f g v (hi g v ) }
242191}
243192end ;
244193
245194// skolemization of a particular existential
246195
247196// /!\ WARNING : partial function defined on valid positions only
248197symbol skolem1 : Pos → Prop → Prop ;
249- symbol skolem1 -: Pos → Prop → Prop ;
250198
251199rule skolem1 top (∃ $p ) ↪ $p (ε $p )
252200with skolem1 (all $i ) (∀ $p ) ↪ `∀ x , skolem1 $i ($p x )
201+ with skolem1 (ex $i ) (∃ $p ) ↪ `∃ x , skolem1 $i ($p x )
253202with skolem1 (and1 $i ) ($p ∧ $q ) ↪ skolem1 $i $p ∧ $q
254203with skolem1 (and2 $i ) ($p ∧ $q ) ↪ $p ∧ skolem1 $i $q
255204with skolem1 (or1 $i ) ($p ∨ $q ) ↪ skolem1 $i $p ∨ $q
256205with skolem1 (or2 $i ) ($p ∨ $q ) ↪ $p ∨ skolem1 $i $q
257- with skolem1 (imp1 $i ) ($p ⇒ $q ) ↪ skolem1 - $i $p ⇒ $q
258- with skolem1 (imp2 $i ) ($p ⇒ $q ) ↪ $p ⇒ skolem1 $i $q
259-
260- with skolem1 - top (∀ $p ) ↪ $p (ε $p )
261- with skolem1 - (ex $i ) (∃ $p ) ↪ `∃ x , skolem1 - $i ($p x )
262- with skolem1 - (and1 $i ) ($p ∧ $q ) ↪ skolem1 - $i $p ∧ $q
263- with skolem1 - (and2 $i ) ($p ∧ $q ) ↪ $p ∧ skolem1 - $i $q
264- with skolem1 - (or1 $i ) ($p ∨ $q ) ↪ skolem1 - $i $p ∨ $q
265- with skolem1 - (or2 $i ) ($p ∨ $q ) ↪ $p ∨ skolem1 - $i $q
266- with skolem1 - (imp1 $i ) ($p ⇒ $q ) ↪ skolem1 $i $p ⇒ $q
267- with skolem1 - (imp2 $i ) ($p ⇒ $q ) ↪ $p ⇒ skolem1 - $i $q
268206;
269207
270208assert ⊢ skolem1 (all top ) A ≡ B ;
271209assert ⊢ skolem1 (all (and2 (all top ))) B ≡ C ;
272210
273- // correctness proof
211+ // skolemization preserves provability
274212
275- opaque symbol skolem1_correct i f : π(valid i f ) → π f → π(skolem1 i f ) ≔
213+ opaque symbol skolem1_preserves_provability i f :
214+ π(valid i f ) → π f → π(skolem1 i f ) ≔
276215begin
277- refine ind_valid (λ i f , f ⇒ skolem1 i f ) _ _ _ _ _ _ _ _ _
278- { assume a f h ; apply εᵢ _ h }
216+ refine ind_valid (λ i f , f ⇒ skolem1 i f ) _ _ _ _ _ _ _
217+ { assume a f h ; simplify ; apply εᵢ _ h }
279218{ assume i a f v IH h x ; apply IH x (h x ) }
280- { admit }
281- { assume i f g v IH h ; apply ∧ᵢ { apply IH (∧ₑ₁ h ) } { apply ∧ₑ₂ h } }
282- { assume i f g v IH h ; apply ∧ᵢ { apply ∧ₑ₁ h } { apply IH (∧ₑ₂ h ) } }
283- { assume i f g v IH h ; apply ∨ₑ h { assume hf ; apply ∨ᵢ₁ (IH hf ) } { assume hg ; apply ∨ᵢ₂ hg } }
284- { assume i f g v IH h ; apply ∨ₑ h { assume hf ; apply ∨ᵢ₁ hf } { assume hg ; apply ∨ᵢ₂ (IH hg ) } }
285- { assume i f g v IH h ; admit }
286- { assume i f g v IH h ; admit }
219+ { assume i a f v IH h ; simplify ; apply ∃ₑ h ; assume x hx ; apply ∃ᵢ x ; apply IH x ; apply hx }
220+ { assume i f g v IH h ; simplify ; apply ∧ᵢ { apply IH (∧ₑ₁ h ) } { apply ∧ₑ₂ h } }
221+ { assume i f g v IH h ; simplify ; apply ∧ᵢ { apply ∧ₑ₁ h } { apply IH (∧ₑ₂ h ) } }
222+ { assume i f g v IH h ; simplify ; apply ∨ₑ h { assume hf ; apply ∨ᵢ₁ (IH hf ) } { assume hg ; apply ∨ᵢ₂ hg } }
223+ { assume i f g v IH h ; simplify ; apply ∨ₑ h { assume hf ; apply ∨ᵢ₁ hf } { assume hg ; apply ∨ᵢ₂ (IH hg ) } }
287224end ;
0 commit comments