Split the MakeXXX typeclasses into two, and add Hint Modes for them.
They are split into: 1- KnownMakeXXX , which only works if the parameter is not an evar. Hence, it will never force this evar to becomes e.g., emp or True. 2- MakeXXX, which works even if this is an evar, but it only has instances that will not instanciate arbitrarilly this evar.
... | ... | @@ -389,6 +389,94 @@ Instance maybe_frame_default {PROP : bi} (R P : PROP) : |
TCOr (Affine R) (Absorbing P) → MaybeFrame false R P P false | 100. | ||
Proof. intros. rewrite /MaybeFrame /=. apply: sep_elim_r. Qed. | ||
(* For each of the [MakeXxxx] class, there is a [KnownMakeXxxx] variant, | ||
|
||
that only succeeds if the parameter(s) is not an evar. In the case | ||
the parameter(s) is an evar, then [MakeXxxx] will not instantiate | ||
it arbitrarily. *) | ||
Class MakeEmbed `{BiEmbedding PROP PROP'} (P : PROP) (Q : PROP') := | ||
make_embed : ⎡P⎤ ⊣⊢ Q. | ||
Arguments MakeEmbed {_ _ _ _} _%I _%I. | ||
Hint Mode MakeEmbed + + + + - - : typeclass_instances. | ||
Class KnownMakeEmbed `{BiEmbedding PROP PROP'} (P : PROP) (Q : PROP') := | ||
go_make_embed :> MakeEmbed P Q. | ||
Arguments KnownMakeEmbed {_ _ _ _} _%I _%I. | ||
Hint Mode KnownMakeEmbed + + + + ! - : typeclass_instances. | ||
Class MakeSep {PROP : bi} (P Q PQ : PROP) := make_sep : P ∗ Q ⊣⊢ PQ . | ||
Arguments MakeSep {_} _%I _%I _%I. | ||
Hint Mode MakeSep + - - - : typeclass_instances. | ||
Class KnownLMakeSep {PROP : bi} (P Q PQ : PROP) := gol_make_sep :> MakeSep P Q PQ. | ||
Arguments KnownLMakeSep {_} _%I _%I _%I. | ||
Hint Mode KnownLMakeSep + ! - - : typeclass_instances. | ||
Class KnownRMakeSep {PROP : bi} (P Q PQ : PROP) := gor_make_sep :> MakeSep P Q PQ. | ||
Arguments KnownRMakeSep {_} _%I _%I _%I. | ||
Hint Mode KnownRMakeSep + - ! - : typeclass_instances. | ||
Class MakeAnd {PROP : bi} (P Q PQ : PROP) := make_and_l : P ∧ Q ⊣⊢ PQ. | ||
Arguments MakeAnd {_} _%I _%I _%I. | ||
Hint Mode MakeAnd + - - - : typeclass_instances. | ||
Class KnownLMakeAnd {PROP : bi} (P Q PQ : PROP) := gol_make_and :> MakeAnd P Q PQ. | ||
Arguments KnownLMakeAnd {_} _%I _%I _%I. | ||
Hint Mode KnownLMakeAnd + ! - - : typeclass_instances. | ||
Class KnownRMakeAnd {PROP : bi} (P Q PQ : PROP) := gor_make_and :> MakeAnd P Q PQ. | ||
Arguments KnownRMakeAnd {_} _%I _%I _%I. | ||
Hint Mode KnownRMakeAnd + - ! - : typeclass_instances. | ||
Class MakeOr {PROP : bi} (P Q PQ : PROP) := make_or_l : P ∨ Q ⊣⊢ PQ. | ||
Arguments MakeOr {_} _%I _%I _%I. | ||
Hint Mode MakeOr + - - - : typeclass_instances. | ||
Class KnownLMakeOr {PROP : bi} (P Q PQ : PROP) := gol_make_or :> MakeOr P Q PQ. | ||
Arguments KnownLMakeOr {_} _%I _%I _%I. | ||
Hint Mode KnownLMakeOr + ! - - : typeclass_instances. | ||
Class KnownRMakeOr {PROP : bi} (P Q PQ : PROP) := gor_make_or :> MakeOr P Q PQ. | ||
Arguments KnownRMakeOr {_} _%I _%I _%I. | ||
Hint Mode KnownRMakeOr + - ! - : typeclass_instances. | ||
Class MakeAffinely {PROP : bi} (P Q : PROP) := | ||
make_affinely :> bi_affinely P ⊣⊢ Q. | ||
Arguments MakeAffinely {_} _%I _%I. | ||
Hint Mode MakeAffinely + - - : typeclass_instances. | ||
Class KnownMakeAffinely {PROP : bi} (P Q : PROP) := | ||
go_make_affinely : MakeAffinely P Q. | ||
Arguments KnownMakeAffinely {_} _%I _%I. | ||
Hint Mode KnownMakeAffinely + ! - : typeclass_instances. | ||
Class MakeAbsorbingly {PROP : bi} (P Q : PROP) := | ||
make_absorbingly : bi_absorbingly P ⊣⊢ Q. | ||
Arguments MakeAbsorbingly {_} _%I _%I. | ||
Hint Mode MakeAbsorbingly + - - : typeclass_instances. | ||
Class KnownMakeAbsorbingly {PROP : bi} (P Q : PROP) := | ||
go_make_absorbingly :> MakeAbsorbingly P Q. | ||
Arguments KnownMakeAbsorbingly {_} _%I _%I. | ||
Hint Mode KnownMakeAbsorbingly + ! - : typeclass_instances. | ||
Class MakePersistently {PROP : bi} (P Q : PROP) := | ||
make_persistently : bi_persistently P ⊣⊢ Q. | ||
Arguments MakePersistently {_} _%I _%I. | ||
Hint Mode MakePersistently + - - : typeclass_instances. | ||
Class KnownMakePersistently {PROP : bi} (P Q : PROP) := | ||
go_make_persistently :> MakePersistently P Q. | ||
Arguments KnownMakePersistently {_} _%I _%I. | ||
Hint Mode KnownMakePersistently + ! - : typeclass_instances. | ||
Class MakeLaterN {PROP : sbi} (n : nat) (P lP : PROP) := | ||
make_laterN : ▷^n P ⊣⊢ lP. | ||
Arguments MakeLaterN {_} _%nat _%I _%I. | ||
Hint Mode MakeLaterN + + - - : typeclass_instances. | ||
Class KnownMakeLaterN {PROP : sbi} (n : nat) (P lP : PROP) := | ||
go_make_laterN :> MakeLaterN n P lP. | ||
Arguments KnownMakeLaterN {_} _%nat _%I _%I. | ||
Hint Mode KnownMakeLaterN + + ! - : typeclass_instances. | ||
Class MakeExcept0 {PROP : sbi} (P Q : PROP) := | ||
make_except_0 : sbi_except_0 P ⊣⊢ Q. | ||
Arguments MakeExcept0 {_} _%I _%I. | ||
Hint Mode MakeExcept0 + - - : typeclass_instances. | ||
Class KnownMakeExcept0 {PROP : sbi} (P Q : PROP) := | ||
go_make_except_0 :> MakeExcept0 P Q. | ||
Arguments KnownMakeExcept0 {_} _%I _%I. | ||
Hint Mode KnownMakeExcept0 + ! - : typeclass_instances. | ||
Class IntoExcept0 {PROP : sbi} (P Q : PROP) := into_except_0 : P ⊢ ◇ Q. | ||
Arguments IntoExcept0 {_} _%I _%I : simpl never. | ||
Arguments into_except_0 {_} _%I _%I {_}. | ||
... | ... |