src/HOL/Statespace/state_fun.ML
changeset 61144 5e94dfead1c2
parent 60754 02924903a6fd
child 62597 b3f2b8c906a6
equal deleted inserted replaced
61143:5f898411ce87 61144:5e94dfead1c2
    49   | isTrue _ = false;
    49   | isTrue _ = false;
    50 
    50 
    51 in
    51 in
    52 
    52 
    53 val lazy_conj_simproc =
    53 val lazy_conj_simproc =
    54   Simplifier.simproc_global @{theory HOL} "lazy_conj_simp" ["P & Q"]
    54   Simplifier.make_simproc @{context} "lazy_conj_simp"
    55     (fn ctxt => fn t =>
    55    {lhss = [@{term "P & Q"}],
    56       (case t of (Const (@{const_name HOL.conj},_) $ P $ Q) =>
    56     proc = fn _ => fn ctxt => fn ct =>
    57         let
    57       (case Thm.term_of ct of
    58           val P_P' = Simplifier.rewrite ctxt (Thm.cterm_of ctxt P);
    58         Const (@{const_name HOL.conj},_) $ P $ Q =>
    59           val P' = P_P' |> Thm.prop_of |> Logic.dest_equals |> #2;
    59           let
    60         in
    60             val P_P' = Simplifier.rewrite ctxt (Thm.cterm_of ctxt P);
    61           if isFalse P' then SOME (conj1_False OF [P_P'])
    61             val P' = P_P' |> Thm.prop_of |> Logic.dest_equals |> #2;
    62           else
    62           in
    63             let
    63             if isFalse P' then SOME (conj1_False OF [P_P'])
    64               val Q_Q' = Simplifier.rewrite ctxt (Thm.cterm_of ctxt Q);
    64             else
    65               val Q' = Q_Q' |> Thm.prop_of |> Logic.dest_equals |> #2;
    65               let
    66             in
    66                 val Q_Q' = Simplifier.rewrite ctxt (Thm.cterm_of ctxt Q);
    67               if isFalse Q' then SOME (conj2_False OF [Q_Q'])
    67                 val Q' = Q_Q' |> Thm.prop_of |> Logic.dest_equals |> #2;
    68               else if isTrue P' andalso isTrue Q' then SOME (conj_True OF [P_P', Q_Q'])
    68               in
    69               else if P aconv P' andalso Q aconv Q' then NONE
    69                 if isFalse Q' then SOME (conj2_False OF [Q_Q'])
    70               else SOME (conj_cong OF [P_P', Q_Q'])
    70                 else if isTrue P' andalso isTrue Q' then SOME (conj_True OF [P_P', Q_Q'])
    71             end
    71                 else if P aconv P' andalso Q aconv Q' then NONE
    72          end
    72                 else SOME (conj_cong OF [P_P', Q_Q'])
    73       | _ => NONE));
    73               end
       
    74            end
       
    75       | _ => NONE),
       
    76     identifier = []};
    74 
    77 
    75 fun string_eq_simp_tac ctxt =
    78 fun string_eq_simp_tac ctxt =
    76   simp_tac (put_simpset HOL_basic_ss ctxt
    79   simp_tac (put_simpset HOL_basic_ss ctxt
    77     addsimps (@{thms list.inject} @ @{thms char.inject} @ @{thms list.distinct} @ @{thms simp_thms})
    80     addsimps (@{thms list.inject} @ @{thms char.inject} @ @{thms list.distinct} @ @{thms simp_thms})
    78     addsimprocs [lazy_conj_simproc]
    81     addsimprocs [lazy_conj_simproc]
   104 );
   107 );
   105 
   108 
   106 val _ = Theory.setup (Context.theory_map (Data.put (lookup_ss, ex_lookup_ss, false)));
   109 val _ = Theory.setup (Context.theory_map (Data.put (lookup_ss, ex_lookup_ss, false)));
   107 
   110 
   108 val lookup_simproc =
   111 val lookup_simproc =
   109   Simplifier.simproc_global @{theory} "lookup_simp" ["lookup d n (update d' c m v s)"]
   112   Simplifier.make_simproc @{context} "lookup_simp"
   110     (fn ctxt => fn t =>
   113    {lhss = [@{term "lookup d n (update d' c m v s)"}],
   111       (case t of (Const (@{const_name StateFun.lookup}, lT) $ destr $ n $
   114     proc = fn _ => fn ctxt => fn ct =>
       
   115       (case Thm.term_of ct of (Const (@{const_name StateFun.lookup}, lT) $ destr $ n $
   112                    (s as Const (@{const_name StateFun.update}, uT) $ _ $ _ $ _ $ _ $ _)) =>
   116                    (s as Const (@{const_name StateFun.update}, uT) $ _ $ _ $ _ $ _ $ _)) =>
   113         (let
   117         (let
   114           val (_::_::_::_::sT::_) = binder_types uT;
   118           val (_::_::_::_::sT::_) = binder_types uT;
   115           val mi = maxidx_of_term t;
   119           val mi = Term.maxidx_of_term (Thm.term_of ct);
   116           fun mk_upds (Const (@{const_name StateFun.update}, uT) $ d' $ c $ m $ v $ s) =
   120           fun mk_upds (Const (@{const_name StateFun.update}, uT) $ d' $ c $ m $ v $ s) =
   117                 let
   121                 let
   118                   val (_ :: _ :: _ :: fT :: _ :: _) = binder_types uT;
   122                   val (_ :: _ :: _ :: fT :: _ :: _) = binder_types uT;
   119                   val vT = domain_type fT;
   123                   val vT = domain_type fT;
   120                   val (s', cnt) = mk_upds s;
   124                   val (s', cnt) = mk_upds s;
   147           if (op aconv) (Logic.dest_equals (Thm.prop_of thm))
   151           if (op aconv) (Logic.dest_equals (Thm.prop_of thm))
   148           then NONE
   152           then NONE
   149           else SOME thm
   153           else SOME thm
   150         end
   154         end
   151         handle Option.Option => NONE)
   155         handle Option.Option => NONE)
   152       | _ => NONE ));
   156       | _ => NONE),
       
   157   identifier = []};
   153 
   158 
   154 
   159 
   155 local
   160 local
   156 
   161 
   157 val meta_ext = @{thm StateFun.meta_ext};
   162 val meta_ext = @{thm StateFun.meta_ext};
   163     |> fold Simplifier.add_cong @{thms block_conj_cong});
   168     |> fold Simplifier.add_cong @{thms block_conj_cong});
   164 
   169 
   165 in
   170 in
   166 
   171 
   167 val update_simproc =
   172 val update_simproc =
   168   Simplifier.simproc_global @{theory} "update_simp" ["update d c n v s"]
   173   Simplifier.make_simproc @{context} "update_simp"
   169     (fn ctxt => fn t =>
   174    {lhss = [@{term "update d c n v s"}],
   170       (case t of
   175     proc = fn _ => fn ctxt => fn ct =>
       
   176       (case Thm.term_of ct of
   171         Const (@{const_name StateFun.update}, uT) $ _ $ _ $ _ $ _ $ _ =>
   177         Const (@{const_name StateFun.update}, uT) $ _ $ _ $ _ $ _ $ _ =>
   172           let
   178           let
   173             val (_ :: _ :: _ :: _ :: sT :: _) = binder_types uT;
   179             val (_ :: _ :: _ :: _ :: sT :: _) = binder_types uT;
   174               (*"('v => 'a1) => ('a2 => 'v) => 'n => ('a1 => 'a2) => ('n => 'v) => ('n => 'v)"*)
   180               (*"('v => 'a1) => ('a2 => 'v) => 'n => ('a1 => 'a2) => ('n => 'v) => ('n => 'v)"*)
   175             fun init_seed s = (Bound 0, Bound 0, [("s", sT)], [], false);
   181             fun init_seed s = (Bound 0, Bound 0, [("s", sT)], [], false);
   240 
   246 
   241             val ctxt0 = Config.put simp_depth_limit 100 ctxt;
   247             val ctxt0 = Config.put simp_depth_limit 100 ctxt;
   242             val ctxt1 = put_simpset ss' ctxt0;
   248             val ctxt1 = put_simpset ss' ctxt0;
   243             val ctxt2 = put_simpset (#1 (Data.get (Context.Proof ctxt0))) ctxt0;
   249             val ctxt2 = put_simpset (#1 (Data.get (Context.Proof ctxt0))) ctxt0;
   244           in
   250           in
   245             (case mk_updterm [] t of
   251             (case mk_updterm [] (Thm.term_of ct) of
   246               (trm, trm', vars, _, true) =>
   252               (trm, trm', vars, _, true) =>
   247                 let
   253                 let
   248                   val eq1 =
   254                   val eq1 =
   249                     Goal.prove ctxt0 [] []
   255                     Goal.prove ctxt0 [] []
   250                       (Logic.list_all (vars, Logic.mk_equals (trm, trm')))
   256                       (Logic.list_all (vars, Logic.mk_equals (trm, trm')))
   251                       (fn _ => resolve_tac ctxt0 [meta_ext] 1 THEN simp_tac ctxt1 1);
   257                       (fn _ => resolve_tac ctxt0 [meta_ext] 1 THEN simp_tac ctxt1 1);
   252                   val eq2 = Simplifier.asm_full_rewrite ctxt2 (Thm.dest_equals_rhs (Thm.cprop_of eq1));
   258                   val eq2 = Simplifier.asm_full_rewrite ctxt2 (Thm.dest_equals_rhs (Thm.cprop_of eq1));
   253                 in SOME (Thm.transitive eq1 eq2) end
   259                 in SOME (Thm.transitive eq1 eq2) end
   254             | _ => NONE)
   260             | _ => NONE)
   255           end
   261           end
   256       | _ => NONE));
   262       | _ => NONE),
       
   263   identifier = []};
   257 
   264 
   258 end;
   265 end;
   259 
   266 
   260 
   267 
   261 local
   268 local
   267   in member (fn (s, (n, _)) => n = s) (more :: flds) sel end;
   274   in member (fn (s, (n, _)) => n = s) (more :: flds) sel end;
   268 
   275 
   269 in
   276 in
   270 
   277 
   271 val ex_lookup_eq_simproc =
   278 val ex_lookup_eq_simproc =
   272   Simplifier.simproc_global @{theory HOL} "ex_lookup_eq_simproc" ["Ex t"]
   279   Simplifier.make_simproc @{context} "ex_lookup_eq_simproc"
   273     (fn ctxt => fn t =>
   280    {lhss = [@{term "Ex t"}],
       
   281     proc = fn _ => fn ctxt => fn ct =>
   274       let
   282       let
   275         val thy = Proof_Context.theory_of ctxt;
   283         val thy = Proof_Context.theory_of ctxt;
       
   284         val t = Thm.term_of ct;
   276 
   285 
   277         val ex_lookup_ss = #2 (Data.get (Context.Proof ctxt));
   286         val ex_lookup_ss = #2 (Data.get (Context.Proof ctxt));
   278         val ctxt' = ctxt |> Config.put simp_depth_limit 100 |> put_simpset ex_lookup_ss;
   287         val ctxt' = ctxt |> Config.put simp_depth_limit 100 |> put_simpset ex_lookup_ss;
   279         fun prove prop =
   288         fun prove prop =
   280           Goal.prove_global thy [] [] prop
   289           Goal.prove_global thy [] [] prop
   314                   Logic.mk_equals (Const (@{const_name Ex}, Tex) $ Abs (s, T, eq), @{term True}));
   323                   Logic.mk_equals (Const (@{const_name Ex}, Tex) $ Abs (s, T, eq), @{term True}));
   315               val thm = Drule.export_without_context (prove prop);
   324               val thm = Drule.export_without_context (prove prop);
   316               val thm' = if swap then swap_ex_eq OF [thm] else thm
   325               val thm' = if swap then swap_ex_eq OF [thm] else thm
   317             in SOME thm' end handle TERM _ => NONE)
   326             in SOME thm' end handle TERM _ => NONE)
   318         | _ => NONE)
   327         | _ => NONE)
   319       end handle Option.Option => NONE);
   328       end handle Option.Option => NONE,
       
   329   identifier = []};
   320 
   330 
   321 end;
   331 end;
   322 
   332 
   323 val val_sfx = "V";
   333 val val_sfx = "V";
   324 val val_prfx = "StateFun."
   334 val val_prfx = "StateFun."