Module mtc:lambda
Builds on mtc:shared_declarations
e ::= ...
| abs(string, ty, e)
| app(e, e)
| var(string)
v ::= ...
| closure([(string, v)], string, e)
ty ::= ...
| arrowTy(ty, ty)
typeOf (X, Ty1)::G E Ty2
----------------------------------------- [T-Abs]
typeOf G abs(X, Ty1, E) arrowTy(Ty1, Ty2)
typeOf G E1 arrowTy(Ty1, Ty2)
typeOf G E2 Ty1
----------------------------- [T-App]
typeOf G app(E1, E2) Ty2
lookup G X Ty
------------------ [T-Var]
typeOf G var(X) Ty
-------------------------------------- [E-Abs]
eval G abs(X, Ty1, E) closure(G, X, E)
eval G E1 closure(GC, X, Body)
eval G E2 V2
eval (X, V2)::GC Body V
------------------------------ [E-App]
eval G app(E1, E2) V
lookup G X V
--------------- [E-Var]
eval G var(X) V
typeOfCtx TG G
typeOf (X, Ty1)::TG E Ty2
-------------------------------------------- [VT-Closure]
valueType closure(G, X, E) arrowTy(Ty1, Ty2)
evalStep E1 E11
--------------------------------- [ES-App-Step1]
evalStep app(E1, E2) app(E11, E2)
value E1
evalStep E2 E21
--------------------------------- [ES-App-Step2]
evalStep app(E1, E2) app(E1, E21)
value E2
subst X E2 E1 E
---------------------------------- [ES-App-Subst]
evalStep app(abs(X, Ty, E1), E2) E
------------------- [V-Abs]
value abs(X, Ty, E)
------------------------------------- [S-Abs-Same]
subst X R abs(X, Ty, E) abs(X, Ty, E)
X != Y
subst X R E E1
-------------------------------------- [S-Abs-Diff]
subst X R abs(Y, Ty, E) abs(Y, Ty, E1)
subst X R E1 E11
subst X R E2 E21
----------------------------------- [S-App]
subst X R app(E1, E2) app(E11, E21)
------------------ [S-Var-Same]
subst X R var(X) R
X != Y
----------------------- [S-Var-Diff]
subst X R var(Y) var(Y)
-------------------------------------- [C-ArrowTy]
canon arrowTy(Ty1, Ty2) abs(X, Ty1, E)
---------------------------- [Proj-Abs]
|{e}- abs(X, Ty, E) ~~> nilE
-------------------------- [Proj-App]
|{e}- app(E1, E2) ~~> nilE
--------------------- [Proj-Var]
|{e}- var(X) ~~> nilE
------------------------------- [Proj-Closure]
|{v}- closure(G, X, E) ~~> nilV
---------------------------------- [Proj-ArrowTy]
|{ty}- arrowTy(Ty1, Ty2) ~~> nilTy
Click on a command or tactic to see a detailed view of its use.
Module mtc:lambda. Theorem typeOfCtx_lookups : forall TG EG X Ty V, typeOfCtx TG EG -> lookup TG X Ty -> lookup EG X V -> valueType V Ty. [Show Proof] Prove mtc:shared_declarations:type_preservation. [Show Proof] Prove mtc:shared_declarations:value_evalStep_false. [Show Proof] Prove mtc:shared_declarations:subst_unique. [Show Proof] Prove mtc:shared_declarations:evalStep_unique. [Show Proof] Prove mtc:shared_declarations:ty_lookup. [Show Proof] Prove mtc:shared_declarations:subst_preservation. [Show Proof] Prove mtc:shared_declarations:evalStep_type_preservation. [Show Proof] Prove mtc:shared_declarations:canonical_form. [Show Proof] Prove mtc:shared_declarations:subst_is. [Show Proof] Prove mtc:shared_declarations:evalStep_is. [Show Proof] Prove mtc:shared_declarations:subst_total. [Show Proof] Prove mtc:shared_declarations:progress. [Show Proof]