src/Tools/isac/Knowledge/Base_Tools.thy
author Walther Neuper <walther.neuper@jku.at>
Fri, 22 Jan 2021 14:56:44 +0100
changeset 60149 f01072d28542
parent 60077 bd5be37901f8
child 60273 f15995595411
permissions -rw-r--r--
step 5.4: clarify dependencies of BridgeJEdit.thy

note: BridgeJEdit is late in the graph in order to have Biegelinie.thy.
see "after devel.of BridgeJEdit"
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>
wneuper@59602
     8
axiomatization where (*for evaluating the assumptions of conditional rules*)
wneuper@59602
     9
wneuper@59602
    10
(*last_thmI:	        "lastI (x#xs) = (if xs =!= [] then x else lastI xs)" and*)
wneuper@59602
    11
  real_unari_minus:   "- a = (-1) * a" and
wneuper@59602
    12
  radd_left_cancel_le:"((k::real) + m <= k + n) = (m <= n)" and
wneuper@59602
    13
  (* should be in Rational.thy, but: 
wneuper@59602
    14
   needed for asms in e.g. d2_pqformula1 in PolyEq.ML, RootEq.ML...*)
wneuper@59602
    15
  rat_leq1:	      "[| b ~= 0; d ~= 0 |] ==>
wneuper@59602
    16
		       ((a / b) <= (c / d)) = ((a*d) <= (b*c))"(*Isa?*) and
wneuper@59602
    17
  rat_leq2:	      "d ~= 0 ==>
wneuper@59602
    18
		       ( a      <= (c / d)) = ((a*d) <=    c )"(*Isa?*) and
wneuper@59602
    19
  rat_leq3:	      "b ~= 0 ==>
wneuper@59602
    20
		       ((a / b) <=  c     ) = ( a    <= (b*c))"(*Isa?*)
wneuper@59602
    21
wneuper@59602
    22
subsection \<open>setup for ML-functions\<close>
wneuper@59602
    23
text \<open>required by "eval_binop" below\<close>
wneuper@59602
    24
setup \<open>KEStore_Elems.add_calcs
walther@59603
    25
  [ ("occurs_in", ("Prog_Expr.occurs'_in", Prog_Expr.eval_occurs_in "#occurs_in_")),
walther@59603
    26
    ("some_occur_in", ("Prog_Expr.some'_occur'_in", Prog_Expr.eval_some_occur_in "#some_occur_in_")),
walther@59603
    27
    ("is_atom", ("Prog_Expr.is'_atom", Prog_Expr.eval_is_atom "#is_atom_")),
walther@59603
    28
    ("is_even", ("Prog_Expr.is'_even", Prog_Expr.eval_is_even "#is_even_")),
walther@59603
    29
    ("is_const", ("Prog_Expr.is'_const", Prog_Expr.eval_const "#is_const_")),
walther@59603
    30
    ("le", ("Orderings.ord_class.less", Prog_Expr.eval_equ "#less_")),
walther@59603
    31
    ("leq", ("Orderings.ord_class.less_eq", Prog_Expr.eval_equ "#less_equal_")),
walther@59603
    32
    ("ident", ("Prog_Expr.ident", Prog_Expr.eval_ident "#ident_")),
walther@59603
    33
    ("equal", ("HOL.eq", Prog_Expr.eval_equal "#equal_")),
walther@59603
    34
    ("PLUS", ("Groups.plus_class.plus", (**)eval_binop "#add_")),
walther@59603
    35
    ("MINUS", ("Groups.minus_class.minus", (**)eval_binop "#sub_")),
walther@59603
    36
    ("TIMES", ("Groups.times_class.times", (**)eval_binop "#mult_")),
walther@59603
    37
    ("DIVIDE", ("Rings.divide_class.divide", Prog_Expr.eval_cancel "#divide_e")),
walther@59603
    38
    ("POWER",("Prog_Expr.pow", (**)eval_binop "#power_")),
walther@59603
    39
    ("boollist2sum", ("Prog_Expr.boollist2sum", Prog_Expr.eval_boollist2sum ""))]\<close>
wneuper@59602
    40
wneuper@59602
    41
subsection \<open>rewrite-order for rule-sets\<close>
wneuper@59602
    42
ML \<open>
wneuper@59602
    43
\<close> ML \<open>
wneuper@59602
    44
local
wneuper@59602
    45
  open Term;
wneuper@59602
    46
in
walther@59910
    47
  fun termlessI (_: subst) uv = LibraryC.termless uv;
walther@59910
    48
  fun term_ordI (_: subst) uv = Term_Ord.term_ord uv;
wneuper@59602
    49
end;
wneuper@59602
    50
\<close> ML \<open>
walther@59857
    51
(*TODO.WN0509 reduce ids: tless_true = e_rew_ord' = Rewrite_Ord.e_rew_ord = Rewrite_Ord.dummy_ord*)
walther@59857
    52
val tless_true = Rewrite_Ord.dummy_ord;
walther@59887
    53
Rewrite_Ord.rew_ord' := overwritel (! Rewrite_Ord.rew_ord', (*<<<---- use Know_Store.xxx here, too*)
wneuper@59602
    54
			[("tless_true", tless_true),
wneuper@59602
    55
			 ("e_rew_ord'", tless_true),
walther@59857
    56
			 ("dummy_ord", Rewrite_Ord.dummy_ord)]);
wneuper@59602
    57
\<close>
wneuper@59602
    58
wneuper@59602
    59
subsection \<open>rule-sets\<close>
wneuper@59602
    60
ML \<open>
wneuper@59602
    61
\<close> ML \<open>
walther@59852
    62
val Atools_erls = Rule_Set.append_rules "Atools_erls" Rule_Set.empty
walther@59878
    63
  [ Rule.Eval ("HOL.eq", Prog_Expr.eval_equal "#equal_"),
walther@59871
    64
    Rule.Thm ("not_true", ThmC.numerals_to_Free @{thm not_true}),
wneuper@59602
    65
		(*"(~ True) = False"*)
walther@59871
    66
		Rule.Thm ("not_false", ThmC.numerals_to_Free @{thm not_false}),
wneuper@59602
    67
		(*"(~ False) = True"*)
walther@59871
    68
		Rule.Thm ("and_true", ThmC.numerals_to_Free @{thm and_true}),
wneuper@59602
    69
		(*"(?a & True) = ?a"*)
walther@59871
    70
		Rule.Thm ("and_false", ThmC.numerals_to_Free @{thm and_false}),
wneuper@59602
    71
		(*"(?a & False) = False"*)
walther@59871
    72
		Rule.Thm ("or_true", ThmC.numerals_to_Free @{thm or_true}),
wneuper@59602
    73
		(*"(?a | True) = True"*)
walther@59871
    74
		Rule.Thm ("or_false", ThmC.numerals_to_Free @{thm or_false}),
wneuper@59602
    75
		(*"(?a | False) = ?a"*)
wneuper@59602
    76
               
walther@59871
    77
		Rule.Thm ("rat_leq1", ThmC.numerals_to_Free @{thm rat_leq1}),
walther@59871
    78
		Rule.Thm ("rat_leq2", ThmC.numerals_to_Free @{thm rat_leq2}),
walther@59871
    79
		Rule.Thm ("rat_leq3", ThmC.numerals_to_Free @{thm rat_leq3}),
walther@59871
    80
      Rule.Thm ("refl", ThmC.numerals_to_Free @{thm refl}),
walther@59871
    81
		Rule.Thm ("order_refl", ThmC.numerals_to_Free @{thm order_refl}),
walther@59871
    82
		Rule.Thm ("radd_left_cancel_le", ThmC.numerals_to_Free @{thm radd_left_cancel_le}),
wneuper@59602
    83
		
walther@59878
    84
		Rule.Eval ("Orderings.ord_class.less", Prog_Expr.eval_equ "#less_"),
walther@59878
    85
		Rule.Eval ("Orderings.ord_class.less_eq", Prog_Expr.eval_equ "#less_equal_"),
wneuper@59602
    86
		
walther@59878
    87
		Rule.Eval ("Prog_Expr.ident", Prog_Expr.eval_ident "#ident_"),    
walther@59878
    88
		Rule.Eval ("Prog_Expr.is'_const", Prog_Expr.eval_const "#is_const_"),
walther@59878
    89
		Rule.Eval ("Prog_Expr.occurs'_in", Prog_Expr.eval_occurs_in ""),    
walther@59878
    90
		Rule.Eval ("Prog_Expr.matches", Prog_Expr.eval_matches "")];
wneuper@59602
    91
\<close>
wneuper@59602
    92
wneuper@59602
    93
ML \<open>
walther@59852
    94
val Atools_crls = Rule_Set.append_rules "Atools_crls" Rule_Set.empty
walther@59878
    95
  [ Rule.Eval ("HOL.eq", Prog_Expr.eval_equal "#equal_"),
walther@59871
    96
    Rule.Thm ("not_true", ThmC.numerals_to_Free @{thm not_true}),
walther@59871
    97
		Rule.Thm ("not_false", ThmC.numerals_to_Free @{thm not_false}),
walther@59871
    98
		Rule.Thm ("and_true", ThmC.numerals_to_Free @{thm and_true}),
walther@59871
    99
		Rule.Thm ("and_false", ThmC.numerals_to_Free @{thm and_false}),
walther@59871
   100
		Rule.Thm ("or_true", ThmC.numerals_to_Free @{thm or_true}),
walther@59871
   101
		Rule.Thm ("or_false", ThmC.numerals_to_Free @{thm or_false}),
wneuper@59602
   102
               
walther@59871
   103
		Rule.Thm ("rat_leq1", ThmC.numerals_to_Free @{thm rat_leq1}),
walther@59871
   104
		Rule.Thm ("rat_leq2", ThmC.numerals_to_Free @{thm rat_leq2}),
walther@59871
   105
		Rule.Thm ("rat_leq3", ThmC.numerals_to_Free @{thm rat_leq3}),
walther@59871
   106
		Rule.Thm ("refl", ThmC.numerals_to_Free @{thm refl}),
walther@59871
   107
		Rule.Thm ("order_refl", ThmC.numerals_to_Free @{thm order_refl}),
walther@59871
   108
		Rule.Thm ("radd_left_cancel_le", ThmC.numerals_to_Free @{thm radd_left_cancel_le}),
wneuper@59602
   109
		
walther@59878
   110
		Rule.Eval ("Orderings.ord_class.less", Prog_Expr.eval_equ "#less_"),
walther@59878
   111
		Rule.Eval ("Orderings.ord_class.less_eq", Prog_Expr.eval_equ "#less_equal_"),
wneuper@59602
   112
		
walther@59878
   113
		Rule.Eval ("Prog_Expr.ident", Prog_Expr.eval_ident "#ident_"),    
walther@59878
   114
		Rule.Eval ("Prog_Expr.is'_const", Prog_Expr.eval_const "#is_const_"),
walther@59878
   115
		Rule.Eval ("Prog_Expr.occurs'_in", Prog_Expr.eval_occurs_in ""),    
walther@59878
   116
		Rule.Eval ("Prog_Expr.matches", Prog_Expr.eval_matches "")];
wneuper@59602
   117
\<close>
wneuper@59602
   118
wneuper@59602
   119
subsection \<open>ONCE AGAIN extend rule-set for evaluating pre-conditions and program-expressions\<close>
wneuper@59602
   120
text \<open>requires "eval_binop" from above\<close>
wneuper@59602
   121
ML \<open>
walther@59852
   122
val prog_expr = Rule_Set.append_rules "prog_expr" prog_expr
walther@59878
   123
	[ Rule.Eval ("Groups.times_class.times", (**)eval_binop "#mult_"),
walther@59878
   124
		Rule.Eval ("Groups.plus_class.plus", (**)eval_binop "#add_"), 
walther@59878
   125
		Rule.Eval ("Orderings.ord_class.less", Prog_Expr.eval_equ "#less_"),
walther@59878
   126
		Rule.Eval ("Orderings.ord_class.less_eq", Prog_Expr.eval_equ "#less_equal_"),
walther@59878
   127
		Rule.Eval ("Prog_Expr.ident", Prog_Expr.eval_ident "#ident_"),
walther@59878
   128
		Rule.Eval ("HOL.eq", Prog_Expr.eval_equal "#equal_"),(*atom <> atom -> False*)
wneuper@59602
   129
       
walther@59878
   130
		Rule.Eval ("Prog_Expr.Vars",Prog_Expr.eval_var "#Vars_"),
wneuper@59602
   131
		
walther@59871
   132
		Rule.Thm ("if_True",ThmC.numerals_to_Free @{thm if_True}),
walther@59871
   133
		Rule.Thm ("if_False",ThmC.numerals_to_Free @{thm if_False})];
wneuper@59602
   134
walther@59852
   135
val prog_expr = Auto_Prog.prep_rls @{theory} (Rule_Set.merge "list_erls"
walther@59851
   136
	(Rule_Def.Repeat {id = "replaced", preconds = [], rew_ord = ("termlessI", termlessI),
walther@59851
   137
    erls = Rule_Def.Repeat {id = "list_elrs", preconds = [], rew_ord = ("termlessI", termlessI), 
walther@59852
   138
    erls = Rule_Set.empty, srls = Rule_Set.Empty, calc = [], errpatts = [],
walther@59878
   139
    rules = [Rule.Eval ("Groups.plus_class.plus", (**)eval_binop "#add_"),
walther@59878
   140
      Rule.Eval ("Orderings.ord_class.less", Prog_Expr.eval_equ "#less_")
wneuper@59602
   141
      (*    ~~~~~~ for nth_Cons_*)],
walther@59878
   142
    scr = Rule.Empty_Prog},
walther@59851
   143
    srls = Rule_Set.Empty, calc = [], errpatts = [],
walther@59878
   144
    rules = [], scr = Rule.Empty_Prog})
walther@59801
   145
  prog_expr);
wneuper@59602
   146
\<close>
wneuper@59602
   147
subsection \<open>setup for extended rule-set\<close>
wneuper@59602
   148
setup \<open>KEStore_Elems.add_rlss
walther@59801
   149
  [("prog_expr", (Context.theory_name @{theory}, Auto_Prog.prep_rls @{theory} prog_expr))]\<close>
wneuper@59602
   150
walther@60077
   151
end