src/Tools/isac/BaseDefinitions/rule-set.sml
author wneuper <walther.neuper@jku.at>
Wed, 18 Aug 2021 11:35:24 +0200
changeset 60384 2b6e73df4e5d
parent 60223 740ebee5948b
child 60436 1c8263e775d4
permissions -rw-r--r--
repair test/../root.sml, diff.sml; outcomment NEW errors TOODOO.1
     1 (* Title:  BaseDefinitions/rule-set.sml
     2    Author: Walther Neuper
     3    (c) due to copyright terms
     4 
     5 In ISAC a Rule_Set serves rewriting. Know_Store holds all rule-sets for ubiquitous access.
     6 *)                                       
     7 signature RULE_SET =
     8 sig
     9   datatype T = datatype Rule_Def.rule_set
    10   eqtype id
    11 
    12   val id: T -> string
    13   val rep: T -> {calc: Rule_Def.calc list, erls: T, errpats: Rule_Def.errpatID list, id: string,
    14     preconds: term list, rew_ord: Rewrite_Ord.rew_ord, rules: Rule_Def.rule list, scr: Rule_Def.program, srls: T}
    15 
    16   val append_rules: string -> T -> Rule_Def.rule list -> T
    17   val append_erls_rules: string -> T -> Rule_Def.rule list -> T
    18   val keep_unique_rules: string -> T ->  Rule_Def.rule list -> T
    19   val merge: string -> T -> T -> T
    20   val get_rules: T -> Rule_Def.rule list
    21 (*val rule2rls': Rule.rule -> string*)
    22   val id_from_rule: Rule.rule -> string
    23   val contains: Rule.rule -> T -> bool
    24 
    25   type for_kestore
    26   val equal: (''a * ('b * 'c)) * (''a * ('d * 'e)) -> bool
    27   val to_kestore: for_kestore list * for_kestore list -> for_kestore list
    28 
    29 (*/------- this will disappear eventually ----------------------------------------------------\*)
    30   val empty: T
    31   type rrlsstate = term * term * Rule_Def.rule list list * (Rule_Def.rule * (term * term list)) list
    32   val e_rrlsstate: rrlsstate
    33   val e_rrls: T
    34 (*\------- this will disappear eventually ----------------------------------------------------/*)
    35 \<^isac_test>\<open>
    36   val insert_merge: for_kestore -> for_kestore list -> for_kestore list
    37 \<close>
    38 end
    39 
    40 (**)
    41 structure Rule_Set(**): RULE_SET(**) =
    42 struct
    43 (**)
    44 datatype T = datatype Rule_Def.rule_set;
    45 type id = string;
    46 
    47 (*/------- this will disappear eventually ----------------------------------------------------\*)
    48 fun dummy_ord (_: (term * term) list) (_: term, _: term) = true;
    49 val empty =
    50   Rule_Def.Repeat {id = "empty", preconds = [], rew_ord = ("dummy_ord", dummy_ord), erls = Rule_Def.Empty,
    51     srls = Rule_Def.Empty, calc = [], rules = [], errpatts = [], scr = Rule_Def.Empty_Prog}
    52 (*\------- this will disappear eventually ----------------------------------------------------/*)
    53 
    54 val id = Rule.set_id;
    55 fun rep Rule_Def.Empty = rep empty
    56   | rep (Rule_Def.Repeat {id, preconds, rew_ord, erls, srls, calc, errpatts, rules, scr}) =
    57     {id = id, preconds = preconds, rew_ord = rew_ord, erls = erls, srls = srls, errpats = errpatts,
    58       calc = calc, rules = rules, scr = scr}
    59   | rep (Rule_Def.Sequence {id, preconds, rew_ord, erls, srls, calc, errpatts, rules, scr}) =
    60     {id = id, preconds = preconds, rew_ord = rew_ord, erls = erls, srls = srls, errpats = errpatts,
    61       calc = calc, rules = rules, scr = scr}
    62   | rep (Rule_Def.Rrls _)  = rep empty
    63 
    64 fun append_rules id Rule_Def.Empty r = (*.. required for append_erls_rules *)
    65     Rule_Def.Repeat {id = id, preconds = [], rew_ord = ("dummy_ord", dummy_ord), erls = Rule_Def.Empty, 
    66       srls = Rule_Def.Empty, calc = [], rules = r, errpatts = [], scr = Rule_Def.Empty_Prog}
    67   | append_rules id (Rule_Def.Repeat {id = _, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
    68 			rules = rs, errpatts = errpatts, scr = sc}) r =
    69     Rule_Def.Repeat {id = id, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
    70       rules = rs @ r, errpatts = errpatts, scr = sc}
    71   | append_rules id (Rule_Def.Sequence {id = _, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
    72 			rules = rs, errpatts = errpatts, scr = sc}) r =
    73     Rule_Def.Sequence {id = id, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
    74       rules = rs @ r, errpatts = errpatts, scr = sc}
    75   | append_rules id (Rule_Def.Rrls _) _ = raise ERROR ("append_rules: not for reverse-rewrite-rule-set " ^ id);
    76 
    77 fun append_erls_rules id_erls Rule_Def.Empty _ =
    78     raise ERROR ("append_erls_rules: with \"" ^ id_erls ^ "\" not for Rule_Def.Empty")
    79   | append_erls_rules id_erls (Rule_Def.Repeat 
    80     {id = id, preconds = pc, rew_ord = ro, erls = erls, srls = sr, calc = ca,
    81 			rules = rules, errpatts = errpatts, scr = sc}) rs =
    82     Rule_Def.Repeat {id = id, preconds = pc, rew_ord = ro, erls = append_rules id_erls erls rs, 
    83       srls = sr, calc = ca, rules = rules, errpatts = errpatts, scr = sc}
    84   | append_erls_rules id_erls (Rule_Def.Sequence
    85     {id = id, preconds = pc, rew_ord = ro, erls = erls, srls = sr, calc = ca,
    86 			rules = rules, errpatts = errpatts, scr = sc}) rs =
    87     Rule_Def.Sequence {id = id, preconds = pc, rew_ord = ro, erls = append_rules id_erls erls rs,
    88       srls = sr, calc = ca, rules = rules, errpatts = errpatts, scr = sc}
    89   | append_erls_rules id_erls (Rule_Def.Rrls _) _ =
    90     raise ERROR ("append_erls_rules: not for reverse-rewrite-rule-set " ^ id_erls);
    91 
    92 fun merge_ids rls1 rls2 =
    93   let 
    94     val id1 = (#id o rep) rls1
    95     val id2 = (#id o rep) rls2
    96   in
    97     if id1 = id2 then id1 else "merged_" ^ id1 ^ "_" ^ id2
    98   end
    99 
   100 fun merge _ Rule_Def.Empty rls = rls
   101   | merge _ rls Rule_Def.Empty = rls
   102   | merge _ (Rrls x) _ = Rrls x (* required for merging Theory_Data *)
   103   | merge _ _ (Rrls x) = Rrls x
   104   | merge id
   105 	  (Rule_Def.Repeat {preconds = pc1, rew_ord = ro1, erls = er1, srls = sr1, calc = ca1,
   106 	    rules = rs1, errpatts = eps1, scr = sc1, ...})
   107 	  (Rule_Def.Repeat {preconds = pc2, erls = er2, srls = sr2, calc = ca2,
   108 	    rules = rs2, errpatts = eps2, ...})
   109     =
   110 	  Rule_Def.Repeat {id = id, rew_ord = ro1, scr = sc1,
   111 	    preconds = union (op =) pc1 pc2,	    
   112 	    erls = merge (merge_ids er1 er2) er1 er2,
   113 	    srls = merge (merge_ids sr1 sr2) sr1 sr2,
   114 	    calc = union Eval_Def.calc_eq ca1 ca2,
   115 		  rules = union Rule.equal rs1 rs2,
   116       errpatts = union (op =) eps1 eps2}
   117   | merge id
   118 	  (Rule_Def.Sequence {preconds = pc1, rew_ord = ro1, erls = er1, srls = sr1, calc = ca1,
   119 	    rules = rs1, errpatts = eps1, scr = sc1, ...})
   120 	  (Rule_Def.Sequence {preconds = pc2, erls = er2, srls = sr2, calc = ca2,
   121 	    rules = rs2, errpatts = eps2, ...})
   122     =
   123 	  Rule_Def.Sequence {id = id, rew_ord = ro1, scr = sc1,
   124 	    preconds = union (op =) pc1 pc2,	    
   125 	    erls = merge (merge_ids er1 er2) er1 er2,
   126 	    srls = merge (merge_ids sr1 sr2) sr1 sr2,
   127 	    calc = union Eval_Def.calc_eq ca1 ca2,
   128 		  rules = union Rule.equal rs1 rs2,
   129       errpatts = union (op =) eps1 eps2}
   130   | merge id _ _ = raise ERROR ("merge: \"" ^ id ^ 
   131     "\"; not for reverse-rewrite-rule-sets and not for mixed Rls -- Rule_Def.Sequence");
   132 
   133 (* datastructure for KEStore_Elems, intermediate for thehier *)
   134 type for_kestore = 
   135   (id *     (* id unique within Isac *)
   136   (ThyC.id *  (* just for assignment in thehier, not appropriate for parsing etc *)
   137     T))     (* ((#id o rep) T) = id   by coding discipline *)
   138 fun equal ((id1, (_, _)), (id2, (_, _))) = id1 = id2
   139 
   140 fun insert_merge (re as (id, (thyID, r1))) ys = 
   141     case get_index (fn y => if curry equal re y then SOME y else NONE) ys of
   142       NONE => re :: ys
   143     | SOME (i, (_, (_, r2))) => 
   144       let
   145         val r12 = merge id r1 r2
   146       in list_update ys i (id, (thyID, r12)) end
   147 fun to_kestore (s1, s2) = fold insert_merge s1 s2;
   148 
   149 (* used only for one hack *)
   150 fun keep_unique_rules id 
   151      (Rule_Def.Repeat {id = _, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
   152   		  rules = rs, errpatts = eps, scr = sc}) r =
   153       Rule_Def.Repeat {id = id, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
   154   	    rules = gen_rems Rule.equal (rs, r),
   155   	    errpatts = eps,
   156   	    scr = sc}
   157   | keep_unique_rules id
   158      (Rule_Def.Sequence {id = _, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
   159   		  rules = rs, errpatts = eps, scr = sc}) r =
   160       Rule_Def.Sequence {id = id, preconds = pc, rew_ord = ro, erls = er, srls = sr, calc = ca,
   161   	    rules = gen_rems Rule.equal (rs, r),
   162   	    errpatts = eps,
   163   	    scr = sc}
   164   | keep_unique_rules id (Rule_Def.Rrls _) _ = raise ERROR ("keep_unique_rules: not for reverse-rewrite-rule-set "^id)
   165   | keep_unique_rules _ rls _ = raise ERROR ("remove_rls called with " ^ id rls);
   166 
   167 fun get_rules Rule_Def.Empty = []
   168   | get_rules (Rule_Def.Repeat {rules, ...}) = rules
   169   | get_rules (Rule_Def.Sequence {rules, ...}) = rules
   170   | get_rules (Rule_Def.Rrls _) = [];
   171 
   172 fun id_from_rule (Rule.Rls_ rls) = id rls
   173   | id_from_rule r = raise ERROR ("id_from_rule: not defined for " ^ Rule.to_string r);
   174 
   175 (* check if a rule is contained in a rule-set (recursivley down in Rls_);
   176    this rule can even be a rule-set itself                             *)
   177 fun contains r rls = 
   178   let 
   179     fun (*find (_, Rls_ rls) = finds (get_rules rls)
   180       | find r12 = equal r12
   181     and*) finds [] = false
   182     | finds (r1 :: rs) = if Rule.equal (r, r1) then true else finds rs
   183   in 
   184     finds (get_rules rls) 
   185   end
   186 
   187 (*/------- this will disappear eventually -----------\*)
   188 type rrlsstate =  (* state for reverse rewriting, comments see type rule and scr | Rfuns *)
   189   (term * term * Rule_Def.rule list list * (Rule_Def.rule * (term * term list)) list);
   190 val e_rrlsstate = (UnparseC.term_empty, UnparseC.term_empty, [[Rule_Def.Erule]], [(Rule_Def.Erule, (UnparseC.term_empty, []))]) : rrlsstate;
   191 local           
   192     fun ii (_: term) = e_rrlsstate;
   193     fun no (_: term) = SOME (UnparseC.term_empty, [UnparseC.term_empty]);
   194     fun lo (_: Rule_Def.rule list list) (_: term) (_: Rule_Def.rule) = [(Rule_Def.Erule, (UnparseC.term_empty, [UnparseC.term_empty]))];
   195     fun ne (_: Rule_Def.rule list list) (_: term) = SOME Rule_Def.Erule;
   196     fun fo (_: Rule_Def.rule list list) (_: term) (_: term) = [(Rule_Def.Erule, (UnparseC.term_empty, [UnparseC.term_empty]))];
   197 in
   198 val e_rfuns = Rule_Def.Rfuns {init_state = ii, normal_form = no, locate_rule = lo,
   199 		  next_rule = ne, attach_form = fo};
   200 end;
   201 val e_rrls =
   202   Rule_Def.Rrls {id = "e_rrls", prepat = [], rew_ord = ("dummy_ord", dummy_ord), erls = Rule_Def.Empty,
   203     calc = [], errpatts = [], scr = e_rfuns}
   204 (*\------- this will disappear eventually -----------/*)
   205 
   206 
   207 (**)end(**)