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

Scripts --> ProgLang
ME --> Interpret
IsacKnowledge --> Knowledge
neuper@37906
     1
(* tools for applications of differetiation
neuper@37906
     2
 use"DiffApp.ML";
neuper@37947
     3
 use"Knowledge/DiffApp.ML";
neuper@37947
     4
 use"../Knowledge/DiffApp.ML";
neuper@37906
     5
neuper@37906
     6
neuper@37906
     7
WN.6.5.03: old decisions in this file partially are being changed
neuper@37906
     8
  in a quick-and-dirty way to make scripts run: Maximum_value,
neuper@37906
     9
  Make_fun_by_new_variable, Make_fun_by_explicit.
neuper@37906
    10
found to be reconsidered:
neuper@37906
    11
- descriptions (Descript.thy)
neuper@37906
    12
- penv: really need term list; or just rerun the whole example with num/var
neuper@37906
    13
- mk_arg, itms2args ... env in script different from penv ?
neuper@37906
    14
- L = SubProblem eq ... show some vars on the worksheet ? (other means for
neuper@37906
    15
  referencing are labels (no on worksheet))
neuper@37906
    16
neuper@37906
    17
WN.6.5.03 quick-and-dirty: mk_arg, itms2args just make most convenient env
neuper@37906
    18
  from penv as is.    
neuper@37906
    19
 *)
neuper@37906
    20
neuper@37906
    21
neuper@37906
    22
(** interface isabelle -- isac **)
neuper@37906
    23
neuper@37906
    24
theory' := overwritel (!theory', [("DiffApp.thy",DiffApp.thy)]);
neuper@37906
    25
neuper@37906
    26
val eval_rls = prep_rls(
neuper@37906
    27
  Rls {id="eval_rls",preconds = [], rew_ord = ("termlessI",termlessI), 
neuper@37906
    28
      erls = e_rls, srls = Erls, calc = [], (*asm_thm = [],*)
neuper@37906
    29
      rules = [Thm ("refl",num_str refl),
neuper@37906
    30
		Thm ("le_refl",num_str le_refl),
neuper@37906
    31
		Thm ("radd_left_cancel_le",num_str radd_left_cancel_le),
neuper@37906
    32
		Thm ("not_true",num_str not_true),
neuper@37906
    33
		Thm ("not_false",num_str not_false),
neuper@37906
    34
		Thm ("and_true",and_true),
neuper@37906
    35
		Thm ("and_false",and_false),
neuper@37906
    36
		Thm ("or_true",or_true),
neuper@37906
    37
		Thm ("or_false",or_false),
neuper@37906
    38
		Thm ("and_commute",num_str and_commute),
neuper@37906
    39
		Thm ("or_commute",num_str or_commute),
neuper@37906
    40
		
neuper@37906
    41
		Calc ("op <",eval_equ "#less_"),
neuper@37906
    42
		Calc ("op <=",eval_equ "#less_equal_"),
neuper@37906
    43
		
neuper@37906
    44
		Calc ("Atools.ident",eval_ident "#ident_"),    
neuper@37906
    45
		Calc ("Atools.is'_const",eval_const "#is_const_"),
neuper@37906
    46
		Calc ("Atools.occurs'_in",eval_occurs_in ""),    
neuper@37906
    47
		Calc ("Tools.matches",eval_matches "")
neuper@37906
    48
	       ],
neuper@37906
    49
      scr = Script ((term_of o the o (parse thy)) 
neuper@37906
    50
      "empty_script")
neuper@37906
    51
      }:rls);
neuper@37906
    52
ruleset' := overwritelthy thy
neuper@37906
    53
		(!ruleset',
neuper@37906
    54
		 [("eval_rls",Atools_erls)(*FIXXXME:del with rls.rls'*)
neuper@37906
    55
		  ]);
neuper@37906
    56
neuper@37906
    57
neuper@37906
    58
(** problem types **)
neuper@37906
    59
neuper@37906
    60
store_pbt
neuper@37906
    61
 (prep_pbt DiffApp.thy "pbl_fun_max" [] e_pblID
neuper@37906
    62
 (["maximum_of","function"],
neuper@37906
    63
  [("#Given" ,["fixedValues fix_"]),
neuper@37906
    64
   ("#Find"  ,["maximum m_","valuesFor vs_"]),
neuper@37906
    65
   ("#Relate",["relations rs_"])
neuper@37906
    66
  ],
neuper@37926
    67
  e_rls, NONE, []));
neuper@37906
    68
neuper@37906
    69
store_pbt
neuper@37906
    70
 (prep_pbt DiffApp.thy "pbl_fun_make" [] e_pblID
neuper@37906
    71
 (["make","function"]:pblID,
neuper@37906
    72
  [("#Given" ,["functionOf f_","boundVariable v_","equalities eqs_"]),
neuper@37906
    73
   ("#Find"  ,["functionEq f_1_"])
neuper@37906
    74
  ],
neuper@37926
    75
  e_rls, NONE, []));
neuper@37906
    76
store_pbt
neuper@37906
    77
 (prep_pbt DiffApp.thy "pbl_fun_max_expl" [] e_pblID
neuper@37906
    78
 (["by_explicit","make","function"]:pblID,
neuper@37906
    79
  [("#Given" ,["functionOf f_","boundVariable v_","equalities eqs_"]),
neuper@37906
    80
   ("#Find"  ,["functionEq f_1_"])
neuper@37906
    81
  ],
neuper@37926
    82
  e_rls, NONE, [["DiffApp","make_fun_by_explicit"]]));
neuper@37906
    83
store_pbt
neuper@37906
    84
 (prep_pbt DiffApp.thy "pbl_fun_max_newvar" [] e_pblID
neuper@37906
    85
 (["by_new_variable","make","function"]:pblID,
neuper@37906
    86
  [("#Given" ,["functionOf f_","boundVariable v_","equalities eqs_"]),
neuper@37906
    87
   (*WN.12.5.03: precond for distinction still missing*)
neuper@37906
    88
   ("#Find"  ,["functionEq f_1_"])
neuper@37906
    89
  ],
neuper@37926
    90
  e_rls, NONE, [["DiffApp","make_fun_by_new_variable"]]));
neuper@37906
    91
neuper@37906
    92
store_pbt
neuper@37906
    93
 (prep_pbt DiffApp.thy "pbl_fun_max_interv" [] e_pblID
neuper@37906
    94
 (["on_interval","maximum_of","function"]:pblID,
neuper@37906
    95
  [("#Given" ,["functionEq t_","boundVariable v_","interval itv_"]),
neuper@37906
    96
   (*WN.12.5.03: precond for distinction still missing*)
neuper@37906
    97
   ("#Find"  ,["maxArgument v_0_"])
neuper@37906
    98
  ],
neuper@37926
    99
  e_rls, NONE, []));
neuper@37906
   100
neuper@37906
   101
store_pbt
neuper@37906
   102
 (prep_pbt DiffApp.thy "pbl_tool" [] e_pblID
neuper@37906
   103
 (["tool"]:pblID,
neuper@37906
   104
  [],
neuper@37926
   105
  e_rls, NONE, []));
neuper@37906
   106
neuper@37906
   107
store_pbt
neuper@37906
   108
 (prep_pbt DiffApp.thy "pbl_tool_findvals" [] e_pblID
neuper@37906
   109
 (["find_values","tool"]:pblID,
neuper@37906
   110
  [("#Given" ,["maxArgument ma_","functionEq f_","boundVariable v_"]),
neuper@37906
   111
   ("#Find"  ,["valuesFor vls_"]),
neuper@37906
   112
   ("#Relate",["additionalRels rs_"])
neuper@37906
   113
  ],
neuper@37926
   114
  e_rls, NONE, []));
neuper@37906
   115
neuper@37906
   116
neuper@37906
   117
(** methods, scripts not yet implemented **)
neuper@37906
   118
neuper@37906
   119
store_met
neuper@37906
   120
 (prep_met Diff.thy "met_diffapp" [] e_metID
neuper@37906
   121
 (["DiffApp"],
neuper@37906
   122
   [],
neuper@37906
   123
   {rew_ord'="tless_true",rls'=Atools_erls,calc = [], srls = e_rls, prls=e_rls,
neuper@37906
   124
    crls = Atools_erls, nrls=norm_Rational
neuper@37906
   125
    (*, asm_rls=[],asm_thm=[]*)}, "empty_script"));
neuper@37906
   126
store_met
neuper@37906
   127
 (prep_met DiffApp.thy "met_diffapp_max" [] e_metID
neuper@37906
   128
 (["DiffApp","max_by_calculus"]:metID,
neuper@37906
   129
  [("#Given" ,["fixedValues fix_","maximum m_","relations rs_",
neuper@37906
   130
	       "boundVariable v_","interval itv_","errorBound err_"]),
neuper@37906
   131
    ("#Find"  ,["valuesFor vs_"]),
neuper@37906
   132
    ("#Relate",[])
neuper@37906
   133
    ],
neuper@37906
   134
  {rew_ord'="tless_true",rls'=eval_rls,calc=[],srls=list_rls,prls=e_rls,
neuper@37906
   135
    crls = eval_rls, nrls=norm_Rational
neuper@37906
   136
   (*,  asm_rls=[],asm_thm=[]*)},
neuper@37906
   137
  "Script Maximum_value(fix_::bool list)(m_::real) (rs_::bool list)\
neuper@37906
   138
   \      (v_::real) (itv_::real set) (err_::bool) =          \ 
neuper@37906
   139
   \ (let e_ = (hd o (filterVar m_)) rs_;              \
neuper@37906
   140
   \      t_ = (if 1 < length_ rs_                            \
neuper@37906
   141
   \           then (SubProblem (DiffApp_,[make,function],[no_met])\
neuper@37906
   142
   \                     [real_ m_, real_ v_, bool_list_ rs_])\
neuper@37906
   143
   \           else (hd rs_));                                \
neuper@37906
   144
   \      (mx_::real) = SubProblem(DiffApp_,[on_interval,maximum_of,function],\
neuper@37906
   145
   \                                [DiffApp,max_on_interval_by_calculus])\
neuper@37906
   146
   \                               [bool_ t_, real_ v_, real_set_ itv_]\
neuper@37906
   147
   \ in ((SubProblem (DiffApp_,[find_values,tool],[Isac,find_values])   \
neuper@37906
   148
   \      [real_ mx_, real_ (Rhs t_), real_ v_, real_ m_,     \
neuper@37906
   149
   \       bool_list_ (dropWhile (ident e_) rs_)])::bool list))"
neuper@37906
   150
  ));
neuper@37906
   151
store_met
neuper@37906
   152
 (prep_met DiffApp.thy "met_diffapp_funnew" [] e_metID
neuper@37906
   153
 (["DiffApp","make_fun_by_new_variable"]:metID,
neuper@37906
   154
   [("#Given" ,["functionOf f_","boundVariable v_","equalities eqs_"]),
neuper@37906
   155
    ("#Find"  ,["functionEq f_1_"])
neuper@37906
   156
    ],
neuper@37906
   157
   {rew_ord'="tless_true",rls'=eval_rls,srls=list_rls,prls=e_rls,
neuper@37906
   158
    calc=[], crls = eval_rls, nrls=norm_Rational(*,asm_rls=[],asm_thm=[]*)},
neuper@37906
   159
  "Script Make_fun_by_new_variable (f_::real) (v_::real)     \
neuper@37906
   160
   \      (eqs_::bool list) =                                 \
neuper@37906
   161
   \(let h_ = (hd o (filterVar f_)) eqs_;             \
neuper@37906
   162
   \     es_ = dropWhile (ident h_) eqs_;                    \
neuper@37906
   163
   \     vs_ = dropWhile (ident f_) (Vars h_);                \
neuper@37906
   164
   \     v_1 = nth_ 1 vs_;                                   \
neuper@37906
   165
   \     v_2 = nth_ 2 vs_;                                   \
neuper@37906
   166
   \     e_1 = (hd o (filterVar v_1)) es_;            \
neuper@37906
   167
   \     e_2 = (hd o (filterVar v_2)) es_;            \
neuper@37906
   168
   \  (s_1::bool list) = (SubProblem (DiffApp_,[univariate,equation],[no_met])\
neuper@37906
   169
   \                    [bool_ e_1, real_ v_1]);\
neuper@37906
   170
   \  (s_2::bool list) = (SubProblem (DiffApp_,[univariate,equation],[no_met])\
neuper@37906
   171
   \                    [bool_ e_2, real_ v_2])\
neuper@37906
   172
   \in Substitute [(v_1 = (rhs o hd) s_1),(v_2 = (rhs o hd) s_2)] h_)"
neuper@37906
   173
));
neuper@37906
   174
store_met
neuper@37906
   175
(prep_met DiffApp.thy "met_diffapp_funexp" [] e_metID
neuper@37906
   176
(["DiffApp","make_fun_by_explicit"]:metID,
neuper@37906
   177
   [("#Given" ,["functionOf f_","boundVariable v_","equalities eqs_"]),
neuper@37906
   178
    ("#Find"  ,["functionEq f_1_"])
neuper@37906
   179
    ],
neuper@37906
   180
   {rew_ord'="tless_true",rls'=eval_rls,calc=[],srls=list_rls,prls=e_rls,
neuper@37906
   181
    crls = eval_rls, nrls=norm_Rational
neuper@37906
   182
    (*, asm_rls=[],asm_thm=[]*)},
neuper@37906
   183
   "Script Make_fun_by_explicit (f_::real) (v_::real)         \
neuper@37906
   184
   \      (eqs_::bool list) =                                 \
neuper@37906
   185
   \ (let h_ = (hd o (filterVar f_)) eqs_;                    \
neuper@37906
   186
   \      e_1 = hd (dropWhile (ident h_) eqs_);       \
neuper@37906
   187
   \      vs_ = dropWhile (ident f_) (Vars h_);                \
neuper@37906
   188
   \      v_1 = hd (dropWhile (ident v_) vs_);                \
neuper@37906
   189
   \      (s_1::bool list)=(SubProblem(DiffApp_,[univariate,equation],[no_met])\
neuper@37906
   190
   \                          [bool_ e_1, real_ v_1])\
neuper@37906
   191
   \ in Substitute [(v_1 = (rhs o hd) s_1)] h_)"
neuper@37906
   192
   ));
neuper@37906
   193
store_met
neuper@37906
   194
 (prep_met DiffApp.thy "met_diffapp_max_oninterval" [] e_metID
neuper@37906
   195
 (["DiffApp","max_on_interval_by_calculus"]:metID,
neuper@37906
   196
   [("#Given" ,["functionEq t_","boundVariable v_","interval itv_"(*,
neuper@37906
   197
		"errorBound err_"*)]),
neuper@37906
   198
    ("#Find"  ,["maxArgument v_0_"])
neuper@37906
   199
    ],
neuper@37906
   200
   {rew_ord'="tless_true",rls'=eval_rls,calc=[],srls = e_rls,prls=e_rls,
neuper@37906
   201
    crls = eval_rls, nrls=norm_Rational
neuper@37906
   202
    (*, asm_rls=[],asm_thm=[]*)},
neuper@37906
   203
   "empty_script"
neuper@37906
   204
   ));
neuper@37906
   205
store_met
neuper@37906
   206
 (prep_met DiffApp.thy "met_diffapp_findvals" [] e_metID
neuper@37906
   207
 (["DiffApp","find_values"]:metID,
neuper@37906
   208
   [],
neuper@37906
   209
   {rew_ord'="tless_true",rls'=eval_rls,calc=[],srls = e_rls,prls=e_rls,
neuper@37906
   210
    crls = eval_rls, nrls=norm_Rational(*,
neuper@37906
   211
    asm_rls=[],asm_thm=[]*)},
neuper@37906
   212
   "empty_script"));
neuper@37906
   213
neuper@37906
   214
val list_rls = append_rls "list_rls" list_rls
neuper@37906
   215
			  [Thm ("filterVar_Const", num_str filterVar_Const),
neuper@37906
   216
			   Thm ("filterVar_Nil", num_str filterVar_Nil)
neuper@37906
   217
			   ];
neuper@37906
   218
ruleset' := overwritelthy thy (!ruleset',
neuper@37906
   219
  [("list_rls",list_rls)
neuper@37906
   220
   ]);
neuper@37906
   221