src/sml/Scripts/Tools.sml
author agriesma
Thu, 17 Apr 2003 18:01:03 +0200
branchgriesmayer
changeset 331 84c2eef06e26
permissions -rw-r--r--
neues cvs-verzeichnis
agriesma@331
     1
(* = Tools.ML
agriesma@331
     2
   +++ outcommented tests *)
agriesma@331
     3
agriesma@331
     4
agriesma@331
     5
fun eval_var (thmid:string) (op_:string) 
agriesma@331
     6
  (t as (Const(op0,t0) $ arg)) thy = 
agriesma@331
     7
  let 
agriesma@331
     8
    val t' = ((list2isalist HOLogic.realT) o vars) t;
agriesma@331
     9
    val thmId = thmid^(Sign.string_of_term (sign_of thy) arg);
agriesma@331
    10
  in Some (thmId, Trueprop $ (mk_equality (t,t'))) end
agriesma@331
    11
  | eval_var _ _ _ _ = raise GO_ON;
agriesma@331
    12
(* 
agriesma@331
    13
> val t = (term_of o the o (parse thy)) "Var (A=a*(b::real))";
agriesma@331
    14
> val op_ = "Var";
agriesma@331
    15
> val eval_fn = the (assoc (!eval_list, op_));
agriesma@331
    16
> get_pair op_ eval_fn t;
agriesma@331
    17
> val (t as (Const(op0,t0) $ arg)) = t;
agriesma@331
    18
> eval_fn op0 t; 
agriesma@331
    19
agriesma@331
    20
> val thmid = "#Var_";
agriesma@331
    21
> val (Some(thmId,t')) = eval_var thmid op0 t;
agriesma@331
    22
val it = Some ("#Var_(A::real) = (a::real) * (b::real)",Const # $ (# $ #))
agriesma@331
    23
  : (string * term) option
agriesma@331
    24
> Sign.string_of_term (sign_of thy) t';
agriesma@331
    25
val it = "Var ((A::real) = (a::real) * (b::real)) = [A, a, b]" : string
agriesma@331
    26
*)
agriesma@331
    27
fun eval_Length (thmid:string) (op_:string) 
agriesma@331
    28
  (t as (Const(op0,t0) $ arg)) thy = 
agriesma@331
    29
  let 
agriesma@331
    30
    val t' = ((term_of_num HOLogic.realT) o length o isalist2list) arg;
agriesma@331
    31
    val thmId = thmid^(Sign.string_of_term (sign_of thy) arg);
agriesma@331
    32
  in Some (thmId, Trueprop $ (mk_equality (t,t'))) end
agriesma@331
    33
  | eval_Length _ _ _ _ = raise GO_ON;
agriesma@331
    34
(*
agriesma@331
    35
> val thmid = "#Length_"; val op_ = "Length";
agriesma@331
    36
> val s = "Length [A = a * b, a // #2 = #2]";
agriesma@331
    37
> val (t as (Const(op0,t0) $ arg)) = (term_of o the o (parse thy)) s;
agriesma@331
    38
> val (Some (id,t')) = eval_Length thmid op_ t;
agriesma@331
    39
val id = "#Length_[A = a * b, a // #2 = #2]" : string
agriesma@331
    40
val t' = Const ("Trueprop","bool => prop") $ (Const # $ (# $ #) $ Free (#,#))
agriesma@331
    41
val it = "Length [A = a * b, a // #2 = #2] = #2" : cterm
agriesma@331
    42
---------------------------------------------
agriesma@331
    43
> val thmid = "#Length_"; val op_ = "Length";
agriesma@331
    44
> val s = 
agriesma@331
    45
 "if #1 < Length [A = a * b, a // #2 = #2]       \
agriesma@331
    46
 \then make_fun (R, [make, function], no_met) A a_ [A = a * b, a // #2 = #2]\
agriesma@331
    47
 \else hd [A = a * b, a // #2 = #2]";
agriesma@331
    48
agriesma@331
    49
> cterm_of (sign_of thy) t';
agriesma@331
    50
> val t = (term_of o the o (parse thy)) s;
agriesma@331
    51
> val eval_fn = the (assoc (!eval_list, op_));
agriesma@331
    52
> val (Some(_,t')) = get_pair op_ eval_fn t;
agriesma@331
    53
val t' = Const ("Trueprop","bool => prop") $ (Const # $ (# $ #) $ Free (#,#))
agriesma@331
    54
val it = "Length [A = a * b, a // #2 = #2] = #2" : cterm
agriesma@331
    55
agriesma@331
    56
> val ct = (the o (parse thy)) s;
agriesma@331
    57
> val (Some(_,thm)) = get_calculation thy (op_, eval_fn) ct;
agriesma@331
    58
val thm = "Length [A = a * b, a // #2 = #2] = #2" [[ Free ( #2, real) !!!]]
agriesma@331
    59
> rewrite_ thy tless_true e_rls false thm ct;
agriesma@331
    60
("if #1 < #2
agriesma@331
    61
  then make_fun (R, [make, function], no_met)
agriesma@331
    62
       A a_ [A = a * b, a // #2 = #2] else hd [A = a * b, a // #2 = #2]",
agriesma@331
    63
 []) : (cterm * cterm list) option
agriesma@331
    64
> val ct = (the o (parse thy)) s;
agriesma@331
    65
> rewrite_set_ thy e_rls false eval_script ct;
agriesma@331
    66
("if #1 < #2
agriesma@331
    67
  then make_fun (R, [make, function], no_met)
agriesma@331
    68
       A a_ [A = a * b, a // #2 = #2] else hd [A = a * b, a // #2 = #2]",
agriesma@331
    69
 []) : (cterm * cterm list) option
agriesma@331
    70
*)
agriesma@331
    71
agriesma@331
    72
fun eval_Nth (thmid:string) (op_:string) (t as 
agriesma@331
    73
	       (Const (op0,t0) $ t1 $ t2 )) thy =
agriesma@331
    74
(writeln"@@@ eval_Nth";
agriesma@331
    75
  if is_num t1 andalso is_list t2
agriesma@331
    76
    then
agriesma@331
    77
      let 
agriesma@331
    78
	val t' = (nth (num_of_term t1) (isalist2list t2))
agriesma@331
    79
	  handle _ => raise GO_ON; 
agriesma@331
    80
	val thmId = thmid^(Sign.string_of_term (sign_of thy) t1)^
agriesma@331
    81
	  "_"^(Sign.string_of_term (sign_of thy) t2)^
agriesma@331
    82
	  " = "^(Sign.string_of_term (sign_of thy) t');
agriesma@331
    83
      in Some (thmId, Trueprop $ (mk_equality (t,t'))) end
agriesma@331
    84
  else raise GO_ON
agriesma@331
    85
)
agriesma@331
    86
  | eval_Nth _ _ _ _ = raise GO_ON;
agriesma@331
    87
(*
agriesma@331
    88
> val thmid = "#Nth_"; val op_ = "Nth";
agriesma@331
    89
> val s = "Nth #2 [A = a * b, a // #2 = #2]";
agriesma@331
    90
> val t = (term_of o the o (parse thy)) s;
agriesma@331
    91
> eval_Nth thmid op_ t;
agriesma@331
    92
agriesma@331
    93
> val eval_fn = the (assoc (!eval_list, op_));
agriesma@331
    94
> val (Some(id,t')) = get_pair op_ eval_fn t;
agriesma@331
    95
> cterm_of (sign_of thy) t';
agriesma@331
    96
val it = "Nth #2 [A = a * b, a // #2 = #2] = (a // #2 = #2)"
agriesma@331
    97
*)
agriesma@331
    98
agriesma@331
    99
agriesma@331
   100
(*17.6.00: calc_list instead eval_list*)
agriesma@331
   101
eval_list:= overwritel (! eval_list,
agriesma@331
   102
            [("Var",eval_var "#Var_"),
agriesma@331
   103
	     ("Length",eval_Length "#Length_"),
agriesma@331
   104
	     ("Nth",eval_Nth "#Nth_")
agriesma@331
   105
	     ]);
agriesma@331
   106
(*17.6.00: association list for calculate_, calculate*)
agriesma@331
   107
calc_list:= overwritel (! calc_list,
agriesma@331
   108
            [
agriesma@331
   109
	     ("Var"   ,("Var",eval_var "#Var_")),
agriesma@331
   110
	     ("Length",("Length",eval_Length "#Length_")),
agriesma@331
   111
	     ("Nth"   ,("Nth",eval_Nth "#Nth_"))
agriesma@331
   112
	     ]);
agriesma@331
   113