src/Tools/isac/Knowledge/LinEq.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/LinEq.ML@e6fc98fbcb85
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 LinearEquations
neuper@37906
     3
   created by: rlang 
neuper@37906
     4
         date: 02.10
neuper@37906
     5
   changed by: rlang
neuper@37906
     6
   last change by: rlang
neuper@37906
     7
             date: 02.11.04
neuper@37906
     8
*)
neuper@37906
     9
neuper@37906
    10
(* remove_thy"LinEq";
neuper@37947
    11
   use_thy"Knowledge/Isac";
neuper@37906
    12
neuper@37947
    13
   use_thy"Knowledge/LinEq";
neuper@37906
    14
neuper@37906
    15
   use"ROOT.ML";
neuper@37906
    16
   cd"knowledge";
neuper@37906
    17
*)
neuper@37906
    18
neuper@37906
    19
"******* LinEq.ML begin *******";
neuper@37906
    20
neuper@37906
    21
(*-------------------- theory -------------------------------------------------*)
neuper@37906
    22
theory' := overwritel (!theory', [("LinEq.thy",LinEq.thy)]);
neuper@37906
    23
neuper@37906
    24
(*-------------- rules -------------------------------------------------------*)
neuper@37906
    25
val LinEq_prls = (*3.10.02:just the following order due to subterm evaluation*)
neuper@37906
    26
  append_rls "LinEq_prls" e_rls 
neuper@37906
    27
	     [Calc ("op =",eval_equal "#equal_"),
neuper@37906
    28
	      Calc ("Tools.matches",eval_matches ""),
neuper@37906
    29
	      Calc ("Tools.lhs"    ,eval_lhs ""),
neuper@37906
    30
	      Calc ("Tools.rhs"    ,eval_rhs ""),
neuper@37906
    31
	      Calc ("Poly.has'_degree'_in",eval_has_degree_in ""),
neuper@37906
    32
 	      Calc ("Poly.is'_polyrat'_in",eval_is_polyrat_in ""),
neuper@37906
    33
	      Calc ("Atools.occurs'_in",eval_occurs_in ""),    
neuper@37906
    34
	      Calc ("Atools.ident",eval_ident "#ident_"),
neuper@37906
    35
	      Thm ("not_true",num_str not_true),
neuper@37906
    36
	      Thm ("not_false",num_str not_false),
neuper@37906
    37
	      Thm ("and_true",num_str and_true),
neuper@37906
    38
	      Thm ("and_false",num_str and_false),
neuper@37906
    39
	      Thm ("or_true",num_str or_true),
neuper@37906
    40
	      Thm ("or_false",num_str or_false)
neuper@37906
    41
              ];
neuper@37906
    42
(* ----- erls ----- *)
neuper@37906
    43
val LinEq_crls = 
neuper@37906
    44
   append_rls "LinEq_crls" poly_crls
neuper@37906
    45
   [Thm  ("real_assoc_1",num_str real_assoc_1)
neuper@37906
    46
    (*		
neuper@37906
    47
     Don't use
neuper@37906
    48
     Calc ("HOL.divide", eval_cancel "#divide_"),
neuper@37906
    49
     Calc ("Atools.pow" ,eval_binop "#power_"),
neuper@37906
    50
     *)
neuper@37906
    51
    ];
neuper@37906
    52
neuper@37906
    53
(* ----- crls ----- *)
neuper@37906
    54
val LinEq_erls = 
neuper@37906
    55
   append_rls "LinEq_erls" Poly_erls
neuper@37906
    56
   [Thm  ("real_assoc_1",num_str real_assoc_1)
neuper@37906
    57
    (*		
neuper@37906
    58
     Don't use
neuper@37906
    59
     Calc ("HOL.divide", eval_cancel "#divide_"),
neuper@37906
    60
     Calc ("Atools.pow" ,eval_binop "#power_"),
neuper@37906
    61
     *)
neuper@37906
    62
    ];
neuper@37906
    63
neuper@37906
    64
ruleset' := overwritelthy thy (!ruleset',
neuper@37906
    65
			[("LinEq_erls",LinEq_erls)(*FIXXXME:del with rls.rls'*)
neuper@37906
    66
			 ]);
neuper@37906
    67
    
neuper@37906
    68
val LinPoly_simplify = prep_rls(
neuper@37906
    69
  Rls {id = "LinPoly_simplify", preconds = [], 
neuper@37906
    70
       rew_ord = ("termlessI",termlessI), 
neuper@37906
    71
       erls = LinEq_erls, 
neuper@37906
    72
       srls = Erls, 
neuper@37906
    73
       calc = [], 
neuper@37906
    74
       (*asm_thm = [],*)
neuper@37906
    75
       rules = [
neuper@37906
    76
		Thm  ("real_assoc_1",num_str real_assoc_1),
neuper@37906
    77
		Calc ("op +",eval_binop "#add_"),
neuper@37906
    78
		Calc ("op -",eval_binop "#sub_"),
neuper@37906
    79
		Calc ("op *",eval_binop "#mult_"),
neuper@37906
    80
		(*  Dont use  
neuper@37906
    81
		 Calc ("HOL.divide", eval_cancel "#divide_"),		
neuper@37906
    82
		 Calc ("Root.sqrt",eval_sqrt "#sqrt_"),
neuper@37906
    83
		 *)
neuper@37906
    84
		Calc ("Atools.pow" ,eval_binop "#power_")
neuper@37906
    85
		],
neuper@37906
    86
       scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37906
    87
       }:rls);
neuper@37906
    88
ruleset' := overwritelthy thy (!ruleset',
neuper@37906
    89
			  [("LinPoly_simplify",LinPoly_simplify)]);
neuper@37906
    90
neuper@37906
    91
(*isolate the bound variable in an linear equation; 'bdv' is a meta-constant*)
neuper@37906
    92
val LinEq_simplify = prep_rls(
neuper@37906
    93
Rls {id = "LinEq_simplify", preconds = [],
neuper@37906
    94
     rew_ord = ("e_rew_ord",e_rew_ord),
neuper@37906
    95
     erls = LinEq_erls,
neuper@37906
    96
     srls = Erls,
neuper@37906
    97
     calc = [],
neuper@37906
    98
     (*asm_thm = [("lin_isolate_div","")],*)
neuper@37906
    99
     rules = [
neuper@37906
   100
	      Thm("lin_isolate_add1",num_str lin_isolate_add1), 
neuper@37906
   101
	      (* a+bx=0 -> bx=-a *)
neuper@37906
   102
	      Thm("lin_isolate_add2",num_str lin_isolate_add2), 
neuper@37906
   103
	      (* a+ x=0 ->  x=-a *)
neuper@37906
   104
	      Thm("lin_isolate_div",num_str lin_isolate_div)    
neuper@37906
   105
	      (*   bx=c -> x=c/b *)  
neuper@37906
   106
	      ],
neuper@37906
   107
     scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37906
   108
     }:rls);
neuper@37906
   109
ruleset' := overwritelthy thy (!ruleset',
neuper@37906
   110
			[("LinEq_simplify",LinEq_simplify)]);
neuper@37906
   111
neuper@37906
   112
(*----------------------------- problem types --------------------------------*)
neuper@37906
   113
(* 
neuper@37906
   114
show_ptyps(); 
neuper@37906
   115
(get_pbt ["linear","univariate","equation"]);
neuper@37906
   116
*)
neuper@37906
   117
(* ---------linear----------- *)
neuper@37906
   118
store_pbt
neuper@37906
   119
 (prep_pbt LinEq.thy "pbl_equ_univ_lin" [] e_pblID
neuper@37906
   120
 (["linear","univariate","equation"],
neuper@37906
   121
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   122
   ("#Where" ,["False", (*WN0509 just detected: this pbl can never be used?!?*)
neuper@37906
   123
               "Not( (lhs e_) is_polyrat_in v_)",
neuper@37906
   124
               "Not( (rhs e_) is_polyrat_in v_)",
neuper@37906
   125
               "((lhs e_) has_degree_in v_)=1",
neuper@37906
   126
	       "((rhs e_) has_degree_in v_)=1"]),
neuper@37906
   127
   ("#Find"  ,["solutions v_i_"]) 
neuper@37906
   128
  ],
neuper@37926
   129
  LinEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   130
  [["LinEq","solve_lineq_equation"]]));
neuper@37906
   131
neuper@37906
   132
(*-------------- methods-------------------------------------------------------*)
neuper@37906
   133
store_met
neuper@37906
   134
 (prep_met LinEq.thy "met_eqlin" [] e_metID
neuper@37906
   135
 (["LinEq"],
neuper@37906
   136
   [],
neuper@37906
   137
   {rew_ord'="tless_true",rls'=Atools_erls,calc = [], srls = e_rls, prls=e_rls,
neuper@37906
   138
    crls=LinEq_crls, nrls=norm_Poly
neuper@37906
   139
    (*, asm_rls=[],asm_thm=[]*)}, "empty_script"));
neuper@37906
   140
neuper@37906
   141
(* ansprechen mit ["LinEq","solve_univar_equation"] *)
neuper@37906
   142
store_met
neuper@37906
   143
(prep_met LinEq.thy "met_eq_lin" [] e_metID
neuper@37906
   144
 (["LinEq","solve_lineq_equation"],
neuper@37906
   145
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   146
    ("#Where" ,["Not( (lhs e_) is_polyrat_in v_)",
neuper@37906
   147
                "( (lhs e_)  has_degree_in v_)=1"]),
neuper@37906
   148
    ("#Find"  ,["solutions v_i_"])
neuper@37906
   149
   ],
neuper@37906
   150
   {rew_ord'="termlessI",
neuper@37906
   151
    rls'=LinEq_erls,
neuper@37906
   152
    srls=e_rls,
neuper@37906
   153
    prls=LinEq_prls,
neuper@37906
   154
    calc=[],
neuper@37906
   155
    crls=LinEq_crls, nrls=norm_Poly(*,
neuper@37906
   156
    asm_rls=[],
neuper@37906
   157
    asm_thm=[("lin_isolate_div","")]*)},
neuper@37906
   158
    "Script Solve_lineq_equation (e_::bool) (v_::real) =                 \
neuper@37906
   159
    \(let e_ =((Try         (Rewrite     all_left            False)) @@  \ 
neuper@37906
   160
    \          (Try (Repeat (Rewrite     makex1_x           False))) @@  \ 
neuper@37906
   161
    \          (Try         (Rewrite_Set expand_binoms       False)) @@  \ 
neuper@37906
   162
    \          (Try (Repeat (Rewrite_Set_Inst [(bdv,v_::real)]           \
neuper@37906
   163
    \                                 make_ratpoly_in    False)))    @@  \
neuper@37906
   164
    \          (Try (Repeat (Rewrite_Set LinPoly_simplify      False)))) e_;\
neuper@37906
   165
    \     e_ = ((Try (Rewrite_Set_Inst [(bdv,v_::real)]                  \
neuper@37906
   166
    \                                          LinEq_simplify True)) @@  \
neuper@37906
   167
    \            (Repeat(Try (Rewrite_Set LinPoly_simplify     False)))) e_ \
neuper@37906
   168
    \ in ((Or_to_List e_)::bool list))"
neuper@37906
   169
 ));
neuper@37906
   170
"******* LinEq.ML end *******";
neuper@37906
   171
get_met ["LinEq","solve_lineq_equation"];