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 |
|