(** Now the main hoare rules **)

Lemma hoare_while_wp : forall ps R e c Q,
TT |-- hoare_ ps R
(EX I:pred world,
(lift_nat
(hoare_ ps R
(EX v:nat, eval e (int_val v) && !!(v <> 0) && I)
c
(EX v:nat, eval e (int_val v) && I))) *
(lift_nat (lift (eval e (int_val 0) && I --> Q))) *
(EX v:nat, eval e (int_val v) && I))
(while e c)
Q.