Local Open Scope kripke_model.
Inductive MetaState (state: Type): Type :=
| Error: MetaState state
| NonTerminating: MetaState state
| Terminating: state -> MetaState state.
Arguments Error {_}.
Arguments NonTerminating {_}.
Arguments Terminating {_} _.
Module Type FORWARD.
Parameter forward: forall {state: Type} {state_R: Relation state},
MetaState state -> MetaState state -> Prop.
End FORWARD.
Module Partial <: FORWARD.
Inductive forward'
{state: Type}
{state_R: Relation state}:
MetaState state -> MetaState state -> Prop :=
| forward_Error:
forward' Error Error
| forward_NonTerminating:
forward' NonTerminating NonTerminating
| forward_Terminating_NonTerminating:
forall x, forward' (Terminating x) NonTerminating
| forward_Terminating:
forall x y, x <= y -> forward' (Terminating x) (Terminating y).
Definition forward {state: Type} {state_R: Relation state} := forward'.
End Partial.
Module Total <: FORWARD.
Inductive forward'
{state: Type}
{state_R: Relation state}:
MetaState state -> MetaState state -> Prop :=
| forward_Error:
forward' Error Error
| forward_NonTerminating:
forward' NonTerminating NonTerminating
| forward_Terminating:
forall x y, x <= y -> forward' (Terminating x) (Terminating y).
Definition forward {state: Type} {state_R: Relation state} := forward'.
End Total.

(* Specifications: *)
Lemma Total2Partial_forward {state: Type} {state_R: Relation state}: forall ms1 ms2,
Total.forward ms1 ms2 -> Partial.forward ms1 ms2.