src/Tools/isac/Knowledge/Base_Tools.thy
author Walther Neuper <wneuper@ist.tugraz.at>
Thu, 29 Aug 2019 13:52:47 +0200
changeset 59602 89b3eaa34de6
parent 59600 0914ffedb4c5
child 59603 30cd47104ad7
permissions -rw-r--r--
prep. re-organisation of thys in ProgLang
wneuper@59424
     1
theory Base_Tools
wneuper@59600
     2
  imports  "../ProgLang/ProgLang" "../Interpret/Interpret" "../BridgeLibisabelle/BridgeLibisabelle"
wneuper@59600
     3
                                                          (*  ^^^ for KEStore_Elems.add_thes *)
wneuper@59424
     4
begin
wneuper@59602
     5
subsection \<open>theorems for Base_Tools\<close>
wneuper@59602
     6
axiomatization where (*for evaluating the assumptions of conditional rules*)
wneuper@59602
     7
wneuper@59602
     8
(*last_thmI:	        "lastI (x#xs) = (if xs =!= [] then x else lastI xs)" and*)
wneuper@59602
     9
  real_unari_minus:   "- a = (-1) * a" and
wneuper@59602
    10
  radd_left_cancel_le:"((k::real) + m <= k + n) = (m <= n)" and
wneuper@59602
    11
  (* should be in Rational.thy, but: 
wneuper@59602
    12
   needed for asms in e.g. d2_pqformula1 in PolyEq.ML, RootEq.ML...*)
wneuper@59602
    13
  rat_leq1:	      "[| b ~= 0; d ~= 0 |] ==>
wneuper@59602
    14
		       ((a / b) <= (c / d)) = ((a*d) <= (b*c))"(*Isa?*) and
wneuper@59602
    15
  rat_leq2:	      "d ~= 0 ==>
wneuper@59602
    16
		       ( a      <= (c / d)) = ((a*d) <=    c )"(*Isa?*) and
wneuper@59602
    17
  rat_leq3:	      "b ~= 0 ==>
wneuper@59602
    18
		       ((a / b) <=  c     ) = ( a    <= (b*c))"(*Isa?*)
wneuper@59602
    19
wneuper@59602
    20
subsection \<open>setup for ML-functions\<close>
wneuper@59602
    21
text \<open>required by "eval_binop" below\<close>
wneuper@59602
    22
setup \<open>KEStore_Elems.add_calcs
wneuper@59602
    23
  [ ("occurs_in", ("Atools.occurs'_in", eval_occurs_in "#occurs_in_")),
wneuper@59602
    24
    ("some_occur_in", ("Atools.some'_occur'_in", eval_some_occur_in "#some_occur_in_")),
wneuper@59602
    25
    ("is_atom", ("Atools.is'_atom", eval_is_atom "#is_atom_")),
wneuper@59602
    26
    ("is_even", ("Atools.is'_even", eval_is_even "#is_even_")),
wneuper@59602
    27
    ("is_const", ("Atools.is'_const", eval_const "#is_const_")),
wneuper@59602
    28
    ("le", ("Orderings.ord_class.less", eval_equ "#less_")),
wneuper@59602
    29
    ("leq", ("Orderings.ord_class.less_eq", eval_equ "#less_equal_")),
wneuper@59602
    30
    ("ident", ("Atools.ident", eval_ident "#ident_")),
wneuper@59602
    31
    ("equal", ("HOL.eq", eval_equal "#equal_")),
wneuper@59602
    32
    ("PLUS", ("Groups.plus_class.plus", eval_binop "#add_")),
wneuper@59602
    33
    ("MINUS", ("Groups.minus_class.minus", eval_binop "#sub_")),
wneuper@59602
    34
    ("TIMES", ("Groups.times_class.times", eval_binop "#mult_")),
wneuper@59602
    35
    ("DIVIDE", ("Rings.divide_class.divide", eval_cancel "#divide_e")),
wneuper@59602
    36
    ("POWER",("Atools.pow", eval_binop "#power_")),
wneuper@59602
    37
    ("boollist2sum", ("Atools.boollist2sum", eval_boollist2sum ""))]\<close>
wneuper@59602
    38
wneuper@59602
    39
subsection \<open>rewrite-order for rule-sets\<close>
wneuper@59602
    40
ML \<open>
wneuper@59602
    41
\<close> ML \<open>
wneuper@59602
    42
local
wneuper@59602
    43
  open Term;
wneuper@59602
    44
in
wneuper@59602
    45
  fun termlessI (_: Rule.subst) uv = LibraryC.termless uv;
wneuper@59602
    46
  fun term_ordI (_: Rule.subst) uv = Term_Ord.term_ord uv;
wneuper@59602
    47
end;
wneuper@59602
    48
\<close> ML \<open>
wneuper@59602
    49
(*TODO.WN0509 reduce ids: tless_true = e_rew_ord' = Rule.e_rew_ord = Rule.dummy_ord*)
wneuper@59602
    50
val tless_true = Rule.dummy_ord;
wneuper@59602
    51
Rule.rew_ord' := overwritel (! Rule.rew_ord', (*<<<---- use KEStore.xxx here, too*)
wneuper@59602
    52
			[("tless_true", tless_true),
wneuper@59602
    53
			 ("e_rew_ord'", tless_true),
wneuper@59602
    54
			 ("dummy_ord", Rule.dummy_ord)]);
wneuper@59602
    55
\<close>
wneuper@59602
    56
wneuper@59602
    57
subsection \<open>rule-sets\<close>
wneuper@59602
    58
ML \<open>
wneuper@59602
    59
\<close> ML \<open>
wneuper@59602
    60
val Atools_erls = Rule.append_rls "Atools_erls" Rule.e_rls
wneuper@59602
    61
  [ Rule.Calc ("HOL.eq", eval_equal "#equal_"),
wneuper@59602
    62
    Rule.Thm ("not_true", TermC.num_str @{thm not_true}),
wneuper@59602
    63
		(*"(~ True) = False"*)
wneuper@59602
    64
		Rule.Thm ("not_false", TermC.num_str @{thm not_false}),
wneuper@59602
    65
		(*"(~ False) = True"*)
wneuper@59602
    66
		Rule.Thm ("and_true", TermC.num_str @{thm and_true}),
wneuper@59602
    67
		(*"(?a & True) = ?a"*)
wneuper@59602
    68
		Rule.Thm ("and_false", TermC.num_str @{thm and_false}),
wneuper@59602
    69
		(*"(?a & False) = False"*)
wneuper@59602
    70
		Rule.Thm ("or_true", TermC.num_str @{thm or_true}),
wneuper@59602
    71
		(*"(?a | True) = True"*)
wneuper@59602
    72
		Rule.Thm ("or_false", TermC.num_str @{thm or_false}),
wneuper@59602
    73
		(*"(?a | False) = ?a"*)
wneuper@59602
    74
               
wneuper@59602
    75
		Rule.Thm ("rat_leq1", TermC.num_str @{thm rat_leq1}),
wneuper@59602
    76
		Rule.Thm ("rat_leq2", TermC.num_str @{thm rat_leq2}),
wneuper@59602
    77
		Rule.Thm ("rat_leq3", TermC.num_str @{thm rat_leq3}),
wneuper@59602
    78
      Rule.Thm ("refl", TermC.num_str @{thm refl}),
wneuper@59602
    79
		Rule.Thm ("order_refl", TermC.num_str @{thm order_refl}),
wneuper@59602
    80
		Rule.Thm ("radd_left_cancel_le", TermC.num_str @{thm radd_left_cancel_le}),
wneuper@59602
    81
		
wneuper@59602
    82
		Rule.Calc ("Orderings.ord_class.less", eval_equ "#less_"),
wneuper@59602
    83
		Rule.Calc ("Orderings.ord_class.less_eq", eval_equ "#less_equal_"),
wneuper@59602
    84
		
wneuper@59602
    85
		Rule.Calc ("Atools.ident", eval_ident "#ident_"),    
wneuper@59602
    86
		Rule.Calc ("Atools.is'_const", eval_const "#is_const_"),
wneuper@59602
    87
		Rule.Calc ("Atools.occurs'_in", eval_occurs_in ""),    
wneuper@59602
    88
		Rule.Calc ("Tools.matches", Tools.eval_matches "")];
wneuper@59602
    89
\<close>
wneuper@59602
    90
wneuper@59602
    91
ML \<open>
wneuper@59602
    92
val Atools_crls = Rule.append_rls "Atools_crls" Rule.e_rls
wneuper@59602
    93
  [ Rule.Calc ("HOL.eq", eval_equal "#equal_"),
wneuper@59602
    94
    Rule.Thm ("not_true", TermC.num_str @{thm not_true}),
wneuper@59602
    95
		Rule.Thm ("not_false", TermC.num_str @{thm not_false}),
wneuper@59602
    96
		Rule.Thm ("and_true", TermC.num_str @{thm and_true}),
wneuper@59602
    97
		Rule.Thm ("and_false", TermC.num_str @{thm and_false}),
wneuper@59602
    98
		Rule.Thm ("or_true", TermC.num_str @{thm or_true}),
wneuper@59602
    99
		Rule.Thm ("or_false", TermC.num_str @{thm or_false}),
wneuper@59602
   100
               
wneuper@59602
   101
		Rule.Thm ("rat_leq1", TermC.num_str @{thm rat_leq1}),
wneuper@59602
   102
		Rule.Thm ("rat_leq2", TermC.num_str @{thm rat_leq2}),
wneuper@59602
   103
		Rule.Thm ("rat_leq3", TermC.num_str @{thm rat_leq3}),
wneuper@59602
   104
		Rule.Thm ("refl", TermC.num_str @{thm refl}),
wneuper@59602
   105
		Rule.Thm ("order_refl", TermC.num_str @{thm order_refl}),
wneuper@59602
   106
		Rule.Thm ("radd_left_cancel_le", TermC.num_str @{thm radd_left_cancel_le}),
wneuper@59602
   107
		
wneuper@59602
   108
		Rule.Calc ("Orderings.ord_class.less", eval_equ "#less_"),
wneuper@59602
   109
		Rule.Calc ("Orderings.ord_class.less_eq", eval_equ "#less_equal_"),
wneuper@59602
   110
		
wneuper@59602
   111
		Rule.Calc ("Atools.ident", eval_ident "#ident_"),    
wneuper@59602
   112
		Rule.Calc ("Atools.is'_const", eval_const "#is_const_"),
wneuper@59602
   113
		Rule.Calc ("Atools.occurs'_in", eval_occurs_in ""),    
wneuper@59602
   114
		Rule.Calc ("Tools.matches", Tools.eval_matches "")];
wneuper@59602
   115
\<close>
wneuper@59602
   116
wneuper@59602
   117
subsection \<open>ONCE AGAIN extend rule-set for evaluating pre-conditions and program-expressions\<close>
wneuper@59602
   118
text \<open>requires "eval_binop" from above\<close>
wneuper@59602
   119
ML \<open>
wneuper@59602
   120
val list_rls = Rule.append_rls "list_rls" list_rls
wneuper@59602
   121
	[ Rule.Calc ("Groups.times_class.times",eval_binop "#mult_"),
wneuper@59602
   122
		Rule.Calc ("Groups.plus_class.plus", eval_binop "#add_"), 
wneuper@59602
   123
		Rule.Calc ("Orderings.ord_class.less",eval_equ "#less_"),
wneuper@59602
   124
		Rule.Calc ("Orderings.ord_class.less_eq",eval_equ "#less_equal_"),
wneuper@59602
   125
		Rule.Calc ("Atools.ident",eval_ident "#ident_"),
wneuper@59602
   126
		Rule.Calc ("HOL.eq",eval_equal "#equal_"),(*atom <> atom -> False*)
wneuper@59602
   127
       
wneuper@59602
   128
		Rule.Calc ("Tools.Vars",Tools.eval_var "#Vars_"),
wneuper@59602
   129
		
wneuper@59602
   130
		Rule.Thm ("if_True",TermC.num_str @{thm if_True}),
wneuper@59602
   131
		Rule.Thm ("if_False",TermC.num_str @{thm if_False})];
wneuper@59602
   132
wneuper@59602
   133
val list_rls = LTool.prep_rls @{theory} (Rule.merge_rls "list_erls"
wneuper@59602
   134
	(Rule.Rls {id = "replaced", preconds = [], rew_ord = ("termlessI", termlessI),
wneuper@59602
   135
    erls = Rule.Rls {id = "list_elrs", preconds = [], rew_ord = ("termlessI", termlessI), 
wneuper@59602
   136
    erls = Rule.e_rls, srls = Rule.Erls, calc = [], errpatts = [],
wneuper@59602
   137
    rules = [Rule.Calc ("Groups.plus_class.plus", eval_binop "#add_"),
wneuper@59602
   138
      Rule.Calc ("Orderings.ord_class.less", eval_equ "#less_")
wneuper@59602
   139
      (*    ~~~~~~ for nth_Cons_*)],
wneuper@59602
   140
    scr = Rule.EmptyScr},
wneuper@59602
   141
    srls = Rule.Erls, calc = [], errpatts = [],
wneuper@59602
   142
    rules = [], scr = Rule.EmptyScr})
wneuper@59602
   143
  list_rls);
wneuper@59602
   144
\<close>
wneuper@59602
   145
subsection \<open>setup for extended rule-set\<close>
wneuper@59602
   146
setup \<open>KEStore_Elems.add_rlss
wneuper@59602
   147
  [("list_rls", (Context.theory_name @{theory}, LTool.prep_rls @{theory} list_rls))]\<close>
wneuper@59602
   148
wneuper@59424
   149
end