Section LoopLift.
Variable A B : Type. (* Abstract state *)
Variable lift : A -> B. (* Lifting function between state *)
Variable (f : A -> A) (f' : B -> B). (* Abstract steps *)
Variable (h : A -> bool) (h' : B -> bool). (* Abstract halting state *)
Hypothesis halt_lift_comp : forall x:A, h' (lift x) = h x.
Hypothesis step_lift_comp : forall x:A, h x = false -> f' (lift x) = lift (f x).

Lemma loop_lift (k : nat) (a a' : A) :
loop (A := A) f  h  a        k = Some a' ->
loop (A := B) f' h' (lift a) k = Some (lift a').