(** Now the main hoare rules **)

Lemma hoare_while : forall ps R e c I n,
hoare_ ps R
(EX v:nat, eval e (int_val v) && !!(v <> 0) && I)
c
(EX v:nat, eval e (int_val v) && I) n ->
hoare_ ps R
(EX v:nat, eval e (int_val v) && I)
(while e c)
(eval e (int_val 0) && I) n.