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