src/Tools/isac/Specify/pre-conditions.sml
author wneuper <Walther.Neuper@jku.at>
Mon, 18 Sep 2023 08:38:33 +0200
changeset 60747 2eff296ab809
parent 60746 3ba85d40b3c7
child 60748 d9bae125ba2a
permissions -rw-r--r--
prepare 3: shift new code
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@60741
    10
  type unchecked_pos
Walther@60705
    11
  type checked
Walther@60741
    12
  type checked_pos
Walther@60705
    13
Walther@60705
    14
  type env_subst
Walther@60705
    15
  type env_eval
Walther@60556
    16
  type input
Walther@60705
    17
Walther@60673
    18
  val to_string : Proof.context -> T -> string
Walther@60740
    19
  val eval: Proof.context -> Rule_Set.T -> bool * term -> bool * term
walther@59967
    20
Walther@60734
    21
  val max_variant: Model_Def.i_model -> Model_Def.variant
Walther@60733
    22
  val environment_TEST: Model_Pattern.T -> Model_Def.i_model_TEST -> Env.T
Walther@60705
    23
Walther@60747
    24
  val of_max_variant: Model_Pattern.T -> Model_Def.i_model_TEST ->
Walther@60746
    25
       (bool * Model_Def.variant * Model_Def.i_model_TEST) * Env.T * (env_subst * env_eval)
Walther@60747
    26
  val max_variants: Model_Pattern.T -> Model_Def.i_model_TEST ->
Walther@60747
    27
       ( Model_Def.variant list * Model_Def.i_model_TEST list)(* * Env.T * (env_subst * env_eval)*)
Walther@60747
    28
  val make_envs_preconds: (Model_Pattern.single * Model_Def.i_model_single_TEST) list ->
Walther@60747
    29
    ((term * term) * (term * term)) list
Walther@60740
    30
Walther@60741
    31
  val check_pos: Proof.context -> Rule_Set.T -> unchecked_pos -> 
Walther@60741
    32
    Model_Pattern.T * Model_Def.i_model_TEST -> checked_pos
Walther@60741
    33
  val check_envs: Proof.context -> Rule_Set.T -> unchecked -> Env.T * (env_subst * env_eval)
Walther@60732
    34
    -> checked
Walther@60741
    35
  val check: Proof.context -> Rule_Set.T -> unchecked ->
Walther@60706
    36
    Model_Pattern.T * Model_Def.i_model_TEST -> checked
Walther@60706
    37
Walther@60705
    38
(*from isac_test for Minisubpbl*)
Walther@60706
    39
  val get_equal_descr: Model_Def.i_model_TEST -> Model_Pattern.single ->
Walther@60706
    40
    (Model_Pattern.single * Model_Def.i_model_single_TEST) list
Walther@60706
    41
  val unchecked_OLD_to_TEST: term list -> (term * Position.T) list
Walther@60705
    42
Walther@60741
    43
  val arrange_args: int list -> int * Model_Def.variant list -> (int * Model_Def.variant) list
Walther@60710
    44
  val cnt_corrects: Model_Def.i_model_TEST -> int
Walther@60740
    45
Walther@60710
    46
  val all_lhs_atoms: term list -> bool
Walther@60740
    47
  val handle_lists: term -> Model_Def.descriptor * term list -> Env.T;
Walther@60740
    48
  val filter_variants': Model_Def.i_model_TEST -> Model_Def.variant -> Model_Def.i_model_TEST
Walther@60741
    49
  val switch_type: Model_Def.descriptor -> term list -> Model_Def.descriptor;
Walther@60728
    50
  val discern_feedback: term -> Model_Def.i_model_feedback_TEST ->
Walther@60728
    51
    ((term * term) * (term * term)) list
Walther@60728
    52
  val discern_typ: term -> Model_Pattern.descriptor * term list ->
Walther@60728
    53
    ((term * term) * (term * term)) list
Walther@60710
    54
Walther@60740
    55
  val mk_env_model: term -> Model_Def.i_model_feedback_TEST -> Env.T
Walther@60740
    56
  val make_env_model: (Model_Pattern.single * Model_Def.i_model_single_TEST) list -> Env.T
Walther@60740
    57
Walther@60747
    58
  val get_descr: Model_Def.i_model_single_TEST -> Model_Def.descriptor option;
Walther@60747
    59
  val get_dscr': Model_Def.i_model_feedback_TEST -> Model_Def.descriptor option
Walther@60747
    60
  val get_descr_vnt: Model_Def.descriptor -> Model_Def.variants -> Model_Def.i_model_TEST ->
Walther@60747
    61
    Model_Def.i_model_single_TEST
Walther@60747
    62
  val get_descr_vnt': Model_Def.i_model_feedback_TEST -> Model_Def.variants -> O_Model.T ->
Walther@60747
    63
    O_Model.single option
Walther@60747
    64
Walther@60747
    65
\<^isac_test>\<open>
Walther@60740
    66
(**)
wenzelm@60223
    67
\<close>
walther@59960
    68
end
Walther@60722
    69
                 
walther@59965
    70
(**)
walther@59960
    71
structure Pre_Conds(**) : PRE_CONDITIONS(**) =
walther@59960
    72
struct
walther@59965
    73
(**)
Walther@60706
    74
open Model_Def
walther@59960
    75
Walther@60673
    76
type T = Pre_Conds_Def.T;  (*= (bool * term) list;*)
Walther@60605
    77
type unchecked = term list
Walther@60741
    78
type unchecked_pos = (term * Position.T) list
Walther@60705
    79
type checked = bool * (bool * term) list
Walther@60741
    80
type checked_pos = bool * ((bool * (term * Position.T)) list)
Walther@60705
    81
Walther@60715
    82
(* 
Walther@60715
    83
  we have three kinds of Env.T in the specification-phase:
Walther@60715
    84
(*1*) Env.T produced by I_Model.of_max_variant and required to create O_Model.T, I_Model.T from
Walther@60715
    85
    Model_Pattern.T.
Walther@60715
    86
                       Env.T                  / (Constants, fixes)  in Model_Pattern.T
Walther@60715
    87
                       e.g.[(fixes, [r = 7])] |
Walther@60722
    88
                                              > (Constants, [<r = 7>]) in O/I_Model.T       *)
Walther@60715
    89
Walther@60715
    90
(*2*) type env_subst = Env.T (*               / 0 < fixes           in Problem.{where_, ...}
Walther@60715
    91
                       eg. [(fixes, r)]       |
Walther@60715
    92
                                              > 0 < r *)
Walther@60715
    93
(*3*) type env_eval =  Env.T (*               |
Walther@60715
    94
                       eg. [(r, 7)]           |
Walther@60715
    95
                                              > 0 < 7 \<longrightarrow> true
Walther@60715
    96
Walther@60715
    97
  (*1*) is required to produce (*2*) and (*3*); thus respective code is shifted to Pre_Conds.
Walther@60715
    98
  (*2*) and (*3*) is produced from I_Model.of_max_variant by restricting to "#Given".
Walther@60715
    99
  
Walther@60715
   100
  There is a typing problem, probably to be solved by a language for Specification in the future:
Walther@60715
   101
  term <fixes> in (*1*) has type "bool list"
Walther@60715
   102
  term <fixes> in (*2*) has type "real". So for the transition from (*1*) to (*2..3*)
Walther@60715
   103
    fun switch_type is required.
Walther@60715
   104
  The transition requires better modelling by a novel language for Specification.
Walther@60715
   105
*)
Walther@60715
   106
Walther@60605
   107
type input = TermC.as_string list;
walther@59963
   108
Walther@60740
   109
(** tools **)
Walther@60740
   110
Walther@60675
   111
fun to_str ctxt (b, t) = pair2str (bool2str b, UnparseC.term ctxt t);
Walther@60673
   112
fun to_string ctxt pres = strs2str' (map (linefeed o (to_str ctxt)) pres);
walther@59960
   113
Walther@60590
   114
fun eval _ _ (false, where_) = (false, where_) (*NOT ALL Free's have been substituted*)
Walther@60590
   115
  | eval ctxt where_rls (true, where_) =
Walther@60590
   116
    if Rewrite.eval_true ctxt [where_] where_rls
Walther@60706
   117
    then (true, where_)
Walther@60706
   118
    else (false, where_);
walther@59960
   119
Walther@60712
   120
Walther@60740
   121
(** find the maximal variant within an I_Model.T **)
Walther@60705
   122
Walther@60740
   123
(* old code before I_Model.T_TEST *)
Walther@60740
   124
(*ATTENTION: misses variants with equal number of items, etc*)
Walther@60705
   125
fun cnt itms v = (v, (length o (filter (curry op = v)) o flat o (map (fn (_, vrs, _, _, _) => vrs))) itms);
Walther@60705
   126
fun count_variants vts itms = map (cnt itms) vts;
Walther@60705
   127
Walther@60734
   128
fun max_list [] = raise ERROR "max_list of []"
Walther@60734
   129
  | max_list (y :: ys) =
Walther@60705
   130
    let
Walther@60747
   131
      fun mx (a, x) [] = (a, x)             
Walther@60705
   132
  	    | mx (a, x) ((b, y) :: ys) = if x < y then mx (b, y) ys else mx (a, x) ys;
Walther@60705
   133
    in mx y ys end;
Walther@60705
   134
Walther@60740
   135
(*find most frequent variant v in itms*)
Walther@60740
   136
fun variants itms = ((distinct op =) o flat o (map (fn (_, vrs, _, _, _) => vrs))) itms;
Walther@60740
   137
(*find the variant with most items already input, without Pre_Conds (of_max_variant)*)
Walther@60747
   138
(*T_TESTold \<rightarrow> fun max_variants*)
Walther@60705
   139
fun max_variant itms = 
Walther@60705
   140
    let val vts = (count_variants (variants itms)) itms;
Walther@60734
   141
    in if vts = [] then 0 else (fst o max_list) vts end;
Walther@60705
   142
Walther@60705
   143
Walther@60740
   144
(* new code with I_Model.T_TEST proper handling variants *)
Walther@60705
   145
Walther@60740
   146
(*get descriptor of those items which can contribute to Subst.T and Env.T*)
Walther@60712
   147
(*  get_dscr: feedback_TEST -> descriptor option*)
Walther@60710
   148
fun get_dscr' (Cor_TEST ((descr, _), _)) = SOME descr
Walther@60710
   149
  | get_dscr' (Inc_TEST ((descr, _), _)) = SOME descr
Walther@60710
   150
  | get_dscr' (Sup_TEST (descr, _)) = SOME descr
Walther@60747
   151
  | get_dscr' _ = NONE
Walther@60747
   152
    (*other feedback cannot contribute to I_Model.mk_env_TEST and Pre_Conds.mk_env_TEST*)
Walther@60712
   153
(*  get_descr: I_Model.single_TEST -> descriptor option*)
Walther@60706
   154
fun get_descr (_, _, _, _, (feedb, _)) =
Walther@60710
   155
  case get_dscr' feedb of NONE => NONE | some_descr => some_descr
Walther@60747
   156
(*  get_equal_descr: I_Model.T_TEST -> Model_Pattern.single -> (Model_Pattern.single * I_Model.single_TEST) list*)
Walther@60706
   157
fun get_equal_descr i_model (m_patt_single as (_, (descr, _))) =
Walther@60706
   158
  let
Walther@60706
   159
    val equal_variants = 
Walther@60706
   160
      filter (fn i_single => case get_descr i_single of
Walther@60706
   161
          NONE => false (*--------vvvvv*)
Walther@60706
   162
        | SOME descr' => descr' = descr) (*probl_POS*) i_model
Walther@60706
   163
    in
Walther@60706
   164
      (map (pair m_patt_single) equal_variants)
Walther@60706
   165
    end
Walther@60712
   166
Walther@60747
   167
(*get an appropriate (description, variant) item from pbl_imod, otherwise return empty item*)
Walther@60747
   168
fun get_descr_vnt descr vnts i_model =
Walther@60747
   169
  let
Walther@60747
   170
    val equal_descr = filter (fn (_, _, _, _, (feedb, _)) => case get_dscr' feedb of NONE => false
Walther@60747
   171
      | SOME descr' => if descr = descr' then true else false) i_model 
Walther@60747
   172
  in
Walther@60747
   173
    case find_first (fn (_, vnts', _, _, _) => inter op= vnts' vnts <> []) equal_descr of
Walther@60747
   174
      SOME item => item
Walther@60747
   175
    | NONE => (0, [], false, "i_model_empty", (Sup_TEST (descr, []), Position.none))
Walther@60747
   176
  end
Walther@60747
   177
(*
Walther@60747
   178
  get an appropriate (description, variant) item from o_model;
Walther@60747
   179
  called in case of item in met_imod is_empty_single_TEST
Walther@60747
   180
  (i.e. was not transferred pbl_mod by \<open>fun get_descr_vnt\<close>).
Walther@60747
   181
*)
Walther@60747
   182
fun get_descr_vnt' feedb vnts o_model =
Walther@60747
   183
find_first (fn (_, vnts', _, descr', _) =>
Walther@60747
   184
    case get_dscr' feedb of
Walther@60747
   185
      SOME descr => if descr' = descr andalso inter op= vnts' vnts <> [] then true else false
Walther@60747
   186
    | NONE => false) o_model
Walther@60747
   187
Walther@60740
   188
(*  all_lhs_atoms: term list -> bool*)
Walther@60740
   189
fun all_lhs_atoms ts = fold (curry and_) (map (fn t =>
Walther@60740
   190
  if can TermC.lhs t andalso not (TermC.is_num (TermC.lhs t))
Walther@60740
   191
  then TermC.is_atom (TermC.lhs t)
Walther@60740
   192
  else false) ts) true
Walther@60706
   193
Walther@60729
   194
fun handle_lists id (descr, ts) =
Walther@60729
   195
  if Model_Pattern.is_list_descr descr
Walther@60729
   196
  then if length ts > 1         (*list with more than 1 element needs to collect by [.., .., ..]*)
Walther@60729
   197
    then if TermC.is_list (hd ts) (*---broken elementwise input to lists---*)
Walther@60729
   198
      then [(id, TermC.list2isalist (Model_Pattern.typ_of_element descr) (map TermC.the_single ts))]
Walther@60729
   199
      else [(id, TermC.list2isalist (Model_Pattern.typ_of_element descr) ts)] (*AdditValues [u, v]*)
Walther@60729
   200
    else if TermC.is_atom (Library.the_single ts)
Walther@60729
   201
      then [(id, Library.the_single ts)]                                     (* solutions L, ...*)
Walther@60729
   202
      else [(id, TermC.list2isalist (Model_Pattern.typ_of_element descr) ts)](*Constants [r = 7]*)
Walther@60729
   203
  else [(id, Library.the_single ts)]                           (* solveFor x, Extremum (A = ...)*)
Walther@60726
   204
Walther@60722
   205
fun mk_env_model _ (Model_Def.Cor_TEST ((_, []), _)) = []
Walther@60722
   206
  | mk_env_model id (Model_Def.Cor_TEST ((descr, ts), _)) = 
Walther@60726
   207
    handle_lists id (descr, ts)
Walther@60722
   208
  | mk_env_model _ (Model_Def.Syn_TEST _) = [] (*TODO handle correct list elements*)
Walther@60722
   209
  | mk_env_model _ (Model_Def.Inc_TEST ((_, []), _)) = []
Walther@60722
   210
  | mk_env_model id (Model_Def.Inc_TEST ((descr, ts), _)) = 
Walther@60726
   211
    handle_lists id (descr, ts)
Walther@60722
   212
  | mk_env_model _ (Model_Def.Sup_TEST _) = []
Walther@60722
   213
fun make_env_model equal_descr_pairs =
Walther@60721
   214
  map (fn ((_, (_, id)), (_, _, _, _, (feedb, _)))
Walther@60722
   215
        => (mk_env_model id feedb)) equal_descr_pairs
Walther@60721
   216
  |> flat
Walther@60722
   217
Walther@60741
   218
fun switch_type descr [] = descr
Walther@60741
   219
  | switch_type (Free (id_string, _)) ts =
Walther@60724
   220
    Free (id_string, ts |> hd |> TermC.lhs |> type_of)
Walther@60741
   221
  | switch_type descr _ = raise ERROR ("switch_type undefined argument " ^
Walther@60722
   222
      quote (UnparseC.term (ContextC.for_ERROR ()) descr))
Walther@60740
   223
Walther@60729
   224
fun discern_typ _ (_, []) = []
Walther@60729
   225
  | discern_typ id (descr, ts) =
Walther@60729
   226
(*TODO.md "review (descriptor, ts)" REMOVE--------------------------------------\*)
Walther@60729
   227
    let
Walther@60729
   228
      val ts = if Model_Pattern.is_list_descr descr
Walther@60729
   229
        then if TermC.is_list (hd ts)
Walther@60729
   230
          then ts |> map TermC.isalist2list |> flat
Walther@60729
   231
          else ts
Walther@60729
   232
        else ts
Walther@60729
   233
    in
Walther@60729
   234
(*TODO.md "review (descriptor, ts)" REMOVE--------------------------------------/*)
Walther@60729
   235
  if Model_Pattern.typ_of_element descr = HOLogic.boolT andalso all_lhs_atoms ts
Walther@60729
   236
  then
Walther@60729
   237
    if length ts > 1
Walther@60729
   238
    then (writeln "model items of type 'bool' in lists with 'lengt ts > 1' NOT YET IMPLEMENTED";
Walther@60729
   239
      [])
Walther@60741
   240
    else [((switch_type id ts, TermC.lhs (hd ts)), 
Walther@60729
   241
           (TermC.lhs (hd ts), TermC.rhs (hd ts)))]
Walther@60729
   242
  else []
Walther@60729
   243
(*TODO.md "review (descriptor, ts)" REMOVE--------------------------------------\*)
Walther@60729
   244
    end
Walther@60729
   245
(*TODO.md "review (descriptor, ts)" REMOVE--------------------------------------/*)
Walther@60729
   246
(*T_TESTnew*)
Walther@60729
   247
Walther@60722
   248
fun discern_feedback id (Model_Def.Cor_TEST ((descr, ts), _)) = discern_typ id (descr, ts)
Walther@60722
   249
  | discern_feedback _ (Model_Def.Syn_TEST _) = [] (*TODO: handle correct elements*)
Walther@60722
   250
  | discern_feedback id (Model_Def.Inc_TEST ((descr, ts), _)) = discern_typ id (descr, ts)
Walther@60722
   251
  | discern_feedback _ (Model_Def.Sup_TEST _) = []
Walther@60728
   252
fun make_envs_preconds equal_givens =
Walther@60722
   253
  map (fn ((_, (_, id)), (_, _, _, _, (feedb, _))) => discern_feedback id feedb) equal_givens
Walther@60722
   254
  |> flat
Walther@60721
   255
Walther@60712
   256
(*  filter_variants': Model_Def.i_model_TEST -> Model_Def.variant -> Model_Def.i_model_TEST*)
Walther@60710
   257
fun filter_variants' i_singles n = 
Walther@60710
   258
  filter (fn (_, variants, _, _, _) => member op= variants n) i_singles
Walther@60741
   259
(*arrange_args: int list -> int * Model_Def.variant list -> (int * Model_Def.variant) list*)
Walther@60741
   260
fun arrange_args [] _ = []
Walther@60741
   261
  | arrange_args (sum :: ss) (cnt, all) = (sum, nth cnt all) :: (arrange_args ss (cnt + 1, all)) 
Walther@60710
   262
(*cnt_corrects: I_Model.T_TEST -> int*)
Walther@60710
   263
fun cnt_corrects i_model = 
Walther@60710
   264
  fold (curry op +) (map (fn (_, _, _, _, (Cor_TEST _, _)) => 1 | _ => 0) i_model) 0;
Walther@60723
   265
Walther@60747
   266
(*get data wrt. maximal variant; NO Pre_Conds.check
Walther@60747
   267
  TODO: separate determining i_model(s!) with max_variant from creating environments;
Walther@60747
   268
    single i_model with max_variant can ONLY be determined Problem.mode + MethodC.model together.
Walther@60747
   269
*)
Walther@60747
   270
(*T_TESTold*)
Walther@60746
   271
fun of_max_variant _ [] = ((false, 0, []), [], ([], []))
Walther@60723
   272
  | of_max_variant model_patt i_model =
Walther@60723
   273
 let
Walther@60710
   274
    val all_variants =
Walther@60710
   275
        map (fn (_, variants, _, _, _) => variants) i_model
Walther@60710
   276
        |> flat
Walther@60710
   277
        |> distinct op =
Walther@60710
   278
    val variants_separated = map (filter_variants' i_model) all_variants
Walther@60710
   279
    val sums_corr = map (cnt_corrects) variants_separated
Walther@60741
   280
    val sum_variant_s = arrange_args sums_corr (1, all_variants)
Walther@60710
   281
    val (_, max_variant) = hd (*..crude decision, up to improvement *)
Walther@60710
   282
      (sort (fn ((i, _), (j, _)) => int_ord (i, j)) sum_variant_s)
Walther@60710
   283
    val i_model_max =
Walther@60710
   284
      filter (fn (_, variants, _ , _ ,_) => member (op =) variants max_variant) i_model
Walther@60721
   285
    val equal_descr_pairs = map (get_equal_descr i_model) model_patt |> flat
Walther@60722
   286
    val env_model = make_env_model equal_descr_pairs
Walther@60722
   287
    val equal_givens = filter (fn ((m_field, _), _) => m_field = "#Given") equal_descr_pairs
Walther@60722
   288
    val subst_eval_list = make_envs_preconds equal_givens
Walther@60722
   289
    val (env_subst, env_eval) = split_list subst_eval_list
Walther@60721
   290
  in
Walther@60746
   291
    ((length (filter (fn (_, _, _, _, (Cor_TEST _, _)) => true | _ => false) i_model_max)
Walther@60746
   292
        = length model_patt, max_variant, i_model_max),
Walther@60746
   293
      env_model, (env_subst, env_eval))
Walther@60721
   294
  end
Walther@60747
   295
(*T_TEST*)
Walther@60747
   296
fun max_variants model_patt i_model =
Walther@60747
   297
    let
Walther@60747
   298
      val all_variants =
Walther@60747
   299
          map (fn (_, variants, _, _, _) => variants) i_model
Walther@60747
   300
          |> flat
Walther@60747
   301
          |> distinct op =
Walther@60747
   302
      val variants_separated = map (filter_variants' i_model) all_variants
Walther@60747
   303
      val sums_corr = map (cnt_corrects) variants_separated
Walther@60747
   304
      val sum_variant_s = arrange_args sums_corr (1, all_variants)
Walther@60747
   305
Walther@60747
   306
      val max_first = rev (sort (fn ((i, _), (j, _)) => int_ord (i, j)) sum_variant_s)
Walther@60747
   307
      val maxes = filter (fn (cnt, _) => curry op = (fst (hd max_first)) cnt) max_first
Walther@60747
   308
        |> map snd
Walther@60747
   309
      val option_sequence = map 
Walther@60747
   310
        (fn (_, vnt) => if (member (op =) maxes vnt) then SOME vnt else NONE) sum_variant_s
Walther@60747
   311
(*das ist UNSINN .., siehe (*+*)if (pbl_max_imos*)
Walther@60747
   312
      val max_i_models = map (fn (pos_in_sum_variant_s, i_model) =>
Walther@60747
   313
            if is_some pos_in_sum_variant_s then i_model else [])
Walther@60747
   314
          (option_sequence ~~ variants_separated)
Walther@60747
   315
        |> filter_out (fn place_holder => place_holder = []);
Walther@60747
   316
(*/-- fun make_envs_preconds: 1 max_i_model can be determined only together with meth --------\ * )
Walther@60747
   317
      PROBALBY FOR RE-USE:
Walther@60747
   318
      val option_sequence = map 
Walther@60747
   319
        (fn (_, vnt) => if (member (op =) maxes vnt) then SOME vnt else NONE) sum_variant_s
Walther@60747
   320
      val max_i_models = map (fn (pos_in_sum_variant_s, i_model) =>
Walther@60747
   321
            if is_some pos_in_sum_variant_s then i_model else [])
Walther@60747
   322
          (option_sequence ~~ variants_separated)
Walther@60747
   323
        |> filter_out (fn place_holder => place_holder = []);
Walther@60747
   324
      \<longrightarrow> [
Walther@60747
   325
           [(1, [1, 2, 3]), (2, [1, 2, 3]), (3, [1, 2, 3]), (4, [1, 2, 3]), (5, [1, 2])], 
Walther@60747
   326
           [(1, [1, 2, 3]), (2, [1, 2, 3]), (3, [1, 2, 3]), (4, [1, 2, 3]), (5, [1, 2])]]
Walther@60747
   327
------   ----------------------------------------------------------------------------------------
Walther@60747
   328
      val equal_descr_pairs = map (get_equal_descr (hd max_i_models)) model_patt
Walther@60747
   329
        |> flat (*a hack for continuing ------------^^--  "turn to PIDE", works for test example*)
Walther@60747
   330
      val env_model = make_env_model equal_descr_pairs
Walther@60747
   331
      val equal_givens = filter (fn ((m_field, _), _) => m_field = "#Given") equal_descr_pairs
Walther@60747
   332
      val subst_eval_list = make_envs_preconds equal_givens
Walther@60747
   333
      val (env_subst, env_eval) = split_list subst_eval_list
Walther@60747
   334
( *\-- fun make_envs_preconds: 1 max_i_model can be determined only together with meth --------/ *)
Walther@60747
   335
    in
Walther@60747
   336
      ((maxes, max_i_models)(*, env_model, (env_subst, env_eval)*))
Walther@60747
   337
(*     (maxes, max_i_models)*)
Walther@60747
   338
(*/-- fun make_envs_preconds: 1 max_i_model can be determined only together with meth --------\ * )
Walther@60747
   339
                             (env_model, (env_subst, env_eval)
Walther@60747
   340
( *\--fun make_envs_preconds: 1 max_i_model can be determined only together with meth --------/ *)
Walther@60747
   341
    end 
Walther@60747
   342
(*T_TESTnew*)
Walther@60747
   343
Walther@60747
   344
(*T_TESTold*)
Walther@60747
   345
(*T_TEST*)
Walther@60747
   346
(*T_TESTnew*)
Walther@60747
   347
Walther@60747
   348
Walther@60747
   349
Walther@60712
   350
Walther@60740
   351
(*extract the environment from an I_Model.of_max_variant*)
Walther@60733
   352
fun environment_TEST model_patt i_model = of_max_variant model_patt i_model |> #2
Walther@60740
   353
Walther@60712
   354
(** check pre-conditions **)
Walther@60710
   355
Walther@60732
   356
fun check_pos ctxt where_rls where_POS (model_patt, i_model) =
Walther@60732
   357
    let
Walther@60732
   358
      val (_, _, (_, env_eval)) = of_max_variant model_patt 
Walther@60732
   359
        (filter (fn (_, _, _, m_field ,_) => m_field = "#Given") i_model)
Walther@60732
   360
      val full_subst = if env_eval = []
Walther@60732
   361
        then map (fn (t, pos) => ((true, t), pos)) where_POS
Walther@60732
   362
        else map (fn (t, pos) => (TermC.subst_atomic_all env_eval t, pos)) where_POS;
Walther@60732
   363
      val evals = map (fn ((bool_t), pos) => (eval ctxt where_rls bool_t, pos)) full_subst;
Walther@60732
   364
      val display = map (fn ((t, pos), ((bool, _), _)) => (bool, (t, pos))) (where_POS ~~ evals)
Walther@60732
   365
    in
Walther@60732
   366
      (foldl and_ (true, map (fn ((bool, _: term), _: Position.T) => bool) evals), display)
Walther@60732
   367
    end;
Walther@60732
   368
Walther@60740
   369
(*takes the envs resulting from of_max_variant*)
Walther@60741
   370
fun check_envs ctxt where_rls where_ (env_model, (env_subst, env_eval)) =
Walther@60727
   371
  let
Walther@60732
   372
      val pres_subst = map (TermC.subst_atomic_all env_subst) where_;
Walther@60727
   373
      val pres_subst_other = map (TermC.subst_atomic_all env_model) (map #2 pres_subst);
Walther@60727
   374
      val full_subst = if env_eval = [] then pres_subst_other
Walther@60727
   375
        else map (TermC.subst_atomic_all env_eval) (map #2 pres_subst_other)
Walther@60727
   376
      val evals = map (eval ctxt where_rls) full_subst
Walther@60732
   377
  in
Walther@60727
   378
      (foldl and_ (true, map fst evals), pres_subst_other)
Walther@60732
   379
  end
Walther@60710
   380
Walther@60740
   381
(*expects the precondition from Problem, ie. needs substitution by env_model*)
Walther@60741
   382
(*TODO: check shall call check_envs*)
Walther@60741
   383
fun check _ _ [] _  = (true, [])
Walther@60741
   384
  | check ctxt where_rls where_ (model_patt, i_model) =
Walther@60706
   385
    let
Walther@60726
   386
      val (_, env_model, (env_subst, env_eval)) = of_max_variant model_patt i_model
Walther@60729
   387
      val pres_subst = map (TermC.subst_atomic_all env_subst) where_;
Walther@60726
   388
      val pres_subst_other = map (TermC.subst_atomic_all env_model) (map #2 pres_subst);
Walther@60726
   389
      val full_subst = if env_eval = [] then pres_subst_other
Walther@60726
   390
        else map (TermC.subst_atomic_all env_eval) (map #2 pres_subst_other)
Walther@60706
   391
      val evals = map (eval ctxt where_rls) full_subst
Walther@60706
   392
    in
Walther@60726
   393
      (foldl and_ (true, map fst evals), pres_subst_other)
Walther@60706
   394
    end;
Walther@60706
   395
Walther@60706
   396
fun unchecked_OLD_to_TEST pres = map (fn t => (t, Position.none)) pres
Walther@60706
   397
walther@59965
   398
(**)end(**)