diff --git a/theories/base_logic/upred.v b/theories/base_logic/upred.v index d51b589e125c07c5b891f08091498c2055e8ca60..6a7aa906bb6587c659406613a70c816319eb0d1b 100644 --- a/theories/base_logic/upred.v +++ b/theories/base_logic/upred.v @@ -6,6 +6,40 @@ Set Default Proof Using "Type". base_logic.base_logic; that will also give you all the primitive and many derived laws for the logic. *) +(* A good way of understanding this definition of the uPred OFE is to + consider the OFE uPred0 of monotonous SProp predicates. That is, + uPred0 is the OFE of non-expansive functions from M to SProp that + are monotonous with respect to CMRA inclusion. This notion of + monotonicity has to be stated in the SProp logic. Together with the + usual closedness property of SProp, this gives exactly uPred_mono. + + Then, we quotient uPred0 *in the sProp logic* with respect to + equivalence on valid elements of M. That is, we quotient with + respect to the following *sProp* equivalence relation: + P1 ≡ P2 := ∀ x, ✓ x → (P1(x) ↔ P2(x)) (1) + When seen from the ambiant logic, obtaining this quotient requires + definig both a custom Equiv and Dist. + + + It is worth noting that this equivalence relation admits canonical + representatives. More precisely, one can show that every + equivalence class contains exactly one element P0 such that: + ∀ x, (✓ x → P(x)) → P(x) (2) + (Again, this assertion has to be understood in sProp). Starting + from an element P of a given class, one can build this canonical + representative by chosing: + P0(x) := ✓ x → P(x) (3) + + Hence, as an alternative definition of uPred, we could use the set + of canonical representatives (i.e., the subtype of monotonous + sProp predicates that verify (2)). This alternative definition would + save us from using a quotient. However, the definitions of the various + connectives would get more complicated, because we have to make sure + they all verify (2), which sometimes requires some adjustments. We + would moreover need to prove one more property for every logical + connective. + *) + Record uPred (M : ucmraT) : Type := IProp { uPred_holds :> nat → M → Prop; @@ -23,40 +57,6 @@ Arguments uPred_holds {_} _%I _ _. Section cofe. Context {M : ucmraT}. - (* A good way of understanding this definition of the uPred OFE is to - consider the OFE uPred0 of monotonous SProp predicates. That is, - uPred0 is the OFE of non-expansive functions from M to SProp that - are monotonous with respect to CMRA inclusion. This notion of - monotonicity has to be stated in the SProp logic. Together with the - usual closedness property of SProp, this gives exactly uPred_mono. - - Then, we quotient uPred0 *in the sProp logic* with respect to - equivalence on valid elements of M. That is, we quotient with - respect to the following *sProp* equivalence relation: - P1 ≡ P2 := ∀ x, ✓ x → (P1(x) ↔ P2(x)) (1) - When seen from the ambiant logic, obtaining this quotient requires - definig both a custom Equiv and Dist. - - - It is worth noting that this equivalence relation admits canonical - representatives. More precisely, one can show that every - equivalence class contains exactly one element P0 such that: - ∀ x, (✓ x → P(x)) → P(x) (2) - (Again, this assertion has to be understood in sProp). Starting - from an element P of a given class, one can build this canonical - representative by chosing: - P0(x) := ✓ x → P(x) (3) - - Hence, as an alternative definition of uPred, we could use the set - of canonical representatives (i.e., the subtype of monotonous - sProp predicates that verify (2)). This alternative definition would - save us from using a quotient. However, the definitions of the various - connectives would get more complicated, because we have to make sure - they all verify (2), which sometimes requires some adjustments. We - would moreover need to prove one more property for every logical - connective. - *) - Inductive uPred_equiv' (P Q : uPred M) : Prop := { uPred_in_equiv : ∀ n x, ✓{n} x → P n x ↔ Q n x }. Instance uPred_equiv : Equiv (uPred M) := uPred_equiv'.