src/sml/IsacKnowledge/Integrate.ML
author wneuper
Sat, 20 Aug 2005 21:20:16 +0200
changeset 2918 cac1f942e1a1
parent 2917 2488337fd0dd
child 3755 c1e092099128
permissions -rw-r--r--
find out why IntegrateScript doesnt work
wneuper@2854
     1
(* tools for integration over the reals
wneuper@2854
     2
   author: Walther Neuper
wneuper@2854
     3
   050814, 08:51
wneuper@2854
     4
   (c) due to copyright terms
wneuper@2854
     5
wneuper@2854
     6
use"~/proto2/isac/src/sml/IsacKnowledge/Integrate.ML";
wneuper@2854
     7
*)
wneuper@2854
     8
wneuper@2854
     9
(** interface isabelle -- isac **)
wneuper@2854
    10
wneuper@2854
    11
theory' := overwritel (!theory', [("Integrate.thy",Integrate.thy)]);
wneuper@2854
    12
wneuper@2854
    13
theorem' := overwritel (!theorem',
wneuper@2854
    14
[("integral_const",num_str integral_const),
wneuper@2854
    15
 ("integral_var",num_str integral_var),
wneuper@2854
    16
 ("integral_add",num_str integral_add),
wneuper@2854
    17
 ("integral_mult",num_str integral_mult),
wneuper@2916
    18
 ("call_for_new_c",num_str call_for_new_c),
wneuper@2854
    19
 ("integral_pow",num_str integral_pow)
wneuper@2854
    20
]);
wneuper@2854
    21
wneuper@2899
    22
(** eval functions **)
wneuper@2899
    23
wneuper@2899
    24
val c = Free ("c", HOLogic.realT);
wneuper@2899
    25
(*.create a new unique variable 'c..' in a term.*)
wneuper@2899
    26
fun new_c term = 
wneuper@2899
    27
    let fun selc var = 
wneuper@2899
    28
	    case (explode o id_of) var of
wneuper@2899
    29
		"c"::[] => true
wneuper@2899
    30
	      |	"c"::"_"::is => (case (int_of_str o implode) is of
wneuper@2899
    31
				     Some _ => true
wneuper@2899
    32
				   | None => false)
wneuper@2899
    33
              | _ => false;
wneuper@2899
    34
	fun get_coeff c = case (explode o id_of) c of
wneuper@2899
    35
	      		      "c"::"_"::is => (the o int_of_str o implode) is
wneuper@2899
    36
			    | _ => 0;
wneuper@2899
    37
        val cs = filter selc (vars term);
wneuper@2899
    38
    in 
wneuper@2899
    39
	case cs of
wneuper@2899
    40
	    [] => c
wneuper@2899
    41
	  | [c] => Free ("c_2", HOLogic.realT)
wneuper@2899
    42
	  | cs => 
wneuper@2899
    43
	    let val max_coeff = maxl (map get_coeff cs)
wneuper@2899
    44
	    in Free ("c_"^string_of_int (max_coeff + 1), HOLogic.realT) end
wneuper@2899
    45
    end;
wneuper@2899
    46
wneuper@2899
    47
(*("new_c", ("Integrate.new'_c", eval_new_c "new_c_"))*)
wneuper@2899
    48
fun eval_new_c _ _ (p as (Const ("Integrate.new'_c",_) $ t)) _ =
wneuper@2899
    49
     Some ((term2str p) ^ " = " ^ term2str (new_c p),
wneuper@2899
    50
	  Trueprop $ (mk_equality (p, new_c p)))
wneuper@2899
    51
  | eval_new_c _ _ _ _ = None;
wneuper@2899
    52
wneuper@2899
    53
calclist':= overwritel (!calclist', 
wneuper@2910
    54
   [("new_c", ("Integrate.new'_c", eval_new_c "new_c_"))
wneuper@2899
    55
    ]);
wneuper@2899
    56
wneuper@2863
    57
(** rulesets **)
wneuper@2863
    58
wneuper@2863
    59
val integration_rules = 
wneuper@2863
    60
    prep_rls (Rls {id="integration_rules", preconds = [], 
wneuper@2863
    61
		   rew_ord = ("termlessI",termlessI), 
wneuper@2863
    62
		   erls = Rls {id="conditions_in_integration_rules", 
wneuper@2863
    63
			       preconds = [], 
wneuper@2863
    64
			       rew_ord = ("termlessI",termlessI), 
wneuper@2863
    65
			       erls = Erls, 
wneuper@2863
    66
			       srls = Erls, calc = [],
wneuper@2863
    67
			       rules = [(*for rewriting conditions in Thm's*)
wneuper@2863
    68
					Calc ("Atools.occurs'_in", 
wneuper@2863
    69
					      eval_occurs_in "#occurs_in_"),
wneuper@2863
    70
					Thm ("not_true",num_str not_true),
wneuper@2863
    71
					Thm ("not_false",not_false)
wneuper@2863
    72
					],
wneuper@2863
    73
			       scr = EmptyScr}, 
wneuper@2863
    74
		   srls = Erls, calc = [],
wneuper@2863
    75
		   rules = [
wneuper@2863
    76
			    Thm ("integral_const",num_str integral_const),
wneuper@2863
    77
			    Thm ("integral_var",num_str integral_var),
wneuper@2863
    78
			    Thm ("integral_add",num_str integral_add),
wneuper@2863
    79
			    Thm ("integral_mult",num_str integral_mult),
wneuper@2863
    80
			    Thm ("integral_pow",num_str integral_pow),
wneuper@2863
    81
			    Calc ("op +", eval_binop "#add_")(*for n+1*)
wneuper@2863
    82
			    ],
wneuper@2863
    83
		   scr = EmptyScr});
wneuper@2916
    84
val add_new_c = 
wneuper@2916
    85
    prep_rls (Seq {id="add_new_c", preconds = [], 
wneuper@2916
    86
		   rew_ord = ("termlessI",termlessI), 
wneuper@2916
    87
		   erls = Rls {id="conditions_in_add_new_c", 
wneuper@2916
    88
			       preconds = [], 
wneuper@2916
    89
			       rew_ord = ("termlessI",termlessI), 
wneuper@2916
    90
			       erls = Erls, 
wneuper@2916
    91
			       srls = Erls, calc = [],
wneuper@2917
    92
			       rules = [Calc ("Tools.matches", eval_matches""),
wneuper@2917
    93
					Thm ("not_true",num_str not_true),
wneuper@2917
    94
					Thm ("not_false",num_str not_false)
wneuper@2916
    95
					],
wneuper@2916
    96
			       scr = EmptyScr}, 
wneuper@2916
    97
		   srls = Erls, calc = [],
wneuper@2916
    98
		   rules = [ Thm ("call_for_new_c", num_str call_for_new_c),
wneuper@2916
    99
			     Calc("Integrate.new'_c", eval_new_c "new_c_")
wneuper@2916
   100
			    ],
wneuper@2916
   101
		   scr = EmptyScr});
wneuper@2899
   102
val integration = 
wneuper@2899
   103
    prep_rls (Seq {id="integration", preconds = [], 
wneuper@2899
   104
		   rew_ord = ("termlessI",termlessI), 
wneuper@2899
   105
		   erls = Rls {id="conditions_in_integration", 
wneuper@2899
   106
			       preconds = [], 
wneuper@2899
   107
			       rew_ord = ("termlessI",termlessI), 
wneuper@2899
   108
			       erls = Erls, 
wneuper@2899
   109
			       srls = Erls, calc = [],
wneuper@2916
   110
			       rules = [],
wneuper@2899
   111
			       scr = EmptyScr}, 
wneuper@2899
   112
		   srls = Erls, calc = [],
wneuper@2899
   113
		   rules = [ Rls_ integration_rules,
wneuper@2916
   114
			     Rls_ add_new_c,
wneuper@2916
   115
			     Rls_ norm_Poly
wneuper@2899
   116
			    ],
wneuper@2899
   117
		   scr = EmptyScr});
wneuper@2899
   118
ruleset' := overwritel (!ruleset', [("integration_rules", integration_rules),
wneuper@2916
   119
				    ("add_new_c", add_new_c),
wneuper@2899
   120
				    ("integration", integration)]);
wneuper@2863
   121
wneuper@2863
   122
(** problems **)
wneuper@2863
   123
wneuper@2863
   124
store_pbt
wneuper@2863
   125
 (prep_pbt Integrate.thy
wneuper@2863
   126
 (["integrate","function"],
wneuper@2863
   127
  [("#Given" ,["functionTerm f_", "integrateBy v_"]),
wneuper@2863
   128
   ("#Find"  ,["antiDerivative F_"])
wneuper@2863
   129
  ],
wneuper@2863
   130
  append_rls "e_rls" e_rls [(*for preds in where_*)], 
wneuper@2863
   131
  Some "Integrate (f_, v_)", 
wneuper@2872
   132
  [["Diff","integration"]]));
wneuper@2872
   133
 
wneuper@2872
   134
store_pbt
wneuper@2872
   135
 (prep_pbt Integrate.thy
wneuper@2872
   136
 (["named","integrate","function"],
wneuper@2872
   137
  [("#Given" ,["functionTerm f_", "integrateBy v_"]),
wneuper@2872
   138
   ("#Find"  ,["antiDerivative F_"])
wneuper@2872
   139
  ],
wneuper@2872
   140
  append_rls "e_rls" e_rls [(*for preds in where_*)], 
wneuper@2872
   141
  Some "Integrate (f_, v_)", 
wneuper@2872
   142
  [["Diff","integration","named"]]));
wneuper@2863
   143
 
wneuper@2854
   144
(** methods **)
wneuper@2863
   145
wneuper@2863
   146
store_met
wneuper@2872
   147
    (prep_met Integrate.thy
wneuper@2872
   148
	      (["Diff","integration"],
wneuper@2872
   149
	       [("#Given" ,["functionTerm f_", "integrateBy v_"]),
wneuper@2872
   150
		("#Find"  ,["antiDerivative F_"])
wneuper@2872
   151
		],
wneuper@2872
   152
	       {rew_ord'="tless_true", rls'=Atools_erls, calc = [], 
wneuper@2872
   153
		srls = e_rls, 
wneuper@2872
   154
		prls=e_rls,
wneuper@2872
   155
	     crls = Atools_erls, nrls = e_rls},
wneuper@2918
   156
"Script IntegrationScript (f_::real) (v_::real) =                \
wneuper@2918
   157
\  (let t_ = Integral f_ D v_                                    \
wneuper@2918
   158
\   in (Rewrite_Set_Inst [(bdv,v_)] integration False) (t_::real))"
wneuper@2872
   159
));
wneuper@2872
   160
    
wneuper@2872
   161
store_met
wneuper@2872
   162
    (prep_met Integrate.thy
wneuper@2872
   163
	      (["Diff","integration","named"],
wneuper@2872
   164
	       [("#Given" ,["functionTerm f_", "integrateBy v_"]),
wneuper@2872
   165
		("#Find"  ,["antiDerivative F_"])
wneuper@2872
   166
		],
wneuper@2872
   167
	       {rew_ord'="tless_true", rls'=Atools_erls, calc = [], 
wneuper@2872
   168
		srls = e_rls, 
wneuper@2872
   169
		prls=e_rls,
wneuper@2872
   170
		crls = Atools_erls, nrls = e_rls},
wneuper@2918
   171
"Script NamedIntegrationScript (f_::real) (v_::real) (F_::real) = \
wneuper@2918
   172
\  (let t_ = (F_ = Integral f_ D v_)                                 \
wneuper@2918
   173
\   in (Rewrite_Set_Inst [(bdv,v_)] integration False) t_)"
wneuper@2863
   174
 ));
wneuper@2863
   175