@@ -187,7 +187,7 @@ type preenv = {
187187 env_tc : TC .graph ;
188188 env_rwbase : Sp .t Mip .t ;
189189 env_atbase : atbase Msym .t ;
190- env_redbase : mredinfo ;
190+ env_redbase : mredinfo Msym .t ;
191191 env_ntbase : ntbase Mop .t ;
192192 env_albase : path Mp .t ; (* theory aliases *)
193193 env_modlcs : Sid .t ; (* declared modules *)
@@ -217,9 +217,11 @@ and tcinstance = [
217217 | `General of EcPath. path
218218]
219219
220+ and redentry = EcPath. path * EcTheory. rule
221+
220222and redinfo =
221- { ri_priomap : (EcTheory .rule list ) Mint .t ;
222- ri_list : (EcTheory .rule list ) Lazy .t ; }
223+ { ri_priomap : (redentry list ) Mint .t ;
224+ ri_list : (redentry list ) Lazy .t ; }
223225
224226and mredinfo = redinfo Mrd. t
225227
@@ -316,7 +318,7 @@ let empty gstate =
316318 env_tc = TC.Graph. empty;
317319 env_rwbase = Mip. empty;
318320 env_atbase = Msym. empty;
319- env_redbase = Mrd . empty;
321+ env_redbase = Msym . empty;
320322 env_ntbase = Mop. empty;
321323 env_albase = Mp. empty;
322324 env_modlcs = Sid. empty;
@@ -1487,10 +1489,14 @@ end
14871489
14881490(* -------------------------------------------------------------------- *)
14891491module Reduction = struct
1492+ type entry = redentry
14901493 type rule = EcTheory .rule
14911494 type topsym = red_topsym
1495+ type base = symbol
1496+
1497+ let dname : symbol = " "
14921498
1493- let add_rule ((_ , rule ) : path * rule option ) (db : mredinfo ) =
1499+ let add_rule ((src , rule ) : path * rule option ) (db : mredinfo ) =
14941500 match rule with None -> db | Some rule ->
14951501
14961502 let p : topsym =
@@ -1507,7 +1513,7 @@ module Reduction = struct
15071513 | Some x -> x in
15081514
15091515 let ri_priomap =
1510- let change prules = Some (odfl [] prules @ [rule]) in
1516+ let change prules = Some (odfl [] prules @ [(src, rule) ]) in
15111517 Mint. change change (abs rule.rl_prio) ri_priomap in
15121518
15131519 let ri_list =
@@ -1518,26 +1524,111 @@ module Reduction = struct
15181524 let add_rules (rules : (path * rule option) list ) (db : mredinfo ) =
15191525 List. fold_left ((^~ ) add_rule) db rules
15201526
1521- let add ?(import = true ) (rules : (path * rule_option * rule option) list ) (env : env ) =
1522- let rstrip = List. map (fun (x , _ , y ) -> (x, y)) rules in
1527+ let updatedb ?(base : symbol option ) (rules : (path * rule option) list ) (db : mredinfo Msym.t ) =
1528+ let nbase = odfl dname base in
1529+ let base = Msym. find_def Mrd. empty nbase db in
1530+ Msym. add nbase (add_rules rules base) db
1531+
1532+ let add ?(import = true ) ({ red_base; red_rules } : reduction_rule ) (env : env ) =
1533+ let rstrip = List. map (fun (x , _ , y ) -> (x, y)) red_rules in
15231534
15241535 { env with
1525- env_redbase = add_rules rstrip env.env_redbase;
1526- env_item = mkitem ~import (Th_reduction rules ) :: env.env_item; }
1536+ env_redbase = updatedb ? base :red_base rstrip env .env_redbase;
1537+ env_item = mkitem ~import (Th_reduction { red_base; red_rules } ) :: env.env_item; }
15271538
1528- let add1 (prule : path * rule_option * rule option ) (env : env ) =
1529- add [prule] env
1539+ let add1 ? base (prule : path * rule_option * rule option ) (env : env ) =
1540+ add { red_base = base; red_rules = [prule] } env
15301541
1531- let get (p : topsym ) (env : env ) =
1532- Mrd. find_opt p env.env_redbase
1542+ let get_entries ?base (p : topsym ) (env : env ) =
1543+ Msym. find_opt (odfl dname base) env.env_redbase
1544+ |> obind (Mrd. find_opt p)
15331545 |> omap (fun x -> Lazy. force x.ri_list)
15341546 |> odfl []
15351547
1536- (* FIXME: handle other cases, right now only used for print hint *)
1548+ let get ?base (p : topsym ) (env : env ) =
1549+ List. map snd (get_entries ?base p env)
1550+
1551+ let getx (base : symbol ) (env : env ) =
1552+ Msym. find_def Mrd. empty base env.env_redbase
1553+ |> Mrd. bindings
1554+ |> List. map (fun (ts , mr ) -> (ts, List. map snd (Lazy. force mr.ri_list)))
1555+
15371556 let all (env : env ) =
1538- List. map (fun (ts , mr ) ->
1539- (ts, Lazy. force mr.ri_list))
1540- (Mrd. bindings env.env_redbase)
1557+ Msym. bindings env.env_redbase
1558+ |> List. map (fun (base , db ) ->
1559+ (base, List. map (fun (ts , mr ) -> (ts, List. map snd (Lazy. force mr.ri_list))) (Mrd. bindings db)))
1560+ end
1561+
1562+ type local_simplify = {
1563+ ls_active : Ssym .t ;
1564+ ls_added : Reduction .entry list Msym .t ;
1565+ ls_removed : Sp .t Msym .t ;
1566+ }
1567+
1568+ module LocalSimplify = struct
1569+ let empty = {
1570+ ls_active = Ssym. singleton Reduction. dname;
1571+ ls_added = Msym. empty;
1572+ ls_removed = Msym. empty;
1573+ }
1574+
1575+ let active ls = ls.ls_active
1576+
1577+ let normbase = function
1578+ | Some "default" | None -> Reduction. dname
1579+ | Some base -> base
1580+
1581+ let activate bases ls =
1582+ { ls with ls_active = List. fold_left (fun st b -> Ssym. add (normbase (Some b)) st) ls.ls_active bases }
1583+
1584+ let deactivate bases ls =
1585+ { ls with ls_active = List. fold_left (fun st b -> Ssym. remove (normbase (Some b)) st) ls.ls_active bases }
1586+
1587+ let added ?base ls =
1588+ Msym. find_def [] (normbase base) ls.ls_added
1589+
1590+ let removed ?base ls =
1591+ Msym. find_def Sp. empty (normbase base) ls.ls_removed
1592+
1593+ let add_rules ?base rules ls =
1594+ let base = normbase base in
1595+ let old = Msym. find_def [] base ls.ls_added in
1596+ let old =
1597+ List. filter (fun (p , _ ) ->
1598+ not (List. exists (fun (p' , _ ) -> EcPath. p_equal p p') rules))
1599+ old
1600+ in
1601+ let ls_added = Msym. add base (old @ rules) ls.ls_added in
1602+ let ls_removed =
1603+ let removed = Msym. find_def Sp. empty base ls.ls_removed in
1604+ let removed = List. fold_left (fun st (p , _ ) -> Sp. remove p st) removed rules in
1605+ Msym. add base removed ls.ls_removed
1606+ in
1607+ { ls with ls_added; ls_removed }
1608+
1609+ let remove_paths ?base paths ls =
1610+ let base = normbase base in
1611+ let ls_added =
1612+ let added = Msym. find_def [] base ls.ls_added in
1613+ let added =
1614+ List. filter (fun (p , _ ) ->
1615+ not (List. exists (EcPath. p_equal p) paths))
1616+ added
1617+ in
1618+ Msym. add base added ls.ls_added
1619+ in
1620+ let ls_removed =
1621+ let removed = Msym. find_def Sp. empty base ls.ls_removed in
1622+ let removed = List. fold_left (fun st p -> Sp. add p st) removed paths in
1623+ Msym. add base removed ls.ls_removed
1624+ in
1625+ { ls with ls_added; ls_removed }
1626+
1627+ let clear ?base ls =
1628+ let base = normbase base in
1629+ { ls with
1630+ ls_added = Msym. remove base ls.ls_added;
1631+ ls_removed = Msym. remove base ls.ls_removed; }
15411632end
15421633
15431634(* -------------------------------------------------------------------- *)
@@ -3003,9 +3094,9 @@ module Theory = struct
30033094 (* ------------------------------------------------------------------ *)
30043095 let bind_rd_th =
30053096 let for1 _path db = function
3006- | Th_reduction rules ->
3007- let rules = List. map (fun (x , _ , y ) -> (x, y)) rules in
3008- Some (Reduction. add_rules rules db)
3097+ | Th_reduction { red_base; red_rules } ->
3098+ let rules = List. map (fun (x , _ , y ) -> (x, y)) red_rules in
3099+ Some (Reduction. updatedb ?base: red_base rules db )
30093100 | _ -> None
30103101
30113102 in bind_base_th for1
0 commit comments