Section protocols.
Class protocol {state : Type} (Iread Ifull : state -> Z -> mpred) :=
{ full_read s v : Ifull s v |-- |==> Ifull s v * Iread s v; read_dup s v : duplicable (Iread s v) }.
Global Instance dup_protocol {state} (T : state -> Z -> mpred) (Ht : forall s v, duplicable (T s v)) :
protocol T T.
Context {state : Type}.
Parameter protocol_A : val -> state -> (state -> state -> Prop) ->
((state -> Z -> mpred) * (state -> Z -> mpred)) -> mpred.
Context (ord : state -> state -> Prop) `{RelationClasses.PreOrder _ ord}
(Tread Tfull : state -> Z -> mpred).

Lemma protocol_A_super_non_expansive : forall n l s ord Tread Tfull,
approx n (protocol_A l s ord (Tread, Tfull)) =
approx n (protocol_A l s ord (fun s v => approx n (Tread s v), fun s v => approx n (Tfull s v))).