diff --git a/theories/base_logic/upred.v b/theories/base_logic/upred.v index 52ac2d274ef5a1939aa29c26e9b0d77db7d611e8..eec44f42d1184a029f0f7ac427ddabe77e43f49f 100644 --- a/theories/base_logic/upred.v +++ b/theories/base_logic/upred.v @@ -8,7 +8,26 @@ Set Default Proof Using "Type". Record uPred (M : ucmraT) : Type := IProp { uPred_holds :> nat → M → Prop; + + (* [uPred_mono] is used to prove non-expansiveness (guaranteed by + [uPred_ne]). Therefore, it is important that we do not restrict + it to only valid elements. *) uPred_mono n x1 x2 : uPred_holds n x1 → x1 ≼{n} x2 → uPred_holds n x2; + + (* We have to restrict this to hold only for valid elements, + otherwise this condition is no longer limit preserving, and uPred + does no longer form a COFE (i.e., [uPred_compl] breaks). This is + because the distance and equivalence on this cofe ignores the + truth valid on invalid elements. This, in turns, is required by + the fact that entailment has to ignore invalid elements, which is + itself essential for proving [ownM_valid]. + + We could, actually, make the following condition true even for + invalid elements: we have proved that uPred is isomorphic to a + sub-COFE of the COFE of predicates that are monotonous both with + respect to the step index and with respect to x. However, that + would essentially require changing (by making more complicated) + the model of many connectives of the logic, which we don't want. *) uPred_closed n1 n2 x : uPred_holds n1 x → n2 ≤ n1 → ✓{n2} x → uPred_holds n2 x }. Arguments uPred_holds {_} _ _ _ : simpl never.