src/Tools/isac/Knowledge/Biegelinie.thy
author Walther Neuper <walther.neuper@jku.at>
Wed, 15 Apr 2020 11:37:43 +0200
changeset 59878 3163e63a5111
parent 59871 82428ca0d23e
child 59898 68883c046963
permissions -rw-r--r--
cleanup
     1 (* chapter 'Biegelinie' from the textbook: 
     2    Timischl, Kaiser. Ingenieur-Mathematik 3. Wien 1999. p.268-271.
     3    author: Walther Neuper 050826,
     4    (c) due to copyright terms
     5 *)
     6 
     7 theory Biegelinie imports Integrate Equation EqSystem Base_Tools begin
     8 
     9 consts
    10 
    11   qq    :: "real => real"             (* Streckenlast               *)
    12   Q     :: "real => real"             (* Querkraft                  *)
    13   Q'    :: "real => real"             (* Ableitung der Querkraft    *)
    14   M'_b  :: "real => real" ("M'_b")    (* Biegemoment                *)
    15   M'_b' :: "real => real" ("M'_b'")   (* Ableitung des Biegemoments *)
    16   y''   :: "real => real"             (* 2.Ableitung der Biegeline  *)
    17   y'    :: "real => real"             (* Neigung der Biegeline      *)
    18 (*y     :: "real => real"             (* Biegeline                  *)*)
    19   EI    :: "real"                     (* Biegesteifigkeit           *)
    20 
    21   (*new Descriptions in the related problems*)
    22   Traegerlaenge            :: "real => una"
    23   Streckenlast             :: "real => una"
    24   BiegemomentVerlauf       :: "bool => una"
    25   Biegelinie               :: "(real => real) => una"
    26   AbleitungBiegelinie      :: "(real => real) => una"
    27   Randbedingungen          :: "bool list => una"
    28   RandbedingungenBiegung   :: "bool list => una"
    29   RandbedingungenNeigung   :: "bool list => una"
    30   RandbedingungenMoment    :: "bool list => una"
    31   RandbedingungenQuerkraft :: "bool list => una"
    32   FunktionsVariable        :: "real => una"
    33   Funktionen               :: "bool list => una"
    34   Gleichungen              :: "bool list => una"
    35   GleichungsVariablen      :: "real list => una"
    36 
    37 axiomatization where
    38 
    39   Querkraft_Belastung:   "Q' x = -qq x" and
    40   Belastung_Querkraft:   "-qq x = Q' x" and
    41 
    42   Moment_Querkraft:      "M_b' x = Q x" and
    43   Querkraft_Moment:      "Q x = M_b' x" and
    44 
    45   Neigung_Moment:        "y'' x = -M_b x/ EI" and
    46   Moment_Neigung:        "M_b x = -EI * y'' x" and
    47 
    48   (*according to rls 'simplify_Integral': .. = 1/a * .. instead .. = ../ a*)
    49   make_fun_explicit:     "Not (a =!= 0) ==> (a * (f x) = b) = (f x = 1/a * b)"
    50 
    51 setup \<open>
    52 KEStore_Elems.add_thes
    53   [make_thy @{theory}
    54     ["Walther Neuper 2005 supported by a grant from NMI Austria"],
    55   make_isa @{theory} ("IsacKnowledge", "Theorems")
    56     ["Walther Neuper 2005 supported by a grant from NMI Austria"],
    57   make_thm @{theory}  "IsacKnowledge" ("Belastung_Querkraft", @{thm Belastung_Querkraft})
    58 	  ["Walther Neuper 2005 supported by a grant from NMI Austria"],
    59   make_thm @{theory}  "IsacKnowledge" ("Moment_Neigung", @{thm Moment_Neigung})
    60 	  ["Walther Neuper 2005 supported by a grant from NMI Austria"],
    61   make_thm @{theory}  "IsacKnowledge" ("Moment_Querkraft", @{thm Moment_Querkraft})
    62 	  ["Walther Neuper 2005 supported by a grant from NMI Austria"],
    63   make_thm @{theory}  "IsacKnowledge" ("Neigung_Moment", @{thm Neigung_Moment})
    64 	  ["Walther Neuper 2005 supported by a grant from NMI Austria"],
    65   make_thm @{theory}  "IsacKnowledge" ("Querkraft_Belastung", @{thm Querkraft_Belastung})
    66 	  ["Walther Neuper 2005 supported by a grant from NMI Austria"],
    67   make_thm @{theory}  "IsacKnowledge" ("Querkraft_Moment", @{thm Querkraft_Moment})
    68 	  ["Walther Neuper 2005 supported by a grant from NMI Austria"],
    69   make_thm @{theory}  "IsacKnowledge" ("make_fun_explicit", @{thm make_fun_explicit})
    70 	  ["Walther Neuper 2005 supported by a grant from NMI Austria"]]
    71 \<close>
    72 
    73 (** problems **)
    74 setup \<open>KEStore_Elems.add_pbts
    75   [(Specify.prep_pbt @{theory} "pbl_bieg" [] Celem.e_pblID
    76       (["Biegelinien"],
    77         [("#Given" ,["Traegerlaenge l_l", "Streckenlast q_q"]),
    78           (*("#Where",["0 < l_l"]), ...wait for &lt; and handling Arbfix*)
    79           ("#Find"  ,["Biegelinie b_b"]),
    80           ("#Relate",["Randbedingungen r_b"])],
    81         Rule_Set.append_rules "empty" Rule_Set.empty [], NONE, [["IntegrierenUndKonstanteBestimmen2"]])),
    82     (Specify.prep_pbt @{theory} "pbl_bieg_mom" [] Celem.e_pblID
    83       (["MomentBestimmte","Biegelinien"],
    84         [("#Given" ,["Traegerlaenge l_l", "Streckenlast q_q"]),
    85           (*("#Where",["0 < l_l"]), ...wait for &lt; and handling Arbfix*)
    86           ("#Find"  ,["Biegelinie b_b"]),
    87           ("#Relate",["RandbedingungenBiegung r_b","RandbedingungenMoment r_m"])
    88         ],
    89         Rule_Set.append_rules "empty" Rule_Set.empty [], NONE, [["IntegrierenUndKonstanteBestimmen"]])),
    90     (Specify.prep_pbt @{theory} "pbl_bieg_momg" [] Celem.e_pblID
    91       (["MomentGegebene","Biegelinien"], [], Rule_Set.append_rules "empty" Rule_Set.empty [], NONE,
    92         [["IntegrierenUndKonstanteBestimmen","2xIntegrieren"]])),
    93     (Specify.prep_pbt @{theory} "pbl_bieg_einf" [] Celem.e_pblID
    94       (["einfache","Biegelinien"], [], Rule_Set.append_rules "empty" Rule_Set.empty [], NONE,
    95         [["IntegrierenUndKonstanteBestimmen","4x4System"]])),
    96     (Specify.prep_pbt @{theory} "pbl_bieg_momquer" [] Celem.e_pblID
    97       (["QuerkraftUndMomentBestimmte","Biegelinien"], [], Rule_Set.append_rules "empty" Rule_Set.empty [], NONE,
    98         [["IntegrierenUndKonstanteBestimmen","1xIntegrieren"]])),
    99     (Specify.prep_pbt @{theory} "pbl_bieg_vonq" [] Celem.e_pblID
   100       (["vonBelastungZu","Biegelinien"],
   101           [("#Given" ,["Streckenlast q_q","FunktionsVariable v_v"]),
   102             ("#Find"  ,["Funktionen funs'''"])],
   103         Rule_Set.append_rules "empty" Rule_Set.empty [], NONE, [["Biegelinien","ausBelastung"]])),
   104     (Specify.prep_pbt @{theory} "pbl_bieg_randbed" [] Celem.e_pblID
   105       (["setzeRandbedingungen","Biegelinien"],
   106           [("#Given" ,["Funktionen fun_s","Randbedingungen r_b"]),
   107             ("#Find"  ,["Gleichungen equs'''"])],
   108         Rule_Set.append_rules "empty" Rule_Set.empty [], NONE, [["Biegelinien","setzeRandbedingungenEin"]])),
   109     (Specify.prep_pbt @{theory} "pbl_equ_fromfun" [] Celem.e_pblID
   110       (["makeFunctionTo","equation"],
   111           [("#Given" ,["functionEq fu_n","substitution su_b"]),
   112             ("#Find"  ,["equality equ'''"])],
   113         Rule_Set.append_rules "empty" Rule_Set.empty [], NONE, [["Equation","fromFunction"]]))]\<close>
   114 ML \<open>
   115 (** methods **)
   116 
   117 val srls = Rule_Def.Repeat {id="srls_IntegrierenUnd..", 
   118 		preconds = [], 
   119 		rew_ord = ("termlessI",termlessI), 
   120 		erls = Rule_Set.append_rules "erls_in_srls_IntegrierenUnd.." Rule_Set.empty
   121 				  [(*for asm in NTH_CONS ...*)
   122 				   Rule.Eval ("Orderings.ord_class.less", Prog_Expr.eval_equ "#less_"),
   123 				   (*2nd NTH_CONS pushes n+-1 into asms*)
   124 				   Rule.Eval("Groups.plus_class.plus", (**)eval_binop "#add_")
   125 				   ], 
   126 		srls = Rule_Set.Empty, calc = [], errpatts = [],
   127 		rules = [Rule.Thm ("NTH_CONS",ThmC.numerals_to_Free @{thm NTH_CONS}),
   128 			 Rule.Eval("Groups.plus_class.plus", (**)eval_binop "#add_"),
   129 			 Rule.Thm ("NTH_NIL",ThmC.numerals_to_Free @{thm NTH_NIL}),
   130 			 Rule.Eval("Prog_Expr.lhs", Prog_Expr.eval_lhs"eval_lhs_"),
   131 			 Rule.Eval("Prog_Expr.rhs", Prog_Expr.eval_rhs"eval_rhs_"),
   132 			 Rule.Eval("Prog_Expr.argument'_in", Prog_Expr.eval_argument_in "Prog_Expr.argument'_in")
   133 			 ],
   134 		scr = Rule.Empty_Prog};
   135     
   136 val srls2 = 
   137     Rule_Def.Repeat {id="srls_IntegrierenUnd..", 
   138 	 preconds = [], 
   139 	 rew_ord = ("termlessI",termlessI), 
   140 	 erls = Rule_Set.append_rules "erls_in_srls_IntegrierenUnd.." Rule_Set.empty
   141 			   [(*for asm in NTH_CONS ...*)
   142 			    Rule.Eval ("Orderings.ord_class.less", Prog_Expr.eval_equ "#less_"),
   143 			    (*2nd NTH_CONS pushes n+-1 into asms*)
   144 			    Rule.Eval("Groups.plus_class.plus", (**)eval_binop "#add_")
   145 			    ], 
   146 	 srls = Rule_Set.Empty, calc = [], errpatts = [],
   147 	 rules = [Rule.Thm ("NTH_CONS",ThmC.numerals_to_Free @{thm NTH_CONS}),
   148 		  Rule.Eval("Groups.plus_class.plus", (**)eval_binop "#add_"),
   149 		  Rule.Thm ("NTH_NIL", ThmC.numerals_to_Free @{thm NTH_NIL}),
   150 		  Rule.Eval("Prog_Expr.lhs", Prog_Expr.eval_lhs "eval_lhs_"),
   151 		  Rule.Eval("Prog_Expr.filter'_sameFunId", Prog_Expr.eval_filter_sameFunId "Prog_Expr.filter'_sameFunId"),
   152 		  (*WN070514 just for smltest/../biegelinie.sml ...*)
   153 		  Rule.Eval("Prog_Expr.sameFunId", Prog_Expr.eval_sameFunId "Prog_Expr.sameFunId"),
   154 		  Rule.Thm ("filter_Cons", ThmC.numerals_to_Free @{thm filter_Cons}),
   155 		  Rule.Thm ("filter_Nil", ThmC.numerals_to_Free @{thm filter_Nil}),
   156 		  Rule.Thm ("if_True", ThmC.numerals_to_Free @{thm if_True}),
   157 		  Rule.Thm ("if_False", ThmC.numerals_to_Free @{thm if_False}),
   158 		  Rule.Thm ("hd_thm", ThmC.numerals_to_Free @{thm hd_thm})
   159 		  ],
   160 	 scr = Rule.Empty_Prog};
   161 \<close>
   162 
   163 section \<open>Methods\<close>
   164 (* setup parent directory *)
   165 setup \<open>KEStore_Elems.add_mets
   166     [Specify.prep_met @{theory} "met_biege" [] Celem.e_metID 
   167 	    (["IntegrierenUndKonstanteBestimmen"], [],
   168 	    {rew_ord'="tless_true", rls'= Rule_Set.Empty, calc = [], srls = Rule_Set.Empty, prls = Rule_Set.Empty, crls =Rule_Set.Empty,
   169           errpats = [], nrls = Rule_Set.Empty},
   170       @{thm refl})]
   171 \<close>
   172 subsection \<open>Sub-problem "integrate and determine constants", nicely modularised\<close>
   173 
   174 partial_function (tailrec) biegelinie ::
   175   "real \<Rightarrow> real \<Rightarrow> real \<Rightarrow> (real \<Rightarrow> real) \<Rightarrow> bool list \<Rightarrow> real list \<Rightarrow> (real \<Rightarrow> real) \<Rightarrow> bool"
   176   where
   177 "biegelinie l q v b s vs id_abl = (
   178   let
   179     funs = SubProblem (''Biegelinie'', [''vonBelastungZu'', ''Biegelinien''],
   180       [''Biegelinien'', ''ausBelastung'']) [REAL q, REAL v, REAL_REAL b, REAL_REAL id_abl];
   181     equs = SubProblem (''Biegelinie'', [''setzeRandbedingungen'', ''Biegelinien''],
   182       [''Biegelinien'', ''setzeRandbedingungenEin'']) [BOOL_LIST funs, BOOL_LIST s];
   183     cons = SubProblem (''Biegelinie'', [''LINEAR'', ''system''],
   184       [''no_met'']) [BOOL_LIST equs, REAL_LIST vs];
   185     B = Take (lastI funs);
   186     B = ((Substitute cons) #> (Rewrite_Set_Inst [(''bdv'', v)] ''make_ratpoly_in'')) B
   187   in B)"
   188 setup \<open>KEStore_Elems.add_mets
   189     [Specify.prep_met @{theory} "met_biege_2" [] Celem.e_metID
   190 	    (["IntegrierenUndKonstanteBestimmen2"],
   191 	      [("#Given" ,["Traegerlaenge l", "Streckenlast q",
   192               "FunktionsVariable v", "GleichungsVariablen vs", "AbleitungBiegelinie id_abl"]),
   193 		      (*("#Where",["0 < l"]), ...wait for &lt; and handling Arbfix*)
   194 		      ("#Find"  ,["Biegelinie b"]),
   195 		      ("#Relate",["Randbedingungen s"])],
   196 	      {rew_ord'="tless_true", 
   197 	        rls' = Rule_Set.append_rules "erls_IntegrierenUndK.." Rule_Set.empty 
   198 				      [Rule.Eval ("Prog_Expr.ident", Prog_Expr.eval_ident "#ident_"),
   199 				        Rule.Thm ("not_true",ThmC.numerals_to_Free @{thm not_true}),
   200 				        Rule.Thm ("not_false",ThmC.numerals_to_Free @{thm not_false})], 
   201 				  calc = [], 
   202 				  srls = Rule_Set.append_rules "erls_IntegrierenUndK.." Rule_Set.empty 
   203 				      [Rule.Eval("Prog_Expr.rhs", Prog_Expr.eval_rhs"eval_rhs_"),
   204 				        Rule.Eval ("Prog_Expr.ident", Prog_Expr.eval_ident "#ident_"),
   205 				        Rule.Thm ("last_thmI",ThmC.numerals_to_Free @{thm last_thmI}),
   206 				        Rule.Thm ("if_True",ThmC.numerals_to_Free @{thm if_True}),
   207 				        Rule.Thm ("if_False",ThmC.numerals_to_Free @{thm if_False})],
   208 				  prls = Rule_Set.Empty, crls = Atools_erls, errpats = [], nrls = Rule_Set.Empty},
   209         @{thm biegelinie.simps})]
   210 \<close>
   211 setup \<open>KEStore_Elems.add_mets
   212     [Specify.prep_met @{theory} "met_biege_intconst_2" [] Celem.e_metID
   213 	    (["IntegrierenUndKonstanteBestimmen","2xIntegrieren"], [],
   214 	      {rew_ord'="tless_true", rls'=Rule_Set.Empty, calc = [], srls = Rule_Set.empty, prls=Rule_Set.empty, crls = Atools_erls,
   215           errpats = [], nrls = Rule_Set.empty},
   216         @{thm refl}),
   217     Specify.prep_met @{theory} "met_biege_intconst_4" [] Celem.e_metID
   218 	    (["IntegrierenUndKonstanteBestimmen","4x4System"], [],
   219 	      {rew_ord'="tless_true", rls'=Rule_Set.Empty, calc = [], srls = Rule_Set.empty, prls=Rule_Set.empty, crls = Atools_erls,
   220           errpats = [], nrls = Rule_Set.empty},
   221         @{thm refl}),
   222     Specify.prep_met @{theory} "met_biege_intconst_1" [] Celem.e_metID
   223 	    (["IntegrierenUndKonstanteBestimmen","1xIntegrieren"], [],
   224         {rew_ord'="tless_true", rls'=Rule_Set.Empty, calc = [], srls = Rule_Set.empty, prls=Rule_Set.empty, crls = Atools_erls,
   225           errpats = [], nrls = Rule_Set.empty},
   226         @{thm refl}),
   227     Specify.prep_met @{theory} "met_biege2" [] Celem.e_metID
   228 	    (["Biegelinien"], [],
   229 	      {rew_ord'="tless_true", rls'=Rule_Set.Empty, calc = [], srls = Rule_Set.empty, prls=Rule_Set.empty, crls = Atools_erls,
   230           errpats = [], nrls = Rule_Set.empty},
   231         @{thm refl})]
   232 \<close>
   233 subsection \<open>Compute the general bending line\<close>
   234 
   235 partial_function (tailrec) belastung_zu_biegelinie :: "real \<Rightarrow> real \<Rightarrow> (real \<Rightarrow> real) \<Rightarrow> (real \<Rightarrow> real) \<Rightarrow> bool list"
   236   where
   237 "belastung_zu_biegelinie q__q v_v id_fun id_abl = (
   238   let
   239     q___q = Take (qq v_v = q__q);
   240     q___q = (
   241       (Rewrite ''sym_neg_equal_iff_equal'') #>
   242       (Rewrite ''Belastung_Querkraft'')) q___q;
   243     Q__Q = SubProblem (''Biegelinie'', [''named'', ''integrate'', ''function''],
   244       [''diff'', ''integration'', ''named'']) [REAL (rhs q___q), REAL v_v, REAL_REAL Q];
   245     M__M = Rewrite ''Querkraft_Moment'' Q__Q;
   246     M__M = SubProblem (''Biegelinie'', [''named'', ''integrate'', ''function''],
   247       [''diff'', ''integration'', ''named'']) [REAL (rhs M__M), REAL v_v, REAL_REAL M_b];
   248     N__N = (
   249       (Rewrite ''Moment_Neigung'' ) #> (Rewrite ''make_fun_explicit'' )) M__M;
   250     N__N = SubProblem (''Biegelinie'', [''named'', ''integrate'', ''function''],
   251       [''diff'', ''integration'', ''named'']) [REAL (rhs N__N), REAL v_v, REAL_REAL id_abl];
   252     B__B = SubProblem (''Biegelinie'', [''named'', ''integrate'', ''function''],
   253       [''diff'', ''integration'', ''named'']) [REAL (rhs N__N), REAL v_v, REAL_REAL id_fun]
   254   in
   255     [Q__Q, M__M, N__N, B__B])"
   256 setup \<open>KEStore_Elems.add_mets
   257     [Specify.prep_met @{theory} "met_biege_ausbelast" [] Celem.e_metID
   258 	    (["Biegelinien", "ausBelastung"],
   259 	      [("#Given" ,["Streckenlast q__q", "FunktionsVariable v_v",
   260             "Biegelinie id_fun", "AbleitungBiegelinie id_abl"]),
   261 	       ("#Find"  ,["Funktionen fun_s"])],
   262 	      {rew_ord'="tless_true", 
   263 	        rls' = Rule_Set.append_rules "erls_ausBelastung" Rule_Set.empty 
   264 				      [Rule.Eval ("Prog_Expr.ident", Prog_Expr.eval_ident "#ident_"),
   265 				        Rule.Thm ("not_true", ThmC.numerals_to_Free @{thm not_true}),
   266 				        Rule.Thm ("not_false", ThmC.numerals_to_Free @{thm not_false})], 
   267 				  calc = [], 
   268 				  srls = Rule_Set.append_rules "srls_ausBelastung" Rule_Set.empty 
   269 				      [Rule.Eval ("Prog_Expr.rhs", Prog_Expr.eval_rhs "eval_rhs_")], 
   270 				  prls = Rule_Set.empty, crls = Atools_erls, errpats = [], nrls = Rule_Set.empty},
   271         @{thm belastung_zu_biegelinie.simps})]
   272 \<close>
   273 subsection \<open>Substitute the constraints into the equations\<close>
   274 
   275 partial_function (tailrec) setzte_randbedingungen :: "bool list \<Rightarrow> bool list \<Rightarrow> bool list"
   276   where 
   277 "setzte_randbedingungen fun_s r_b = (
   278   let
   279     b_1 = NTH 1 r_b;
   280     f_s = filter_sameFunId (lhs b_1) fun_s;
   281     e_1 = SubProblem (''Biegelinie'', [''makeFunctionTo'', ''equation''],
   282             [''Equation'', ''fromFunction'']) [BOOL (hd f_s), BOOL b_1];
   283     b_2 = NTH 2 r_b;
   284     f_s = filter_sameFunId (lhs b_2) fun_s;
   285     e_2 = SubProblem (''Biegelinie'', [''makeFunctionTo'', ''equation''],
   286              [''Equation'', ''fromFunction'']) [BOOL (hd f_s), BOOL b_2];
   287     b_3 = NTH 3 r_b;
   288     f_s = filter_sameFunId (lhs b_3) fun_s;
   289     e_3 = SubProblem (''Biegelinie'', [''makeFunctionTo'', ''equation''],
   290              [''Equation'', ''fromFunction'']) [BOOL (hd f_s), BOOL b_3];
   291     b_4 = NTH 4 r_b;
   292     f_s = filter_sameFunId (lhs b_4) fun_s;
   293     e_4 = SubProblem (''Biegelinie'', [''makeFunctionTo'', ''equation''],
   294              [''Equation'', ''fromFunction'']) [BOOL (hd f_s), BOOL b_4]
   295   in
   296     [e_1, e_2, e_3, e_4])"
   297 setup \<open>KEStore_Elems.add_mets
   298     [Specify.prep_met @{theory} "met_biege_setzrand" [] Celem.e_metID
   299 	    (["Biegelinien", "setzeRandbedingungenEin"],
   300 	      [("#Given" , ["Funktionen fun_s", "Randbedingungen r_b"]),
   301 	        ("#Find"  , ["Gleichungen equs'''"])],
   302 	      {rew_ord'="tless_true", rls'=Rule_Set.Empty, calc = [], srls = srls2, prls=Rule_Set.empty, crls = Atools_erls,
   303           errpats = [], nrls = Rule_Set.empty},
   304         @{thm setzte_randbedingungen.simps})]
   305 \<close>
   306 subsection \<open>Transform an equality into a function\<close>
   307 
   308         (*(M_b x = c_2 + c * x + -1 * q_0 / 2 * x ^^^ 2) (M_b L = 0) -->
   309                0 = c_2 + c * L + -1 * q_0 / 2 * L ^^^ 2*)
   310 partial_function (tailrec) function_to_equality :: "bool \<Rightarrow> bool \<Rightarrow> bool"
   311   where
   312 "function_to_equality fu_n su_b = (
   313   let
   314     fu_n = Take fu_n;
   315     bd_v = argument_in (lhs fu_n);
   316     va_l = argument_in (lhs su_b);
   317     eq_u = Substitute [bd_v = va_l] fu_n; \<comment> \<open>([1], Res), M_b L = c_2 + c * L + -1 * q_0 / 2 * L ^^^ 2\<close>
   318     eq_u = Substitute [su_b] eq_u
   319   in
   320     (Rewrite_Set ''norm_Rational'') eq_u)"
   321 setup \<open>KEStore_Elems.add_mets
   322     [Specify.prep_met @{theory} "met_equ_fromfun" [] Celem.e_metID
   323 	    (["Equation","fromFunction"],
   324 	      [("#Given" ,["functionEq fu_n","substitution su_b"]),
   325 	        ("#Find"  ,["equality equ'''"])],
   326 	      {rew_ord'="tless_true", rls'=Rule_Set.Empty, calc = [],
   327           srls = Rule_Set.append_rules "srls_in_EquationfromFunc" Rule_Set.empty
   328 				      [Rule.Eval("Prog_Expr.lhs", Prog_Expr.eval_lhs "eval_lhs_"),
   329 				        Rule.Eval("Prog_Expr.argument'_in", Prog_Expr.eval_argument_in "Prog_Expr.argument'_in")], 
   330 				  prls=Rule_Set.empty, crls = Atools_erls, errpats = [], nrls = Rule_Set.empty},
   331         (*(M_b x = c_2 + c * x + -1 * q_0 / 2 * x ^^^ 2) (M_b L = 0) -->
   332                0 = c_2 + c * L + -1 * q_0 / 2 * L ^^^ 2*)
   333         @{thm function_to_equality.simps})]
   334 \<close>
   335 ML \<open>
   336 \<close> ML \<open>
   337 \<close>
   338 end
   339