author | wenzelm |
Wed, 12 Mar 2025 11:39:00 +0100 | |
changeset 82265 | 4b875a4c83b0 |
parent 82027 | 9c33627cea18 |
permissions | -rw-r--r-- |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
1 |
signature REIFY_TABLE = |
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
2 |
sig |
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
3 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
4 |
type table |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
5 |
val empty : table |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
6 |
val get_var : term -> table -> (int * table) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
7 |
val get_term : int -> table -> term option |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
8 |
|
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
9 |
end |
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
10 |
|
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
11 |
structure Reifytab: REIFY_TABLE = |
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
12 |
struct |
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
13 |
type table = (int * (term * int) list) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
14 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
15 |
val empty = (0, []) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
16 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
17 |
fun get_var t (max_var, tis) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
18 |
(case AList.lookup Envir.aeconv tis t of |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
19 |
SOME v => (v, (max_var, tis)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
20 |
| NONE => (max_var, (max_var + 1, (t, max_var) :: tis)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
21 |
) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
22 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
23 |
fun get_term v (_, tis) = Library.find_first (fn (_, v2) => v = v2) tis |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
24 |
|> Option.map fst |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
25 |
|
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
26 |
end |
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
27 |
|
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
28 |
signature LOGIC_SIGNATURE = |
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
29 |
sig |
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
30 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
31 |
val mk_Trueprop : term -> term |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
32 |
val dest_Trueprop : term -> term |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
33 |
val Trueprop_conv : conv -> conv |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
34 |
val Not : term |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
35 |
val conj : term |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
36 |
val disj : term |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
37 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
38 |
val notI : thm (* (P \<Longrightarrow> False) \<Longrightarrow> \<not> P *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
39 |
val ccontr : thm (* (\<not> P \<Longrightarrow> False) \<Longrightarrow> P *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
40 |
val conjI : thm (* P \<Longrightarrow> Q \<Longrightarrow> P \<and> Q *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
41 |
val conjE : thm (* P \<and> Q \<Longrightarrow> (P \<Longrightarrow> Q \<Longrightarrow> R) \<Longrightarrow> R *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
42 |
val disjE : thm (* P \<or> Q \<Longrightarrow> (P \<Longrightarrow> R) \<Longrightarrow> (Q \<Longrightarrow> R) \<Longrightarrow> R *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
43 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
44 |
val not_not_conv : conv (* \<not> (\<not> P) \<equiv> P *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
45 |
val de_Morgan_conj_conv : conv (* \<not> (P \<and> Q) \<equiv> \<not> P \<or> \<not> Q *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
46 |
val de_Morgan_disj_conv : conv (* \<not> (P \<or> Q) \<equiv> \<not> P \<and> \<not> Q *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
47 |
val conj_disj_distribL_conv : conv (* P \<and> (Q \<or> R) \<equiv> (P \<and> Q) \<or> (P \<and> R) *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
48 |
val conj_disj_distribR_conv : conv (* (Q \<or> R) \<and> P \<equiv> (Q \<and> P) \<or> (R \<and> P) *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
49 |
|
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
50 |
end |
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
51 |
|
82026
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
52 |
signature BASE_ORDER_TAC_BASE = |
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
53 |
sig |
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
54 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
55 |
val order_trace_cfg : bool Config.T |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
56 |
val order_split_limit_cfg : int Config.T |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
57 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
58 |
datatype order_kind = Order | Linorder |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
59 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
60 |
type order_literal = (bool * Order_Procedure.order_atom) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
61 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
62 |
type order_ops = { eq : term, le : term, lt : term } |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
63 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
64 |
val map_order_ops : (term -> term) -> order_ops -> order_ops |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
65 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
66 |
type order_context = { |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
67 |
kind : order_kind, |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
68 |
ops : order_ops, |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
69 |
thms : (string * thm) list, conv_thms : (string * thm) list |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
70 |
} |
82026
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
71 |
|
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
72 |
end |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
73 |
|
82026
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
74 |
structure Base_Order_Tac_Base : BASE_ORDER_TAC_BASE = |
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
75 |
struct |
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
76 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
77 |
(* Control tracing output of the solver. *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
78 |
val order_trace_cfg = Attrib.setup_config_bool @{binding "order_trace"} (K false) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
79 |
(* In partial orders, literals of the form \<not> x < y will force the order solver to perform case |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
80 |
distinctions, which leads to an exponential blowup of the runtime. The split limit controls |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
81 |
the number of literals of this form that are passed to the solver. |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
82 |
*) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
83 |
val order_split_limit_cfg = Attrib.setup_config_int @{binding "order_split_limit"} (K 8) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
84 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
85 |
datatype order_kind = Order | Linorder |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
86 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
87 |
type order_literal = (bool * Order_Procedure.order_atom) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
88 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
89 |
type order_ops = { eq : term, le : term, lt : term } |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
90 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
91 |
fun map_order_ops f {eq, le, lt} = {eq = f eq, le = f le, lt = f lt} |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
92 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
93 |
type order_context = { |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
94 |
kind : order_kind, |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
95 |
ops : order_ops, |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
96 |
thms : (string * thm) list, conv_thms : (string * thm) list |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
97 |
} |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
98 |
|
82026
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
99 |
end |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
100 |
|
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
101 |
signature BASE_ORDER_TAC = |
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
102 |
sig |
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
103 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
104 |
include BASE_ORDER_TAC_BASE |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
105 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
106 |
type insert_prems_hook = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
107 |
order_kind -> order_ops -> Proof.context -> (thm * (bool * term * (term * term))) list |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
108 |
-> thm list |
82026
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
109 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
110 |
val declare_insert_prems_hook : |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
111 |
(binding * insert_prems_hook) -> local_theory -> local_theory |
82026
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
112 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
113 |
val insert_prems_hook_names : Proof.context -> binding list |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
114 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
115 |
val tac : |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
116 |
(order_literal Order_Procedure.fm -> Order_Procedure.prf_trm option) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
117 |
-> order_context -> thm list |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
118 |
-> Proof.context -> int -> tactic |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
119 |
|
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
120 |
end |
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
121 |
|
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
122 |
functor Base_Order_Tac( |
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
123 |
structure Logic_Sig : LOGIC_SIGNATURE; val excluded_types : typ list) : BASE_ORDER_TAC = |
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
124 |
struct |
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
125 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
126 |
open Base_Order_Tac_Base |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
127 |
open Order_Procedure |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
128 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
129 |
fun expect _ (SOME x) = x |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
130 |
| expect f NONE = f () |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
131 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
132 |
fun list_curry0 f = (fn [] => f, 0) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
133 |
fun list_curry1 f = (fn [x] => f x, 1) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
134 |
fun list_curry2 f = (fn [x, y] => f x y, 2) |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
135 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
136 |
fun dereify_term consts reifytab t = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
137 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
138 |
fun dereify_term' (App (t1, t2)) = (dereify_term' t1) $ (dereify_term' t2) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
139 |
| dereify_term' (Const s) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
140 |
AList.lookup (op =) consts s |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
141 |
|> expect (fn () => raise TERM ("Const " ^ s ^ " not in", map snd consts)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
142 |
| dereify_term' (Var v) = Reifytab.get_term (integer_of_int v) reifytab |> the |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
143 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
144 |
dereify_term' t |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
145 |
end |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
146 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
147 |
fun dereify_order_fm (eq, le, lt) reifytab t = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
148 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
149 |
val consts = [ |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
150 |
("eq", eq), ("le", le), ("lt", lt), |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
151 |
("Not", Logic_Sig.Not), ("disj", Logic_Sig.disj), ("conj", Logic_Sig.conj) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
152 |
] |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
153 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
154 |
dereify_term consts reifytab t |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
155 |
end |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
156 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
157 |
fun strip_AppP t = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
158 |
let fun strip (AppP (f, s), ss) = strip (f, s::ss) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
159 |
| strip x = x |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
160 |
in strip (t, []) end |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
161 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
162 |
fun replay_conv convs cvp = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
163 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
164 |
val convs = convs @ |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
165 |
[("all_conv", list_curry0 Conv.all_conv)] @ |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
166 |
map (apsnd list_curry1) [ |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
167 |
("atom_conv", I), |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
168 |
("neg_atom_conv", I), |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
169 |
("arg_conv", Conv.arg_conv)] @ |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
170 |
map (apsnd list_curry2) [ |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
171 |
("combination_conv", Conv.combination_conv), |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
172 |
("then_conv", curry (op then_conv))] |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
173 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
174 |
fun lookup_conv convs c = AList.lookup (op =) convs c |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
175 |
|> expect (fn () => error ("Can't replay conversion: " ^ c)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
176 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
177 |
fun rp_conv t = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
178 |
(case strip_AppP t ||> map rp_conv of |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
179 |
(PThm c, cvs) => |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
180 |
let val (conv, arity) = lookup_conv convs c |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
181 |
in if arity = length cvs |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
182 |
then conv cvs |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
183 |
else error ("Expected " ^ Int.toString arity ^ " arguments for conversion " ^ |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
184 |
c ^ " but got " ^ (length cvs |> Int.toString) ^ " arguments") |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
185 |
end |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
186 |
| _ => error "Unexpected constructor in conversion proof") |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
187 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
188 |
rp_conv cvp |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
189 |
end |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
190 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
191 |
fun replay_prf_trm replay_conv dereify ctxt thmtab assmtab p = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
192 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
193 |
fun replay_prf_trm' _ (PThm s) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
194 |
AList.lookup (op =) thmtab s |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
195 |
|> expect (fn () => error ("Cannot replay theorem: " ^ s)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
196 |
| replay_prf_trm' assmtab (Appt (p, t)) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
197 |
replay_prf_trm' assmtab p |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
198 |
|> Drule.infer_instantiate' ctxt [SOME (Thm.cterm_of ctxt (dereify t))] |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
199 |
| replay_prf_trm' assmtab (AppP (p1, p2)) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
200 |
apply2 (replay_prf_trm' assmtab) (p2, p1) |> op COMP |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
201 |
| replay_prf_trm' assmtab (AbsP (reified_t, p)) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
202 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
203 |
val t = dereify reified_t |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
204 |
val t_thm = Logic_Sig.mk_Trueprop t |> Thm.cterm_of ctxt |> Assumption.assume ctxt |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
205 |
val rp = replay_prf_trm' (Termtab.update (Thm.prop_of t_thm, t_thm) assmtab) p |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
206 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
207 |
Thm.implies_intr (Thm.cprop_of t_thm) rp |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
208 |
end |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
209 |
| replay_prf_trm' assmtab (Bound reified_t) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
210 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
211 |
val t = dereify reified_t |> Logic_Sig.mk_Trueprop |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
212 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
213 |
Termtab.lookup assmtab t |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
214 |
|> expect (fn () => raise TERM ("Assumption not found:", t::Termtab.keys assmtab)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
215 |
end |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
216 |
| replay_prf_trm' assmtab (Conv (t, cp, p)) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
217 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
218 |
val thm = replay_prf_trm' assmtab (Bound t) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
219 |
val conv = Logic_Sig.Trueprop_conv (replay_conv cp) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
220 |
val conv_thm = Conv.fconv_rule conv thm |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
221 |
val conv_term = Thm.prop_of conv_thm |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
222 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
223 |
replay_prf_trm' (Termtab.update (conv_term, conv_thm) assmtab) p |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
224 |
end |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
225 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
226 |
replay_prf_trm' assmtab p |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
227 |
end |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
228 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
229 |
fun replay_order_prf_trm ord_ops {thms = thms, conv_thms = conv_thms, ...} ctxt reifytab assmtab = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
230 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
231 |
val thmtab = thms @ [ |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
232 |
("conjE", Logic_Sig.conjE), ("conjI", Logic_Sig.conjI), ("disjE", Logic_Sig.disjE) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
233 |
] |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
234 |
val convs = map (apsnd list_curry0) ( |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
235 |
map (apsnd Conv.rewr_conv) conv_thms @ |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
236 |
[ |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
237 |
("not_not_conv", Logic_Sig.not_not_conv), |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
238 |
("de_Morgan_conj_conv", Logic_Sig.de_Morgan_conj_conv), |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
239 |
("de_Morgan_disj_conv", Logic_Sig.de_Morgan_disj_conv), |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
240 |
("conj_disj_distribR_conv", Logic_Sig.conj_disj_distribR_conv), |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
241 |
("conj_disj_distribL_conv", Logic_Sig.conj_disj_distribL_conv) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
242 |
]) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
243 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
244 |
val dereify = dereify_order_fm ord_ops reifytab |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
245 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
246 |
replay_prf_trm (replay_conv convs) dereify ctxt thmtab assmtab |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
247 |
end |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
248 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
249 |
fun strip_Not (nt $ t) = if nt = Logic_Sig.Not then t else nt $ t |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
250 |
| strip_Not t = t |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
251 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
252 |
fun limit_not_less lt ctxt decomp_prems = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
253 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
254 |
val trace = Config.get ctxt order_trace_cfg |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
255 |
val limit = Config.get ctxt order_split_limit_cfg |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
256 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
257 |
fun is_not_less_term t = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
258 |
case try (strip_Not o Logic_Sig.dest_Trueprop) t of |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
259 |
SOME (binop $ _ $ _) => binop = lt |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
260 |
| _ => false |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
261 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
262 |
val not_less_prems = filter (is_not_less_term o Thm.prop_of o fst) decomp_prems |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
263 |
val _ = if trace andalso length not_less_prems > limit |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
264 |
then tracing "order split limit exceeded" |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
265 |
else () |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
266 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
267 |
filter_out (is_not_less_term o Thm.prop_of o fst) decomp_prems @ |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
268 |
take limit not_less_prems |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
269 |
end |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
270 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
271 |
fun decomp {eq, le, lt} ctxt t = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
272 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
273 |
fun decomp'' (binop $ t1 $ t2) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
274 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
275 |
fun is_excluded t = exists (fn ty => ty = fastype_of t) excluded_types |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
276 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
277 |
open Order_Procedure |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
278 |
val thy = Proof_Context.theory_of ctxt |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
279 |
fun try_match pat = try (Pattern.match thy (pat, binop)) (Vartab.empty, Vartab.empty) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
280 |
in if is_excluded t1 then NONE |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
281 |
else case (try_match eq, try_match le, try_match lt) of |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
282 |
(SOME env, _, _) => SOME ((true, EQ, (t1, t2)), env) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
283 |
| (_, SOME env, _) => SOME ((true, LEQ, (t1, t2)), env) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
284 |
| (_, _, SOME env) => SOME ((true, LESS, (t1, t2)), env) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
285 |
| _ => NONE |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
286 |
end |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
287 |
| decomp'' _ = NONE |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
288 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
289 |
fun decomp' (nt $ t) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
290 |
if nt = Logic_Sig.Not |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
291 |
then decomp'' t |> Option.map (fn ((b, c, p), e) => ((not b, c, p), e)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
292 |
else decomp'' (nt $ t) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
293 |
| decomp' t = decomp'' t |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
294 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
295 |
try Logic_Sig.dest_Trueprop t |> Option.mapPartial decomp' |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
296 |
end |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
297 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
298 |
fun maximal_envs envs = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
299 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
300 |
fun test_opt p (SOME x) = p x |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
301 |
| test_opt _ NONE = false |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
302 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
303 |
fun leq_env (tyenv1, tenv1) (tyenv2, tenv2) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
304 |
Vartab.forall (fn (v, ty) => |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
305 |
Vartab.lookup tyenv2 v |> test_opt (fn ty2 => ty2 = ty)) tyenv1 |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
306 |
andalso |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
307 |
Vartab.forall (fn (v, (ty, t)) => |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
308 |
Vartab.lookup tenv2 v |> test_opt (fn (ty2, t2) => ty2 = ty andalso t2 aconv t)) tenv1 |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
309 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
310 |
fun fold_env (i, env) es = fold_index (fn (i2, env2) => fn es => |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
311 |
if i = i2 then es else if leq_env env env2 then (i, i2) :: es else es) envs es |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
312 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
313 |
val env_order = fold_index fold_env envs [] |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
314 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
315 |
val graph = fold_index (fn (i, env) => fn g => Int_Graph.new_node (i, env) g) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
316 |
envs Int_Graph.empty |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
317 |
val graph = fold Int_Graph.add_edge env_order graph |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
318 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
319 |
val strong_conns = Int_Graph.strong_conn graph |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
320 |
val maximals = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
321 |
filter (fn comp => length comp = length (Int_Graph.all_succs graph comp)) strong_conns |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
322 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
323 |
map (Int_Graph.all_preds graph) maximals |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
324 |
end |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
325 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
326 |
fun partition_prems octxt ctxt prems = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
327 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
328 |
fun these' _ [] = [] |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
329 |
| these' f (x :: xs) = case f x of NONE => these' f xs | SOME y => (x, y) :: these' f xs |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
330 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
331 |
val (decomp_prems, envs) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
332 |
these' (decomp (#ops octxt) ctxt o Thm.prop_of) prems |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
333 |
|> map_split (fn (thm, (l, env)) => ((thm, l), env)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
334 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
335 |
val env_groups = maximal_envs envs |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
336 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
337 |
map (fn is => (map (nth decomp_prems) is, nth envs (hd is))) env_groups |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
338 |
end |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
339 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
340 |
local |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
341 |
fun pretty_term_list ctxt = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
342 |
Pretty.list "" "" o map (Syntax.pretty_term (Config.put show_types true ctxt)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
343 |
fun pretty_type_of ctxt t = Pretty.block |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
344 |
[ Pretty.str "::", Pretty.brk 1 |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
345 |
, Pretty.quote (Syntax.pretty_typ ctxt (Term.fastype_of t)) ] |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
346 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
347 |
fun pretty_order_kind (okind : order_kind) = Pretty.str (@{make_string} okind) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
348 |
fun pretty_order_ops ctxt ({eq, le, lt} : order_ops) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
349 |
Pretty.block [pretty_term_list ctxt [eq, le, lt], Pretty.brk 1, pretty_type_of ctxt le] |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
350 |
end |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
351 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
352 |
type insert_prems_hook = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
353 |
order_kind -> order_ops -> Proof.context -> (thm * (bool * term * (term * term))) list |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
354 |
-> thm list |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
355 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
356 |
structure Insert_Prems_Hook_Data = Generic_Data( |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
357 |
type T = (binding * insert_prems_hook) list |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
358 |
val empty = [] |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
359 |
val merge = Library.merge ((op =) o apply2 fst) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
360 |
) |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
361 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
362 |
fun declare_insert_prems_hook (binding, hook) lthy = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
363 |
lthy |> Local_Theory.declaration {syntax = false, pervasive = false, pos = \<^here>} |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
364 |
(fn phi => fn context => |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
365 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
366 |
val binding = Morphism.binding phi binding |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
367 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
368 |
context |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
369 |
|> Insert_Prems_Hook_Data.map (Library.insert ((op =) o apply2 fst) (binding, hook)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
370 |
end) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
371 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
372 |
val insert_prems_hook_names = Context.Proof #> Insert_Prems_Hook_Data.get #> map fst |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
373 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
374 |
fun eval_insert_prems_hook kind order_ops ctxt decomp_prems (hookN, hook : insert_prems_hook) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
375 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
376 |
fun dereify_order_op' (EQ _) = #eq order_ops |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
377 |
| dereify_order_op' (LEQ _) = #le order_ops |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
378 |
| dereify_order_op' (LESS _) = #lt order_ops |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
379 |
fun dereify_order_op oop = (~1, ~1) |> apply2 Int_of_integer |> oop |> dereify_order_op' |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
380 |
val decomp_prems = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
381 |
decomp_prems |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
382 |
|> map (apsnd (fn (b, oop, (t1, t2)) => (b, dereify_order_op oop, (t1, t2)))) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
383 |
fun unzip (acc1, acc2) [] = (rev acc1, rev acc2) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
384 |
| unzip (acc1, acc2) ((thm, NONE) :: ps) = unzip (acc1, thm :: acc2) ps |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
385 |
| unzip (acc1, acc2) ((thm, SOME dp) :: ps) = unzip ((thm, dp) :: acc1, acc2) ps |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
386 |
val (decomp_extra_prems, invalid_extra_prems) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
387 |
hook kind order_ops ctxt decomp_prems |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
388 |
|> map (swap o ` (decomp order_ops ctxt o Thm.prop_of)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
389 |
|> unzip ([], []) |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
390 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
391 |
val pretty_thm_list = Pretty.list "" "" o map (Thm.pretty_thm ctxt) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
392 |
fun pretty_trace () = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
393 |
[ ("order kind:", pretty_order_kind kind) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
394 |
, ("order operators:", pretty_order_ops ctxt order_ops) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
395 |
, ("inserted premises:", pretty_thm_list (map fst decomp_extra_prems)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
396 |
, ("invalid premises:", pretty_thm_list invalid_extra_prems) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
397 |
] |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
398 |
|> map (fn (t, pp) => Pretty.block [Pretty.str t, Pretty.brk 1, pp]) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
399 |
|> Pretty.big_list ("insert premises hook " ^ Pretty.string_of (Binding.pretty hookN) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
400 |
^ " called with the parameters") |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
401 |
val trace = Config.get ctxt order_trace_cfg |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
402 |
val _ = if trace then tracing (Pretty.string_of (pretty_trace ())) else () |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
403 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
404 |
map (apsnd fst) decomp_extra_prems |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
405 |
end |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
406 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
407 |
fun order_tac raw_order_proc octxt simp_prems = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
408 |
Subgoal.FOCUS (fn {prems=prems, context=ctxt, ...} => |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
409 |
let |
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
410 |
val trace = Config.get ctxt order_trace_cfg |
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
411 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
412 |
fun order_tac' ([], _) = no_tac |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
413 |
| order_tac' (decomp_prems, env) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
414 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
415 |
val (order_ops as {eq, le, lt}) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
416 |
#ops octxt |> map_order_ops (Envir.eta_contract o Envir.subst_term env) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
417 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
418 |
val insert_prems_hooks = Insert_Prems_Hook_Data.get (Context.Proof ctxt) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
419 |
val inserted_decomp_prems = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
420 |
insert_prems_hooks |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
421 |
|> maps (eval_insert_prems_hook (#kind octxt) order_ops ctxt decomp_prems) |
74625
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents:
74561
diff
changeset
|
422 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
423 |
val decomp_prems = decomp_prems @ inserted_decomp_prems |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
424 |
val decomp_prems = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
425 |
case #kind octxt of |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
426 |
Order => limit_not_less lt ctxt decomp_prems |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
427 |
| _ => decomp_prems |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
428 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
429 |
fun reify_prem (_, (b, ctor, (x, y))) (ps, reifytab) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
430 |
(Reifytab.get_var x ##>> Reifytab.get_var y) reifytab |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
431 |
|>> (fn vp => (b, ctor (apply2 Int_of_integer vp)) :: ps) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
432 |
val (reified_prems, reifytab) = fold_rev reify_prem decomp_prems ([], Reifytab.empty) |
82026
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
433 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
434 |
val reified_prems_conj = foldl1 (fn (x, a) => And (x, a)) (map Atom reified_prems) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
435 |
val prems_conj_thm = map fst decomp_prems |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
436 |
|> foldl1 (fn (x, a) => Logic_Sig.conjI OF [x, a]) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
437 |
|> Conv.fconv_rule Thm.eta_conversion |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
438 |
val prems_conj = prems_conj_thm |> Thm.prop_of |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
439 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
440 |
val proof = raw_order_proc reified_prems_conj |
82026
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
441 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
442 |
val pretty_thm_list = Pretty.list "" "" o map (Thm.pretty_thm ctxt) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
443 |
fun pretty_trace () = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
444 |
[ ("order kind:", pretty_order_kind (#kind octxt)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
445 |
, ("order operators:", pretty_order_ops ctxt order_ops) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
446 |
, ("premises:", pretty_thm_list prems) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
447 |
, ("selected premises:", pretty_thm_list (map fst decomp_prems)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
448 |
, ("reified premises:", Pretty.str (@{make_string} reified_prems)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
449 |
, ("contradiction:", Pretty.str (@{make_string} (Option.isSome proof))) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
450 |
] |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
451 |
|> map (fn (t, pp) => Pretty.block [Pretty.str t, Pretty.brk 1, pp]) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
452 |
|> Pretty.big_list "order solver called with the parameters" |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
453 |
val _ = if trace then tracing (Pretty.string_of (pretty_trace ())) else () |
82026
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
454 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
455 |
val assmtab = Termtab.make [(prems_conj, prems_conj_thm)] |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
456 |
val replay = replay_order_prf_trm (eq, le, lt) octxt ctxt reifytab assmtab |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
457 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
458 |
case proof of |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
459 |
NONE => no_tac |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
460 |
| SOME p => SOLVED' (resolve_tac ctxt [replay p]) 1 |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
461 |
end |
74625
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents:
74561
diff
changeset
|
462 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
463 |
val prems = simp_prems @ prems |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
464 |
|> filter (fn p => null (Term.add_vars (Thm.prop_of p) [])) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
465 |
|> map (Conv.fconv_rule Thm.eta_conversion) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
466 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
467 |
partition_prems octxt ctxt prems |> map order_tac' |> FIRST |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
468 |
end) |
74625
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents:
74561
diff
changeset
|
469 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
470 |
val ad_absurdum_tac = SUBGOAL (fn (A, i) => |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
471 |
case try (Logic_Sig.dest_Trueprop o Logic.strip_assums_concl) A of |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
472 |
SOME (nt $ _) => |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
473 |
if nt = Logic_Sig.Not |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
474 |
then resolve0_tac [Logic_Sig.notI] i |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
475 |
else resolve0_tac [Logic_Sig.ccontr] i |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
476 |
| _ => resolve0_tac [Logic_Sig.ccontr] i) |
82026
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
477 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
478 |
fun tac raw_order_proc octxt simp_prems ctxt = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
479 |
ad_absurdum_tac THEN' order_tac raw_order_proc octxt simp_prems ctxt |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
480 |
|
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
481 |
end |
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
482 |
|
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
483 |
functor Order_Tac(structure Base_Tac : BASE_ORDER_TAC) = struct |
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
484 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
485 |
open Base_Tac |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
486 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
487 |
fun order_context_eq ({kind = kind1, ops = ops1, ...}, {kind = kind2, ops = ops2, ...}) = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
488 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
489 |
fun ops_list ops = [#eq ops, #le ops, #lt ops] |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
490 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
491 |
kind1 = kind2 andalso eq_list (op aconv) (apply2 ops_list (ops1, ops2)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
492 |
end |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
493 |
val order_data_eq = order_context_eq o apply2 fst |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
494 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
495 |
structure Data = Generic_Data( |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
496 |
type T = (order_context * (order_context -> thm list -> Proof.context -> int -> tactic)) list |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
497 |
val empty = [] |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
498 |
fun merge data = Library.merge order_data_eq data |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
499 |
) |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
500 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
501 |
fun declare (octxt as {kind = kind, raw_proc = raw_proc, ...}) lthy = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
502 |
lthy |> Local_Theory.declaration {syntax = false, pervasive = false, pos = \<^here>} |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
503 |
(fn phi => fn context => |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
504 |
let |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
505 |
val ops = map_order_ops (Morphism.term phi) (#ops octxt) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
506 |
val thms = map (fn (s, thm) => (s, Morphism.thm phi thm)) (#thms octxt) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
507 |
val conv_thms = map (fn (s, thm) => (s, Morphism.thm phi thm)) (#conv_thms octxt) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
508 |
val octxt' = {kind = kind, ops = ops, thms = thms, conv_thms = conv_thms} |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
509 |
in |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
510 |
context |> Data.map (Library.insert order_data_eq (octxt', raw_proc)) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
511 |
end) |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
512 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
513 |
fun declare_order { |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
514 |
ops = ops, |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
515 |
thms = { |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
516 |
trans = trans, (* x \<le> y \<Longrightarrow> y \<le> z \<Longrightarrow> x \<le> z *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
517 |
refl = refl, (* x \<le> x *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
518 |
eqD1 = eqD1, (* x = y \<Longrightarrow> x \<le> y *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
519 |
eqD2 = eqD2, (* x = y \<Longrightarrow> y \<le> x *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
520 |
antisym = antisym, (* x \<le> y \<Longrightarrow> y \<le> x \<Longrightarrow> x = y *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
521 |
contr = contr (* \<not> P \<Longrightarrow> P \<Longrightarrow> R *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
522 |
}, |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
523 |
conv_thms = { |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
524 |
less_le = less_le, (* x < y \<equiv> x \<le> y \<and> x \<noteq> y *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
525 |
nless_le = nless_le (* \<not> a < b \<equiv> \<not> a \<le> b \<or> a = b *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
526 |
} |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
527 |
} = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
528 |
declare { |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
529 |
kind = Order, |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
530 |
ops = ops, |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
531 |
thms = [("trans", trans), ("refl", refl), ("eqD1", eqD1), ("eqD2", eqD2), |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
532 |
("antisym", antisym), ("contr", contr)], |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
533 |
conv_thms = [("less_le", less_le), ("nless_le", nless_le)], |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
534 |
raw_proc = Base_Tac.tac Order_Procedure.po_contr_prf |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
535 |
} |
73526
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
nipkow
parents:
diff
changeset
|
536 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
537 |
fun declare_linorder { |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
538 |
ops = ops, |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
539 |
thms = { |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
540 |
trans = trans, (* x \<le> y \<Longrightarrow> y \<le> z \<Longrightarrow> x \<le> z *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
541 |
refl = refl, (* x \<le> x *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
542 |
eqD1 = eqD1, (* x = y \<Longrightarrow> x \<le> y *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
543 |
eqD2 = eqD2, (* x = y \<Longrightarrow> y \<le> x *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
544 |
antisym = antisym, (* x \<le> y \<Longrightarrow> y \<le> x \<Longrightarrow> x = y *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
545 |
contr = contr (* \<not> P \<Longrightarrow> P \<Longrightarrow> R *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
546 |
}, |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
547 |
conv_thms = { |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
548 |
less_le = less_le, (* x < y \<equiv> x \<le> y \<and> x \<noteq> y *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
549 |
nless_le = nless_le, (* \<not> x < y \<equiv> y \<le> x *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
550 |
nle_le = nle_le (* \<not> a \<le> b \<equiv> b \<le> a \<and> b \<noteq> a *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
551 |
} |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
552 |
} = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
553 |
declare { |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
554 |
kind = Linorder, |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
555 |
ops = ops, |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
556 |
thms = [("trans", trans), ("refl", refl), ("eqD1", eqD1), ("eqD2", eqD2), |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
557 |
("antisym", antisym), ("contr", contr)], |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
558 |
conv_thms = [("less_le", less_le), ("nless_le", nless_le), ("nle_le", nle_le)], |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
559 |
raw_proc = Base_Tac.tac Order_Procedure.lo_contr_prf |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
560 |
} |
82026
57b4e44f5bc4
add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents:
78095
diff
changeset
|
561 |
|
82027
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
562 |
(* Try to solve the goal by calling the order solver with each of the declared orders. *) |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
563 |
fun tac simp_prems ctxt = |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
564 |
let fun app_tac (octxt, tac0) = CHANGED o tac0 octxt simp_prems ctxt |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
565 |
in FIRST' (map app_tac (Data.get (Context.Proof ctxt))) end |
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
566 |
|
9c33627cea18
more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents:
82026
diff
changeset
|
567 |
end |