src/Tools/isac/Knowledge/DiffApp.thy
author Walther Neuper <neuper@ist.tugraz.at>
Sun, 29 Sep 2013 18:27:37 +0200
changeset 52139 511fc271f783
parent 52136 ef98c3e15a8d
child 52148 aabc6c8e930a
permissions -rw-r--r--
collected updates since changeset 9690a8d5f1c
neuper@37906
     1
(* application of differential calculus
neuper@37954
     2
   Walther Neuper 2002
neuper@37954
     3
   (c) due to copyright terms
neuper@37906
     4
*)
neuper@37906
     5
neuper@37954
     6
theory DiffApp imports Diff begin
neuper@37906
     7
neuper@37906
     8
consts
neuper@37906
     9
neuper@37906
    10
  Maximum'_value
neuper@37954
    11
             :: "[bool list,real,bool list,real,real set,bool, 
neuper@37954
    12
		    bool list] => bool list"
neuper@37906
    13
               ("((Script Maximum'_value (_ _ _ _ _ _ =))// (_))" 9)
neuper@37906
    14
  
neuper@37906
    15
  Make'_fun'_by'_new'_variable
neuper@37954
    16
             :: "[real,real,bool list,  
neuper@37954
    17
		    bool] => bool"
neuper@37954
    18
               ("((Script Make'_fun'_by'_new'_variable (_ _ _ =))//  
neuper@37954
    19
		   (_))" 9)
neuper@37906
    20
  Make'_fun'_by'_explicit
neuper@37954
    21
             :: "[real,real,bool list,  
neuper@37954
    22
		    bool] => bool"
neuper@37954
    23
               ("((Script Make'_fun'_by'_explicit (_ _ _ =))//  
neuper@37954
    24
		   (_))" 9)
neuper@37906
    25
neuper@37906
    26
  dummy :: real
neuper@37906
    27
neuper@37906
    28
(*for script Maximum_value*)
neuper@37906
    29
  filterVar :: "[real, 'a list] => 'a list"
neuper@37906
    30
t@42211
    31
(*primrec*)axioms(*axiomatization where*)
t@42211
    32
  filterVar_Nil:		"filterVar v []     = []" (*and*)
neuper@37995
    33
  filterVar_Const:	"filterVar v (x#xs) =                       
neuper@41905
    34
			 (if (v : set (Vars x)) then x#(filterVar v xs)  
neuper@37954
    35
			                    else filterVar v xs)   "
neuper@37954
    36
text {*WN.6.5.03: old decisions in this file partially are being changed
neuper@37954
    37
  in a quick-and-dirty way to make scripts run: Maximum_value,
neuper@37954
    38
  Make_fun_by_new_variable, Make_fun_by_explicit.
neuper@37954
    39
found to be reconsidered:
neuper@37954
    40
- descriptions (Descript.thy)
neuper@37954
    41
- penv: really need term list; or just rerun the whole example with num/var
neuper@37954
    42
- mk_arg, itms2args ... env in script different from penv ?
neuper@37954
    43
- L = SubProblem eq ... show some vars on the worksheet ? (other means for
neuper@37954
    44
  referencing are labels (no on worksheet))
neuper@37954
    45
neuper@37954
    46
WN.6.5.03 quick-and-dirty: mk_arg, itms2args just make most convenient env
neuper@37954
    47
  from penv as is.    
neuper@37954
    48
*}
neuper@37954
    49
neuper@37954
    50
ML {*
neuper@37972
    51
val thy = @{theory};
neuper@37972
    52
neuper@52139
    53
val eval_rls = prep_rls (
neuper@52139
    54
  Rls {id = "eval_rls", preconds = [], rew_ord = ("termlessI", termlessI), 
neuper@52139
    55
    erls = e_rls, srls = Erls, calc = [], errpatts = [],
neuper@52139
    56
    rules = [Thm ("refl", num_str @{thm refl}),
neuper@52139
    57
      Thm ("order_refl", num_str @{thm order_refl}),
neuper@52139
    58
      Thm ("radd_left_cancel_le", num_str @{thm radd_left_cancel_le}),
neuper@52139
    59
      Thm ("not_true", num_str @{thm not_true}),
neuper@52139
    60
      Thm ("not_false", num_str @{thm not_false}),
neuper@52139
    61
      Thm ("and_true", num_str @{thm and_true}),
neuper@52139
    62
      Thm ("and_false", num_str @{thm and_false}),
neuper@52139
    63
      Thm ("or_true", num_str @{thm or_true}),
neuper@52139
    64
      Thm ("or_false", num_str @{thm or_false}),
neuper@52139
    65
      Thm ("and_commute", num_str @{thm and_commute}),
neuper@52139
    66
      Thm ("or_commute", num_str @{thm or_commute}),
neuper@52139
    67
      
neuper@52139
    68
      Calc ("Orderings.ord_class.less", eval_equ "#less_"),
neuper@52139
    69
      Calc ("Orderings.ord_class.less_eq", eval_equ "#less_equal_"),
neuper@52139
    70
      
neuper@52139
    71
      Calc ("Atools.ident", eval_ident "#ident_"),    
neuper@52139
    72
      Calc ("Atools.is'_const", eval_const "#is_const_"),
neuper@52139
    73
      Calc ("Atools.occurs'_in", eval_occurs_in ""),    
neuper@52139
    74
      Calc ("Tools.matches", eval_matches "")],
neuper@52139
    75
    scr = Prog ((term_of o the o (parse thy)) "empty_script")
neuper@52139
    76
    }:rls);
neuper@52139
    77
neuper@52139
    78
ruleset' := overwritelthy @{theory} (!ruleset',
neuper@52139
    79
	[("eval_rls", eval_rls)(*FIXXXME:del with rls.rls'*)]);
neuper@37995
    80
*}
neuper@52125
    81
setup {* KEStore_Elems.add_rlss [("eval_rls", (Context.theory_name @{theory}, eval_rls))] *}
neuper@37995
    82
ML{*
neuper@37954
    83
neuper@37954
    84
(** problem types **)
neuper@37954
    85
neuper@37954
    86
store_pbt
neuper@37972
    87
 (prep_pbt thy "pbl_fun_max" [] e_pblID
neuper@37954
    88
 (["maximum_of","function"],
neuper@37995
    89
  [("#Given" ,["fixedValues f_ix"]),
neuper@37995
    90
   ("#Find"  ,["maximum m_m","valuesFor v_s"]),
neuper@37995
    91
   ("#Relate",["relations r_s"])
neuper@37954
    92
  ],
neuper@37954
    93
  e_rls, NONE, []));
neuper@37954
    94
neuper@37954
    95
store_pbt
neuper@37972
    96
 (prep_pbt thy "pbl_fun_make" [] e_pblID
neuper@37954
    97
 (["make","function"]:pblID,
neuper@37994
    98
  [("#Given" ,["functionOf f_f","boundVariable v_v","equalities eqs"]),
neuper@37995
    99
   ("#Find"  ,["functionEq f_1"])
neuper@37954
   100
  ],
neuper@37954
   101
  e_rls, NONE, []));
neuper@37954
   102
store_pbt
neuper@37972
   103
 (prep_pbt thy "pbl_fun_max_expl" [] e_pblID
neuper@37954
   104
 (["by_explicit","make","function"]:pblID,
neuper@37994
   105
  [("#Given" ,["functionOf f_f","boundVariable v_v","equalities eqs"]),
neuper@37995
   106
   ("#Find"  ,["functionEq f_1"])
neuper@37954
   107
  ],
neuper@37954
   108
  e_rls, NONE, [["DiffApp","make_fun_by_explicit"]]));
neuper@37954
   109
store_pbt
neuper@37972
   110
 (prep_pbt thy "pbl_fun_max_newvar" [] e_pblID
neuper@37954
   111
 (["by_new_variable","make","function"]:pblID,
neuper@37994
   112
  [("#Given" ,["functionOf f_f","boundVariable v_v","equalities eqs"]),
neuper@37954
   113
   (*WN.12.5.03: precond for distinction still missing*)
neuper@37995
   114
   ("#Find"  ,["functionEq f_1"])
neuper@37954
   115
  ],
neuper@37954
   116
  e_rls, NONE, [["DiffApp","make_fun_by_new_variable"]]));
neuper@37954
   117
neuper@37954
   118
store_pbt
neuper@37972
   119
 (prep_pbt thy "pbl_fun_max_interv" [] e_pblID
neuper@37954
   120
 (["on_interval","maximum_of","function"]:pblID,
neuper@37995
   121
  [("#Given" ,["functionEq t_t","boundVariable v_v","interval i_tv"]),
neuper@37954
   122
   (*WN.12.5.03: precond for distinction still missing*)
neuper@37995
   123
   ("#Find"  ,["maxArgument v_0"])
neuper@37954
   124
  ],
neuper@37954
   125
  e_rls, NONE, []));
neuper@37954
   126
neuper@37954
   127
store_pbt
neuper@37972
   128
 (prep_pbt thy "pbl_tool" [] e_pblID
neuper@37954
   129
 (["tool"]:pblID,
neuper@37954
   130
  [],
neuper@37954
   131
  e_rls, NONE, []));
neuper@37954
   132
neuper@37954
   133
store_pbt
neuper@37972
   134
 (prep_pbt thy "pbl_tool_findvals" [] e_pblID
neuper@37954
   135
 (["find_values","tool"]:pblID,
neuper@37995
   136
  [("#Given" ,["maxArgument m_ax","functionEq f_f","boundVariable v_v"]),
neuper@37995
   137
   ("#Find"  ,["valuesFor v_ls"]),
neuper@37995
   138
   ("#Relate",["additionalRels r_s"])
neuper@37954
   139
  ],
neuper@37954
   140
  e_rls, NONE, []));
neuper@37954
   141
neuper@37995
   142
*}
neuper@37995
   143
ML{*
neuper@37954
   144
neuper@37954
   145
(** methods, scripts not yet implemented **)
neuper@37954
   146
neuper@37954
   147
store_met
neuper@37972
   148
 (prep_met thy "met_diffapp" [] e_metID
neuper@37954
   149
 (["DiffApp"],
neuper@37954
   150
   [],
neuper@37954
   151
   {rew_ord'="tless_true",rls'=Atools_erls,calc = [], srls = e_rls, prls=e_rls,
neuper@42425
   152
    crls = Atools_erls, errpats = [], nrls = norm_Rational
neuper@37954
   153
    (*, asm_rls=[],asm_thm=[]*)}, "empty_script"));
neuper@37995
   154
*}
neuper@37995
   155
ML{*
neuper@37954
   156
store_met
neuper@37972
   157
 (prep_met thy "met_diffapp_max" [] e_metID
neuper@37954
   158
 (["DiffApp","max_by_calculus"]:metID,
neuper@37995
   159
  [("#Given" ,["fixedValues f_ix","maximum m_m","relations r_s",
neuper@37995
   160
	       "boundVariable v_v","interval i_tv","errorBound e_rr"]),
neuper@37995
   161
    ("#Find"  ,["valuesFor v_s"]),
neuper@37954
   162
    ("#Relate",[])
neuper@37954
   163
    ],
neuper@37954
   164
  {rew_ord'="tless_true",rls'=eval_rls,calc=[],srls=list_rls,prls=e_rls,
neuper@42425
   165
    crls = eval_rls, errpats = [], nrls = norm_Rational
neuper@37954
   166
   (*,  asm_rls=[],asm_thm=[]*)},
neuper@37995
   167
  "Script Maximum_value(f_ix::bool list)(m_m::real) (r_s::bool list)       " ^
neuper@37995
   168
  "      (v_v::real) (itv_v::real set) (e_rr::bool) =                       " ^ 
neuper@37995
   169
  " (let e_e = (hd o (filterVar m_m)) r_s;                                  " ^
neuper@37995
   170
  "      t_t = (if 1 < LENGTH r_s                                         " ^
neuper@37995
   171
  "           then (SubProblem (DiffApp',[make,function],[no_met])        " ^
neuper@37995
   172
  "                     [REAL m_m, REAL v_v, BOOL_LIST r_s])             " ^
neuper@37995
   173
  "           else (hd r_s));                                             " ^
neuper@37995
   174
  "      (m_x::real) =                                                    " ^ 
neuper@37995
   175
  "SubProblem(DiffApp',[on_interval,maximum_of,function],                 " ^
neuper@37954
   176
  "                                [DiffApp,max_on_interval_by_calculus]) " ^
neuper@37995
   177
  "                               [BOOL t_t, REAL v_v, REAL_SET i_tv]    " ^
neuper@37995
   178
  " in ((SubProblem (DiffApp',[find_values,tool],[Isac,find_values])      " ^
neuper@37995
   179
  "      [REAL m_x, REAL (Rhs t_t), REAL v_v, REAL m_m,                  " ^
neuper@37995
   180
  "       BOOL_LIST (dropWhile (ident e_e) r_s)])::bool list))            "
neuper@37954
   181
 ));
neuper@37995
   182
*}
neuper@37995
   183
ML{*
neuper@37954
   184
store_met
neuper@37972
   185
 (prep_met thy "met_diffapp_funnew" [] e_metID
neuper@37954
   186
 (["DiffApp","make_fun_by_new_variable"]:metID,
neuper@37994
   187
   [("#Given" ,["functionOf f_f","boundVariable v_v","equalities eqs"]),
neuper@37995
   188
    ("#Find"  ,["functionEq f_1"])
neuper@37954
   189
    ],
neuper@37954
   190
   {rew_ord'="tless_true",rls'=eval_rls,srls=list_rls,prls=e_rls,
neuper@42425
   191
    calc=[], crls = eval_rls, errpats = [], nrls = norm_Rational(*,asm_rls=[],asm_thm=[]*)},
neuper@37994
   192
  "Script Make_fun_by_new_variable (f_f::real) (v_v::real)                " ^
neuper@37994
   193
  "      (eqs::bool list) =                                            " ^
neuper@37995
   194
  "(let h_h = (hd o (filterVar f_f)) eqs;                                " ^
neuper@37995
   195
  "     e_s = dropWhile (ident h_h) eqs;                                " ^
neuper@37995
   196
  "     v_s = dropWhile (ident f_f) (Vars h_h);                           " ^
neuper@37995
   197
  "     v_1 = NTH 1 v_s;                                               " ^
neuper@37995
   198
  "     v_2 = NTH 2 v_s;                                               " ^
neuper@37995
   199
  "     e_1 = (hd o (filterVar v_1)) e_s;                               " ^
neuper@37995
   200
  "     e_2 = (hd o (filterVar v_2)) e_s;                               " ^
neuper@37954
   201
  "  (s_1::bool list) =                                                 " ^
neuper@37995
   202
  "                (SubProblem (DiffApp',[univariate,equation],[no_met])" ^
neuper@37984
   203
  "                    [BOOL e_1, REAL v_1]);                         " ^
neuper@37954
   204
  "  (s_2::bool list) =                                                 " ^
neuper@37995
   205
  "                (SubProblem (DiffApp',[univariate,equation],[no_met])" ^
neuper@37984
   206
  "                    [BOOL e_2, REAL v_2])" ^
neuper@37995
   207
  "in Substitute [(v_1 = (rhs o hd) s_1),(v_2 = (rhs o hd) s_2)] h_h)"
neuper@37954
   208
));
neuper@37995
   209
*}
neuper@37995
   210
ML{*
neuper@37954
   211
store_met
neuper@37972
   212
(prep_met thy "met_diffapp_funexp" [] e_metID
neuper@37954
   213
(["DiffApp","make_fun_by_explicit"]:metID,
neuper@37994
   214
   [("#Given" ,["functionOf f_f","boundVariable v_v","equalities eqs"]),
neuper@37995
   215
    ("#Find"  ,["functionEq f_1"])
neuper@37954
   216
    ],
neuper@37954
   217
   {rew_ord'="tless_true",rls'=eval_rls,calc=[],srls=list_rls,prls=e_rls,
neuper@42425
   218
    crls = eval_rls, errpats = [], nrls = norm_Rational
neuper@37954
   219
    (*, asm_rls=[],asm_thm=[]*)},
neuper@37994
   220
   "Script Make_fun_by_explicit (f_f::real) (v_v::real)                 " ^
neuper@37994
   221
   "      (eqs::bool list) =                                         " ^
neuper@37995
   222
   " (let h_h = (hd o (filterVar f_f)) eqs;                            " ^
neuper@37995
   223
   "      e_1 = hd (dropWhile (ident h_h) eqs);                       " ^
neuper@37995
   224
   "      v_s = dropWhile (ident f_f) (Vars h_h);                       " ^
neuper@37995
   225
   "      v_1 = hd (dropWhile (ident v_v) v_s);                        " ^
neuper@37954
   226
   "      (s_1::bool list)=                                           " ^ 
neuper@37995
   227
   "              (SubProblem(DiffApp',[univariate,equation],[no_met])" ^
neuper@37984
   228
   "                          [BOOL e_1, REAL v_1])                 " ^
neuper@37995
   229
   " in Substitute [(v_1 = (rhs o hd) s_1)] h_h)                       "
neuper@37954
   230
   ));
neuper@37995
   231
*}
neuper@37995
   232
ML{*
neuper@37954
   233
store_met
neuper@37972
   234
 (prep_met thy "met_diffapp_max_oninterval" [] e_metID
neuper@37954
   235
 (["DiffApp","max_on_interval_by_calculus"]:metID,
neuper@37995
   236
   [("#Given" ,["functionEq t_t","boundVariable v_v","interval i_tv"(*,
neuper@37995
   237
		"errorBound e_rr"*)]),
neuper@37995
   238
    ("#Find"  ,["maxArgument v_0"])
neuper@37954
   239
    ],
neuper@37954
   240
   {rew_ord'="tless_true",rls'=eval_rls,calc=[],srls = e_rls,prls=e_rls,
neuper@42425
   241
    crls = eval_rls, errpats = [], nrls = norm_Rational
neuper@37954
   242
    (*, asm_rls=[],asm_thm=[]*)},
neuper@37954
   243
   "empty_script"
neuper@37954
   244
   ));
neuper@37995
   245
*}
neuper@37995
   246
ML{*
neuper@37954
   247
store_met
neuper@37972
   248
 (prep_met thy "met_diffapp_findvals" [] e_metID
neuper@37954
   249
 (["DiffApp","find_values"]:metID,
neuper@37954
   250
   [],
neuper@37954
   251
   {rew_ord'="tless_true",rls'=eval_rls,calc=[],srls = e_rls,prls=e_rls,
neuper@42425
   252
    crls = eval_rls, errpats = [], nrls = norm_Rational(*,
neuper@37954
   253
    asm_rls=[],asm_thm=[]*)},
neuper@37954
   254
   "empty_script"));
neuper@37954
   255
neuper@37954
   256
val list_rls = append_rls "list_rls" list_rls
neuper@52139
   257
  [Thm ("filterVar_Const", num_str @{thm filterVar_Const}),
neuper@52139
   258
   Thm ("filterVar_Nil", num_str @{thm filterVar_Nil})];
neuper@52139
   259
neuper@37967
   260
ruleset' := overwritelthy @{theory} (!ruleset',
neuper@37954
   261
  [("list_rls",list_rls)
neuper@37954
   262
   ]);
neuper@37954
   263
*}
neuper@52125
   264
setup {* KEStore_Elems.add_rlss [("list_rls", (Context.theory_name @{theory}, list_rls))] *}
neuper@37906
   265
neuper@37906
   266
end