End SimpleArith3.
Inductive value : tm -> Prop :=
| v_const : forall n, value (C n).
Instance dec_value t : Dec (value t).
constructor; unfold decidable.
destruct t.
- left; constructor; auto.
- right=> contra. inversion contra.
Defined.
Derive ArbitrarySizedSuchThat for (fun t => value t).
Reserved Notation " t '===>' t' " (at level 40).
Inductive step : tm -> tm -> Prop :=
| ST_PlusConstConst : forall n1 n2,
P (C n1) (C n2)
===> C (n1 + n2)
| ST_Plus1 : forall t1 t1' t2,
t1 ===> t1' ->
P t1 t2 ===> P t1' t2
| ST_Plus2 : forall v1 t2 t2',
value v1 ->                     (* <----- n.b. *)
t2 ===> t2' ->
P v1 t2 ===> P v1 t2'
where " t '===>' t' " := (step t t').

(* Specifications: *)
Theorem step_deterministic :
deterministic step.