From 626a225847107d4b79b49c93428f1165d9f05e24 Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <mail@robbertkrebbers.nl>
Date: Sun, 22 Jan 2017 12:49:14 +0100
Subject: [PATCH] Hint Mode for Persistent, Timeless, Exclusive, ...

---
 theories/algebra/cmra.v       |  4 +++-
 theories/algebra/ofe.v        | 17 ++++++++++-------
 theories/base_logic/big_op.v  |  2 ++
 theories/base_logic/derived.v |  2 ++
 4 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/theories/algebra/cmra.v b/theories/algebra/cmra.v
index 8fe2f1ddf..1d38d34c9 100644
--- a/theories/algebra/cmra.v
+++ b/theories/algebra/cmra.v
@@ -130,10 +130,12 @@ Infix "â‹…?" := opM (at level 50, left associativity) : C_scope.
 (** * Persistent elements *)
 Class Persistent {A : cmraT} (x : A) := persistent : pcore x ≡ Some x.
 Arguments persistent {_} _ {_}.
+Hint Mode Persistent + ! : typeclass_instances.
 
 (** * Exclusive elements (i.e., elements that cannot have a frame). *)
 Class Exclusive {A : cmraT} (x : A) := exclusive0_l y : ✓{0} (x ⋅ y) → False.
 Arguments exclusive0_l {_} _ {_} _ _.
+Hint Mode Exclusive + ! : typeclass_instances.
 
 (** * CMRAs whose core is total *)
 (** The function [core] may return a dummy when used on CMRAs without total
@@ -545,7 +547,7 @@ Section ucmra.
   Global Instance cmra_unit_total : CMRATotal A.
   Proof.
     intros x. destruct (cmra_pcore_mono' ∅ x ∅) as (cx&->&?);
-      eauto using ucmra_unit_least, (persistent ∅).
+      eauto using ucmra_unit_least, (persistent (∅:A)).
   Qed.
 End ucmra.
 Hint Immediate cmra_unit_total.
diff --git a/theories/algebra/ofe.v b/theories/algebra/ofe.v
index 2a4694ad4..5285f7ef2 100644
--- a/theories/algebra/ofe.v
+++ b/theories/algebra/ofe.v
@@ -72,8 +72,10 @@ Hint Extern 1 (_ ≡{_}≡ _) => apply equiv_dist; assumption.
 (** Discrete OFEs and Timeless elements *)
 (* TODO: On paper, We called these "discrete elements". I think that makes
    more sense. *)
-Class Timeless `{Equiv A, Dist A} (x : A) := timeless y : x ≡{0}≡ y → x ≡ y.
-Arguments timeless {_ _ _} _ {_} _ _.
+Class Timeless {A : ofeT} (x : A) := timeless y : x ≡{0}≡ y → x ≡ y.
+Arguments timeless {_} _ {_} _ _.
+Hint Mode Timeless + ! : typeclass_instances.
+
 Class Discrete (A : ofeT) := discrete_timeless (x : A) :> Timeless x.
 
 (** OFEs with a completion *)
@@ -1029,12 +1031,13 @@ Section sigma.
 
   Global Instance sig_timeless (x : sig P) :
     Timeless (proj1_sig x) → Timeless x.
-  Proof. intros ? y. destruct x, y. unfold dist, sig_dist, equiv, sig_equiv. apply (timeless _). Qed.
-  Global Instance sig_discrete_cofe : Discrete A → Discrete sigC.
   Proof.
-    intros ? [??] [??]. rewrite /dist /equiv /ofe_dist /ofe_equiv /=.
-    rewrite /sig_dist /sig_equiv /=. apply discrete_timeless.
-  Qed.
+    intros ? [b ?]; destruct x as [a ?].
+    rewrite /dist /ofe_dist /= /sig_dist /equiv /ofe_equiv /= /sig_equiv /=.
+    apply (timeless _).
+   Qed.
+  Global Instance sig_discrete_cofe : Discrete A → Discrete sigC.
+  Proof. intros ??. apply _. Qed.
 End sigma.
 
 Arguments sigC {_} _.
diff --git a/theories/base_logic/big_op.v b/theories/base_logic/big_op.v
index 8644cfaba..64075f8b7 100644
--- a/theories/base_logic/big_op.v
+++ b/theories/base_logic/big_op.v
@@ -115,10 +115,12 @@ Notation "'[∗' 'mset' ] x ∈ X , P" := (big_opMS (M:=uPredUR _) X (λ x, P))
 Class PersistentL {M} (Ps : list (uPred M)) :=
   persistentL : Forall PersistentP Ps.
 Arguments persistentL {_} _ {_}.
+Hint Mode PersistentL + ! : typeclass_instances.
 
 Class TimelessL {M} (Ps : list (uPred M)) :=
   timelessL : Forall TimelessP Ps.
 Arguments timelessL {_} _ {_}.
+Hint Mode TimelessP + ! : typeclass_instances.
 
 (** * Properties *)
 Section big_op.
diff --git a/theories/base_logic/derived.v b/theories/base_logic/derived.v
index 79f2970ac..c812280a8 100644
--- a/theories/base_logic/derived.v
+++ b/theories/base_logic/derived.v
@@ -31,10 +31,12 @@ Typeclasses Opaque uPred_except_0.
 
 Class TimelessP {M} (P : uPred M) := timelessP : ▷ P ⊢ ◇ P.
 Arguments timelessP {_} _ {_}.
+Hint Mode TimelessP + ! : typeclass_instances.
 
 Class PersistentP {M} (P : uPred M) := persistentP : P ⊢ □ P.
 Hint Mode PersistentP - ! : typeclass_instances.
 Arguments persistentP {_} _ {_}.
+Hint Mode PersistentP + ! : typeclass_instances.
 
 Module uPred.
 Section derived.
-- 
GitLab