src/HOL/Tools/SMT2/z3_new_isar.ML
changeset 56129 9ee083f9da5b
parent 56128 c106ac2ff76d
child 56855 e7a55d295b8e
equal deleted inserted replaced
56128:c106ac2ff76d 56129:9ee083f9da5b
    61           in
    61           in
    62             (name, role, t', rule, deps') :: inline_z3_hypotheses hyp_names hyps' lines
    62             (name, role, t', rule, deps') :: inline_z3_hypotheses hyp_names hyps' lines
    63           end
    63           end
    64       end
    64       end
    65 
    65 
    66 fun simplify_prop (@{const Not} $ t) = s_not (simplify_prop t)
    66 fun simplify_bool (@{const Not} $ t) = s_not (simplify_bool t)
    67   | simplify_prop (@{const conj} $ t $ u) = s_conj (simplify_prop t, simplify_prop u)
    67   | simplify_bool (@{const conj} $ t $ u) = s_conj (simplify_bool t, simplify_bool u)
    68   | simplify_prop (@{const disj} $ t $ u) = s_disj (simplify_prop t, simplify_prop u)
    68   | simplify_bool (@{const disj} $ t $ u) = s_disj (simplify_bool t, simplify_bool u)
    69   | simplify_prop (@{const implies} $ t $ u) = s_imp (simplify_prop t, simplify_prop u)
    69   | simplify_bool (@{const implies} $ t $ u) = s_imp (simplify_bool t, simplify_bool u)
    70   | simplify_prop (@{const HOL.eq (bool)} $ t $ u) = s_iff (simplify_prop t, simplify_prop u)
    70   | simplify_bool (@{const HOL.eq (bool)} $ t $ u) = s_iff (simplify_bool t, simplify_bool u)
    71   | simplify_prop (t as Const (@{const_name HOL.eq}, _) $ u $ v) =
    71   | simplify_bool (t as Const (@{const_name HOL.eq}, _) $ u $ v) =
    72     if u aconv v then @{const True} else t
    72     if u aconv v then @{const True} else t
    73   | simplify_prop (t $ u) = simplify_prop t $ simplify_prop u
    73   | simplify_bool (t $ u) = simplify_bool t $ simplify_bool u
    74   | simplify_prop (Abs (s, T, t)) = Abs (s, T, simplify_prop t)
    74   | simplify_bool (Abs (s, T, t)) = Abs (s, T, simplify_bool t)
    75   | simplify_prop t = t
    75   | simplify_bool t = t
    76 
    76 
    77 fun simplify_line (name, role, t, rule, deps) = (name, role, simplify_prop t, rule, deps)
    77 (* It is not entirely clear why this should be necessary, especially for abstractions variables. *)
       
    78 val unskolemize_names =
       
    79   Term.map_abs_vars (perhaps (try Name.dest_skolem))
       
    80   #> Term.map_aterms (perhaps (try (fn Free (s, T) => Free (Name.dest_skolem s, T))))
    78 
    81 
    79 fun atp_proof_of_z3_proof thy rewrite_rules conjecture_id fact_ids proof =
    82 fun atp_proof_of_z3_proof thy rewrite_rules conjecture_id fact_ids proof =
    80   let
    83   let
    81     fun step_of (Z3_New_Proof.Z3_Step {id, rule, prems, concl, ...}) =
    84     fun step_of (Z3_New_Proof.Z3_Step {id, rule, prems, concl, ...}) =
    82       let
    85       let
    97           | _ => Plain)
   100           | _ => Plain)
    98 
   101 
    99         val concl' = concl
   102         val concl' = concl
   100           |> Raw_Simplifier.rewrite_term thy rewrite_rules []
   103           |> Raw_Simplifier.rewrite_term thy rewrite_rules []
   101           |> Object_Logic.atomize_term thy
   104           |> Object_Logic.atomize_term thy
       
   105           |> simplify_bool
       
   106           |> unskolemize_names
   102           |> HOLogic.mk_Trueprop
   107           |> HOLogic.mk_Trueprop
   103       in
   108       in
   104         (name, role, concl', Z3_New_Proof.string_of_rule rule, map step_name_of prems)
   109         (name, role, concl', Z3_New_Proof.string_of_rule rule, map step_name_of prems)
   105       end
   110       end
   106   in
   111   in
   107     proof
   112     proof
   108     |> map step_of
   113     |> map step_of
   109     |> inline_z3_defs []
   114     |> inline_z3_defs []
   110     |> inline_z3_hypotheses [] []
   115     |> inline_z3_hypotheses [] []
   111     |> map simplify_line
       
   112   end
   116   end
   113 
   117 
   114 end;
   118 end;