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; |