(* Definition of the hoare relation and rules *)
Definition hoare (t:terminationMeasure) (n':nat) (G R P:pred world) (c:instruction) (Q:pred world) :=
forall t', termMeasure_incr t t' ->
forall p n k stk,
(forall s, G (p,(s,t'))) ->
(forall r', guards n R stk       (p,(r',t'))) ->
(forall r', guards n Q (k::stk)  (p,(r',t'))) ->
(forall r,  guards (n'+n) P ((c ;; k)::stk) (p,(r,t'))).

Lemma hoare_call : forall t x G R v Q,
let wp :=
EX l:label, EX A:Type, EX lP:(A->pred world), EX lQ:(A -> pred world), EX n':nat, EX a:A,
store_op (fun r => r#v = Some (value_label l) /\ t l r = Some n' /\ n' < x) &&
(G --> funptr l A lP lQ) &&
lP a && (closed (lQ a --> Q))
in
hoare t x G R wp (instr_call v) Q.