62 val ex_comm: thm (* (? x y. P x y) = (? y x. P x y) *) |
62 val ex_comm: thm (* (? x y. P x y) = (? y x. P x y) *) |
63 end; |
63 end; |
64 |
64 |
65 signature QUANTIFIER1 = |
65 signature QUANTIFIER1 = |
66 sig |
66 sig |
67 val prove_one_point_all_tac: tactic |
67 val prove_one_point_all_tac: Proof.context -> tactic |
68 val prove_one_point_ex_tac: tactic |
68 val prove_one_point_ex_tac: Proof.context -> tactic |
69 val rearrange_all: Proof.context -> cterm -> thm option |
69 val rearrange_all: Proof.context -> cterm -> thm option |
70 val rearrange_ex: Proof.context -> cterm -> thm option |
70 val rearrange_ex: Proof.context -> cterm -> thm option |
71 val rearrange_ball: (Proof.context -> tactic) -> Proof.context -> cterm -> thm option |
71 val rearrange_ball: (Proof.context -> tactic) -> Proof.context -> cterm -> thm option |
72 val rearrange_bex: (Proof.context -> tactic) -> Proof.context -> cterm -> thm option |
72 val rearrange_bex: (Proof.context -> tactic) -> Proof.context -> cterm -> thm option |
73 val rearrange_Collect: (Proof.context -> tactic) -> Proof.context -> cterm -> thm option |
73 val rearrange_Collect: (Proof.context -> tactic) -> Proof.context -> cterm -> thm option |
124 let |
124 let |
125 val (goal, ctxt') = |
125 val (goal, ctxt') = |
126 yield_singleton (Variable.import_terms true) (Logic.mk_equals tu) ctxt; |
126 yield_singleton (Variable.import_terms true) (Logic.mk_equals tu) ctxt; |
127 val thm = |
127 val thm = |
128 Goal.prove ctxt' [] [] goal |
128 Goal.prove ctxt' [] [] goal |
129 (fn {context = ctxt'', ...} => resolve_tac [Data.iff_reflection] 1 THEN tac ctxt''); |
129 (fn {context = ctxt'', ...} => |
|
130 resolve_tac ctxt'' [Data.iff_reflection] 1 THEN tac ctxt''); |
130 in singleton (Variable.export ctxt' ctxt) thm end; |
131 in singleton (Variable.export ctxt' ctxt) thm end; |
131 |
132 |
132 fun qcomm_tac qcomm qI i = REPEAT_DETERM (resolve_tac [qcomm] i THEN resolve_tac [qI] i); |
133 fun qcomm_tac ctxt qcomm qI i = |
|
134 REPEAT_DETERM (resolve_tac ctxt [qcomm] i THEN resolve_tac ctxt [qI] i); |
133 |
135 |
134 (* Proves (? x0..xn. ... & x0 = t & ...) = (? x1..xn x0. x0 = t & ... & ...) |
136 (* Proves (? x0..xn. ... & x0 = t & ...) = (? x1..xn x0. x0 = t & ... & ...) |
135 Better: instantiate exI |
137 Better: instantiate exI |
136 *) |
138 *) |
137 local |
139 local |
138 val excomm = Data.ex_comm RS Data.iff_trans; |
140 val excomm = Data.ex_comm RS Data.iff_trans; |
139 in |
141 in |
140 val prove_one_point_ex_tac = |
142 fun prove_one_point_ex_tac ctxt = |
141 qcomm_tac excomm Data.iff_exI 1 THEN resolve_tac [Data.iffI] 1 THEN |
143 qcomm_tac ctxt excomm Data.iff_exI 1 THEN resolve_tac ctxt [Data.iffI] 1 THEN |
142 ALLGOALS |
144 ALLGOALS |
143 (EVERY' [eresolve_tac [Data.exE], REPEAT_DETERM o eresolve_tac [Data.conjE], |
145 (EVERY' [eresolve_tac ctxt [Data.exE], REPEAT_DETERM o eresolve_tac ctxt [Data.conjE], |
144 resolve_tac [Data.exI], |
146 resolve_tac ctxt [Data.exI], |
145 DEPTH_SOLVE_1 o ares_tac [Data.conjI]]) |
147 DEPTH_SOLVE_1 o ares_tac [Data.conjI]]) |
146 end; |
148 end; |
147 |
149 |
148 (* Proves (! x0..xn. (... & x0 = t & ...) --> P x0) = |
150 (* Proves (! x0..xn. (... & x0 = t & ...) --> P x0) = |
149 (! x1..xn x0. x0 = t --> (... & ...) --> P x0) |
151 (! x1..xn x0. x0 = t --> (... & ...) --> P x0) |
150 *) |
152 *) |
151 local |
153 local |
152 val tac = |
154 fun tac ctxt = |
153 SELECT_GOAL |
155 SELECT_GOAL |
154 (EVERY1 [REPEAT o dresolve_tac [Data.uncurry], |
156 (EVERY1 [REPEAT o dresolve_tac ctxt [Data.uncurry], |
155 REPEAT o resolve_tac [Data.impI], |
157 REPEAT o resolve_tac ctxt [Data.impI], |
156 eresolve_tac [Data.mp], |
158 eresolve_tac ctxt [Data.mp], |
157 REPEAT o eresolve_tac [Data.conjE], |
159 REPEAT o eresolve_tac ctxt [Data.conjE], |
158 REPEAT o ares_tac [Data.conjI]]); |
160 REPEAT o ares_tac [Data.conjI]]); |
159 val allcomm = Data.all_comm RS Data.iff_trans; |
161 val allcomm = Data.all_comm RS Data.iff_trans; |
160 in |
162 in |
161 val prove_one_point_all_tac = |
163 fun prove_one_point_all_tac ctxt = |
162 EVERY1 [qcomm_tac allcomm Data.iff_allI, |
164 EVERY1 [qcomm_tac ctxt allcomm Data.iff_allI, |
163 resolve_tac [Data.iff_allI], |
165 resolve_tac ctxt [Data.iff_allI], |
164 resolve_tac [Data.iffI], tac, tac]; |
166 resolve_tac ctxt [Data.iffI], tac ctxt, tac ctxt]; |
165 end |
167 end |
166 |
168 |
167 fun renumber l u (Bound i) = |
169 fun renumber l u (Bound i) = |
168 Bound (if i < l orelse i > u then i else if i = u then l else i + 1) |
170 Bound (if i < l orelse i > u then i else if i = u then l else i + 1) |
169 | renumber l u (s $ t) = renumber l u s $ renumber l u t |
171 | renumber l u (s $ t) = renumber l u s $ renumber l u t |
183 F as (all as Const (q, _)) $ Abs (x, T, P) => |
185 F as (all as Const (q, _)) $ Abs (x, T, P) => |
184 (case extract_quant extract_imp q P of |
186 (case extract_quant extract_imp q P of |
185 NONE => NONE |
187 NONE => NONE |
186 | SOME (xs, eq, Q) => |
188 | SOME (xs, eq, Q) => |
187 let val R = quantify all x T xs (Data.imp $ eq $ Q) |
189 let val R = quantify all x T xs (Data.imp $ eq $ Q) |
188 in SOME (prove_conv ctxt (F, R) (K prove_one_point_all_tac)) end) |
190 in SOME (prove_conv ctxt (F, R) prove_one_point_all_tac) end) |
189 | _ => NONE); |
191 | _ => NONE); |
190 |
192 |
191 fun rearrange_ball tac ctxt ct = |
193 fun rearrange_ball tac ctxt ct = |
192 (case term_of ct of |
194 (case term_of ct of |
193 F as Ball $ A $ Abs (x, T, P) => |
195 F as Ball $ A $ Abs (x, T, P) => |
205 F as (ex as Const (q, _)) $ Abs (x, T, P) => |
207 F as (ex as Const (q, _)) $ Abs (x, T, P) => |
206 (case extract_quant extract_conj q P of |
208 (case extract_quant extract_conj q P of |
207 NONE => NONE |
209 NONE => NONE |
208 | SOME (xs, eq, Q) => |
210 | SOME (xs, eq, Q) => |
209 let val R = quantify ex x T xs (Data.conj $ eq $ Q) |
211 let val R = quantify ex x T xs (Data.conj $ eq $ Q) |
210 in SOME (prove_conv ctxt (F, R) (K prove_one_point_ex_tac)) end) |
212 in SOME (prove_conv ctxt (F, R) prove_one_point_ex_tac) end) |
211 | _ => NONE); |
213 | _ => NONE); |
212 |
214 |
213 fun rearrange_bex tac ctxt ct = |
215 fun rearrange_bex tac ctxt ct = |
214 (case term_of ct of |
216 (case term_of ct of |
215 F as Bex $ A $ Abs (x, T, P) => |
217 F as Bex $ A $ Abs (x, T, P) => |