src/Tools/isac/Specify/pre-conditions.sml
author wneuper <Walther.Neuper@jku.at>
Fri, 04 Aug 2023 23:07:04 +0200
changeset 60728 12054f6e21be
parent 60727 37ad097adfb2
child 60729 43d11e7742e1
permissions -rw-r--r--
//prepare 12: Test_Theory/100-init-.. and 150a-add-.. both work with src/*
Walther@60605
     1
(* Title:  Specify/pre-conds.sml
walther@59960
     2
   Author: Walther Neuper 110226
Walther@60705
     3
   (c) due to copyrigh,t terms
walther@59960
     4
*)
walther@59960
     5
walther@59960
     6
signature PRE_CONDITIONS =
walther@59960
     7
sig
walther@59963
     8
  type T
Walther@60605
     9
  type unchecked
Walther@60712
    10
(*RENA unchecked_pos*)
Walther@60705
    11
  type unchecked_TEST
Walther@60705
    12
  type checked
Walther@60712
    13
(*RENA checked_pos*)
Walther@60705
    14
  type checked_TEST
Walther@60705
    15
Walther@60705
    16
  type env_subst
Walther@60705
    17
  type env_eval
Walther@60556
    18
  type input
Walther@60705
    19
Walther@60673
    20
  val to_string : Proof.context -> T -> string
walther@59967
    21
Walther@60705
    22
  val max_variant: Model_Def.i_model -> int
Walther@60705
    23
  val environment: Model_Def.i_model -> Env.T
Walther@60705
    24
Walther@60727
    25
  (* WRONG ENVS *)
Walther@60706
    26
  val check: Proof.context -> Rule_Set.T -> unchecked -> Model_Def.i_model -> 'a -> checked
Walther@60727
    27
  (* WRONG ENVS *)
Walther@60710
    28
  val check_from_store: Proof.context -> Rule_Set.T -> unchecked -> env_subst -> env_eval -> checked
Walther@60727
    29
  (*  vvv-replaces-^^^*)
Walther@60727
    30
  val check_envs_TEST: Proof.context -> Rule_Def.rule_set -> term list -> 
Walther@60727
    31
  Env.T * (env_subst * env_eval) -> checked
Walther@60727
    32
  (* WRONG ENVS *)
Walther@60710
    33
  val check_TEST : Proof.context -> Rule_Set.T -> unchecked_TEST  -> env_eval -> checked_TEST
Walther@60710
    34
Walther@60710
    35
  (*this makes the OLD tests run AFTER introduction of I_Model.T_TEST..*)
Walther@60710
    36
  val check_OLD: Proof.context -> Rule_Set.T -> unchecked ->
Walther@60706
    37
    Model_Pattern.T * Model_Def.i_model_TEST -> checked
Walther@60706
    38
Walther@60590
    39
  val eval: Proof.context -> Rule_Set.T -> bool * term -> bool * term
Walther@60706
    40
  val feedback_TEST_to_string: Model_Def.i_model_feedback_TEST -> string
Walther@60590
    41
Walther@60705
    42
  val check_variant_envs: Proof.context -> Rule_Set.T -> unchecked ->
Walther@60705
    43
    env_subst -> env_eval -> checked
Walther@60710
    44
Walther@60715
    45
(*val sep_variants_envs replaced by of_max_variant       TODO
Walther@60715
    46
    for that purpose compare with sep_variants_envs_OLD  TODO*)
Walther@60706
    47
  val sep_variants_envs: Model_Pattern.T -> Model_Def.i_model_TEST ->
Walther@60706
    48
    ((Model_Def.i_model_TEST * env_subst * env_eval) * Model_Def.variant) list
Walther@60710
    49
  val sep_variants_envs_OLD: Model_Pattern.T -> Model_Def.i_model_TEST ->
Walther@60706
    50
    env_subst * env_eval;
Walther@60715
    51
Walther@60728
    52
(*T_TESTold* )
Walther@60710
    53
  val of_max_variant: Model_Pattern.T -> Model_Def.i_model_TEST ->
Walther@60710
    54
    Model_Def.i_model_TEST * env_subst * env_eval
Walther@60728
    55
( *T_TEST*)
Walther@60722
    56
  val of_max_variant:Model_Pattern.T -> Model_Def.i_model_TEST ->
Walther@60722
    57
       Model_Def.i_model_TEST * Env.T * (env_subst * env_eval)
Walther@60728
    58
(*T_TESTnew*)
Walther@60706
    59
Walther@60705
    60
(*from isac_test for Minisubpbl*)
Walther@60710
    61
  val discern_feedback_subst: Model_Def.descriptor -> Model_Def.i_model_feedback_TEST -> Env.T;
Walther@60710
    62
  val discern_type_subst: term * term -> term list -> Env.T;
Walther@60710
    63
  val discern_type_eval: Model_Def.descriptor -> term list -> env_eval
Walther@60710
    64
  val discern_atoms: term list -> Env.T;
Walther@60712
    65
Walther@60728
    66
  val make_env_model: (Model_Pattern.single * Model_Def.i_model_single_TEST) list -> Env.T
Walther@60728
    67
Walther@60705
    68
  val mk_env: Model_Def.i_model_feedback_TEST -> Env.T
Walther@60705
    69
  val mk_env_subst: (Model_Pattern.single * Model_Def.i_model_single_TEST) list -> env_subst
Walther@60710
    70
  val mk_env_subst_DEL: (Model_Pattern.single * Model_Def.i_model_single_TEST) list -> env_subst
Walther@60705
    71
  val mk_env_eval: (Model_Pattern.single * Model_Def.i_model_single_TEST) list -> env_eval
Walther@60710
    72
  val mk_env_eval_DEL: Model_Def.i_model_single_TEST list -> env_eval
Walther@60706
    73
  val arrange_args2: 'a list -> 'b list -> 'c list -> int * 'd list -> (('a * 'b * 'c) * 'd) list
Walther@60706
    74
  val filter_variants: (Model_Pattern.single * Model_Def.i_model_single_TEST) list ->
Walther@60706
    75
    Model_Def.variant -> (Model_Pattern.single * Model_Def.i_model_single_TEST) list
Walther@60706
    76
  val get_equal_descr: Model_Def.i_model_TEST -> Model_Pattern.single ->
Walther@60706
    77
    (Model_Pattern.single * Model_Def.i_model_single_TEST) list
Walther@60706
    78
  val unchecked_OLD_to_TEST: term list -> (term * Position.T) list
Walther@60705
    79
Walther@60710
    80
  val filter_variants': Model_Def.i_model_TEST -> Model_Def.variant -> Model_Def.i_model_TEST
Walther@60710
    81
  val arrange_args1: int list -> int * Model_Def.variant list -> (int * Model_Def.variant) list
Walther@60710
    82
  val cnt_corrects: Model_Def.i_model_TEST -> int
Walther@60710
    83
  val handle_descr_ts: term -> term list -> Env.T
Walther@60710
    84
  val distinguish_atoms: term list -> Env.T
Walther@60712
    85
(*REN type_repair_env: Env.T -> Env.T*)
Walther@60710
    86
  val repair_env: Env.T -> Env.T
Walther@60710
    87
  val all_atoms: term list -> bool
Walther@60710
    88
  val all_lhs_atoms: term list -> bool
Walther@60728
    89
(*from isac_test for Minisubpbl*)
Walther@60728
    90
  val mk_env_model: term -> Model_Def.i_model_feedback_TEST -> Env.T
Walther@60728
    91
  val make_envs_preconds: (Model_Pattern.single * Model_Def.i_model_single_TEST) list ->
Walther@60728
    92
    ((term * term) * (term * term)) list
Walther@60728
    93
  val switch_type_TEST: Model_Def.descriptor -> term list -> Model_Def.descriptor;
Walther@60728
    94
  val discern_feedback: term -> Model_Def.i_model_feedback_TEST ->
Walther@60728
    95
    ((term * term) * (term * term)) list
Walther@60728
    96
  val discern_typ: term -> Model_Pattern.descriptor * term list ->
Walther@60728
    97
    ((term * term) * (term * term)) list
Walther@60710
    98
Walther@60722
    99
\<^isac_test>\<open>  
Walther@60722
   100
  val switch_type: Model_Pattern.descriptor -> typ -> Model_Pattern.descriptor
Walther@60705
   101
wenzelm@60223
   102
\<close>
walther@59960
   103
end
Walther@60722
   104
                 
walther@59965
   105
(**)
walther@59960
   106
structure Pre_Conds(**) : PRE_CONDITIONS(**) =
walther@59960
   107
struct
walther@59965
   108
(**)
Walther@60706
   109
open Model_Def
walther@59960
   110
Walther@60673
   111
type T = Pre_Conds_Def.T;  (*= (bool * term) list;*)
Walther@60605
   112
type unchecked = term list
Walther@60705
   113
type unchecked_TEST = (term * Position.T) list
Walther@60705
   114
type checked = bool * (bool * term) list
Walther@60705
   115
type checked_TEST = bool * (bool * (term * Position.T)) list
Walther@60705
   116
Walther@60715
   117
(* 
Walther@60715
   118
  we have three kinds of Env.T in the specification-phase:
Walther@60715
   119
(*1*) Env.T produced by I_Model.of_max_variant and required to create O_Model.T, I_Model.T from
Walther@60715
   120
    Model_Pattern.T.
Walther@60715
   121
                       Env.T                  / (Constants, fixes)  in Model_Pattern.T
Walther@60715
   122
                       e.g.[(fixes, [r = 7])] |
Walther@60722
   123
                                              > (Constants, [<r = 7>]) in O/I_Model.T       *)
Walther@60715
   124
Walther@60715
   125
(*2*) type env_subst = Env.T (*               / 0 < fixes           in Problem.{where_, ...}
Walther@60715
   126
                       eg. [(fixes, r)]       |
Walther@60715
   127
                                              > 0 < r *)
Walther@60715
   128
(*3*) type env_eval =  Env.T (*               |
Walther@60715
   129
                       eg. [(r, 7)]           |
Walther@60715
   130
                                              > 0 < 7 \<longrightarrow> true
Walther@60715
   131
Walther@60715
   132
  (*1*) is required to produce (*2*) and (*3*); thus respective code is shifted to Pre_Conds.
Walther@60715
   133
  (*2*) and (*3*) is produced from I_Model.of_max_variant by restricting to "#Given".
Walther@60715
   134
  
Walther@60715
   135
  There is a typing problem, probably to be solved by a language for Specification in the future:
Walther@60715
   136
  term <fixes> in (*1*) has type "bool list"
Walther@60715
   137
  term <fixes> in (*2*) has type "real". So for the transition from (*1*) to (*2..3*)
Walther@60715
   138
    fun switch_type is required.
Walther@60715
   139
  The transition requires better modelling by a novel language for Specification.
Walther@60715
   140
*)
Walther@60715
   141
Walther@60605
   142
type input = TermC.as_string list;
walther@59963
   143
Walther@60675
   144
fun to_str ctxt (b, t) = pair2str (bool2str b, UnparseC.term ctxt t);
Walther@60673
   145
fun to_string ctxt pres = strs2str' (map (linefeed o (to_str ctxt)) pres);
walther@59960
   146
Walther@60590
   147
fun eval _ _ (false, where_) = (false, where_) (*NOT ALL Free's have been substituted*)
Walther@60590
   148
  | eval ctxt where_rls (true, where_) =
Walther@60590
   149
    if Rewrite.eval_true ctxt [where_] where_rls
Walther@60706
   150
    then (true, where_)
Walther@60706
   151
    else (false, where_);
walther@59960
   152
Walther@60712
   153
(** old code before I_Model.T_TEST **)
Walther@60712
   154
Walther@60705
   155
(* find most frequent variant v in itms *)
Walther@60705
   156
(* ATTENTION
Walther@60705
   157
 * spurios old code
Walther@60705
   158
 * misses variants with equal number of items, etc
Walther@60705
   159
*)
Walther@60705
   160
fun variants itms = ((distinct op =) o flat o (map (fn (_, vrs, _, _, _) => vrs))) itms;
Walther@60705
   161
Walther@60705
   162
(*version without typing problem*)
Walther@60705
   163
fun cnt itms v = (v, (length o (filter (curry op = v)) o flat o (map (fn (_, vrs, _, _, _) => vrs))) itms);
Walther@60705
   164
fun count_variants vts itms = map (cnt itms) vts;
Walther@60705
   165
Walther@60705
   166
fun max2 [] = raise ERROR "max2 of []"
Walther@60705
   167
  | max2 (y :: ys) =
Walther@60705
   168
    let
Walther@60705
   169
      fun mx (a, x) [] = (a, x)
Walther@60705
   170
  	    | mx (a, x) ((b, y) :: ys) = if x < y then mx (b, y) ys else mx (a, x) ys;
Walther@60705
   171
    in mx y ys end;
Walther@60705
   172
Walther@60705
   173
(* get the constant value from a penv *)
Walther@60705
   174
fun getval (id, values) = 
Walther@60705
   175
  case values of
Walther@60705
   176
	  [] => raise ERROR ("penv_value: no values in '" ^ UnparseC.term (ContextC.for_ERROR ()) id)
Walther@60705
   177
  | [v] => (id, v)
Walther@60705
   178
  | (v1 :: v2 :: _) => (case v1 of 
Walther@60705
   179
	      Const (\<^const_name>\<open>Program.Arbfix\<close>, _) => (id, v2)
Walther@60705
   180
	    | _ => (id, v1));
Walther@60705
   181
Walther@60705
   182
(* find the variant with most items already input *)
Walther@60705
   183
fun max_variant itms = 
Walther@60705
   184
    let val vts = (count_variants (variants itms)) itms;
Walther@60705
   185
    in if vts = [] then 0 else (fst o max2) vts end;
Walther@60705
   186
Walther@60706
   187
fun mk_e (Cor (_, iv)) = [getval iv]
Walther@60706
   188
  | mk_e (Syn _) = []
Walther@60706
   189
  | mk_e (Typ _) = [] 
Walther@60706
   190
  | mk_e (Inc (_, iv)) = [getval iv]
Walther@60706
   191
  | mk_e (Sup _) = []
Walther@60706
   192
  | mk_e (Mis _) = []
Walther@60705
   193
  | mk_e  _ = raise ERROR "mk_e: uncovered case in fun.def.";
Walther@60705
   194
fun mk_en vt (_, vts, _, _, itm_) = if member op = vts vt then mk_e itm_ else [];
Walther@60705
   195
Walther@60705
   196
(* extract the environment from an item list; takes the variant with most items *)
Walther@60705
   197
fun environment itms = 
Walther@60705
   198
  let val vt = max_variant itms
Walther@60712
   199
  in (flat o (map (mk_en vt))) itms end;
Walther@60705
   200
Walther@60706
   201
Walther@60712
   202
(** new code for I_Model.T_TEST **)
Walther@60712
   203
Walther@60706
   204
fun pen2str ctxt (t, ts) =
Walther@60706
   205
  pair2str (UnparseC.term ctxt t, (strs2str' o map (UnparseC.term  ctxt)) ts);
Walther@60706
   206
fun feedback_to_string_TEST ctxt (Cor_TEST ((d, ts), penv)) = 
Walther@60706
   207
    "Cor_TEST " ^ UnparseC.term ctxt (Input_Descript.join (d, ts)) ^ " ," ^ pen2str ctxt penv
Walther@60706
   208
  | feedback_to_string_TEST _ (Syn_TEST c) =
Walther@60706
   209
    "Syn_TEST " ^ c
Walther@60714
   210
  | feedback_to_string_TEST ctxt (Inc_TEST ((d, []), _)) = 
Walther@60714
   211
    "Inc_TEST " ^ UnparseC.term ctxt (Input_Descript.join (d, [])) ^ " " ^ 
Walther@60717
   212
      Model_Pattern.empty_for d
Walther@60714
   213
  | feedback_to_string_TEST ctxt (Inc_TEST ((d, ts), penv)) =
Walther@60706
   214
    "Inc_TEST " ^ UnparseC.term ctxt (Input_Descript.join (d, ts)) ^ " ," ^ pen2str ctxt penv
Walther@60706
   215
  | feedback_to_string_TEST ctxt (Sup_TEST (d, ts)) = 
Walther@60706
   216
    "Sup_TEST " ^ UnparseC.term ctxt (Input_Descript.join (d, ts))
Walther@60706
   217
fun feedback_TEST_to_string t = feedback_to_string_TEST (ContextC.for_ERROR ()) t;
Walther@60705
   218
Walther@60705
   219
Walther@60710
   220
(*** make environments for substituting model_pattern+program and for evaluating pre-conditions ***)
Walther@60705
   221
Walther@60712
   222
(** OLD make environment for substituting model_pattern+program and pre-conditions **)
Walther@60710
   223
Walther@60712
   224
(*val all_atoms_OLD: term list -> bool*)
Walther@60712
   225
fun all_atoms_OLD ts =
Walther@60705
   226
  fold (curry and_) (map (fn t => TermC.is_atom (TermC.lhs t)) ts) true
Walther@60705
   227
fun switch_type (Free (id, _)) T = Free (id, T)
Walther@60705
   228
  | switch_type t _ = raise TERM ("switch_type not for", [t])
Walther@60712
   229
Walther@60705
   230
(*
Walther@60705
   231
  this repair is spurious and indicates the need for considering a separate language for Model-ing.
Walther@60705
   232
  E.g. "fixes" is used with 2 different types "bool list" and "real" in the problem-definition
Walther@60705
   233
    problem pbl_opti_univ : "univariate_calculus/Optimisation" = ..
Walther@60705
   234
      Given: "Constants fixes"
Walther@60705
   235
      Where: "0 < fixes"
Walther@60705
   236
      ...
Walther@60705
   237
     (1) Given: Const ("Input_Descript.Constants", "bool list \<Rightarrow> nam") $ Free ("fixes", "bool list")
Walther@60705
   238
     (2) Where: Const ("Orderings.ord_class.less", "real \<Rightarrow> real \<Rightarrow> bool") $
Walther@60705
   239
           Const ("Groups.zero_class.zero", "real") $ Free ("fixes", "real")
Walther@60705
   240
Walther@60705
   241
  The intermediately simplistic solution is to build a pair of environments, type env_pair,
Walther@60705
   242
Walther@60705
   243
  The simplistic design works for the instantiation of the demo-example
Walther@60705
   244
    "Constants [r = (7::real)]"
Walther@60705
   245
  but it could be extended to instantiations like
Walther@60705
   246
      "Constants [a = (1::real), b = (2::real)]"
Walther@60705
   247
    with the same Where: "0 < fixes" in the problem-definition
Walther@60705
   248
    if indexing / deletion of found elements from the association list is considered.
Walther@60705
   249
Walther@60705
   250
  For the purpose of future pimprovements a pair of environments, type env_pair, is built;
Walther@60705
   251
  where as key of the "outer" environment Free ("fixes", "real" kept to future improvements
Walther@60705
   252
  (by indexing "fixes_1", "fixes_2" in case the are more than one element in 
Walther@60705
   253
  "Input_Descript.Constants", "bool list..)
Walther@60705
   254
*)
Walther@60705
   255
fun repair_env env = 
Walther@60705
   256
  map (fn (id_inst, val_) => (switch_type id_inst (type_of val_), val_)) env
Walther@60710
   257
Walther@60705
   258
(* make an Env.T for Prec_Conds.eval *)
Walther@60705
   259
fun mk_env (Model_Def.Cor_TEST ((descr, [ts]), _)) =
Walther@60705
   260
    let
Walther@60706
   261
    (*val ts = TermC.isalist2list ts*)
Walther@60706
   262
      val ts = if TermC.is_list ts then TermC.isalist2list ts else [ts]
Walther@60705
   263
    in
Walther@60705
   264
      (*compare Model_Pattern.empty_for*)
Walther@60705
   265
      case type_of descr of
Walther@60705
   266
        (Type ("fun", [Type ("List.list", [Type ("HOL.bool", [])]), _])) (*SideConditions \<longrightarrow> (sideconds, [(u / 2) \<up> 2 + (2 / v) \<up> 2 = r \<up> 2])*)
Walther@60712
   267
          => if all_atoms_OLD ts then map (fn t => (TermC.lhs t, TermC.rhs t)) ts else []
Walther@60705
   268
      | (Type ("fun", [Type ("List.list", [Type ("Real.real", [])]), _])) (*AdditionalValues [u, v]*)
Walther@60705
   269
          => []
Walther@60705
   270
      | (Type ("HOL.bool", [])) (*Precision (\<epsilon> = 0.01)*)
Walther@60712
   271
          => if all_atoms_OLD ts then map (fn t => (TermC.lhs t, TermC.rhs t)) ts else []
Walther@60706
   272
      | _ (*Maximum A*) => [(hd ts, TermC.empty (*dummy rhs*))]
Walther@60705
   273
    end
Walther@60705
   274
  | mk_env (Model_Def.Inc_TEST ((descr, [ts]), _)) =
Walther@60705
   275
    let
Walther@60706
   276
    (*val ts = TermC.isalist2list ts*)
Walther@60706
   277
      val ts = if TermC.is_list ts then TermC.isalist2list ts else [ts]
Walther@60705
   278
    in
Walther@60705
   279
      (*compare Model_Pattern.empty_for*)
Walther@60705
   280
      case type_of descr of
Walther@60705
   281
        (Type ("fun", [Type ("List.list", [Type ("HOL.bool", [])]), _])) (*SideConditions \<longrightarrow> (sideconds, [(u / 2) \<up> 2 + (2 / v) \<up> 2 = r \<up> 2])*)
Walther@60712
   282
          => if all_atoms_OLD ts then map (fn t => (TermC.lhs t, TermC.rhs t)) ts else []
Walther@60705
   283
      | (Type ("fun", [Type ("List.list", [Type ("Real.real", [])]), _])) (*AdditionalValues [u, v]*)
Walther@60705
   284
          => []
Walther@60705
   285
      | (Type ("HOL.bool", [])) (*Precision (\<epsilon> = 0.01)*)
Walther@60712
   286
          => if all_atoms_OLD ts then map (fn t => (TermC.lhs t, TermC.rhs t)) ts else []
Walther@60706
   287
      | _ (*Maximum A*) => [(hd ts, TermC.empty (*dummy rhs*))]
Walther@60705
   288
   end
Walther@60706
   289
  | mk_env (Model_Def.Sup_TEST (descr, [ts])) =      
Walther@60705
   290
    let
Walther@60706
   291
    (*val ts = TermC.isalist2list ts*)
Walther@60706
   292
      val ts = if TermC.is_list ts then TermC.isalist2list ts else [ts]
Walther@60705
   293
    in
Walther@60705
   294
      (*compare Model_Pattern.empty_for*)
Walther@60705
   295
      case type_of descr of
Walther@60705
   296
        (Type ("fun", [Type ("List.list", [Type ("HOL.bool", [])]), _])) (*SideConditions \<longrightarrow> (sideconds, [(u / 2) \<up> 2 + (2 / v) \<up> 2 = r \<up> 2])*)
Walther@60712
   297
          => if all_atoms_OLD ts then map (fn t => (TermC.lhs t, TermC.rhs t)) ts else []
Walther@60705
   298
      | (Type ("fun", [Type ("List.list", [Type ("Real.real", [])]), _])) (*AdditionalValues [u, v]*)
Walther@60705
   299
          => []
Walther@60705
   300
      | (Type ("HOL.bool", [])) (*Precision (\<epsilon> = 0.01)*)
Walther@60712
   301
          => if all_atoms_OLD ts then map (fn t => (TermC.lhs t, TermC.rhs t)) ts else []
Walther@60706
   302
      | _ (*Maximum A*) => [(hd ts, TermC.empty (*dummy rhs*))]
Walther@60705
   303
    end
Walther@60706
   304
  | mk_env feedb =
Walther@60706
   305
    raise ERROR ("mk_env not reasonable for " ^  quote (feedback_TEST_to_string feedb))
Walther@60705
   306
fun mk_env_subst equal_descr_pairs =
Walther@60705
   307
  map (fn ((_, (_, id)), (_, _, _, _, (feedb, _)))
Walther@60706
   308
        => (mk_env feedb) |> map fst (*dummy rhs dropped*)|> map (pair id)) equal_descr_pairs
Walther@60705
   309
  |> flat
Walther@60705
   310
  |> repair_env
Walther@60710
   311
(*fun mk_env_eval unused? DEL!*)
Walther@60705
   312
fun mk_env_eval equal_descr_pairs =
Walther@60705
   313
  map (fn (_, (_, _, _, _, (feedb, _))) => mk_env feedb) equal_descr_pairs
Walther@60705
   314
  |> flat
Walther@60706
   315
  |> filter_out (fn (_, b) => b = TermC.empty) (*drop pairs with dummy rhs*)
Walther@60710
   316
Walther@60712
   317
(*  all_atoms: term list -> bool*)
Walther@60710
   318
fun all_atoms ts =
Walther@60710
   319
  fold (curry and_) (map (fn t => TermC.is_atom t) ts) true
Walther@60712
   320
(*  all_lhs_atoms: term list -> bool*)
Walther@60710
   321
fun all_lhs_atoms ts = fold (curry and_) (map (fn t =>
Walther@60710
   322
  if can TermC.lhs t then TermC.is_atom (TermC.lhs t) else false) ts) true
Walther@60712
   323
(*  distinguish_atoms: term list -> Env.T*)
Walther@60710
   324
fun distinguish_atoms (*[(u / 2) \<up> 2 + (2 / v) \<up> 2 = r \<up> 2], \<epsilon> = 0.01, [L]*) ts =
Walther@60710
   325
  if all_atoms ts
Walther@60710
   326
  then map (rpair TermC.empty (*dummy rhs*)) ts
Walther@60710
   327
  else if all_lhs_atoms ts
Walther@60710
   328
    then map (fn t => (TermC.lhs t, TermC.rhs t)) ts
Walther@60710
   329
    else []
Walther@60712
   330
(*  handle_descr_ts: term -> term list -> (term * term) list*)
Walther@60710
   331
fun handle_descr_ts descr ts =
Walther@60710
   332
  (*compare Model_Pattern.empty_for*)
Walther@60710
   333
  case type_of descr of
Walther@60710
   334
    (Type ("fun", [Type ("List.list", [Type ("HOL.bool", [])]), _])) (*(SideConds [(u / 2) \<up> 2 + (2 / v) \<up> 2 = r \<up> 2]), [L]*)
Walther@60710
   335
      => distinguish_atoms ts
Walther@60710
   336
  | (Type ("fun", [Type ("List.list", [Type ("Real.real", [])]), _])) (*AdditionalValues [u, v]*)
Walther@60710
   337
      => if TermC.is_list (hd ts)
Walther@60710
   338
         then [(descr, ts |> map TermC.the_single |> TermC.list2isalist HOLogic.realT)]
Walther@60710
   339
         else []
Walther@60710
   340
  | (Type ("HOL.bool", [])) (*Precision (\<epsilon> = 0.01)*)
Walther@60710
   341
      => distinguish_atoms ts
Walther@60710
   342
  | _ (*Maximum A*) => [(hd ts, TermC.empty (*dummy rhs*))]
Walther@60710
   343
Walther@60712
   344
Walther@60712
   345
(** NEW make environment for substituting program and pre-conditions **)
Walther@60710
   346
Walther@60710
   347
fun switch_type (Free (id, _)) T = Free (id, T)
Walther@60710
   348
  | switch_type t _ = raise TERM ("switch_type not for", [t])
Walther@60710
   349
Walther@60710
   350
fun repair_env env =
Walther@60710
   351
  map (fn (id_inst, val_) => (switch_type id_inst (type_of val_), val_)) env
Walther@60710
   352
Walther@60710
   353
(*  discern_type_subst: term * term -> term list -> Env.T*)
Walther@60710
   354
fun discern_type_subst (descr, id) ts =
Walther@60710
   355
  (*..compare Model_Pattern.empty_for*)
Walther@60710
   356
  case type_of descr of 
Walther@60710
   357
    (Type ("fun", [Type ("List.list", [Type ("HOL.bool", [])]), _])) (*(SideConds [(u / 2) \<up> 2 + (2 / v) \<up> 2 = r \<up> 2]), [L]*)
Walther@60712
   358
      => if TermC.is_list (hd ts)
Walther@60712
   359
         then [(id, ts |> map TermC.the_single |> TermC.list2isalist HOLogic.boolT)]
Walther@60712
   360
         else if length ts = 1 
Walther@60712
   361
           then [(id, Library.the_single ts)]
Walther@60710
   362
           else raise error "discern_type_subst list bool DESIGN ERROR"
Walther@60710
   363
  | (Type ("fun", [Type ("List.list", [Type ("Real.real", [])]), _])) (*AdditionalValues [u, v]*)
Walther@60712
   364
      => if TermC.is_list (hd ts)
Walther@60712
   365
         then [(id, ts |> map TermC.the_single |> TermC.list2isalist HOLogic.realT)]
Walther@60712
   366
         else if length ts = 1 
Walther@60712
   367
           then [(id, Library.the_single ts)]
Walther@60710
   368
           else raise error "discern_type_subst list bool DESIGN ERROR"
Walther@60712
   369
  | _ (*Maximum A*) => [(id, Library.the_single ts)] (*if length ts = 1 !*)
Walther@60710
   370
Walther@60712
   371
(*  discern_feedback_subst: Model_Def.i_model_feedback_TEST -> Env.T*)
Walther@60710
   372
fun discern_feedback_subst id (Model_Def.Cor_TEST ((descr, [ts]), _)) =
Walther@60712
   373
    discern_type_subst (descr, id) [ts]
Walther@60710
   374
  | discern_feedback_subst id (Model_Def.Inc_TEST ((descr, [ts]), _)) =
Walther@60712
   375
    discern_type_subst (descr, id) [ts]
Walther@60712
   376
  | discern_feedback_subst id (Model_Def.Sup_TEST (descr, [ts])) =
Walther@60712
   377
    discern_type_subst (descr, id) [ts]
Walther@60710
   378
  | discern_feedback_subst id (Model_Def.Cor_TEST ((descr, (*[*)ts(*]*)), _)) =
Walther@60712
   379
    discern_type_subst (descr, id) ts
Walther@60712
   380
  | discern_feedback_subst _ feedb =
Walther@60712
   381
    raise ERROR ("discern_feedback_subst not reasonable for " ^ quote (feedback_TEST_to_string feedb))
Walther@60710
   382
Walther@60710
   383
fun mk_env_subst_DEL equal_descr_pairs =
Walther@60710
   384
  map (fn ((_, (_, id)), (_, _, _, _, (feedb, _)))
Walther@60710
   385
        => (discern_feedback_subst id feedb)) equal_descr_pairs
Walther@60710
   386
  |> flat
Walther@60710
   387
  |> repair_env
Walther@60710
   388
Walther@60710
   389
Walther@60712
   390
(** NEW make environment for evaluating pre-conditions **)
Walther@60712
   391
Walther@60712
   392
(*  all_atoms: term list -> bool*)
Walther@60710
   393
fun all_atoms ts =
Walther@60710
   394
  fold (curry and_) (map (fn t => TermC.is_atom t) ts) true
Walther@60712
   395
(*  all_lhs_atoms: term list -> bool*)
Walther@60710
   396
fun all_lhs_atoms ts = fold (curry and_) (map (fn t =>
Walther@60710
   397
  if can TermC.lhs t then TermC.is_atom (TermC.lhs t) else false) ts) true
Walther@60712
   398
(*  discern_atoms: term list -> (term * term) list*)
Walther@60710
   399
fun discern_atoms (*[(u / 2) \<up> 2 + (2 / v) \<up> 2 = r \<up> 2], \<epsilon> = 0.01, [L]*) ts =
Walther@60710
   400
  if all_atoms ts
Walther@60710
   401
  then map (rpair TermC.empty (*dummy rhs*)) ts
Walther@60710
   402
  else if all_lhs_atoms ts
Walther@60710
   403
    then map (fn t => (TermC.lhs t, TermC.rhs t)) ts
Walther@60710
   404
    else []
Walther@60710
   405
Walther@60710
   406
fun discern_type_eval descr ts =
Walther@60710
   407
  (*..compare Model_Pattern.empty_for*)
Walther@60710
   408
  case type_of descr of 
Walther@60710
   409
    (Type ("fun", [Type ("List.list", [Type ("HOL.bool", [])]), _])) (*(SideConds [(u / 2) \<up> 2 + (2 / v) \<up> 2 = r \<up> 2]), [L]*)
Walther@60710
   410
      => discern_atoms ts
Walther@60710
   411
  | (Type ("fun", [Type ("List.list", [Type ("Real.real", [])]), _])) (*AdditionalValues [u, v]*)
Walther@60710
   412
      => discern_atoms ts
Walther@60710
   413
  | _ (*Maximum A*) => discern_atoms ts
Walther@60710
   414
Walther@60712
   415
fun discern_feedback_eval (Model_Def.Cor_TEST ((descr, [ts]), _)) = discern_type_eval descr [ts]
Walther@60712
   416
  | discern_feedback_eval (Model_Def.Inc_TEST ((descr, [ts]), _)) = discern_type_eval descr [ts]
Walther@60712
   417
  | discern_feedback_eval (Model_Def.Sup_TEST (descr, [ts])) = discern_type_eval descr [ts]
Walther@60712
   418
  | discern_feedback_eval (Model_Def.Cor_TEST ((descr, ts), _)) = discern_type_eval descr ts
Walther@60712
   419
  | discern_feedback_eval feedb =
Walther@60710
   420
    raise ERROR ("discern_feedback_eval not defined for " ^  quote (feedback_TEST_to_string feedb))
Walther@60710
   421
Walther@60710
   422
fun mk_env_eval_DEL i_singles =
Walther@60710
   423
  map (fn (_, _, _, _, (feedb, _)) => discern_feedback_eval feedb) i_singles
Walther@60710
   424
  |> flat
Walther@60710
   425
  |> filter_out (fn (_, b) => b = TermC.empty) (*drop pairs with dummy rhs*)
Walther@60710
   426
Walther@60710
   427
Walther@60712
   428
(*** old check_variant_envs, sep_variants_envs/_OLD, of_max_variant, check/_TEST/_OLD ***)
Walther@60710
   429
Walther@60705
   430
fun check_variant_envs ctxt where_rls pres env_subst env_eval =
Walther@60705
   431
  let
Walther@60705
   432
    val pres_subst = map (TermC.subst_atomic_all env_subst) pres;
Walther@60705
   433
    val full_subst = map (fn (bool, t) => (bool, subst_atomic env_eval t)) pres_subst
Walther@60705
   434
    val evals = map (eval ctxt where_rls) full_subst
Walther@60705
   435
  in
Walther@60705
   436
    (foldl and_ (true, map fst evals), pres_subst)
Walther@60705
   437
  end
Walther@60705
   438
walther@59965
   439
Walther@60710
   440
(* check_variant_envs for PIDE *)
Walther@60706
   441
Walther@60706
   442
fun filter_variants pairs i = 
Walther@60706
   443
  filter (fn (_, (_, variants, _, _, _)) => member op= variants i) pairs
Walther@60712
   444
Walther@60706
   445
(*get descriptor of those items which can contribute to Subst.T and Env.T *)
Walther@60712
   446
(*  get_dscr: feedback_TEST -> descriptor option*)
Walther@60710
   447
fun get_dscr' (Cor_TEST ((descr, _), _)) = SOME descr
Walther@60710
   448
  | get_dscr' (Inc_TEST ((descr, _), _)) = SOME descr
Walther@60710
   449
  | get_dscr' (Sup_TEST (descr, _)) = SOME descr
Walther@60710
   450
  | get_dscr' _
Walther@60706
   451
    (*other feedback cannot contribute to I_Model.mk_env_TEST and Pre_Conds.mk_env_TEST*) = NONE
Walther@60712
   452
(*  get_descr: I_Model.single_TEST -> descriptor option*)
Walther@60706
   453
fun get_descr (_, _, _, _, (feedb, _)) =
Walther@60710
   454
  case get_dscr' feedb of NONE => NONE | some_descr => some_descr
Walther@60712
   455
(*  get_equal_descr: I_Model.T_TEST -> Model_Pattern.single ->
Walther@60706
   456
    (Model_Pattern.single * I_Model.single_TEST) list*)
Walther@60706
   457
fun get_equal_descr i_model (m_patt_single as (_, (descr, _))) =
Walther@60706
   458
  let
Walther@60706
   459
    val equal_variants = 
Walther@60706
   460
      filter (fn i_single => case get_descr i_single of
Walther@60706
   461
          NONE => false (*--------vvvvv*)
Walther@60706
   462
        | SOME descr' => descr' = descr) (*probl_POS*) i_model
Walther@60706
   463
    in
Walther@60706
   464
      (map (pair m_patt_single) equal_variants)
Walther@60706
   465
    end
Walther@60706
   466
fun arrange_args2 [] _ _ _(*all have equal length*) = []
Walther@60706
   467
  | arrange_args2 (b :: bs) (c :: cs) (d :: ds) (cnt, all) =
Walther@60706
   468
    ((b, c, d), nth cnt all) :: (arrange_args2 bs cs ds (cnt + 1, all)) 
Walther@60706
   469
  | arrange_args2 _ _ _ _ = raise ERROR "I_Model.arrange_args2 UnequalLengths"
Walther@60706
   470
fun sep_variants_envs model_patt i_model =
Walther@60706
   471
  let
Walther@60706
   472
    val equal_descr_pairs =
Walther@60706
   473
      map (get_equal_descr i_model) model_patt
Walther@60706
   474
      |> flat
Walther@60706
   475
    val all_variants =
Walther@60706
   476
        map (fn (_, (_, variants, _, _, _)) => variants) equal_descr_pairs
Walther@60706
   477
        |> flat
Walther@60706
   478
        |> distinct op =
Walther@60706
   479
    val variants_separated = map (filter_variants equal_descr_pairs) all_variants
Walther@60712
   480
    val i_models = map (map snd) variants_separated
Walther@60706
   481
    val restricted_to_given = map (filter (fn ((m_field, (_, _)), (_, _, _, _, (_, _))) =>
Walther@60706
   482
      m_field = "#Given")) variants_separated
Walther@60706
   483
    val envs_subst = map mk_env_subst restricted_to_given
Walther@60706
   484
    val envs_eval =  map mk_env_eval restricted_to_given
Walther@60706
   485
  in
Walther@60706
   486
    arrange_args2 i_models envs_subst envs_eval (1, all_variants)
Walther@60706
   487
  end
Walther@60712
   488
Walther@60706
   489
(* smash all environments into one; this works only for old test before Maximum-example *)
Walther@60706
   490
fun sep_variants_envs_OLD model_patt i_model =
Walther@60706
   491
  let
Walther@60706
   492
    val equal_descr_pairs =
Walther@60706
   493
      map (get_equal_descr i_model) model_patt
Walther@60706
   494
      |> flat
Walther@60706
   495
    val all_variants =
Walther@60706
   496
        map (fn (_, (_, variants, _, _, _)) => variants) equal_descr_pairs
Walther@60706
   497
        |> flat
Walther@60706
   498
        |> distinct op =
Walther@60706
   499
    val variants_separated = map (filter_variants equal_descr_pairs) all_variants
Walther@60706
   500
    val restricted_to_given = map (filter (fn ((m_field, (_, _)), (_, _, _, _, (_, _))) =>
Walther@60706
   501
      m_field = "#Given")) variants_separated
Walther@60706
   502
    val envs_subst = map mk_env_subst restricted_to_given
Walther@60706
   503
    val envs_eval =  map mk_env_eval restricted_to_given
Walther@60706
   504
  in
Walther@60706
   505
    (flat envs_subst, flat envs_eval)
Walther@60706
   506
  end
Walther@60706
   507
Walther@60712
   508
(** of_max_variant **)
Walther@60721
   509
Walther@60726
   510
fun handle_lists id (descr, ts) =
Walther@60726
   511
    if Model_Pattern.is_list_descr descr 
Walther@60726
   512
    then if length ts > 1         (*list with more than 1 element needs to collect by [.., .., ..]*)
Walther@60726
   513
      then [(id, TermC.list2isalist (Model_Pattern.typ_of_element descr) ts)] (*AdditValues [u, v]*)
Walther@60726
   514
      else if TermC.is_atom (Library.the_single ts)
Walther@60726
   515
        then [(id, Library.the_single ts)]                                     (* solutions L, ...*)
Walther@60726
   516
        else [(id, TermC.list2isalist (Model_Pattern.typ_of_element descr) ts)](*Constants [r = 7]*)
Walther@60726
   517
    else [(id, Library.the_single ts)]                           (* solveFor x, Extremum (A = ...)*)
Walther@60726
   518
Walther@60722
   519
fun mk_env_model _ (Model_Def.Cor_TEST ((_, []), _)) = []
Walther@60722
   520
  | mk_env_model id (Model_Def.Cor_TEST ((descr, ts), _)) = 
Walther@60728
   521
(*T_TEST.150* )
Walther@60722
   522
    if Model_Pattern.is_list_descr descr 
Walther@60721
   523
    then [(id, TermC.list2isalist (Model_Pattern.typ_of_element descr) ts)]
Walther@60721
   524
    else [(id, hd ts)]
Walther@60728
   525
( *T_TEST*)
Walther@60726
   526
    handle_lists id (descr, ts)
Walther@60728
   527
(*T_TEST.100*)
Walther@60722
   528
  | mk_env_model _ (Model_Def.Syn_TEST _) = [] (*TODO handle correct list elements*)
Walther@60722
   529
  | mk_env_model _ (Model_Def.Inc_TEST ((_, []), _)) = []
Walther@60722
   530
  | mk_env_model id (Model_Def.Inc_TEST ((descr, ts), _)) = 
Walther@60728
   531
(*T_TEST.150* )
Walther@60722
   532
    if Model_Pattern.is_list_descr descr 
Walther@60721
   533
    then [(id, TermC.list2isalist (Model_Pattern.typ_of_element descr) ts)]
Walther@60721
   534
    else [(id, hd ts)]
Walther@60728
   535
( *T_TEST*)
Walther@60726
   536
    handle_lists id (descr, ts)
Walther@60728
   537
(*T_TEST.100*)
Walther@60722
   538
  | mk_env_model _ (Model_Def.Sup_TEST _) = []
Walther@60722
   539
fun make_env_model equal_descr_pairs =
Walther@60721
   540
  map (fn ((_, (_, id)), (_, _, _, _, (feedb, _)))
Walther@60722
   541
        => (mk_env_model id feedb)) equal_descr_pairs
Walther@60721
   542
  |> flat
Walther@60722
   543
Walther@60722
   544
fun switch_type_TEST descr [] = descr
Walther@60722
   545
  | switch_type_TEST (Free (id_string, _)) ts =
Walther@60724
   546
    Free (id_string, ts |> hd |> TermC.lhs |> type_of)
Walther@60728
   547
  | switch_type_TEST descr _ = raise ERROR ("switch_type_TEST undefined argument " ^
Walther@60722
   548
      quote (UnparseC.term (ContextC.for_ERROR ()) descr))
Walther@60722
   549
fun discern_typ _ (_, []) = []
Walther@60722
   550
  | discern_typ id (descr, ts) =
Walther@60728
   551
(*TODO.md "review (descriptor, ts)" REMOVE--------------------------------------\*)
Walther@60723
   552
    let
Walther@60728
   553
      val ts = if Model_Pattern.is_list_descr descr andalso TermC.is_list (hd ts)
Walther@60723
   554
        then TermC.isalist2list (hd ts)
Walther@60723
   555
        else ts
Walther@60723
   556
    in
Walther@60728
   557
(*TODO.md "review (descriptor, ts)" REMOVE--------------------------------------/*)
Walther@60722
   558
  if Model_Pattern.typ_of_element descr = HOLogic.boolT
Walther@60722
   559
    andalso ts |> map TermC.lhs |> all_atoms
Walther@60722
   560
  then
Walther@60722
   561
    if length ts > 1
Walther@60722
   562
    then raise ERROR "model items of type 'bool' in lists with 'lengt ts > 1' NOT YET IMPLEMENTED"
Walther@60722
   563
    else [((switch_type_TEST id ts, TermC.lhs (hd ts)), 
Walther@60722
   564
           (TermC.lhs (hd ts), TermC.rhs (hd ts)))]
Walther@60722
   565
  else []
Walther@60728
   566
(*TODO.md "review (descriptor, ts)" REMOVE--------------------------------------\*)
Walther@60723
   567
    end
Walther@60728
   568
(*TODO.md "review (descriptor, ts)" REMOVE--------------------------------------/*)
Walther@60722
   569
fun discern_feedback id (Model_Def.Cor_TEST ((descr, ts), _)) = discern_typ id (descr, ts)
Walther@60722
   570
  | discern_feedback _ (Model_Def.Syn_TEST _) = [] (*TODO: handle correct elements*)
Walther@60722
   571
  | discern_feedback id (Model_Def.Inc_TEST ((descr, ts), _)) = discern_typ id (descr, ts)
Walther@60722
   572
  | discern_feedback _ (Model_Def.Sup_TEST _) = []
Walther@60728
   573
fun make_envs_preconds equal_givens =
Walther@60722
   574
  map (fn ((_, (_, id)), (_, _, _, _, (feedb, _))) => discern_feedback id feedb) equal_givens
Walther@60722
   575
  |> flat
Walther@60721
   576
Walther@60712
   577
(*  filter_variants': Model_Def.i_model_TEST -> Model_Def.variant -> Model_Def.i_model_TEST*)
Walther@60710
   578
fun filter_variants' i_singles n = 
Walther@60710
   579
  filter (fn (_, variants, _, _, _) => member op= variants n) i_singles
Walther@60710
   580
(*arrange_args1: int list -> int * Model_Def.variant list -> (int * Model_Def.variant) list*)
Walther@60710
   581
fun arrange_args1 [] _ = []
Walther@60710
   582
  | arrange_args1 (sum :: ss) (cnt, all) = (sum, nth cnt all) :: (arrange_args1 ss (cnt + 1, all)) 
Walther@60710
   583
(*cnt_corrects: I_Model.T_TEST -> int*)
Walther@60710
   584
fun cnt_corrects i_model = 
Walther@60710
   585
  fold (curry op +) (map (fn (_, _, _, _, (Cor_TEST _, _)) => 1 | _ => 0) i_model) 0;
Walther@60723
   586
Walther@60728
   587
(*T_TESTold* )
Walther@60710
   588
fun of_max_variant model_patt i_model =
Walther@60728
   589
( *T_TEST*)
Walther@60723
   590
fun of_max_variant _ [] = ([], [], ([], []))
Walther@60723
   591
  | of_max_variant model_patt i_model =
Walther@60728
   592
(*T_TESTnew*)
Walther@60723
   593
 let
Walther@60710
   594
    val all_variants =
Walther@60710
   595
        map (fn (_, variants, _, _, _) => variants) i_model
Walther@60710
   596
        |> flat
Walther@60710
   597
        |> distinct op =
Walther@60710
   598
    val variants_separated = map (filter_variants' i_model) all_variants
Walther@60710
   599
    val sums_corr = map (cnt_corrects) variants_separated
Walther@60710
   600
    val sum_variant_s = arrange_args1 sums_corr (1, all_variants)
Walther@60710
   601
    val (_, max_variant) = hd (*..crude decision, up to improvement *)
Walther@60710
   602
      (sort (fn ((i, _), (j, _)) => int_ord (i, j)) sum_variant_s)
Walther@60710
   603
    val i_model_max =
Walther@60710
   604
      filter (fn (_, variants, _ , _ ,_) => member (op =) variants max_variant) i_model
Walther@60721
   605
    val equal_descr_pairs = map (get_equal_descr i_model) model_patt |> flat
Walther@60728
   606
(*T_TESTold* )
Walther@60712
   607
    val env_subst = mk_env_subst_DEL equal_descr_pairs
Walther@60712
   608
    val env_eval = mk_env_eval_DEL i_model_max
Walther@60710
   609
  in
Walther@60712
   610
    (i_model_max, env_subst, env_eval)
Walther@60710
   611
  end
Walther@60728
   612
( *T_TEST*)
Walther@60722
   613
    val env_model = make_env_model equal_descr_pairs
Walther@60722
   614
    val equal_givens = filter (fn ((m_field, _), _) => m_field = "#Given") equal_descr_pairs
Walther@60722
   615
    val subst_eval_list = make_envs_preconds equal_givens
Walther@60722
   616
    val (env_subst, env_eval) = split_list subst_eval_list
Walther@60721
   617
  in
Walther@60722
   618
    (i_model_max, env_model, (env_subst, env_eval))
Walther@60721
   619
  end
Walther@60728
   620
(*T_TESTnew*)
Walther@60712
   621
Walther@60712
   622
Walther@60712
   623
(** check pre-conditions **)
Walther@60710
   624
Walther@60727
   625
(* WRONG ENVS expects the precondition from Problem, ie. needs substitution *)
Walther@60706
   626
fun check _ _ [] _ _ = (true, [])
Walther@60706
   627
  | check ctxt where_rls pres pbl (_ (*I_Model.variants UNNECESSARY: I_Model.T filtered for*)) =
Walther@60706
   628
    let
Walther@60706
   629
      val env = environment pbl;
Walther@60706
   630
      val pres' = map (TermC.subst_atomic_all env) pres;
Walther@60706
   631
      val evals = map (eval ctxt where_rls) pres';
Walther@60706
   632
    in (foldl and_ (true, map fst evals), evals) end;
Walther@60727
   633
(* WRONG ENVS expects the precondition from PIDE, ie. already substituted *)
Walther@60706
   634
fun check_TEST _ _ [] _ = (true, [])
Walther@60706
   635
  | check_TEST ctxt where_rls preconds env_eval =
Walther@60706
   636
    let
Walther@60706
   637
      val full_subst =
Walther@60706
   638
        map (fn (t, pos) => (subst_atomic env_eval t, pos)) preconds
Walther@60706
   639
      val evals =
Walther@60706
   640
        map (fn (term, pos) => (Rewrite.eval_true ctxt [term] where_rls, (term, pos))) full_subst
Walther@60706
   641
    in
Walther@60706
   642
      (foldl and_ (true, map fst evals), (map fst evals) ~~ preconds)
Walther@60706
   643
    end;
Walther@60727
   644
(* WRONG ENVS *)
Walther@60710
   645
fun check_from_store ctxt where_rls pres env_subst env_eval =
Walther@60710
   646
  let
Walther@60710
   647
    val pres_subst = map (TermC.subst_atomic_all env_subst) pres;
Walther@60710
   648
    val full_subst = map (fn (bool, t) => (bool, subst_atomic env_eval t)) pres_subst
Walther@60710
   649
    val evals = map (eval ctxt where_rls) full_subst
Walther@60710
   650
  in
Walther@60710
   651
    (foldl and_ (true, map fst evals), pres_subst)
Walther@60710
   652
  end
Walther@60727
   653
(*  vvv-replaces-^^^*)
Walther@60727
   654
fun check_envs_TEST ctxt where_rls pres (env_model, (env_subst, env_eval)) =
Walther@60727
   655
  let
Walther@60727
   656
      val pres_subst = map (TermC.subst_atomic_all env_subst) pres;
Walther@60727
   657
      val pres_subst_other = map (TermC.subst_atomic_all env_model) (map #2 pres_subst);
Walther@60727
   658
      val full_subst = if env_eval = [] then pres_subst_other
Walther@60727
   659
        else map (TermC.subst_atomic_all env_eval) (map #2 pres_subst_other)
Walther@60727
   660
      val evals = map (eval ctxt where_rls) full_subst
Walther@60727
   661
    in
Walther@60727
   662
      (foldl and_ (true, map fst evals), pres_subst_other)
Walther@60727
   663
    end
Walther@60710
   664
Walther@60726
   665
(* expects the precondition from Problem, ie. needs substitution by env_model*)
Walther@60706
   666
fun check_OLD _ _ [] _  = (true, [])
Walther@60706
   667
  | check_OLD ctxt where_rls pres (model_patt, i_model) =
Walther@60706
   668
    let
Walther@60728
   669
(*T_TESTold* )
Walther@60706
   670
      val (env_subst, env_eval) = sep_variants_envs_OLD model_patt i_model
Walther@60706
   671
      val pres_subst = map (TermC.subst_atomic_all env_subst) pres;
Walther@60706
   672
      val full_subst = map (fn (bool, t) => (bool, subst_atomic env_eval t)) pres_subst
Walther@60727
   673
      val evals = map (eval ctxt where_rls) full_subst
Walther@60727
   674
    in
Walther@60727
   675
      (foldl and_ (true, map fst evals), pres_subst)
Walther@60727
   676
    end;
Walther@60728
   677
( *T_TEST*)
Walther@60726
   678
      val (_, env_model, (env_subst, env_eval)) = of_max_variant model_patt i_model
Walther@60726
   679
      val pres_subst = map (TermC.subst_atomic_all env_subst) pres;
Walther@60726
   680
      val pres_subst_other = map (TermC.subst_atomic_all env_model) (map #2 pres_subst);
Walther@60726
   681
      val full_subst = if env_eval = [] then pres_subst_other
Walther@60726
   682
        else map (TermC.subst_atomic_all env_eval) (map #2 pres_subst_other)
Walther@60706
   683
      val evals = map (eval ctxt where_rls) full_subst
Walther@60706
   684
    in
Walther@60726
   685
      (foldl and_ (true, map fst evals), pres_subst_other)
Walther@60706
   686
    end;
Walther@60728
   687
(*T_TESTnew*)
Walther@60706
   688
Walther@60706
   689
fun unchecked_OLD_to_TEST pres = map (fn t => (t, Position.none)) pres
Walther@60706
   690
walther@59965
   691
(**)end(**)