src/Tools/isac/CalcElements/rule-set.sml
author Walther Neuper <walther.neuper@jku.at>
Sat, 04 Apr 2020 12:11:32 +0200
changeset 59850 f3cac3053e7b
child 59851 4dd533681fef
permissions -rw-r--r--
separate Rule_Set from Rule
walther@59850
     1
(* Title:  KEStore/rule-set.sml
walther@59850
     2
   Author: Walther Neuper
walther@59850
     3
   (c) due to copyright terms
walther@59850
     4
walther@59850
     5
In ISAC a Rule_Set serves rewriting. KEStore holds all rule-sets for ubiquitous access.
walther@59850
     6
*)
walther@59850
     7
signature RULE_SET =
walther@59850
     8
sig
walther@59850
     9
  datatype rls = datatype Rule_Def.rls
walther@59850
    10
  eqtype rls'
walther@59850
    11
walther@59850
    12
  type calc = Rule_Def.calc                                                    (*..from Rule_Def*)
walther@59850
    13
  val e_rls: rls
walther@59850
    14
walther@59850
    15
  type rrlsstate = term * term * Rule_Def.rule list list * (Rule_Def.rule * (term * term list)) list
walther@59850
    16
  val e_rrlsstate: rrlsstate
walther@59850
    17
  val e_rrls: rls
walther@59850
    18
  type rlss_elem
walther@59850
    19
walther@59850
    20
  val append_rls: string -> rls -> Rule_Def.rule list -> rls
walther@59850
    21
  val rep_rls: rls -> {calc: calc list, erls: rls, errpats: Rule_Def.errpatID list, id: string,
walther@59850
    22
    preconds: term list, rew_ord: Rule_Def.rew_ord, rules: Rule_Def.rule list, scr: Rule_Def.program, srls: rls}
walther@59850
    23
walther@59850
    24
  val rls2str: Rule_Def.rls -> string
walther@59850
    25
  val id_rls: Rule_Def.rls -> string
walther@59850
    26
  val id_rule: Rule_Def.rule -> string
walther@59850
    27
  val eq_rule: Rule_Def.rule * Rule_Def.rule -> bool
walther@59850
    28
walther@59850
    29
  val merge_rls: string -> rls -> rls -> rls
walther@59850
    30
  val merge_rlss: rlss_elem list * rlss_elem list -> rlss_elem list
walther@59850
    31
  val remove_rls: string -> rls ->  Rule_Def.rule list -> rls
walther@59850
    32
walther@59850
    33
  val rule2str: Rule_Def.rule -> string
walther@59850
    34
  val rule2str': Rule_Def.rule -> string
walther@59850
    35
walther@59850
    36
  eqtype prog_calcID
walther@59850
    37
  type cal
walther@59850
    38
  type calc_elem
walther@59850
    39
  val calc_eq: calc_elem * calc_elem -> bool
walther@59850
    40
  val e_evalfn: Rule_Def.eval_fn
walther@59850
    41
walther@59850
    42
  val get_rules: rls -> Rule_Def.rule list
walther@59850
    43
  val rls_eq: (''a * ('b * 'c)) * (''a * ('d * 'e)) -> bool
walther@59850
    44
walther@59850
    45
(* ---- for tests only: shifted from below to remove the Warning "unused" at fun.def. --------- *)
walther@59850
    46
  (*NONE*)
walther@59850
    47
(*/-------------------------------------------------------- ! aktivate for Test_Isac BEGIN ---\* )
walther@59850
    48
  (*NONE*)
walther@59850
    49
( *\--- ! aktivate for Test_Isac END ----------------------------------------------------------/*)
walther@59850
    50
end
walther@59850
    51
(**)
walther@59850
    52
structure Rule_Set(**): RULE_SET(**) =
walther@59850
    53
struct
walther@59850
    54
(**)
walther@59850
    55
datatype rls = datatype Rule_Def.rls
walther@59850
    56
type rls' = string
walther@59850
    57
walther@59850
    58
type calc = Rule_Def.calc
walther@59850
    59
type subst = (term * term) list;
walther@59850
    60
fun dummy_ord (_: subst) (_: term, _: term) = true;
walther@59850
    61
walther@59850
    62
val e_rls =
walther@59850
    63
  Rls {id = "e_rls", preconds = [], rew_ord = ("dummy_ord", dummy_ord), erls = Erls,
walther@59850
    64
    srls = Erls, calc = [], rules = [], errpatts = [], scr = Rule_Def.EmptyScr}: rls;
walther@59850
    65
walther@59850
    66
(*/--------------------------------------\*)
walther@59850
    67
type rrlsstate =  (* state for reverse rewriting, comments see type rule and scr | Rfuns *)
walther@59850
    68
  (term * term * Rule_Def.rule list list * (Rule_Def.rule * (term * term list)) list);
walther@59850
    69
val e_rrlsstate = (Rule.e_term, Rule.e_term, [[Rule_Def.Erule]], [(Rule_Def.Erule, (Rule.e_term, []))]) : rrlsstate;
walther@59850
    70
(*\--------------------------------------/*)
walther@59850
    71
local
walther@59850
    72
    fun ii (_: term) = e_rrlsstate;
walther@59850
    73
    fun no (_: term) = SOME (Rule.e_term, [Rule.e_term]);
walther@59850
    74
    fun lo (_: Rule_Def.rule list list) (_: term) (_: Rule_Def.rule) = [(Rule_Def.Erule, (Rule.e_term, [Rule.e_term]))];
walther@59850
    75
    fun ne (_: Rule_Def.rule list list) (_: term) = SOME Rule_Def.Erule;
walther@59850
    76
    fun fo (_: Rule_Def.rule list list) (_: term) (_: term) = [(Rule_Def.Erule, (Rule.e_term, [Rule.e_term]))];
walther@59850
    77
in
walther@59850
    78
val e_rfuns = Rule_Def.Rfuns {init_state = ii, normal_form = no, locate_rule = lo,
walther@59850
    79
		  next_rule = ne, attach_form = fo};
walther@59850
    80
end;
walther@59850
    81
val e_rrls =
walther@59850
    82
  Rrls {id = "e_rrls", prepat = [], rew_ord = ("dummy_ord", dummy_ord), erls = Erls,
walther@59850
    83
    calc = [], errpatts = [], scr = e_rfuns}:rls;
walther@59850
    84
walther@59850
    85
fun rep_rls Erls = rep_rls e_rls
walther@59850
    86
  | rep_rls (Rls {id, preconds, rew_ord, erls, srls, calc, errpatts, rules, scr}) =
walther@59850
    87
    {id = id, preconds = preconds, rew_ord = rew_ord, erls = erls, srls = srls, errpats = errpatts,
walther@59850
    88
      calc = calc, rules = rules, scr = scr}
walther@59850
    89
  | rep_rls (Seq {id, preconds, rew_ord, erls, srls, calc, errpatts, rules, scr}) =
walther@59850
    90
    {id = id, preconds = preconds, rew_ord = rew_ord, erls = erls, srls = srls, errpats = errpatts,
walther@59850
    91
      calc = calc, rules = rules, scr = scr}
walther@59850
    92
  | rep_rls (Rrls _)  = rep_rls e_rls
walther@59850
    93
walther@59850
    94
fun append_rls id Erls _ = raise ERROR ("append_rls: with \"" ^ id ^ "\" not for Erls")
walther@59850
    95
  | append_rls id (Rls {id = _, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
walther@59850
    96
			rules = rs, errpatts = errpatts, scr = sc}) r =
walther@59850
    97
    Rls {id = id, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
walther@59850
    98
      rules = rs @ r, errpatts = errpatts, scr = sc}
walther@59850
    99
  | append_rls id (Seq {id = _, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
walther@59850
   100
			rules = rs, errpatts = errpatts, scr = sc}) r =
walther@59850
   101
    Seq {id = id, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
walther@59850
   102
      rules = rs @ r, errpatts = errpatts, scr = sc}
walther@59850
   103
  | append_rls id (Rrls _) _ = raise ERROR ("append_rls: not for reverse-rewrite-rule-set " ^ id);
walther@59850
   104
walther@59850
   105
fun id_rls Erls = "e_rls" (*WN060714 quick and dirty: recursive defs! TODO "Erls"*)
walther@59850
   106
  | id_rls (Rule_Def.Rls {id, ...}) = id
walther@59850
   107
  | id_rls (Rule_Def.Seq {id, ...}) = id
walther@59850
   108
  | id_rls (Rule_Def.Rrls {id, ...}) = id;
walther@59850
   109
val rls2str = id_rls;
walther@59850
   110
walther@59850
   111
fun id_rule (Rule_Def.Thm (id, _)) = id
walther@59850
   112
  | id_rule (Rule_Def.Num_Calc (id, _)) = id
walther@59850
   113
  | id_rule (Rule_Def.Cal1 (id, _)) = id
walther@59850
   114
  | id_rule (Rule_Def.Rls_ rls) = id_rls rls
walther@59850
   115
  | id_rule Rule_Def.Erule = "Erule";
walther@59850
   116
fun eq_rule (Rule_Def.Thm (thm1, _), Rule_Def.Thm (thm2, _)) = thm1 = thm2
walther@59850
   117
  | eq_rule (Rule_Def.Num_Calc (id1, _), Rule_Def.Num_Calc (id2, _)) = id1 = id2
walther@59850
   118
  | eq_rule (Rule_Def.Rls_ rls1, Rule_Def.Rls_ rls2) = id_rls rls1 = id_rls rls2
walther@59850
   119
  | eq_rule _ = false;
walther@59850
   120
walther@59850
   121
fun rule2str Rule_Def.Erule = "Erule"
walther@59850
   122
  | rule2str (Rule_Def.Thm (str, thm)) = "Thm (\""^str^"\"," ^ Rule.string_of_thmI thm ^")"
walther@59850
   123
  | rule2str (Rule_Def.Num_Calc (str, _)) = "Num_Calc (\""^str^"\",fn)"
walther@59850
   124
  | rule2str (Rule_Def.Cal1 (str, _)) = "Cal1 (\""^str^"\",fn)"
walther@59850
   125
  | rule2str (Rule_Def.Rls_ rls) = "Rls_ (\""^id_rls rls^"\")";
walther@59850
   126
fun rule2str' Rule_Def.Erule = "Erule"
walther@59850
   127
  | rule2str' (Rule_Def.Thm (str, _)) = "Thm (\""^str^"\",\"\")"
walther@59850
   128
  | rule2str' (Rule_Def.Num_Calc (str, _)) = "Num_Calc (\""^str^"\",fn)"
walther@59850
   129
  | rule2str' (Rule_Def.Cal1 (str, _)) = "Cal1 (\""^str^"\",fn)"
walther@59850
   130
  | rule2str' (Rule_Def.Rls_ rls) = "Rls_ (\""^id_rls rls^"\")";
walther@59850
   131
walther@59850
   132
fun merge_ids rls1 rls2 =
walther@59850
   133
  let 
walther@59850
   134
    val id1 = (#id o rep_rls) rls1
walther@59850
   135
    val id2 = (#id o rep_rls) rls2
walther@59850
   136
  in
walther@59850
   137
    if id1 = id2 then id1 else "merged_" ^ id1 ^ "_" ^ id2
walther@59850
   138
  end
walther@59850
   139
(* op in isa-term "Const(op,_)" *)
walther@59850
   140
type cal = Rule_Def.calID * Rule_Def.eval_fn;
walther@59850
   141
walther@59850
   142
type prog_calcID = string;
walther@59850
   143
walther@59850
   144
type calc_elem =  (* fun calculate_ fetches the evaluation-function via this list *)
walther@59850
   145
  prog_calcID *   (* a simple identifier used in programs                    *)
walther@59850
   146
  (Rule_Def.calID *        (* a long identifier used in Const                         *)
walther@59850
   147
    Rule_Def.eval_fn)      (* an ML function                                          *)
walther@59850
   148
fun calc_eq ((pi1, (ci1, _)), (pi2, (ci2, _))) =
walther@59850
   149
  if pi1 = pi2
walther@59850
   150
  then if ci1 = ci2 then true else error ("calc_eq: " ^ ci1 ^ " <> " ^ ci2)
walther@59850
   151
  else false
walther@59850
   152
fun e_evalfn (_ : 'a) (_ : term) (_ : theory) = NONE : (string * term) option;
walther@59850
   153
walther@59850
   154
fun merge_rls _ Erls rls = rls
walther@59850
   155
  | merge_rls _ rls Erls = rls
walther@59850
   156
  | merge_rls _ (Rrls x) _ = Rrls x (* required for merging Theory_Data *)
walther@59850
   157
  | merge_rls _ _ (Rrls x) = Rrls x
walther@59850
   158
  | merge_rls id
walther@59850
   159
	  (Rls {preconds = pc1, rew_ord = ro1, erls = er1, srls = sr1, calc = ca1,
walther@59850
   160
	    rules = rs1, errpatts = eps1, scr = sc1, ...})
walther@59850
   161
	  (Rls {preconds = pc2, erls = er2, srls = sr2, calc = ca2,
walther@59850
   162
	    rules = rs2, errpatts = eps2, ...})
walther@59850
   163
    =
walther@59850
   164
	  Rls {id = id, rew_ord = ro1, scr = sc1,
walther@59850
   165
	    preconds = union (op =) pc1 pc2,	    
walther@59850
   166
	    erls = merge_rls (merge_ids er1 er2) er1 er2,
walther@59850
   167
	    srls = merge_rls (merge_ids sr1 sr2) sr1 sr2,
walther@59850
   168
	    calc = union calc_eq ca1 ca2,
walther@59850
   169
		  rules = union eq_rule rs1 rs2,
walther@59850
   170
      errpatts = union (op =) eps1 eps2}
walther@59850
   171
  | merge_rls id
walther@59850
   172
	  (Seq {preconds = pc1, rew_ord = ro1, erls = er1, srls = sr1, calc = ca1,
walther@59850
   173
	    rules = rs1, errpatts = eps1, scr = sc1, ...})
walther@59850
   174
	  (Seq {preconds = pc2, erls = er2, srls = sr2, calc = ca2,
walther@59850
   175
	    rules = rs2, errpatts = eps2, ...})
walther@59850
   176
    =
walther@59850
   177
	  Seq {id = id, rew_ord = ro1, scr = sc1,
walther@59850
   178
	    preconds = union (op =) pc1 pc2,	    
walther@59850
   179
	    erls = merge_rls (merge_ids er1 er2) er1 er2,
walther@59850
   180
	    srls = merge_rls (merge_ids sr1 sr2) sr1 sr2,
walther@59850
   181
	    calc = union calc_eq ca1 ca2,
walther@59850
   182
		  rules = union eq_rule rs1 rs2,
walther@59850
   183
      errpatts = union (op =) eps1 eps2}
walther@59850
   184
  | merge_rls id _ _ = error ("merge_rls: \"" ^ id ^ 
walther@59850
   185
    "\"; not for reverse-rewrite-rule-sets and not for mixed Rls -- Seq");
walther@59850
   186
walther@59850
   187
(* datastructure for KEStore_Elems, intermediate for thehier *)
walther@59850
   188
type rlss_elem = 
walther@59850
   189
  (rls' *     (* identifier unique within Isac *)
walther@59850
   190
  (Rule.theory' *  (* just for assignment in thehier, not appropriate for parsing etc *)
walther@59850
   191
    Rule_Def.rls))     (* ((#id o rep_rls) rls) = rls'   by coding discipline *)
walther@59850
   192
fun rls_eq ((id1, (_, _)), (id2, (_, _))) = id1 = id2
walther@59850
   193
walther@59850
   194
fun insert_merge_rls (re as (id, (thyID, r1)) : rlss_elem) ys = 
walther@59850
   195
    case get_index (fn y => if curry rls_eq re y then SOME y else NONE) ys of
walther@59850
   196
      NONE => re :: ys
walther@59850
   197
    | SOME (i, (_, (_, r2))) => 
walther@59850
   198
      let
walther@59850
   199
        val r12 = merge_rls id r1 r2
walther@59850
   200
      in list_update ys i (id, (thyID, r12)) end
walther@59850
   201
fun merge_rlss (s1, s2) = fold insert_merge_rls s1 s2;
walther@59850
   202
walther@59850
   203
(* used only for one hack TODO remove *)
walther@59850
   204
fun remove_rls id (Rls {id = _, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
walther@59850
   205
		  rules = rs, errpatts = eps, scr = sc}) r =
walther@59850
   206
    Rls {id = id, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
walther@59850
   207
	    rules = gen_rems eq_rule (rs, r),
walther@59850
   208
	    errpatts = eps,
walther@59850
   209
	    scr = sc}
walther@59850
   210
  | remove_rls id (Seq {id = _, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
walther@59850
   211
		  rules = rs, errpatts = eps, scr = sc}) r =
walther@59850
   212
    Seq {id = id, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
walther@59850
   213
	    rules = gen_rems eq_rule (rs, r),
walther@59850
   214
	    errpatts = eps,
walther@59850
   215
	    scr = sc}
walther@59850
   216
  | remove_rls id (Rrls _) _ = raise ERROR ("remove_rls: not for reverse-rewrite-rule-set "^id)
walther@59850
   217
  | remove_rls _ rls _ = raise ERROR ("remove_rls called with " ^ rls2str rls);
walther@59850
   218
walther@59850
   219
fun get_rules Erls = []
walther@59850
   220
  | get_rules (Rls {rules, ...}) = rules
walther@59850
   221
  | get_rules (Seq {rules, ...}) = rules
walther@59850
   222
  | get_rules (Rrls _) = [];
walther@59850
   223
walther@59850
   224
walther@59850
   225
(**)end(**)