src/Tools/isac/Knowledge/Atools.thy
author Walther Neuper <neuper@ist.tugraz.at>
Wed, 25 Aug 2010 16:20:07 +0200
branchisac-update-Isa09-2
changeset 37947 22235e4dbe5f
parent 37946 src/Tools/isac/IsacKnowledge/Atools.thy@a28b5fc129b7
child 37948 ed85f172569c
permissions -rw-r--r--
renamed isac's directories and Build_Isac.thy

Scripts --> ProgLang
ME --> Interpret
IsacKnowledge --> Knowledge
neuper@37944
     1
(* Title:  tools for arithmetic
neuper@37944
     2
   Author: Walther Neuper 010308
neuper@37944
     3
   (c) due to copyright terms
neuper@37906
     4
neuper@37906
     5
remove_thy"Atools";
neuper@37947
     6
use_thy"Knowledge/Atools";
neuper@37947
     7
use_thy"Knowledge/Isac";
neuper@37906
     8
neuper@37947
     9
use_thy_only"Knowledge/Atools";
neuper@37947
    10
use_thy"Knowledge/Isac";
neuper@37906
    11
*)
neuper@37906
    12
neuper@37944
    13
theory Atools imports Descript Typefix begin
neuper@37906
    14
neuper@37906
    15
consts
neuper@37906
    16
neuper@37946
    17
  Arbfix           :: "real"
neuper@37946
    18
  Undef            :: "real"
neuper@37946
    19
  dummy            :: "real"
neuper@37946
    20
neuper@37946
    21
  some'_occur'_in  :: "[real list, 'a] => bool" ("some'_of _ occur'_in _")
neuper@37946
    22
  occurs'_in       :: "[real     , 'a] => bool" ("_ occurs'_in _")
neuper@37946
    23
neuper@37946
    24
  pow              :: "[real, real] => real"    (infixr "^^^" 80)
neuper@37946
    25
(* ~~~ power doesn't allow Free("2",real) ^ Free("2",nat)
neuper@37946
    26
                           ~~~~     ~~~~    ~~~~     ~~~*)
neuper@37947
    27
(*WN0603 at Frontend encoded strings to '^', 
neuper@37946
    28
	see 'fun encode', fun 'decode'*)
neuper@37946
    29
neuper@37946
    30
  abs              :: "real => real"            ("(|| _ ||)")
neuper@37946
    31
(* ~~~ FIXXXME Isabelle2002 has abs already !!!*)
neuper@37946
    32
  absset           :: "real set => real"        ("(||| _ |||)")
neuper@37946
    33
  (*is numeral constant ?*)
neuper@37946
    34
  is'_const        :: "real => bool"            ("_ is'_const" 10)
neuper@37946
    35
  (*is_const rename to is_num FIXXXME.WN.16.5.03 *)
neuper@37946
    36
  is'_atom         :: "real => bool"            ("_ is'_atom" 10)
neuper@37946
    37
  is'_even         :: "real => bool"            ("_ is'_even" 10)
neuper@37946
    38
		
neuper@37946
    39
  (* identity on term level*)
neuper@37946
    40
  ident            :: "['a, 'a] => bool"        ("(_ =!=/ _)" [51, 51] 50)
neuper@37946
    41
neuper@37946
    42
  argument'_in     :: "real => real"            ("argument'_in _" 10)
neuper@37946
    43
  sameFunId        :: "[real, bool] => bool"    (**"same'_funid _ _" 10
neuper@37946
    44
	WN0609 changed the id, because ".. _ _" inhibits currying**)
neuper@37946
    45
  filter'_sameFunId:: "[real, bool list] => bool list" 
neuper@37946
    46
					        ("filter'_sameFunId _ _" 10)
neuper@37946
    47
  boollist2sum     :: "bool list => real"
neuper@37946
    48
neuper@37946
    49
axioms (*for evaluating the assumptions of conditional rules*)
neuper@37946
    50
neuper@37946
    51
  last_thmI	      "lastI (x#xs) = (if xs =!= [] then x else lastI xs)"
neuper@37946
    52
  real_unari_minus    "- a = (-1) * a"           (*Isa!*)
neuper@37946
    53
neuper@37946
    54
  rle_refl            "(n::real) <= n"
neuper@37946
    55
(*reflI               "(t = t) = True"*)
neuper@37946
    56
  radd_left_cancel_le "((k::real) + m <= k + n) = (m <= n)"
neuper@37946
    57
  not_true            "(~ True) = False"
neuper@37946
    58
  not_false           "(~ False) = True"
neuper@37946
    59
  and_true            "(a & True) = a"
neuper@37946
    60
  and_false           "(a & False) = False"
neuper@37946
    61
  or_true             "(a | True) = True"
neuper@37946
    62
  or_false            "(a | False) = a"
neuper@37946
    63
  and_commute         "(a & b) = (b & a)"
neuper@37946
    64
  or_commute          "(a | b) = (b | a)"
neuper@37946
    65
neuper@37946
    66
  (*.should be in Rational.thy, but: 
neuper@37946
    67
   needed for asms in e.g. d2_pqformula1 in PolyEq.ML, RootEq.ML.*)
neuper@37946
    68
  rat_leq1	      "[| b ~= 0; d ~= 0 |] ==> \
neuper@37946
    69
		      \((a / b) <= (c / d)) = ((a*d) <= (b*c))"(*Isa?*)
neuper@37946
    70
  rat_leq2	      "d ~= 0 ==> \
neuper@37946
    71
		      \( a      <= (c / d)) = ((a*d) <=    c )"(*Isa?*)
neuper@37946
    72
  rat_leq3	      "b ~= 0 ==> \
neuper@37946
    73
		      \((a / b) <=  c     ) = ( a    <= (b*c))"(*Isa?*)
neuper@37946
    74
neuper@37946
    75
text {*copy from doc/math-eng.tex WN.28.3.03
neuper@37946
    76
WN071228 extended *}
neuper@37946
    77
neuper@37946
    78
neuper@37946
    79
section {*Coding standards*}
neuper@37946
    80
subsection {*Identifiers*}
neuper@37946
    81
text {*Naming is particularily crucial, because Isabelles name space is global, and isac does not yet use the novel locale features introduces by Isar. For instance, {\tt probe} sounds reasonable as (1) a description in the model of a problem-pattern, (2) as an element of the problem hierarchies key, (3) as a socalled CAS-command, (4) as the name of a related script etc. However, all the cases (1)..(4) require different typing for one and the same identifier {\tt probe} which is impossible, and actually leads to strange errors (for instance (1) is used as string, except in a script addressing a Subproblem).
neuper@37946
    82
neuper@37946
    83
This are the preliminary rules for naming identifiers>
neuper@37946
    84
\begin{description}
neuper@37946
    85
\item [elements of a key] into the hierarchy of problems or methods must not contain capital letters and may contain underscrores, e.g. {\tt probe, for_polynomials}.
neuper@37946
    86
\item [descriptions in problem-patterns] must contain at least 1 capital letter and must not contain underscores, e.g. {\tt Probe, forPolynomials}.
neuper@37946
    87
\item [CAS-commands] follow the same rules as descriptions in problem-patterns above, thus beware of conflicts~!
neuper@37946
    88
\item [script identifiers] always end with {\tt Script}, e.g. {\tt ProbeScript}.
neuper@37946
    89
\item [???] ???
neuper@37946
    90
\item [???] ???
neuper@37946
    91
\end{description}
neuper@37946
    92
%WN071228 extended *}
neuper@37946
    93
neuper@37946
    94
subsection {*Rule sets*}
neuper@37947
    95
text {*The actual version of the coding standards for rulesets is in {\tt /Knowledge/Atools.ML where it can be viewed using the knowledge browsers.
neuper@37946
    96
neuper@37946
    97
There are rulesets visible to the student, and there are rulesets visible (in general) only for math authors. There are also rulesets which {\em must} exist for {\em each} theory; these contain the identifier of the respective theory (including all capital letters) as indicated by {\it Thy} below.
neuper@37946
    98
\begin{description}
neuper@37946
    99
neuper@37946
   100
\item [norm\_{\it Thy}] exists for each theory, and {\em efficiently} calculates a normalform for all terms which can be expressed by the definitions of the respective theory (and the respective parents).
neuper@37946
   101
neuper@37946
   102
\item [simplify\_{\it Thy}] exists for each theory, and calculates a normalform for all terms which can be expressed by the definitions of the respective theory (and the respective parents) such, that the rewrites can be presented to the student.
neuper@37946
   103
neuper@37946
   104
\item [calculate\_{\it Thy}] exists for each theory, and evaluates terms with numerical constants only (i.e. all terms which can be expressed by the definitions of the respective theory and the respective parent theories). In particular, this ruleset includes evaluating in/equalities with numerical constants only.
neuper@37946
   105
WN.3.7.03: may be dropped due to more generality: numericals and non-numericals are logically equivalent, where the latter often add to the assumptions (e.g. in Check_elementwise).
neuper@37946
   106
\end{description}
neuper@37946
   107
neuper@37946
   108
The above rulesets are all visible to the user, and also may be input; thus they must be contained in the global associationlist {\tt ruleset':= }~! All these rulesets must undergo a preparation using the function {\tt prep_rls}, which generates a script for stepwise rewriting etc.
neuper@37946
   109
The following rulesets are used for internal purposes and usually invisible to the (naive) user:
neuper@37946
   110
\begin{description}
neuper@37946
   111
neuper@37946
   112
\item [*\_erls] 
neuper@37946
   113
\item [*\_prls] 
neuper@37946
   114
\item [*\_srls] 
neuper@37946
   115
neuper@37946
   116
\end{description}
neuper@37946
   117
{\tt append_rls, merge_rls, remove_rls}
neuper@37946
   118
*}
neuper@37946
   119
neuper@37946
   120
ML {*
neuper@37946
   121
neuper@37946
   122
(** evaluation of numerals and special predicates on the meta-level **)
neuper@37946
   123
(*-------------------------functions---------------------*)
neuper@37946
   124
local (* rlang 09.02 *)
neuper@37946
   125
    (*.a 'c is coefficient of v' if v does occur in c.*)
neuper@37946
   126
    fun coeff_in v c = member op = (vars c) v;
neuper@37946
   127
in
neuper@37946
   128
    fun occurs_in v t = coeff_in v t;
neuper@37946
   129
end;
neuper@37946
   130
neuper@37946
   131
(*("occurs_in", ("Atools.occurs'_in", eval_occurs_in ""))*)
neuper@37946
   132
fun eval_occurs_in _ "Atools.occurs'_in"
neuper@37946
   133
	     (p as (Const ("Atools.occurs'_in",_) $ v $ t)) _ =
neuper@37946
   134
    ((*writeln("@@@ eval_occurs_in: v= "^(term2str v));
neuper@37946
   135
     writeln("@@@ eval_occurs_in: t= "^(term2str t));*)
neuper@37946
   136
     if occurs_in v t
neuper@37946
   137
    then SOME ((term2str p) ^ " = True",
neuper@37946
   138
	  Trueprop $ (mk_equality (p, HOLogic.true_const)))
neuper@37946
   139
    else SOME ((term2str p) ^ " = False",
neuper@37946
   140
	  Trueprop $ (mk_equality (p, HOLogic.false_const))))
neuper@37946
   141
  | eval_occurs_in _ _ _ _ = NONE;
neuper@37946
   142
neuper@37946
   143
(*some of the (bound) variables (eg. in an eqsys) "vs" occur in term "t"*)   
neuper@37946
   144
fun some_occur_in vs t = 
neuper@37946
   145
    let fun occurs_in' a b = occurs_in b a
neuper@37946
   146
    in foldl or_ (false, map (occurs_in' t) vs) end;
neuper@37946
   147
neuper@37946
   148
(*("some_occur_in", ("Atools.some'_occur'_in", 
neuper@37946
   149
			eval_some_occur_in "#eval_some_occur_in_"))*)
neuper@37946
   150
fun eval_some_occur_in _ "Atools.some'_occur'_in"
neuper@37946
   151
			  (p as (Const ("Atools.some'_occur'_in",_) 
neuper@37946
   152
				       $ vs $ t)) _ =
neuper@37946
   153
    if some_occur_in (isalist2list vs) t
neuper@37946
   154
    then SOME ((term2str p) ^ " = True",
neuper@37946
   155
	       Trueprop $ (mk_equality (p, HOLogic.true_const)))
neuper@37946
   156
    else SOME ((term2str p) ^ " = False",
neuper@37946
   157
	       Trueprop $ (mk_equality (p, HOLogic.false_const)))
neuper@37946
   158
  | eval_some_occur_in _ _ _ _ = NONE;
neuper@37946
   159
neuper@37946
   160
neuper@37946
   161
neuper@37946
   162
neuper@37946
   163
(*evaluate 'is_atom'*)
neuper@37946
   164
(*("is_atom",("Atools.is'_atom",eval_is_atom "#is_atom_"))*)
neuper@37946
   165
fun eval_is_atom (thmid:string) "Atools.is'_atom"
neuper@37946
   166
		 (t as (Const(op0,_) $ arg)) thy = 
neuper@37946
   167
    (case arg of 
neuper@37946
   168
	 Free (n,_) => SOME (mk_thmid thmid op0 n "", 
neuper@37946
   169
			      Trueprop $ (mk_equality (t, true_as_term)))
neuper@37946
   170
       | _ => SOME (mk_thmid thmid op0 "" "", 
neuper@37946
   171
		    Trueprop $ (mk_equality (t, false_as_term))))
neuper@37946
   172
  | eval_is_atom _ _ _ _ = NONE;
neuper@37946
   173
neuper@37946
   174
(*evaluate 'is_even'*)
neuper@37946
   175
fun even i = (i div 2) * 2 = i;
neuper@37946
   176
(*("is_even",("Atools.is'_even",eval_is_even "#is_even_"))*)
neuper@37946
   177
fun eval_is_even (thmid:string) "Atools.is'_even"
neuper@37946
   178
		 (t as (Const(op0,_) $ arg)) thy = 
neuper@37946
   179
    (case arg of 
neuper@37946
   180
	Free (n,_) =>
neuper@37946
   181
	 (case int_of_str n of
neuper@37946
   182
	      SOME i =>
neuper@37946
   183
	      if even i then SOME (mk_thmid thmid op0 n "", 
neuper@37946
   184
				   Trueprop $ (mk_equality (t, true_as_term)))
neuper@37946
   185
	      else SOME (mk_thmid thmid op0 "" "", 
neuper@37946
   186
			 Trueprop $ (mk_equality (t, false_as_term)))
neuper@37946
   187
	    | _ => NONE)
neuper@37946
   188
       | _ => NONE)
neuper@37946
   189
  | eval_is_even _ _ _ _ = NONE; 
neuper@37946
   190
neuper@37946
   191
(*evaluate 'is_const'*)
neuper@37946
   192
(*("is_const",("Atools.is'_const",eval_const "#is_const_"))*)
neuper@37946
   193
fun eval_const (thmid:string) _(*"Atools.is'_const" WN050820 diff.beh. rooteq*)
neuper@37946
   194
	       (t as (Const(op0,t0) $ arg)) (thy:theory) = 
neuper@37946
   195
    (*eval_const FIXXXXXME.WN.16.5.03 still forgets ComplexI*)
neuper@37946
   196
    (case arg of 
neuper@37946
   197
       Const (n1,_) =>
neuper@37946
   198
	 SOME (mk_thmid thmid op0 n1 "", 
neuper@37946
   199
	       Trueprop $ (mk_equality (t, false_as_term)))
neuper@37946
   200
     | Free (n1,_) =>
neuper@37946
   201
	 if is_numeral n1
neuper@37946
   202
	   then SOME (mk_thmid thmid op0 n1 "", 
neuper@37946
   203
		      Trueprop $ (mk_equality (t, true_as_term)))
neuper@37946
   204
	 else SOME (mk_thmid thmid op0 n1 "", 
neuper@37946
   205
		    Trueprop $ (mk_equality (t, false_as_term)))
neuper@37946
   206
     | Const ("Float.Float",_) =>
neuper@37946
   207
       SOME (mk_thmid thmid op0 (term2str arg) "", 
neuper@37946
   208
	     Trueprop $ (mk_equality (t, true_as_term)))
neuper@37946
   209
     | _ => (*NONE*)
neuper@37946
   210
       SOME (mk_thmid thmid op0 (term2str arg) "", 
neuper@37946
   211
		    Trueprop $ (mk_equality (t, false_as_term))))
neuper@37946
   212
  | eval_const _ _ _ _ = NONE; 
neuper@37946
   213
neuper@37946
   214
(*. evaluate binary, associative, commutative operators: *,+,^ .*)
neuper@37946
   215
(*("PLUS"    ,("op +"        ,eval_binop "#add_")),
neuper@37946
   216
  ("TIMES"   ,("op *"        ,eval_binop "#mult_")),
neuper@37946
   217
  ("POWER"  ,("Atools.pow"  ,eval_binop "#power_"))*)
neuper@37946
   218
neuper@37946
   219
(* val (thmid,op_,t as(Const (op0,t0) $ Free (n1,t1) $ Free(n2,t2)),thy) =
neuper@37946
   220
       ("xxxxxx",op_,t,thy);
neuper@37946
   221
   *)
neuper@37946
   222
fun mk_thmid_f thmid ((v11, v12), (p11, p12)) ((v21, v22), (p21, p22))  = 
neuper@37946
   223
    thmid ^ "Float ((" ^ 
neuper@37946
   224
    (string_of_int v11)^","^(string_of_int v12)^"), ("^
neuper@37946
   225
    (string_of_int p11)^","^(string_of_int p12)^")) __ (("^
neuper@37946
   226
    (string_of_int v21)^","^(string_of_int v22)^"), ("^
neuper@37946
   227
    (string_of_int p21)^","^(string_of_int p22)^"))";
neuper@37946
   228
neuper@37946
   229
(*.convert int and float to internal floatingpoint prepresentation.*)
neuper@37946
   230
fun numeral (Free (str, T)) = 
neuper@37946
   231
    (case int_of_str str of
neuper@37946
   232
	 SOME i => SOME ((i, 0), (0, 0))
neuper@37946
   233
       | NONE => NONE)
neuper@37946
   234
  | numeral (Const ("Float.Float", _) $
neuper@37946
   235
		   (Const ("Pair", _) $
neuper@37946
   236
			  (Const ("Pair", T) $ Free (v1, _) $ Free (v2,_)) $
neuper@37946
   237
			  (Const ("Pair", _) $ Free (p1, _) $ Free (p2,_))))=
neuper@37946
   238
    (case (int_of_str v1, int_of_str v2, int_of_str p1, int_of_str p2) of
neuper@37946
   239
	(SOME v1', SOME v2', SOME p1', SOME p2') =>
neuper@37946
   240
	SOME ((v1', v2'), (p1', p2'))
neuper@37946
   241
      | _ => NONE)
neuper@37946
   242
  | numeral _ = NONE;
neuper@37946
   243
neuper@37946
   244
(*.evaluate binary associative operations.*)
neuper@37946
   245
fun eval_binop (thmid:string) (op_:string) 
neuper@37946
   246
	       (t as ( Const(op0,t0) $ 
neuper@37946
   247
			    (Const(op0',t0') $ v $ t1) $ t2)) 
neuper@37946
   248
	       thy =                                     (*binary . (v.n1).n2*)
neuper@37946
   249
    if op0 = op0' then
neuper@37946
   250
	case (numeral t1, numeral t2) of
neuper@37946
   251
	    (SOME n1, SOME n2) =>
neuper@37946
   252
	    let val (T1,T2,Trange) = dest_binop_typ t0
neuper@37946
   253
		val res = calc (if op0 = "op -" then "op +" else op0) n1 n2
neuper@37946
   254
		(*WN071229 "HOL.divide" never tried*)
neuper@37946
   255
		val rhs = var_op_float v op_ t0 T1 res
neuper@37946
   256
		val prop = Trueprop $ (mk_equality (t, rhs))
neuper@37946
   257
	    in SOME (mk_thmid_f thmid n1 n2, prop) end
neuper@37946
   258
	  | _ => NONE
neuper@37946
   259
    else NONE
neuper@37946
   260
  | eval_binop (thmid:string) (op_:string) 
neuper@37946
   261
	       (t as 
neuper@37946
   262
		  (Const (op0, t0) $ t1 $ 
neuper@37946
   263
			 (Const (op0', t0') $ t2 $ v))) 
neuper@37946
   264
	       thy =                                     (*binary . n1.(n2.v)*)
neuper@37946
   265
  if op0 = op0' then
neuper@37946
   266
	case (numeral t1, numeral t2) of
neuper@37946
   267
	    (SOME n1, SOME n2) =>
neuper@37946
   268
	    if op0 = "op -" then NONE else
neuper@37946
   269
	    let val (T1,T2,Trange) = dest_binop_typ t0
neuper@37946
   270
		val res = calc op0 n1 n2
neuper@37946
   271
		val rhs = float_op_var v op_ t0 T1 res
neuper@37946
   272
		val prop = Trueprop $ (mk_equality (t, rhs))
neuper@37946
   273
	    in SOME (mk_thmid_f thmid n1 n2, prop) end
neuper@37946
   274
	  | _ => NONE
neuper@37946
   275
  else NONE
neuper@37946
   276
    
neuper@37946
   277
  | eval_binop (thmid:string) (op_:string)
neuper@37946
   278
	       (t as (Const (op0,t0) $ t1 $ t2)) thy =       (*binary . n1.n2*)
neuper@37946
   279
    (case (numeral t1, numeral t2) of
neuper@37946
   280
	 (SOME n1, SOME n2) =>
neuper@37946
   281
	 let val (T1,T2,Trange) = dest_binop_typ t0;
neuper@37946
   282
	     val res = calc op0 n1 n2;
neuper@37946
   283
	     val rhs = term_of_float Trange res;
neuper@37946
   284
	     val prop = Trueprop $ (mk_equality (t, rhs));
neuper@37946
   285
	 in SOME (mk_thmid_f thmid n1 n2, prop) end
neuper@37946
   286
       | _ => NONE)
neuper@37946
   287
  | eval_binop _ _ _ _ = NONE; 
neuper@37946
   288
(*
neuper@37946
   289
> val SOME (thmid, t) = eval_binop "#add_" "op +" (str2term "-1 + 2") thy;
neuper@37946
   290
> term2str t;
neuper@37946
   291
val it = "-1 + 2 = 1"
neuper@37946
   292
> val t = str2term "-1 * (-1 * a)";
neuper@37946
   293
> val SOME (thmid, t) = eval_binop "#mult_" "op *" t thy;
neuper@37946
   294
> term2str t;
neuper@37946
   295
val it = "-1 * (-1 * a) = 1 * a"*)
neuper@37946
   296
neuper@37946
   297
neuper@37946
   298
neuper@37946
   299
(*.evaluate < and <= for numerals.*)
neuper@37946
   300
(*("le"      ,("op <"        ,eval_equ "#less_")),
neuper@37946
   301
  ("leq"     ,("op <="       ,eval_equ "#less_equal_"))*)
neuper@37946
   302
fun eval_equ (thmid:string) (op_:string) (t as 
neuper@37946
   303
	       (Const (op0,t0) $ Free (n1,t1) $ Free(n2,t2))) thy = 
neuper@37946
   304
    (case (int_of_str n1, int_of_str n2) of
neuper@37946
   305
	 (SOME n1', SOME n2') =>
neuper@37946
   306
  if calc_equ (strip_thy op0) (n1', n2')
neuper@37946
   307
    then SOME (mk_thmid thmid op0 n1 n2, 
neuper@37946
   308
	  Trueprop $ (mk_equality (t, true_as_term)))
neuper@37946
   309
  else SOME (mk_thmid thmid op0 n1 n2,  
neuper@37946
   310
	  Trueprop $ (mk_equality (t, false_as_term)))
neuper@37946
   311
       | _ => NONE)
neuper@37946
   312
    
neuper@37946
   313
  | eval_equ _ _ _ _ = NONE;
neuper@37946
   314
neuper@37946
   315
neuper@37946
   316
(*evaluate identity
neuper@37946
   317
> reflI;
neuper@37946
   318
val it = "(?t = ?t) = True"
neuper@37946
   319
> val t = str2term "x = 0";
neuper@37946
   320
> val NONE = rewrite_ thy dummy_ord e_rls false reflI t;
neuper@37946
   321
neuper@37946
   322
> val t = str2term "1 = 0";
neuper@37946
   323
> val NONE = rewrite_ thy dummy_ord e_rls false reflI t;
neuper@37946
   324
----------- thus needs Calc !
neuper@37946
   325
> val t = str2term "0 = 0";
neuper@37946
   326
> val SOME (t',_) = rewrite_ thy dummy_ord e_rls false reflI t;
neuper@37946
   327
> term2str t';
neuper@37946
   328
val it = "True"
neuper@37946
   329
neuper@37946
   330
val t = str2term "Not (x = 0)";
neuper@37946
   331
atomt t; term2str t;
neuper@37946
   332
*** -------------
neuper@37946
   333
*** Const ( Not)
neuper@37946
   334
*** . Const ( op =)
neuper@37946
   335
*** . . Free ( x, )
neuper@37946
   336
*** . . Free ( 0, )
neuper@37946
   337
val it = "x ~= 0" : string*)
neuper@37946
   338
neuper@37946
   339
(*.evaluate identity on the term-level, =!= ,i.e. without evaluation of 
neuper@37946
   340
  the arguments: thus special handling by 'fun eval_binop'*)
neuper@37946
   341
(*("ident"   ,("Atools.ident",eval_ident "#ident_")):calc*)
neuper@37946
   342
fun eval_ident (thmid:string) "Atools.ident" (t as 
neuper@37946
   343
	       (Const (op0,t0) $ t1 $ t2 )) thy = 
neuper@37946
   344
  if t1 = t2
neuper@37946
   345
    then SOME (mk_thmid thmid op0 
neuper@37946
   346
	       ("("^(Syntax.string_of_term (thy2ctxt thy) t1)^")")
neuper@37946
   347
	       ("("^(Syntax.string_of_term (thy2ctxt thy) t2)^")"), 
neuper@37946
   348
	  Trueprop $ (mk_equality (t, true_as_term)))
neuper@37946
   349
  else SOME (mk_thmid thmid op0  
neuper@37946
   350
	       ("("^(Syntax.string_of_term (thy2ctxt thy) t1)^")")
neuper@37946
   351
	       ("("^(Syntax.string_of_term (thy2ctxt thy) t2)^")"),  
neuper@37946
   352
	  Trueprop $ (mk_equality (t, false_as_term)))
neuper@37946
   353
  | eval_ident _ _ _ _ = NONE;
neuper@37946
   354
(* TODO
neuper@37946
   355
> val t = str2term "x =!= 0";
neuper@37946
   356
> val SOME (str, t') = eval_ident "ident_" "b" t thy;
neuper@37946
   357
> term2str t';
neuper@37946
   358
val str = "ident_(x)_(0)" : string
neuper@37946
   359
val it = "(x =!= 0) = False" : string                                
neuper@37946
   360
> val t = str2term "1 =!= 0";
neuper@37946
   361
> val SOME (str, t') = eval_ident "ident_" "b" t thy;
neuper@37946
   362
> term2str t';
neuper@37946
   363
val str = "ident_(1)_(0)" : string 
neuper@37946
   364
val it = "(1 =!= 0) = False" : string                                       
neuper@37946
   365
> val t = str2term "0 =!= 0";
neuper@37946
   366
> val SOME (str, t') = eval_ident "ident_" "b" t thy;
neuper@37946
   367
> term2str t';
neuper@37946
   368
val str = "ident_(0)_(0)" : string
neuper@37946
   369
val it = "(0 =!= 0) = True" : string
neuper@37946
   370
*)
neuper@37946
   371
neuper@37946
   372
(*.evaluate identity of terms, which stay ready for evaluation in turn;
neuper@37946
   373
  thus returns False only for atoms.*)
neuper@37946
   374
(*("equal"   ,("op =",eval_equal "#equal_")):calc*)
neuper@37946
   375
fun eval_equal (thmid:string) "op =" (t as 
neuper@37946
   376
	       (Const (op0,t0) $ t1 $ t2 )) thy = 
neuper@37946
   377
  if t1 = t2
neuper@37946
   378
    then ((*writeln"... eval_equal: t1 = t2  --> True";*)
neuper@37946
   379
	  SOME (mk_thmid thmid op0 
neuper@37946
   380
	       ("("^(Syntax.string_of_term (thy2ctxt thy) t1)^")")
neuper@37946
   381
	       ("("^(Syntax.string_of_term (thy2ctxt thy) t2)^")"), 
neuper@37946
   382
	  Trueprop $ (mk_equality (t, true_as_term)))
neuper@37946
   383
	  )
neuper@37946
   384
  else (case (is_atom t1, is_atom t2) of
neuper@37946
   385
	    (true, true) => 
neuper@37946
   386
	    ((*writeln"... eval_equal: t1<>t2, is_atom t1,t2 --> False";*)
neuper@37946
   387
	     SOME (mk_thmid thmid op0  
neuper@37946
   388
			   ("("^(term2str t1)^")") ("("^(term2str t2)^")"),
neuper@37946
   389
		  Trueprop $ (mk_equality (t, false_as_term)))
neuper@37946
   390
	     )
neuper@37946
   391
	  | _ => ((*writeln"... eval_equal: t1<>t2, NOT is_atom t1,t2 --> go-on";*)
neuper@37946
   392
		  NONE))
neuper@37946
   393
  | eval_equal _ _ _ _ = (writeln"... eval_equal: error-exit";
neuper@37946
   394
			  NONE);
neuper@37946
   395
(*
neuper@37946
   396
val t = str2term "x ~= 0";
neuper@37946
   397
val NONE = eval_equal "equal_" "b" t thy;
neuper@37946
   398
neuper@37946
   399
neuper@37946
   400
> val t = str2term "(x + 1) = (x + 1)";
neuper@37946
   401
> val SOME (str, t') = eval_equal "equal_" "b" t thy;
neuper@37946
   402
> term2str t';
neuper@37946
   403
val str = "equal_(x + 1)_(x + 1)" : string
neuper@37946
   404
val it = "(x + 1 = x + 1) = True" : string
neuper@37946
   405
> val t = str2term "x = 0";
neuper@37946
   406
> val NONE = eval_equal "equal_" "b" t thy;
neuper@37946
   407
neuper@37946
   408
> val t = str2term "1 = 0";
neuper@37946
   409
> val SOME (str, t') = eval_equal "equal_" "b" t thy;
neuper@37946
   410
> term2str t';
neuper@37946
   411
val str = "equal_(1)_(0)" : string 
neuper@37946
   412
val it = "(1 = 0) = False" : string
neuper@37946
   413
> val t = str2term "0 = 0";
neuper@37946
   414
> val SOME (str, t') = eval_equal "equal_" "b" t thy;
neuper@37946
   415
> term2str t';
neuper@37946
   416
val str = "equal_(0)_(0)" : string
neuper@37946
   417
val it = "(0 = 0) = True" : string
neuper@37946
   418
*)
neuper@37946
   419
neuper@37946
   420
neuper@37946
   421
(** evaluation on the metalevel **)
neuper@37946
   422
neuper@37946
   423
(*. evaluate HOL.divide .*)
neuper@37946
   424
(*("DIVIDE" ,("HOL.divide"  ,eval_cancel "#divide_"))*)
neuper@37946
   425
fun eval_cancel (thmid:string) "HOL.divide" (t as 
neuper@37946
   426
	       (Const (op0,t0) $ Free (n1,t1) $ Free(n2,t2))) thy = 
neuper@37946
   427
    (case (int_of_str n1, int_of_str n2) of
neuper@37946
   428
	 (SOME n1', SOME n2') =>
neuper@37946
   429
  let 
neuper@37946
   430
    val sg = sign2 n1' n2';
neuper@37946
   431
    val (T1,T2,Trange) = dest_binop_typ t0;
neuper@37946
   432
    val gcd' = gcd (abs n1') (abs n2');
neuper@37946
   433
  in if gcd' = abs n2' 
neuper@37946
   434
     then let val rhs = term_of_num Trange (sg * (abs n1') div gcd')
neuper@37946
   435
	      val prop = Trueprop $ (mk_equality (t, rhs))
neuper@37946
   436
	  in SOME (mk_thmid thmid op0 n1 n2, prop) end     
neuper@37946
   437
     else if 0 < n2' andalso gcd' = 1 then NONE
neuper@37946
   438
     else let val rhs = num_op_num T1 T2 (op0,t0) (sg * (abs n1') div gcd')
neuper@37946
   439
				   ((abs n2') div gcd')
neuper@37946
   440
	      val prop = Trueprop $ (mk_equality (t, rhs))
neuper@37946
   441
	  in SOME (mk_thmid thmid op0 n1 n2, prop) end
neuper@37946
   442
  end
neuper@37946
   443
       | _ => ((*writeln"@@@ eval_cancel NONE";*)NONE))
neuper@37946
   444
neuper@37946
   445
  | eval_cancel _ _ _ _ = NONE;
neuper@37946
   446
neuper@37946
   447
(*. get the argument from a function-definition.*)
neuper@37946
   448
(*("argument_in" ,("Atools.argument'_in",
neuper@37946
   449
		   eval_argument_in "Atools.argument'_in"))*)
neuper@37946
   450
fun eval_argument_in _ "Atools.argument'_in" 
neuper@37946
   451
		     (t as (Const ("Atools.argument'_in", _) $ (f $ arg))) _ =
neuper@37946
   452
    if is_Free arg (*could be something to be simplified before*)
neuper@37946
   453
    then SOME (term2str t ^ " = " ^ term2str arg,
neuper@37946
   454
	       Trueprop $ (mk_equality (t, arg)))
neuper@37946
   455
    else NONE
neuper@37946
   456
  | eval_argument_in _ _ _ _ = NONE;
neuper@37946
   457
neuper@37946
   458
(*.check if the function-identifier of the first argument matches 
neuper@37946
   459
   the function-identifier of the lhs of the second argument.*)
neuper@37946
   460
(*("sameFunId" ,("Atools.sameFunId",
neuper@37946
   461
		   eval_same_funid "Atools.sameFunId"))*)
neuper@37946
   462
fun eval_sameFunId _ "Atools.sameFunId" 
neuper@37946
   463
		     (p as Const ("Atools.sameFunId",_) $ 
neuper@37946
   464
			(f1 $ _) $ 
neuper@37946
   465
			(Const ("op =", _) $ (f2 $ _) $ _)) _ =
neuper@37946
   466
    if f1 = f2 
neuper@37946
   467
    then SOME ((term2str p) ^ " = True",
neuper@37946
   468
	       Trueprop $ (mk_equality (p, HOLogic.true_const)))
neuper@37946
   469
    else SOME ((term2str p) ^ " = False",
neuper@37946
   470
	       Trueprop $ (mk_equality (p, HOLogic.false_const)))
neuper@37946
   471
| eval_sameFunId _ _ _ _ = NONE;
neuper@37946
   472
neuper@37946
   473
neuper@37946
   474
(*.from a list of fun-definitions "f x = ..." as 2nd argument
neuper@37946
   475
   filter the elements with the same fun-identfier in "f y"
neuper@37946
   476
   as the fst argument;
neuper@37946
   477
   this is, because Isabelles filter takes more than 1 sec.*)
neuper@37946
   478
fun same_funid f1 (Const ("op =", _) $ (f2 $ _) $ _) = f1 = f2
neuper@37946
   479
  | same_funid f1 t = raise error ("same_funid called with t = ("
neuper@37946
   480
				   ^term2str f1^") ("^term2str t^")");
neuper@37946
   481
(*("filter_sameFunId" ,("Atools.filter'_sameFunId",
neuper@37946
   482
		   eval_filter_sameFunId "Atools.filter'_sameFunId"))*)
neuper@37946
   483
fun eval_filter_sameFunId _ "Atools.filter'_sameFunId" 
neuper@37946
   484
		     (p as Const ("Atools.filter'_sameFunId",_) $ 
neuper@37946
   485
			(fid $ _) $ fs) _ =
neuper@37946
   486
    let val fs' = ((list2isalist HOLogic.boolT) o 
neuper@37946
   487
		   (filter (same_funid fid))) (isalist2list fs)
neuper@37946
   488
    in SOME (term2str (mk_equality (p, fs')),
neuper@37946
   489
	       Trueprop $ (mk_equality (p, fs'))) end
neuper@37946
   490
| eval_filter_sameFunId _ _ _ _ = NONE;
neuper@37946
   491
neuper@37946
   492
neuper@37946
   493
(*make a list of terms to a sum*)
neuper@37946
   494
fun list2sum [] = error ("list2sum called with []")
neuper@37946
   495
  | list2sum [s] = s
neuper@37946
   496
  | list2sum (s::ss) = 
neuper@37946
   497
    let fun sum su [s'] = 
neuper@37946
   498
	    Const ("op +", [HOLogic.realT,HOLogic.realT]--->HOLogic.realT)
neuper@37946
   499
		  $ su $ s'
neuper@37946
   500
	  | sum su (s'::ss') = 
neuper@37946
   501
	    sum (Const ("op +", [HOLogic.realT,HOLogic.realT]--->HOLogic.realT)
neuper@37946
   502
		  $ su $ s') ss'
neuper@37946
   503
    in sum s ss end;
neuper@37946
   504
neuper@37946
   505
(*make a list of equalities to the sum of the lhs*)
neuper@37946
   506
(*("boollist2sum"    ,("Atools.boollist2sum"    ,eval_boollist2sum "")):calc*)
neuper@37946
   507
fun eval_boollist2sum _ "Atools.boollist2sum" 
neuper@37946
   508
		      (p as Const ("Atools.boollist2sum", _) $ 
neuper@37946
   509
			 (l as Const ("List.list.Cons", _) $ _ $ _)) _ =
neuper@37946
   510
    let val isal = isalist2list l
neuper@37946
   511
	val lhss = map lhs isal
neuper@37946
   512
	val sum = list2sum lhss
neuper@37946
   513
    in SOME ((term2str p) ^ " = " ^ (term2str sum),
neuper@37946
   514
	  Trueprop $ (mk_equality (p, sum)))
neuper@37946
   515
    end
neuper@37946
   516
| eval_boollist2sum _ _ _ _ = NONE;
neuper@37946
   517
neuper@37946
   518
neuper@37946
   519
neuper@37946
   520
local
neuper@37946
   521
neuper@37946
   522
open Term;
neuper@37946
   523
neuper@37946
   524
in
neuper@37946
   525
fun termlessI (_:subst) uv = termless uv;
neuper@37946
   526
fun term_ordI (_:subst) uv = term_ord uv;
neuper@37946
   527
end;
neuper@37946
   528
neuper@37946
   529
neuper@37946
   530
(** rule set, for evaluating list-expressions in scripts 8.01.02 **)
neuper@37946
   531
neuper@37946
   532
neuper@37946
   533
val list_rls = 
neuper@37946
   534
    append_rls "list_rls" list_rls
neuper@37946
   535
	       [Calc ("op *",eval_binop "#mult_"),
neuper@37946
   536
		Calc ("op +", eval_binop "#add_"), 
neuper@37946
   537
		Calc ("op <",eval_equ "#less_"),
neuper@37946
   538
		Calc ("op <=",eval_equ "#less_equal_"),
neuper@37946
   539
		Calc ("Atools.ident",eval_ident "#ident_"),
neuper@37946
   540
		Calc ("op =",eval_equal "#equal_"),(*atom <> atom -> False*)
neuper@37946
   541
       
neuper@37946
   542
		Calc ("Tools.Vars",eval_var "#Vars_"),
neuper@37946
   543
		
neuper@37946
   544
		Thm ("if_True",num_str if_True),
neuper@37946
   545
		Thm ("if_False",num_str if_False)
neuper@37946
   546
		];
neuper@37946
   547
neuper@37946
   548
ruleset' := overwritelthy thy (!ruleset',
neuper@37946
   549
  [("list_rls",list_rls)
neuper@37946
   550
   ]);
neuper@37946
   551
neuper@37946
   552
(*TODO.WN0509 reduce ids: tless_true = e_rew_ord' = e_rew_ord = dummy_ord*)
neuper@37946
   553
val tless_true = dummy_ord;
neuper@37946
   554
rew_ord' := overwritel (!rew_ord',
neuper@37946
   555
			[("tless_true", tless_true),
neuper@37946
   556
			 ("e_rew_ord'", tless_true),
neuper@37946
   557
			 ("dummy_ord", dummy_ord)]);
neuper@37946
   558
neuper@37946
   559
val calculate_Atools = 
neuper@37946
   560
    append_rls "calculate_Atools" e_rls
neuper@37946
   561
               [Calc ("op <",eval_equ "#less_"),
neuper@37946
   562
		Calc ("op <=",eval_equ "#less_equal_"),
neuper@37946
   563
		Calc ("op =",eval_equal "#equal_"),
neuper@37946
   564
neuper@37946
   565
		Thm  ("real_unari_minus",num_str real_unari_minus),
neuper@37946
   566
		Calc ("op +",eval_binop "#add_"),
neuper@37946
   567
		Calc ("op -",eval_binop "#sub_"),
neuper@37946
   568
		Calc ("op *",eval_binop "#mult_")
neuper@37946
   569
		];
neuper@37946
   570
neuper@37946
   571
val Atools_erls = 
neuper@37946
   572
    append_rls "Atools_erls" e_rls
neuper@37946
   573
               [Calc ("op =",eval_equal "#equal_"),
neuper@37946
   574
                Thm ("not_true",num_str not_true),
neuper@37946
   575
		(*"(~ True) = False"*)
neuper@37946
   576
		Thm ("not_false",num_str not_false),
neuper@37946
   577
		(*"(~ False) = True"*)
neuper@37946
   578
		Thm ("and_true",and_true),
neuper@37946
   579
		(*"(?a & True) = ?a"*)
neuper@37946
   580
		Thm ("and_false",and_false),
neuper@37946
   581
		(*"(?a & False) = False"*)
neuper@37946
   582
		Thm ("or_true",or_true),
neuper@37946
   583
		(*"(?a | True) = True"*)
neuper@37946
   584
		Thm ("or_false",or_false),
neuper@37946
   585
		(*"(?a | False) = ?a"*)
neuper@37946
   586
               
neuper@37946
   587
		Thm ("rat_leq1",rat_leq1),
neuper@37946
   588
		Thm ("rat_leq2",rat_leq2),
neuper@37946
   589
		Thm ("rat_leq3",rat_leq3),
neuper@37946
   590
                Thm ("refl",num_str refl),
neuper@37946
   591
		Thm ("le_refl",num_str le_refl),
neuper@37946
   592
		Thm ("radd_left_cancel_le",num_str radd_left_cancel_le),
neuper@37946
   593
		
neuper@37946
   594
		Calc ("op <",eval_equ "#less_"),
neuper@37946
   595
		Calc ("op <=",eval_equ "#less_equal_"),
neuper@37946
   596
		
neuper@37946
   597
		Calc ("Atools.ident",eval_ident "#ident_"),    
neuper@37946
   598
		Calc ("Atools.is'_const",eval_const "#is_const_"),
neuper@37946
   599
		Calc ("Atools.occurs'_in",eval_occurs_in ""),    
neuper@37946
   600
		Calc ("Tools.matches",eval_matches "")
neuper@37946
   601
		];
neuper@37946
   602
neuper@37946
   603
val Atools_crls = 
neuper@37946
   604
    append_rls "Atools_crls" e_rls
neuper@37946
   605
               [Calc ("op =",eval_equal "#equal_"),
neuper@37946
   606
                Thm ("not_true",num_str not_true),
neuper@37946
   607
		Thm ("not_false",num_str not_false),
neuper@37946
   608
		Thm ("and_true",and_true),
neuper@37946
   609
		Thm ("and_false",and_false),
neuper@37946
   610
		Thm ("or_true",or_true),
neuper@37946
   611
		Thm ("or_false",or_false),
neuper@37946
   612
               
neuper@37946
   613
		Thm ("rat_leq1",rat_leq1),
neuper@37946
   614
		Thm ("rat_leq2",rat_leq2),
neuper@37946
   615
		Thm ("rat_leq3",rat_leq3),
neuper@37946
   616
                Thm ("refl",num_str refl),
neuper@37946
   617
		Thm ("le_refl",num_str le_refl),
neuper@37946
   618
		Thm ("radd_left_cancel_le",num_str radd_left_cancel_le),
neuper@37946
   619
		
neuper@37946
   620
		Calc ("op <",eval_equ "#less_"),
neuper@37946
   621
		Calc ("op <=",eval_equ "#less_equal_"),
neuper@37946
   622
		
neuper@37946
   623
		Calc ("Atools.ident",eval_ident "#ident_"),    
neuper@37946
   624
		Calc ("Atools.is'_const",eval_const "#is_const_"),
neuper@37946
   625
		Calc ("Atools.occurs'_in",eval_occurs_in ""),    
neuper@37946
   626
		Calc ("Tools.matches",eval_matches "")
neuper@37946
   627
		];
neuper@37946
   628
neuper@37946
   629
(*val atools_erls = ... waere zu testen ...
neuper@37946
   630
    merge_rls calculate_Atools
neuper@37946
   631
	      (append_rls Atools_erls (*i.A. zu viele rules*)
neuper@37946
   632
			  [Calc ("Atools.ident",eval_ident "#ident_"),    
neuper@37946
   633
			   Calc ("Atools.is'_const",eval_const "#is_const_"),
neuper@37946
   634
			   Calc ("Atools.occurs'_in",
neuper@37946
   635
				 eval_occurs_in "#occurs_in"),    
neuper@37946
   636
			   Calc ("Tools.matches",eval_matches "#matches")
neuper@37946
   637
			   ] (*i.A. zu viele rules*)
neuper@37946
   638
			  );*)
neuper@37946
   639
(* val atools_erls = prep_rls(
neuper@37946
   640
  Rls {id="atools_erls",preconds = [], rew_ord = ("termlessI",termlessI), 
neuper@37946
   641
      erls = e_rls, srls = Erls, calc = [], (*asm_thm = [],*)
neuper@37946
   642
      rules = [Thm ("refl",num_str refl),
neuper@37946
   643
		Thm ("le_refl",num_str le_refl),
neuper@37946
   644
		Thm ("radd_left_cancel_le",num_str radd_left_cancel_le),
neuper@37946
   645
		Thm ("not_true",num_str not_true),
neuper@37946
   646
		Thm ("not_false",num_str not_false),
neuper@37946
   647
		Thm ("and_true",and_true),
neuper@37946
   648
		Thm ("and_false",and_false),
neuper@37946
   649
		Thm ("or_true",or_true),
neuper@37946
   650
		Thm ("or_false",or_false),
neuper@37946
   651
		Thm ("and_commute",num_str and_commute),
neuper@37946
   652
		Thm ("or_commute",num_str or_commute),
neuper@37946
   653
		
neuper@37946
   654
		Calc ("op <",eval_equ "#less_"),
neuper@37946
   655
		Calc ("op <=",eval_equ "#less_equal_"),
neuper@37946
   656
		
neuper@37946
   657
		Calc ("Atools.ident",eval_ident "#ident_"),    
neuper@37946
   658
		Calc ("Atools.is'_const",eval_const "#is_const_"),
neuper@37946
   659
		Calc ("Atools.occurs'_in",eval_occurs_in ""),    
neuper@37946
   660
		Calc ("Tools.matches",eval_matches "")
neuper@37946
   661
	       ],
neuper@37946
   662
      scr = Script ((term_of o the o (parse thy)) 
neuper@37946
   663
      "empty_script")
neuper@37946
   664
      }:rls);
neuper@37946
   665
ruleset' := overwritelth thy 
neuper@37946
   666
		(!ruleset',
neuper@37946
   667
		 [("atools_erls",atools_erls)(*FIXXXME:del with rls.rls'*)
neuper@37946
   668
		  ]);
neuper@37946
   669
*)
neuper@37946
   670
"******* Atools.ML end *******";
neuper@37946
   671
neuper@37946
   672
calclist':= overwritel (!calclist', 
neuper@37946
   673
   [("occurs_in",("Atools.occurs'_in", eval_occurs_in "#occurs_in_")),
neuper@37946
   674
    ("some_occur_in",
neuper@37946
   675
     ("Atools.some'_occur'_in", eval_some_occur_in "#some_occur_in_")),
neuper@37946
   676
    ("is_atom"  ,("Atools.is'_atom",eval_is_atom "#is_atom_")),
neuper@37946
   677
    ("is_even"  ,("Atools.is'_even",eval_is_even "#is_even_")),
neuper@37946
   678
    ("is_const" ,("Atools.is'_const",eval_const "#is_const_")),
neuper@37946
   679
    ("le"       ,("op <"        ,eval_equ "#less_")),
neuper@37946
   680
    ("leq"      ,("op <="       ,eval_equ "#less_equal_")),
neuper@37946
   681
    ("ident"    ,("Atools.ident",eval_ident "#ident_")),
neuper@37946
   682
    ("equal"    ,("op =",eval_equal "#equal_")),
neuper@37946
   683
    ("PLUS"     ,("op +"        ,eval_binop "#add_")),
neuper@37946
   684
    ("minus"    ,("op -",eval_binop "#sub_")), (*040207 only for prep_rls
neuper@37946
   685
	        			      no script with "minus"*)
neuper@37946
   686
    ("TIMES"    ,("op *"        ,eval_binop "#mult_")),
neuper@37946
   687
    ("DIVIDE"  ,("HOL.divide"  ,eval_cancel "#divide_")),
neuper@37946
   688
    ("POWER"   ,("Atools.pow"  ,eval_binop "#power_")),
neuper@37946
   689
    ("boollist2sum",("Atools.boollist2sum",eval_boollist2sum ""))
neuper@37946
   690
    ]);
neuper@37946
   691
neuper@37946
   692
val list_rls = prep_rls(
neuper@37946
   693
    merge_rls "list_erls"
neuper@37946
   694
	      (Rls {id="replaced",preconds = [], 
neuper@37946
   695
		    rew_ord = ("termlessI", termlessI),
neuper@37946
   696
		    erls = Rls {id="list_elrs", preconds = [], 
neuper@37946
   697
				rew_ord = ("termlessI",termlessI), 
neuper@37946
   698
				erls = e_rls, 
neuper@37946
   699
				srls = Erls, calc = [], (*asm_thm = [],*)
neuper@37946
   700
				rules = [Calc ("op +", eval_binop "#add_"),
neuper@37946
   701
					 Calc ("op <",eval_equ "#less_")
neuper@37946
   702
					 (*    ~~~~~~ for nth_Cons_*)
neuper@37946
   703
					 ],
neuper@37946
   704
				scr = EmptyScr},
neuper@37946
   705
		    srls = Erls, calc = [], (*asm_thm = [], *)
neuper@37946
   706
		    rules = [], scr = EmptyScr})
neuper@37946
   707
	      list_rls);
neuper@37946
   708
ruleset' := overwritelthy thy (!ruleset', [("list_rls", list_rls)]);
neuper@37946
   709
*}
neuper@37906
   710
neuper@37906
   711
end