End InjectLemmas.
Section InductiveInvLemmas.
Variable pr : protocol.
Notation l := (plab pr).
Variable I : dstatelet -> pred nid -> Prop.
Variable ii : InductiveInv pr I.
(* Tailored modal always-lemma *)
Variables (A : Type) (this: nid).
Notation V := (mkWorld pr).
Notation W := (mkWorld (ProtocolWithIndInv ii)).
Variable (e : DT this V A).
(*  [Inferences rule for invariant strengthening]  This rule essentially means that we can always verify the program in stronger assumptions (i.e., in a protocol, enriched with the inductive invariant), if we can provide this protocol in the first place. We can then also make use of the invariant.  *)
Notation getS i := (getStatelet i l).

(* Specifications: *)
Lemma with_inv_rule' i (r : cont A) :
verify i e (fun x m =>
I (getS m) (nodes pr (getS m)) -> r x m) ->
verify i (with_inv ii e) r.
Lemma with_inv_rule i (r : cont A) :
verify i e (fun x m => r x m) ->
verify i (with_inv ii e) r.