wneuper@59424
|
1 |
theory Base_Tools
|
walther@60149
|
2 |
imports Interpret.Interpret
|
walther@60149
|
3 |
(** )"../BridgeJEdit/BridgeJEdit" ( *activate after devel.of BridgeJEdit*)
|
walther@60149
|
4 |
(**) "../BridgeLibisabelle/BridgeLibisabelle" (*remove after devel.of BridgeJEdit*)
|
walther@60149
|
5 |
(* ^^^ for KEStore_Elems.add_thes *)
|
wneuper@59424
|
6 |
begin
|
wneuper@59602
|
7 |
subsection \<open>theorems for Base_Tools\<close>
|
walther@60273
|
8 |
|
walther@60384
|
9 |
lemma real_unari_minus: "Not (a is_num) ==> - a = (-1) * (a::real)" by auto
|
walther@60318
|
10 |
(*lemma real_unari_minus: "- a = (-1) * (a::real)" by auto LOOPS WITH NUMERALS*)
|
walther@60273
|
11 |
(*Semiring_Normalization.comm_ring_1_class.ring_normalization_rules(1)*)
|
walther@60273
|
12 |
|
walther@60273
|
13 |
(* should be in Rational.thy, but needed for asms in e.g. d2_pqformula1 in PolyEq, RootEq... *)
|
walther@60274
|
14 |
lemma radd_left_cancel_le: "((k::real) + m \<le> k + n) = (m \<le> n)" by auto
|
walther@60273
|
15 |
(*Groups.ordered_ab_semigroup_add_imp_le_class.add_le_cancel_left*)
|
walther@60273
|
16 |
|
walther@60274
|
17 |
thm "Fields.linordered_field_class.mult_imp_le_div_pos" (*0 < ?y \<Longrightarrow> ?z * ?y \<le> ?x \<Longrightarrow> ?z \<le> ?x / ?y*)
|
walther@60274
|
18 |
|
wneuper@59602
|
19 |
axiomatization where (*for evaluating the assumptions of conditional rules*)
|
walther@60273
|
20 |
(* should be in Rational.thy, but needed for asms in e.g. d2_pqformula1 in PolyEq, RootEq... *)
|
walther@60274
|
21 |
rat_leq1: "0 \<noteq> b \<Longrightarrow> 0 \<noteq> d \<Longrightarrow> (a / b \<le> c / d) = (a * d \<le> b * c)"(*Quickcheck found a counterexample*) and
|
walther@60274
|
22 |
rat_leq2: "0 \<noteq> d \<Longrightarrow> (a \<le> c / d) = (a * d \<le> c)"(*Quickcheck found a counterexample*) and
|
walther@60274
|
23 |
rat_leq3: "0 \<noteq> b \<Longrightarrow> (a / b \<le> c ) = (a \<le> b * c)"(*Quickcheck found a counterexample*)
|
wneuper@59602
|
24 |
|
wneuper@59602
|
25 |
|
wneuper@59602
|
26 |
subsection \<open>setup for ML-functions\<close>
|
wneuper@59602
|
27 |
text \<open>required by "eval_binop" below\<close>
|
wenzelm@60313
|
28 |
calculation occurs_in = \<open>Prog_Expr.eval_occurs_in "#occurs_in_"\<close>
|
wenzelm@60313
|
29 |
calculation some_occur_in = \<open>Prog_Expr.eval_some_occur_in "#some_occur_in_"\<close>
|
wenzelm@60313
|
30 |
calculation is_atom = \<open>Prog_Expr.eval_is_atom "#is_atom_"\<close>
|
wenzelm@60313
|
31 |
calculation is_even = \<open>Prog_Expr.eval_is_even "#is_even_"\<close>
|
wenzelm@60313
|
32 |
calculation le (less) = \<open>Prog_Expr.eval_equ "#less_"\<close>
|
wenzelm@60313
|
33 |
calculation leq (less_eq) = \<open>Prog_Expr.eval_equ "#less_equal_"\<close>
|
wenzelm@60313
|
34 |
calculation ident = \<open>Prog_Expr.eval_ident "#ident_"\<close>
|
wenzelm@60313
|
35 |
calculation equal (HOL.eq) = \<open>Prog_Expr.eval_equal "#equal_"\<close>
|
wenzelm@60313
|
36 |
calculation PLUS (plus) = \<open>(**)eval_binop "#add_"\<close>
|
wenzelm@60313
|
37 |
calculation MINUS (minus) = \<open>(**)eval_binop "#sub_"\<close>
|
wenzelm@60313
|
38 |
calculation TIMES (times) = \<open>(**)eval_binop "#mult_"\<close>
|
wenzelm@60313
|
39 |
calculation DIVIDE (divide) = \<open>Prog_Expr.eval_cancel "#divide_e"\<close>
|
wenzelm@60313
|
40 |
calculation POWER (powr) = \<open>(**)eval_binop "#power_"\<close>
|
wenzelm@60313
|
41 |
calculation boollist2sum = \<open>Prog_Expr.eval_boollist2sum ""\<close>
|
wneuper@59602
|
42 |
|
wneuper@59602
|
43 |
subsection \<open>rewrite-order for rule-sets\<close>
|
wneuper@59602
|
44 |
ML \<open>
|
wneuper@59602
|
45 |
\<close> ML \<open>
|
wneuper@59602
|
46 |
local
|
wneuper@59602
|
47 |
open Term;
|
wneuper@59602
|
48 |
in
|
walther@59910
|
49 |
fun termlessI (_: subst) uv = LibraryC.termless uv;
|
walther@59910
|
50 |
fun term_ordI (_: subst) uv = Term_Ord.term_ord uv;
|
wneuper@59602
|
51 |
end;
|
wneuper@59602
|
52 |
\<close> ML \<open>
|
walther@59857
|
53 |
(*TODO.WN0509 reduce ids: tless_true = e_rew_ord' = Rewrite_Ord.e_rew_ord = Rewrite_Ord.dummy_ord*)
|
walther@59857
|
54 |
val tless_true = Rewrite_Ord.dummy_ord;
|
walther@59887
|
55 |
Rewrite_Ord.rew_ord' := overwritel (! Rewrite_Ord.rew_ord', (*<<<---- use Know_Store.xxx here, too*)
|
wneuper@59602
|
56 |
[("tless_true", tless_true),
|
wneuper@59602
|
57 |
("e_rew_ord'", tless_true),
|
walther@59857
|
58 |
("dummy_ord", Rewrite_Ord.dummy_ord)]);
|
wneuper@59602
|
59 |
\<close>
|
wneuper@59602
|
60 |
|
wneuper@59602
|
61 |
subsection \<open>rule-sets\<close>
|
wneuper@59602
|
62 |
ML \<open>
|
wneuper@59602
|
63 |
\<close> ML \<open>
|
walther@60358
|
64 |
val Atools_erls = Rule_Set.append_rules "Atools_erls" Rule_Set.empty [
|
walther@60358
|
65 |
\<^rule_eval>\<open>HOL.eq\<close> (Prog_Expr.eval_equal "#equal_"),
|
walther@60358
|
66 |
\<^rule_thm>\<open>not_true\<close>, (*"(~ True) = False"*)
|
walther@60358
|
67 |
\<^rule_thm>\<open>not_false\<close>, (*"(~ False) = True"*)
|
walther@60358
|
68 |
\<^rule_thm>\<open>and_true\<close>, (*"(?a & True) = ?a"*)
|
walther@60358
|
69 |
\<^rule_thm>\<open>and_false\<close>, (*"(?a & False) = False"*)
|
walther@60358
|
70 |
\<^rule_thm>\<open>or_true\<close>, (*"(?a | True) = True"*)
|
walther@60358
|
71 |
\<^rule_thm>\<open>or_false\<close>, (*"(?a | False) = ?a"*)
|
walther@60358
|
72 |
|
walther@60358
|
73 |
\<^rule_thm>\<open>rat_leq1\<close>,
|
walther@60358
|
74 |
\<^rule_thm>\<open>rat_leq2\<close>,
|
walther@60358
|
75 |
\<^rule_thm>\<open>rat_leq3\<close>,
|
walther@60358
|
76 |
\<^rule_thm>\<open>refl\<close>,
|
walther@60358
|
77 |
\<^rule_thm>\<open>order_refl\<close>,
|
walther@60358
|
78 |
\<^rule_thm>\<open>radd_left_cancel_le\<close>,
|
walther@60358
|
79 |
|
walther@60358
|
80 |
\<^rule_eval>\<open>less\<close> (Prog_Expr.eval_equ "#less_"),
|
walther@60358
|
81 |
\<^rule_eval>\<open>less_eq\<close> (Prog_Expr.eval_equ "#less_equal_"),
|
walther@60358
|
82 |
|
walther@60358
|
83 |
\<^rule_eval>\<open>Prog_Expr.ident\<close> (Prog_Expr.eval_ident "#ident_"),
|
walther@60385
|
84 |
\<^rule_eval>\<open>Prog_Expr.is_num\<close> (Prog_Expr.eval_is_num "#is_num_"),
|
walther@60358
|
85 |
\<^rule_eval>\<open>Prog_Expr.occurs_in\<close> (Prog_Expr.eval_occurs_in ""),
|
walther@60358
|
86 |
\<^rule_eval>\<open>Prog_Expr.matches\<close> (Prog_Expr.eval_matches "")];
|
wneuper@59602
|
87 |
\<close>
|
wneuper@59602
|
88 |
|
wneuper@59602
|
89 |
ML \<open>
|
walther@60358
|
90 |
val Atools_crls = Rule_Set.append_rules "Atools_crls" Rule_Set.empty [
|
walther@60358
|
91 |
\<^rule_eval>\<open>HOL.eq\<close> (Prog_Expr.eval_equal "#equal_"),
|
walther@60358
|
92 |
\<^rule_thm>\<open>not_true\<close>,
|
walther@60358
|
93 |
\<^rule_thm>\<open>not_false\<close>,
|
walther@60358
|
94 |
\<^rule_thm>\<open>and_true\<close>,
|
walther@60358
|
95 |
\<^rule_thm>\<open>and_false\<close>,
|
walther@60358
|
96 |
\<^rule_thm>\<open>or_true\<close>,
|
walther@60358
|
97 |
\<^rule_thm>\<open>or_false\<close>,
|
walther@60358
|
98 |
|
walther@60358
|
99 |
\<^rule_thm>\<open>rat_leq1\<close>,
|
walther@60358
|
100 |
\<^rule_thm>\<open>rat_leq2\<close>,
|
walther@60358
|
101 |
\<^rule_thm>\<open>rat_leq3\<close>,
|
walther@60358
|
102 |
\<^rule_thm>\<open>refl\<close>,
|
walther@60358
|
103 |
\<^rule_thm>\<open>order_refl\<close>,
|
walther@60358
|
104 |
\<^rule_thm>\<open>radd_left_cancel_le\<close>,
|
walther@60358
|
105 |
|
walther@60358
|
106 |
\<^rule_eval>\<open>less\<close> (Prog_Expr.eval_equ "#less_"),
|
walther@60358
|
107 |
\<^rule_eval>\<open>less_eq\<close> (Prog_Expr.eval_equ "#less_equal_"),
|
walther@60358
|
108 |
|
walther@60358
|
109 |
\<^rule_eval>\<open>Prog_Expr.ident\<close> (Prog_Expr.eval_ident "#ident_"),
|
walther@60385
|
110 |
\<^rule_eval>\<open>Prog_Expr.is_num\<close> (Prog_Expr.eval_is_num "#is_num_"),
|
walther@60358
|
111 |
\<^rule_eval>\<open>Prog_Expr.occurs_in\<close> (Prog_Expr.eval_occurs_in ""),
|
walther@60358
|
112 |
\<^rule_eval>\<open>Prog_Expr.matches\<close> (Prog_Expr.eval_matches "")];
|
wneuper@59602
|
113 |
\<close>
|
wneuper@59602
|
114 |
|
wneuper@59602
|
115 |
subsection \<open>ONCE AGAIN extend rule-set for evaluating pre-conditions and program-expressions\<close>
|
wneuper@59602
|
116 |
text \<open>requires "eval_binop" from above\<close>
|
wneuper@59602
|
117 |
ML \<open>
|
walther@60358
|
118 |
val prog_expr = Rule_Set.append_rules "prog_expr" prog_expr [
|
walther@60358
|
119 |
\<^rule_eval>\<open>times\<close> (**)(eval_binop "#mult_"),
|
walther@60358
|
120 |
\<^rule_eval>\<open>plus\<close> (**)(eval_binop "#add_"),
|
walther@60358
|
121 |
\<^rule_eval>\<open>less\<close> (Prog_Expr.eval_equ "#less_"),
|
walther@60358
|
122 |
\<^rule_eval>\<open>less_eq\<close> (Prog_Expr.eval_equ "#less_equal_"),
|
walther@60358
|
123 |
\<^rule_eval>\<open>Prog_Expr.ident\<close> (Prog_Expr.eval_ident "#ident_"),
|
walther@60358
|
124 |
\<^rule_eval>\<open>HOL.eq\<close> (Prog_Expr.eval_equal "#equal_"),(*atom <> atom -> False*)
|
walther@60358
|
125 |
|
walther@60358
|
126 |
\<^rule_eval>\<open>Prog_Expr.Vars\<close> (Prog_Expr.eval_var "#Vars_"),
|
walther@60358
|
127 |
|
walther@60358
|
128 |
\<^rule_thm>\<open>if_True\<close>,
|
walther@60358
|
129 |
\<^rule_thm>\<open>if_False\<close>];
|
wneuper@59602
|
130 |
|
walther@59852
|
131 |
val prog_expr = Auto_Prog.prep_rls @{theory} (Rule_Set.merge "list_erls"
|
walther@59851
|
132 |
(Rule_Def.Repeat {id = "replaced", preconds = [], rew_ord = ("termlessI", termlessI),
|
walther@59851
|
133 |
erls = Rule_Def.Repeat {id = "list_elrs", preconds = [], rew_ord = ("termlessI", termlessI),
|
walther@59852
|
134 |
erls = Rule_Set.empty, srls = Rule_Set.Empty, calc = [], errpatts = [],
|
walther@60358
|
135 |
rules = [
|
walther@60358
|
136 |
\<^rule_eval>\<open>plus\<close> (**)(eval_binop "#add_"),
|
walther@60358
|
137 |
\<^rule_eval>\<open>less\<close> (Prog_Expr.eval_equ "#less_") (*..for nth_Cons_*)],
|
walther@59878
|
138 |
scr = Rule.Empty_Prog},
|
walther@59851
|
139 |
srls = Rule_Set.Empty, calc = [], errpatts = [],
|
walther@59878
|
140 |
rules = [], scr = Rule.Empty_Prog})
|
walther@59801
|
141 |
prog_expr);
|
wneuper@59602
|
142 |
\<close>
|
wenzelm@60286
|
143 |
|
wneuper@59602
|
144 |
subsection \<open>setup for extended rule-set\<close>
|
wenzelm@60286
|
145 |
|
wenzelm@60289
|
146 |
rule_set_knowledge prog_expr = \<open>Auto_Prog.prep_rls @{theory} prog_expr\<close>
|
wneuper@59602
|
147 |
|
walther@60278
|
148 |
ML \<open>
|
walther@60278
|
149 |
\<close> ML \<open>
|
walther@60278
|
150 |
\<close> ML \<open>
|
walther@60278
|
151 |
\<close>
|
walther@60077
|
152 |
end
|