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

Scripts --> ProgLang
ME --> Interpret
IsacKnowledge --> Knowledge
neuper@37906
     1
(*.(c) by Richard Lang, 2003 .*)
neuper@37906
     2
(* collecting all knowledge for RationalEquations
neuper@37906
     3
   created by: rlang 
neuper@37906
     4
         date: 02.09
neuper@37906
     5
   changed by: rlang
neuper@37906
     6
   last change by: rlang
neuper@37906
     7
             date: 02.11.29
neuper@37906
     8
*)
neuper@37906
     9
neuper@37947
    10
(* use"Knowledge/RatEq.ML";
neuper@37906
    11
   use"RatEq.ML";
neuper@37906
    12
   remove_thy"RatEq";
neuper@37906
    13
   use_thy"Isac";
neuper@37906
    14
neuper@37906
    15
   use"ROOT.ML";
neuper@37906
    16
   cd"IsacKnowledge";
neuper@37906
    17
   *)
neuper@37906
    18
"******* RatEq.ML begin *******";
neuper@37906
    19
neuper@37906
    20
theory' := overwritel (!theory', [("RatEq.thy",RatEq.thy)]);
neuper@37906
    21
neuper@37906
    22
(*-------------------------functions-----------------------*)
neuper@37906
    23
(* is_rateqation_in becomes true, if a bdv is in the denominator of a fraction*)
neuper@37906
    24
fun is_rateqation_in t v = 
neuper@37906
    25
    let 
neuper@37935
    26
	fun coeff_in c v = member op = (vars c) v;
neuper@37906
    27
   	fun finddivide (_ $ _ $ _ $ _) v = raise error("is_rateqation_in:")
neuper@37906
    28
	    (* at the moment there is no term like this, but ....*)
neuper@37906
    29
	  | finddivide (t as (Const ("HOL.divide",_) $ _ $ b)) v = coeff_in b v
neuper@37930
    30
	  | finddivide (_ $ t1 $ t2) v = (finddivide t1 v) 
neuper@37930
    31
                                         orelse (finddivide t2 v)
neuper@37906
    32
	  | finddivide (_ $ t1) v = (finddivide t1 v)
neuper@37906
    33
	  | finddivide _ _ = false;
neuper@37906
    34
     in
neuper@37906
    35
	finddivide t v
neuper@37906
    36
    end;
neuper@37906
    37
    
neuper@37906
    38
fun eval_is_ratequation_in _ _ (p as (Const ("RatEq.is'_ratequation'_in",_) $ t $ v)) _  =
neuper@37906
    39
    if is_rateqation_in t v then 
neuper@37926
    40
	SOME ((term2str p) ^ " = True",
neuper@37906
    41
	      Trueprop $ (mk_equality (p, HOLogic.true_const)))
neuper@37926
    42
    else SOME ((term2str p) ^ " = True",
neuper@37906
    43
	       Trueprop $ (mk_equality (p, HOLogic.false_const)))
neuper@37926
    44
  | eval_is_ratequation_in _ _ _ _ = ((*writeln"### nichts matcht";*) NONE);
neuper@37906
    45
neuper@37906
    46
(*-------------------------rulse-----------------------*)
neuper@37906
    47
val RatEq_prls = (*15.10.02:just the following order due to subterm evaluation*)
neuper@37906
    48
  append_rls "RatEq_prls" e_rls 
neuper@37906
    49
	     [Calc ("Atools.ident",eval_ident "#ident_"),
neuper@37906
    50
	      Calc ("Tools.matches",eval_matches ""),
neuper@37906
    51
	      Calc ("Tools.lhs"    ,eval_lhs ""),
neuper@37906
    52
	      Calc ("Tools.rhs"    ,eval_rhs ""),
neuper@37906
    53
	      Calc ("RatEq.is'_ratequation'_in",eval_is_ratequation_in ""),
neuper@37906
    54
	      Calc ("op =",eval_equal "#equal_"),
neuper@37906
    55
	      Thm ("not_true",num_str not_true),
neuper@37906
    56
	      Thm ("not_false",num_str not_false),
neuper@37906
    57
	      Thm ("and_true",num_str and_true),
neuper@37906
    58
	      Thm ("and_false",num_str and_false),
neuper@37906
    59
	      Thm ("or_true",num_str or_true),
neuper@37906
    60
	      Thm ("or_false",num_str or_false)
neuper@37906
    61
	      ];
neuper@37906
    62
neuper@37906
    63
neuper@37906
    64
(*rls = merge_rls erls Poly_erls *)
neuper@37906
    65
val rateq_erls = 
neuper@37906
    66
    remove_rls "rateq_erls"                                   (*WN: ein Hack*)
neuper@37906
    67
	(merge_rls "is_ratequation_in" calculate_Rational
neuper@37906
    68
		   (append_rls "is_ratequation_in"
neuper@37906
    69
			Poly_erls
neuper@37906
    70
			[(*Calc ("HOL.divide", eval_cancel "#divide_"),*)
neuper@37906
    71
			 Calc ("RatEq.is'_ratequation'_in",
neuper@37906
    72
			       eval_is_ratequation_in "")
neuper@37906
    73
neuper@37906
    74
			 ]))
neuper@37906
    75
	[Thm ("and_commute",num_str and_commute), (*WN: ein Hack*)
neuper@37906
    76
	 Thm ("or_commute",num_str or_commute)    (*WN: ein Hack*)
neuper@37906
    77
	 ];
neuper@37906
    78
ruleset' := overwritelthy thy (!ruleset',
neuper@37906
    79
			[("rateq_erls",rateq_erls)(*FIXXXME:del with rls.rls'*)
neuper@37906
    80
			 ]);
neuper@37906
    81
neuper@37906
    82
neuper@37906
    83
val RatEq_crls = 
neuper@37906
    84
    remove_rls "RatEq_crls"                                   (*WN: ein Hack*)
neuper@37906
    85
	(merge_rls "is_ratequation_in" calculate_Rational
neuper@37906
    86
		   (append_rls "is_ratequation_in"
neuper@37906
    87
			Poly_erls
neuper@37906
    88
			[(*Calc ("HOL.divide", eval_cancel "#divide_"),*)
neuper@37906
    89
			 Calc ("RatEq.is'_ratequation'_in",
neuper@37906
    90
			       eval_is_ratequation_in "")
neuper@37906
    91
			 ]))
neuper@37906
    92
	[Thm ("and_commute",num_str and_commute), (*WN: ein Hack*)
neuper@37906
    93
	 Thm ("or_commute",num_str or_commute)    (*WN: ein Hack*)
neuper@37906
    94
	 ];
neuper@37906
    95
neuper@37906
    96
val RatEq_eliminate = prep_rls(
neuper@37906
    97
  Rls {id = "RatEq_eliminate", preconds = [], rew_ord = ("termlessI",termlessI), 
neuper@37906
    98
      erls = rateq_erls, srls = Erls, calc = [], 
neuper@37906
    99
       (*asm_thm = [("rat_mult_denominator_both",""),("rat_mult_denominator_left",""),
neuper@37906
   100
                  ("rat_mult_denominator_right","")],*)
neuper@37906
   101
    rules = [
neuper@37906
   102
	     Thm("rat_mult_denominator_both",num_str rat_mult_denominator_both), 
neuper@37906
   103
	     (* a/b=c/d -> ad=cb *)
neuper@37906
   104
	     Thm("rat_mult_denominator_left",num_str rat_mult_denominator_left), 
neuper@37906
   105
	     (* a  =c/d -> ad=c  *)
neuper@37906
   106
	     Thm("rat_mult_denominator_right",num_str rat_mult_denominator_right)
neuper@37906
   107
	     (* a/b=c   ->  a=cb *)
neuper@37906
   108
	     ],
neuper@37906
   109
    scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37906
   110
    }:rls);
neuper@37906
   111
ruleset' := overwritelthy thy (!ruleset',
neuper@37906
   112
			[("RatEq_eliminate",RatEq_eliminate)
neuper@37906
   113
			 ]);
neuper@37906
   114
neuper@37906
   115
neuper@37906
   116
neuper@37906
   117
neuper@37906
   118
val RatEq_simplify = prep_rls(
neuper@37906
   119
  Rls {id = "RatEq_simplify", preconds = [], rew_ord = ("termlessI",termlessI), 
neuper@37906
   120
      erls = rateq_erls, srls = Erls, calc = [], 
neuper@37906
   121
       (*asm_thm = [("rat_double_rat_1",""),("rat_double_rat_2",""),
neuper@37906
   122
                  ("rat_double_rat_3","")],*)
neuper@37906
   123
    rules = [
neuper@37906
   124
	     Thm("real_rat_mult_1",num_str real_rat_mult_1),
neuper@37906
   125
	     (*a*(b/c) = (a*b)/c*)
neuper@37906
   126
	     Thm("real_rat_mult_2",num_str real_rat_mult_2),
neuper@37906
   127
	     (*(a/b)*(c/d) = (a*c)/(b*d)*)
neuper@37906
   128
             Thm("real_rat_mult_3",num_str real_rat_mult_3),
neuper@37906
   129
             (* (a/b)*c = (a*c)/b*)
neuper@37906
   130
	     Thm("real_rat_pow",num_str real_rat_pow),
neuper@37906
   131
	     (*(a/b)^^^2 = a^^^2/b^^^2*)
neuper@37906
   132
	     Thm("real_diff_minus",num_str real_diff_minus),
neuper@37906
   133
	     (* a - b = a + (-1) * b *)
neuper@37906
   134
             Thm("rat_double_rat_1",num_str rat_double_rat_1),
neuper@37906
   135
             (* (a / (c/d) = (a*d) / c) *)
neuper@37906
   136
             Thm("rat_double_rat_2",num_str rat_double_rat_2), 
neuper@37906
   137
             (* ((a/b) / (c/d) = (a*d) / (b*c)) *)
neuper@37906
   138
             Thm("rat_double_rat_3",num_str rat_double_rat_3) 
neuper@37906
   139
             (* ((a/b) / c = a / (b*c) ) *)
neuper@37906
   140
	     ],
neuper@37906
   141
    scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37906
   142
    }:rls);
neuper@37906
   143
ruleset' := overwritelthy thy (!ruleset',
neuper@37906
   144
			[("RatEq_simplify",RatEq_simplify)
neuper@37906
   145
			 ]);
neuper@37906
   146
neuper@37906
   147
(*-------------------------Problem-----------------------*)
neuper@37906
   148
(*
neuper@37906
   149
(get_pbt ["rational","univariate","equation"]);
neuper@37906
   150
show_ptyps(); 
neuper@37906
   151
*)
neuper@37906
   152
store_pbt
neuper@37906
   153
 (prep_pbt RatEq.thy "pbl_equ_univ_rat" [] e_pblID
neuper@37906
   154
 (["rational","univariate","equation"],
neuper@37906
   155
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   156
   ("#Where" ,["(e_::bool) is_ratequation_in (v_::real)"]),
neuper@37906
   157
   ("#Find"  ,["solutions v_i_"]) 
neuper@37906
   158
  ],
neuper@37906
   159
neuper@37926
   160
  RatEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   161
  [["RatEq","solve_rat_equation"]]));
neuper@37906
   162
neuper@37906
   163
neuper@37906
   164
(*-------------------------methods-----------------------*)
neuper@37906
   165
store_met
neuper@37906
   166
 (prep_met RatEq.thy "met_rateq" [] e_metID
neuper@37906
   167
 (["RatEq"],
neuper@37906
   168
   [],
neuper@37906
   169
   {rew_ord'="tless_true",rls'=Atools_erls,calc = [], srls = e_rls, prls=e_rls,
neuper@37906
   170
    crls=RatEq_crls, nrls=norm_Rational
neuper@37906
   171
    (*, asm_rls=[],asm_thm=[]*)}, "empty_script"));
neuper@37906
   172
store_met
neuper@37906
   173
 (prep_met RatEq.thy "met_rat_eq" [] e_metID
neuper@37906
   174
 (["RatEq","solve_rat_equation"],
neuper@37906
   175
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   176
   ("#Where" ,["(e_::bool) is_ratequation_in (v_::real)"]),
neuper@37906
   177
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   178
  ],
neuper@37906
   179
   {rew_ord'="termlessI",
neuper@37906
   180
    rls'=rateq_erls,
neuper@37906
   181
    srls=e_rls,
neuper@37906
   182
    prls=RatEq_prls,
neuper@37906
   183
    calc=[],
neuper@37906
   184
    crls=RatEq_crls, nrls=norm_Rational(*,
neuper@37906
   185
    asm_rls=[],
neuper@37906
   186
    asm_thm=[("rat_double_rat_1",""),("rat_double_rat_2",""),("rat_double_rat_3",""),
neuper@37906
   187
             ("rat_mult_denominator_both",""),("rat_mult_denominator_left",""),
neuper@37906
   188
             ("rat_mult_denominator_right","")]*)},
neuper@37906
   189
   "Script Solve_rat_equation  (e_::bool) (v_::real) =                   \
neuper@37906
   190
    \(let e_ = ((Repeat(Try (Rewrite_Set RatEq_simplify      True))) @@  \
neuper@37906
   191
    \           (Repeat(Try (Rewrite_Set norm_Rational      False))) @@  \
neuper@37906
   192
    \           (Repeat(Try (Rewrite_Set common_nominator_p False))) @@  \
neuper@37906
   193
    \           (Repeat(Try (Rewrite_Set RatEq_eliminate     True)))) e_;\
neuper@37906
   194
    \ (L_::bool list) =  (SubProblem (RatEq_,[univariate,equation],      \
neuper@37906
   195
    \                [no_met]) [bool_ e_, real_ v_])                     \
neuper@37906
   196
    \ in Check_elementwise L_ {(v_::real). Assumptions})"
neuper@37906
   197
   ));
neuper@37906
   198
neuper@37906
   199
calclist':= overwritel (!calclist', 
neuper@37906
   200
   [("is_ratequation_in", ("RatEq.is_ratequation_in", 
neuper@37906
   201
			   eval_is_ratequation_in ""))
neuper@37906
   202
    ]);
neuper@37906
   203
"******* RatEq.ML end *******";