src/Provers/quantifier1.ML
changeset 59498 50b60f501b05
parent 58838 59203adfc33f
child 59582 0fbed69ff081
equal deleted inserted replaced
59497:0c5cd369a643 59498:50b60f501b05
    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) =>