@@ -1571,37 +1571,65 @@ let elpi_fails program_name =
1571
1571
" Please report this inconvenience to the authors of the program."
1572
1572
]))
1573
1573
1574
+ module type M = sig
1575
+ type elt
1576
+ type t
1577
+ val empty : t
1578
+ val diff : t -> t -> t
1579
+ val union : t -> t -> t
1580
+ val add : elt -> t -> t
1581
+ val gr2elt : Names.GlobRef .t -> elt
1582
+ val mem : elt -> t -> bool
1583
+ val of_qualid_list : Libnames .qualid list -> t
1584
+
1585
+ end
1586
+
1587
+ (* Set of overridden class *)
1588
+ module OSet : M = struct
1589
+ module M = GRSet
1590
+
1591
+ type t = M .t
1592
+ type elt = M .elt
1593
+ let empty = M. empty
1594
+ let diff = M. diff
1595
+ let union = M. union
1596
+ let add = M. add
1597
+ let mem = M. mem
1598
+ let gr2elt (x : Names.GlobRef.t ) : elt = x
1599
+
1600
+ let of_qualid_list (x : Libnames.qualid list ) : t =
1601
+ let add s x = add (Coq_elpi_utils. locate_simple_qualid x) s in
1602
+ List. fold_left add empty x
1603
+ end
1574
1604
1575
1605
module Modes = struct
1576
1606
1577
1607
(* * override_mode *)
1578
1608
type omode =
1579
- | AllButFor of GRSet .t
1580
- | Only of GRSet .t
1609
+ | AllButFor of OSet .t
1610
+ | Only of OSet .t
1581
1611
1582
1612
type action =
1583
1613
| Set of omode
1584
- | Add of Libnames .qualid list
1585
- | Rm of Libnames .qualid list
1614
+ | Add of OSet .t
1615
+ | Rm of OSet .t
1586
1616
1587
1617
let omodes = ref (CSMap. empty : omode CSMap.t )
1588
1618
1589
1619
let create_solver_omode solver =
1590
- omodes := CSMap. add solver (Only GRSet . empty) ! omodes
1620
+ omodes := CSMap. add solver (Only OSet . empty) ! omodes
1591
1621
1592
1622
let takeover (qname , new_mode ,c ) =
1593
1623
let name = qname2str qname in
1594
1624
if c then create_solver_omode name else
1595
- let add_str x = GRSet. add (str2gr x) in
1596
- let grl2set grl = List. fold_right add_str grl GRSet. empty in
1597
1625
let old_mode = CSMap. find name ! omodes in
1598
1626
let new_mode =
1599
1627
match old_mode, new_mode with
1600
1628
| _ , Set (mode ) -> mode
1601
- | AllButFor s , Add grl -> AllButFor (GRSet . diff s (grl2set grl) )
1602
- | AllButFor s , Rm grl -> AllButFor (GRSet . union s (grl2set grl) )
1603
- | Only s , Add grl -> Only (GRSet . union s (grl2set grl) )
1604
- | Only s , Rm grl -> Only (GRSet . diff s (grl2set grl) )
1629
+ | AllButFor s , Add grl -> AllButFor (OSet . diff s grl)
1630
+ | AllButFor s , Rm grl -> AllButFor (OSet . union s grl)
1631
+ | Only s , Add grl -> Only (OSet . union s grl)
1632
+ | Only s , Rm grl -> Only (OSet . diff s grl)
1605
1633
in
1606
1634
omodes := CSMap. set name new_mode ! omodes
1607
1635
@@ -1627,11 +1655,11 @@ module Solver = struct
1627
1655
match Coq_elpi_vernacular.Interp. run ~static_check: false cprogram (`Fun query) with
1628
1656
| API.Execute. Success solution ->
1629
1657
let sigma, sub_goals, to_shelve = Coq_elpi_HOAS. solution2evd ~eta_contract_solution: true sigma solution (Evar.Set. of_list goals) in
1630
- let sigma = Evd. shelve sigma ( sub_goals @ to_shelve) in
1658
+ let sigma = Evd. shelve sigma sub_goals in
1631
1659
sub_goals = [] , sigma
1632
1660
| API.Execute. NoMoreSteps -> CErrors. user_err Pp. (str " elpi run out of steps" )
1633
1661
| API.Execute. Failure -> elpi_fails program
1634
- | exception (Coq_elpi_utils. LtacFail (level , msg )) -> elpi_fails program
1662
+ | exception (Coq_elpi_utils. LtacFail (level , msg )) -> raise Not_found
1635
1663
}
1636
1664
1637
1665
type action =
@@ -1643,9 +1671,7 @@ module Solver = struct
1643
1671
let ei = Evd. find_undefined sigma i in
1644
1672
let ty = Evd. evar_concl ei in
1645
1673
match Typeclasses. class_of_constr env sigma ty with
1646
- | Some (_ ,(((cl : typeclass ),_ ),_ )) ->
1647
- let cl_impl = cl.Typeclasses. cl_impl in
1648
- GRSet. mem cl_impl classes
1674
+ | Some (_ ,((cl ,_ ),_ )) -> OSet. mem (OSet. gr2elt cl.cl_impl) classes
1649
1675
| None -> default
1650
1676
1651
1677
let covered omode env sigma s =
@@ -1668,20 +1694,18 @@ end
1668
1694
1669
1695
1670
1696
let set_solver_mode kind qname (l : Libnames.qualid list ) =
1697
+ let l = OSet. of_qualid_list l in
1671
1698
let cache_solver_mode = Modes. cache_solver_mode in
1672
- let empty = GRSet. empty in
1673
1699
match kind with
1674
1700
| AAdd -> Lib. add_leaf (cache_solver_mode (qname, Add l, false ))
1675
1701
| ARm -> Lib. add_leaf (cache_solver_mode (qname, Rm l, false ))
1676
- | AAll -> Lib. add_leaf (cache_solver_mode (qname, Set (AllButFor empty), false ))
1677
- | ANone -> Lib. add_leaf (cache_solver_mode (qname, Set (Only empty), false ))
1678
- | ASet -> let set = ref empty in
1679
- List. iter (fun x -> set := GRSet. add (str2gr x) ! set) l;
1680
- Lib. add_leaf (cache_solver_mode (qname, Set (Only ! set), false ))
1702
+ | AAll -> Lib. add_leaf (cache_solver_mode (qname, Set (AllButFor OSet. empty), false ))
1703
+ | ANone -> Lib. add_leaf (cache_solver_mode (qname, Set (Only OSet. empty), false ))
1704
+ | ASet -> Lib. add_leaf (cache_solver_mode (qname, Set (Only l), false ))
1681
1705
1682
1706
let solver_register l =
1683
1707
Lib. add_leaf (Solver. cache_solver (l, Create ));
1684
- Lib. add_leaf (Modes. cache_solver_mode (l, Add [] , true ))
1708
+ Lib. add_leaf (Modes. cache_solver_mode (l, Add OSet. empty , true ))
1685
1709
1686
1710
let solver_activate l = Lib. add_leaf (Solver. cache_solver (l, Activate ))
1687
1711
0 commit comments