%%% Intrinsically typed lambda terms
ty : type.
i : ty.
arr : ty -> ty -> ty.
tm : ty -> type.
lam : {A:ty} {B:ty} (tm A -> tm B) -> tm (arr A B).
app : {A:ty} {B:ty} tm (arr A B) -> tm A -> tm B.
eval : {A:ty} tm A -> tm A -> type.
eval/lam : {A:ty} {B:ty} {R:tm A -> tm B}
eval (arr A B) (lam A B R) (lam A B R).
eval/app : {A:ty} {B:ty} {M:tm (arr A B)} {N:tm A} {R:tm A -> tm B} {V:tm B}
eval (arr A B) M (lam A B R) ->
eval B (R N) V ->
eval B (app A B M N) V.
step : {A:ty} tm A -> tm A -> type.
step/reduce : {A:ty} {B:ty} {R:tm A -> tm B} {N:tm A}
step B (app A B (lam A B R) N) (R N).
step/head : {A:ty} {B:ty} {M1:tm (arr A B)} {M2:tm (arr A B)} {N:tm A}
step B (app A B M1 N) (app A B M2 N).
nstep : {A:ty} tm A -> tm A -> type.
nstep/zero : {A:ty} {M:tm A} nstep A M M.
nstep/succ : {A:ty} {M1:tm A} {M2:tm A} {N:tm A}
step A M1 M2 -> nstep A M2 N -> nstep A M1 N.
value : {A:ty} tm A -> type.
value/abs : {A:ty} {B:ty} {R:tm A -> tm B} value (arr A B) (lam A B R).
Click on a command or tactic to see a detailed view of its use.
Specification "intrinsic.elf". Define progr : lfobj -> lfobj -> prop by progr A M := <A:ty> /\ <M:tm A> /\ exists P, <P:value A M> ; progr A M := <A:ty> /\ <M:tm A> /\ exists N P, <N:tm A> /\ <P:step A M N>. Theorem progress : forall A M, <A:ty> -> <M:tm A> -> progr A M.