src/Tools/isac/Knowledge/DiffApp.thy
author Mathias Lehnfeld <s1210629013@students.fh-hagenberg.at>
Mon, 27 Jan 2014 21:49:27 +0100
changeset 55359 73dc85c025ab
parent 55339 cccd24e959ba
child 55363 d78bc1342183
permissions -rw-r--r--
cleanup, naming: 'KEStore_Elems' in Tests now 'Test_KEStore_Elems', 'store_pbts' now 'add_pbts'
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
neuper@52148
    31
axiomatization where
neuper@52148
    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@37995
    77
*}
neuper@52125
    78
setup {* KEStore_Elems.add_rlss [("eval_rls", (Context.theory_name @{theory}, eval_rls))] *}
neuper@37995
    79
ML{*
neuper@37954
    80
neuper@37954
    81
(** problem types **)
neuper@37954
    82
neuper@37954
    83
store_pbt
neuper@37972
    84
 (prep_pbt thy "pbl_fun_max" [] e_pblID
neuper@37954
    85
 (["maximum_of","function"],
neuper@37995
    86
  [("#Given" ,["fixedValues f_ix"]),
neuper@37995
    87
   ("#Find"  ,["maximum m_m","valuesFor v_s"]),
neuper@37995
    88
   ("#Relate",["relations r_s"])
neuper@37954
    89
  ],
neuper@37954
    90
  e_rls, NONE, []));
neuper@37954
    91
neuper@37954
    92
store_pbt
neuper@37972
    93
 (prep_pbt thy "pbl_fun_make" [] e_pblID
neuper@37954
    94
 (["make","function"]:pblID,
neuper@37994
    95
  [("#Given" ,["functionOf f_f","boundVariable v_v","equalities eqs"]),
neuper@37995
    96
   ("#Find"  ,["functionEq f_1"])
neuper@37954
    97
  ],
neuper@37954
    98
  e_rls, NONE, []));
neuper@37954
    99
store_pbt
neuper@37972
   100
 (prep_pbt thy "pbl_fun_max_expl" [] e_pblID
neuper@37954
   101
 (["by_explicit","make","function"]:pblID,
neuper@37994
   102
  [("#Given" ,["functionOf f_f","boundVariable v_v","equalities eqs"]),
neuper@37995
   103
   ("#Find"  ,["functionEq f_1"])
neuper@37954
   104
  ],
neuper@37954
   105
  e_rls, NONE, [["DiffApp","make_fun_by_explicit"]]));
neuper@37954
   106
store_pbt
neuper@37972
   107
 (prep_pbt thy "pbl_fun_max_newvar" [] e_pblID
neuper@37954
   108
 (["by_new_variable","make","function"]:pblID,
neuper@37994
   109
  [("#Given" ,["functionOf f_f","boundVariable v_v","equalities eqs"]),
neuper@37954
   110
   (*WN.12.5.03: precond for distinction still missing*)
neuper@37995
   111
   ("#Find"  ,["functionEq f_1"])
neuper@37954
   112
  ],
neuper@37954
   113
  e_rls, NONE, [["DiffApp","make_fun_by_new_variable"]]));
neuper@37954
   114
neuper@37954
   115
store_pbt
neuper@37972
   116
 (prep_pbt thy "pbl_fun_max_interv" [] e_pblID
neuper@37954
   117
 (["on_interval","maximum_of","function"]:pblID,
neuper@37995
   118
  [("#Given" ,["functionEq t_t","boundVariable v_v","interval i_tv"]),
neuper@37954
   119
   (*WN.12.5.03: precond for distinction still missing*)
neuper@37995
   120
   ("#Find"  ,["maxArgument v_0"])
neuper@37954
   121
  ],
neuper@37954
   122
  e_rls, NONE, []));
neuper@37954
   123
neuper@37954
   124
store_pbt
neuper@37972
   125
 (prep_pbt thy "pbl_tool" [] e_pblID
neuper@37954
   126
 (["tool"]:pblID,
neuper@37954
   127
  [],
neuper@37954
   128
  e_rls, NONE, []));
neuper@37954
   129
neuper@37954
   130
store_pbt
neuper@37972
   131
 (prep_pbt thy "pbl_tool_findvals" [] e_pblID
neuper@37954
   132
 (["find_values","tool"]:pblID,
neuper@37995
   133
  [("#Given" ,["maxArgument m_ax","functionEq f_f","boundVariable v_v"]),
neuper@37995
   134
   ("#Find"  ,["valuesFor v_ls"]),
neuper@37995
   135
   ("#Relate",["additionalRels r_s"])
neuper@37954
   136
  ],
neuper@37954
   137
  e_rls, NONE, []));
neuper@37995
   138
*}
s1210629013@55359
   139
setup {* KEStore_Elems.add_pbts
s1210629013@55339
   140
  [(prep_pbt thy "pbl_fun_max" [] e_pblID
s1210629013@55339
   141
      (["maximum_of","function"],
s1210629013@55339
   142
        [("#Given" ,["fixedValues f_ix"]),
s1210629013@55339
   143
          ("#Find"  ,["maximum m_m","valuesFor v_s"]),
s1210629013@55339
   144
          ("#Relate",["relations r_s"])],
s1210629013@55339
   145
        e_rls, NONE, [])),
s1210629013@55339
   146
    (prep_pbt thy "pbl_fun_make" [] e_pblID
s1210629013@55339
   147
      (["make","function"]:pblID,
s1210629013@55339
   148
        [("#Given" ,["functionOf f_f","boundVariable v_v","equalities eqs"]),
s1210629013@55339
   149
          ("#Find"  ,["functionEq f_1"])],
s1210629013@55339
   150
        e_rls, NONE, [])),
s1210629013@55339
   151
    (prep_pbt thy "pbl_fun_max_expl" [] e_pblID
s1210629013@55339
   152
      (["by_explicit","make","function"]:pblID,
s1210629013@55339
   153
        [("#Given" ,["functionOf f_f","boundVariable v_v","equalities eqs"]),
s1210629013@55339
   154
          ("#Find"  ,["functionEq f_1"])],
s1210629013@55339
   155
      e_rls, NONE, [["DiffApp","make_fun_by_explicit"]])),
s1210629013@55339
   156
    (prep_pbt thy "pbl_fun_max_newvar" [] e_pblID
s1210629013@55339
   157
      (["by_new_variable","make","function"]:pblID,
s1210629013@55339
   158
        [("#Given" ,["functionOf f_f","boundVariable v_v","equalities eqs"]),
s1210629013@55339
   159
          (*WN.12.5.03: precond for distinction still missing*)
s1210629013@55339
   160
          ("#Find"  ,["functionEq f_1"])],
s1210629013@55339
   161
      e_rls, NONE, [["DiffApp","make_fun_by_new_variable"]])),
s1210629013@55339
   162
    (prep_pbt thy "pbl_fun_max_interv" [] e_pblID
s1210629013@55339
   163
      (["on_interval","maximum_of","function"]:pblID,
s1210629013@55339
   164
        [("#Given" ,["functionEq t_t","boundVariable v_v","interval i_tv"]),
s1210629013@55339
   165
          (*WN.12.5.03: precond for distinction still missing*)
s1210629013@55339
   166
          ("#Find"  ,["maxArgument v_0"])],
s1210629013@55339
   167
      e_rls, NONE, [])),
s1210629013@55339
   168
    (prep_pbt thy "pbl_tool" [] e_pblID
s1210629013@55339
   169
      (["tool"]:pblID, [], e_rls, NONE, [])),
s1210629013@55339
   170
    (prep_pbt thy "pbl_tool_findvals" [] e_pblID
s1210629013@55339
   171
      (["find_values","tool"]:pblID,
s1210629013@55339
   172
        [("#Given" ,["maxArgument m_ax","functionEq f_f","boundVariable v_v"]),
s1210629013@55339
   173
          ("#Find"  ,["valuesFor v_ls"]),
s1210629013@55339
   174
          ("#Relate",["additionalRels r_s"])],
s1210629013@55339
   175
      e_rls, NONE, []))] *}
neuper@37995
   176
ML{*
neuper@37954
   177
neuper@37954
   178
(** methods, scripts not yet implemented **)
neuper@37954
   179
neuper@37954
   180
store_met
neuper@37972
   181
 (prep_met thy "met_diffapp" [] e_metID
neuper@37954
   182
 (["DiffApp"],
neuper@37954
   183
   [],
neuper@37954
   184
   {rew_ord'="tless_true",rls'=Atools_erls,calc = [], srls = e_rls, prls=e_rls,
neuper@42425
   185
    crls = Atools_erls, errpats = [], nrls = norm_Rational
neuper@37954
   186
    (*, asm_rls=[],asm_thm=[]*)}, "empty_script"));
neuper@37995
   187
*}
neuper@37995
   188
ML{*
neuper@37954
   189
store_met
neuper@37972
   190
 (prep_met thy "met_diffapp_max" [] e_metID
neuper@37954
   191
 (["DiffApp","max_by_calculus"]:metID,
neuper@37995
   192
  [("#Given" ,["fixedValues f_ix","maximum m_m","relations r_s",
neuper@37995
   193
	       "boundVariable v_v","interval i_tv","errorBound e_rr"]),
neuper@37995
   194
    ("#Find"  ,["valuesFor v_s"]),
neuper@37954
   195
    ("#Relate",[])
neuper@37954
   196
    ],
neuper@37954
   197
  {rew_ord'="tless_true",rls'=eval_rls,calc=[],srls=list_rls,prls=e_rls,
neuper@42425
   198
    crls = eval_rls, errpats = [], nrls = norm_Rational
neuper@37954
   199
   (*,  asm_rls=[],asm_thm=[]*)},
neuper@37995
   200
  "Script Maximum_value(f_ix::bool list)(m_m::real) (r_s::bool list)       " ^
neuper@37995
   201
  "      (v_v::real) (itv_v::real set) (e_rr::bool) =                       " ^ 
neuper@37995
   202
  " (let e_e = (hd o (filterVar m_m)) r_s;                                  " ^
neuper@37995
   203
  "      t_t = (if 1 < LENGTH r_s                                         " ^
neuper@37995
   204
  "           then (SubProblem (DiffApp',[make,function],[no_met])        " ^
neuper@37995
   205
  "                     [REAL m_m, REAL v_v, BOOL_LIST r_s])             " ^
neuper@37995
   206
  "           else (hd r_s));                                             " ^
neuper@37995
   207
  "      (m_x::real) =                                                    " ^ 
neuper@37995
   208
  "SubProblem(DiffApp',[on_interval,maximum_of,function],                 " ^
neuper@37954
   209
  "                                [DiffApp,max_on_interval_by_calculus]) " ^
neuper@37995
   210
  "                               [BOOL t_t, REAL v_v, REAL_SET i_tv]    " ^
neuper@37995
   211
  " in ((SubProblem (DiffApp',[find_values,tool],[Isac,find_values])      " ^
neuper@37995
   212
  "      [REAL m_x, REAL (Rhs t_t), REAL v_v, REAL m_m,                  " ^
neuper@37995
   213
  "       BOOL_LIST (dropWhile (ident e_e) r_s)])::bool list))            "
neuper@37954
   214
 ));
neuper@37995
   215
*}
neuper@37995
   216
ML{*
neuper@37954
   217
store_met
neuper@37972
   218
 (prep_met thy "met_diffapp_funnew" [] e_metID
neuper@37954
   219
 (["DiffApp","make_fun_by_new_variable"]:metID,
neuper@37994
   220
   [("#Given" ,["functionOf f_f","boundVariable v_v","equalities eqs"]),
neuper@37995
   221
    ("#Find"  ,["functionEq f_1"])
neuper@37954
   222
    ],
neuper@37954
   223
   {rew_ord'="tless_true",rls'=eval_rls,srls=list_rls,prls=e_rls,
neuper@42425
   224
    calc=[], crls = eval_rls, errpats = [], nrls = norm_Rational(*,asm_rls=[],asm_thm=[]*)},
neuper@37994
   225
  "Script Make_fun_by_new_variable (f_f::real) (v_v::real)                " ^
neuper@37994
   226
  "      (eqs::bool list) =                                            " ^
neuper@37995
   227
  "(let h_h = (hd o (filterVar f_f)) eqs;                                " ^
neuper@37995
   228
  "     e_s = dropWhile (ident h_h) eqs;                                " ^
neuper@37995
   229
  "     v_s = dropWhile (ident f_f) (Vars h_h);                           " ^
neuper@37995
   230
  "     v_1 = NTH 1 v_s;                                               " ^
neuper@37995
   231
  "     v_2 = NTH 2 v_s;                                               " ^
neuper@37995
   232
  "     e_1 = (hd o (filterVar v_1)) e_s;                               " ^
neuper@37995
   233
  "     e_2 = (hd o (filterVar v_2)) e_s;                               " ^
neuper@37954
   234
  "  (s_1::bool list) =                                                 " ^
neuper@37995
   235
  "                (SubProblem (DiffApp',[univariate,equation],[no_met])" ^
neuper@37984
   236
  "                    [BOOL e_1, REAL v_1]);                         " ^
neuper@37954
   237
  "  (s_2::bool list) =                                                 " ^
neuper@37995
   238
  "                (SubProblem (DiffApp',[univariate,equation],[no_met])" ^
neuper@37984
   239
  "                    [BOOL e_2, REAL v_2])" ^
neuper@37995
   240
  "in Substitute [(v_1 = (rhs o hd) s_1),(v_2 = (rhs o hd) s_2)] h_h)"
neuper@37954
   241
));
neuper@37995
   242
*}
neuper@37995
   243
ML{*
neuper@37954
   244
store_met
neuper@37972
   245
(prep_met thy "met_diffapp_funexp" [] e_metID
neuper@37954
   246
(["DiffApp","make_fun_by_explicit"]:metID,
neuper@37994
   247
   [("#Given" ,["functionOf f_f","boundVariable v_v","equalities eqs"]),
neuper@37995
   248
    ("#Find"  ,["functionEq f_1"])
neuper@37954
   249
    ],
neuper@37954
   250
   {rew_ord'="tless_true",rls'=eval_rls,calc=[],srls=list_rls,prls=e_rls,
neuper@42425
   251
    crls = eval_rls, errpats = [], nrls = norm_Rational
neuper@37954
   252
    (*, asm_rls=[],asm_thm=[]*)},
neuper@37994
   253
   "Script Make_fun_by_explicit (f_f::real) (v_v::real)                 " ^
neuper@37994
   254
   "      (eqs::bool list) =                                         " ^
neuper@37995
   255
   " (let h_h = (hd o (filterVar f_f)) eqs;                            " ^
neuper@37995
   256
   "      e_1 = hd (dropWhile (ident h_h) eqs);                       " ^
neuper@37995
   257
   "      v_s = dropWhile (ident f_f) (Vars h_h);                       " ^
neuper@37995
   258
   "      v_1 = hd (dropWhile (ident v_v) v_s);                        " ^
neuper@37954
   259
   "      (s_1::bool list)=                                           " ^ 
neuper@37995
   260
   "              (SubProblem(DiffApp',[univariate,equation],[no_met])" ^
neuper@37984
   261
   "                          [BOOL e_1, REAL v_1])                 " ^
neuper@37995
   262
   " in Substitute [(v_1 = (rhs o hd) s_1)] h_h)                       "
neuper@37954
   263
   ));
neuper@37995
   264
*}
neuper@37995
   265
ML{*
neuper@37954
   266
store_met
neuper@37972
   267
 (prep_met thy "met_diffapp_max_oninterval" [] e_metID
neuper@37954
   268
 (["DiffApp","max_on_interval_by_calculus"]:metID,
neuper@37995
   269
   [("#Given" ,["functionEq t_t","boundVariable v_v","interval i_tv"(*,
neuper@37995
   270
		"errorBound e_rr"*)]),
neuper@37995
   271
    ("#Find"  ,["maxArgument v_0"])
neuper@37954
   272
    ],
neuper@37954
   273
   {rew_ord'="tless_true",rls'=eval_rls,calc=[],srls = e_rls,prls=e_rls,
neuper@42425
   274
    crls = eval_rls, errpats = [], nrls = norm_Rational
neuper@37954
   275
    (*, asm_rls=[],asm_thm=[]*)},
neuper@37954
   276
   "empty_script"
neuper@37954
   277
   ));
neuper@37995
   278
*}
neuper@37995
   279
ML{*
neuper@37954
   280
store_met
neuper@37972
   281
 (prep_met thy "met_diffapp_findvals" [] e_metID
neuper@37954
   282
 (["DiffApp","find_values"]:metID,
neuper@37954
   283
   [],
neuper@37954
   284
   {rew_ord'="tless_true",rls'=eval_rls,calc=[],srls = e_rls,prls=e_rls,
neuper@42425
   285
    crls = eval_rls, errpats = [], nrls = norm_Rational(*,
neuper@37954
   286
    asm_rls=[],asm_thm=[]*)},
neuper@37954
   287
   "empty_script"));
neuper@37954
   288
neuper@37954
   289
val list_rls = append_rls "list_rls" list_rls
neuper@52139
   290
  [Thm ("filterVar_Const", num_str @{thm filterVar_Const}),
neuper@52139
   291
   Thm ("filterVar_Nil", num_str @{thm filterVar_Nil})];
neuper@37954
   292
*}
neuper@52125
   293
setup {* KEStore_Elems.add_rlss [("list_rls", (Context.theory_name @{theory}, list_rls))] *}
neuper@37906
   294
neuper@37906
   295
end