The core STLC types and terms are 𝐴,𝐵::=𝑃∣𝟐∣𝐴→𝐵,𝑒::=𝑥∣𝜆𝑥:𝐴.𝑒∣𝑒𝑒∣𝗍𝗍∣𝖿𝖿∣𝗂𝖿(𝑒;𝑒;𝑒). Type and context formation are generated by
𝑃𝗍𝗒𝗉𝖾
Ty-Atom
𝟐𝗍𝗒𝗉𝖾
Ty-Bool
𝐴𝗍𝗒𝗉𝖾𝐵𝗍𝗒𝗉𝖾
𝐴→𝐵𝗍𝗒𝗉𝖾
Ty-Arr
⋅𝖼𝗍𝗑
Cx-Emp
Γ𝖼𝗍𝗑𝐴𝗍𝗒𝗉𝖾𝑥∉dom(Γ)
Γ,𝑥:𝐴𝖼𝗍𝗑
Cx-Ext
Rule instances below range over well-formed contexts and types; in Lam, the context-formation convention supplies 𝑥∉dom(Γ).
(𝑥:𝐴)∈Γ
Γ⊢𝑥:𝐴
Var
Γ⊢𝗍𝗍:𝟐
True
Γ⊢𝖿𝖿:𝟐
False
Γ⊢𝑒:𝟐Γ⊢𝑒1:𝐶Γ⊢𝑒2:𝐶
Γ⊢𝗂𝖿(𝑒;𝑒1;𝑒2):𝐶
If
Γ,𝑥:𝐴⊢𝑒:𝐵
Γ⊢𝜆𝑥:𝐴.𝑒:𝐴→𝐵
Lam
Γ⊢𝑒1:𝐴→𝐵Γ⊢𝑒2:𝐴
Γ⊢𝑒1𝑒2:𝐵
App
Core values are 𝑣::=𝗍𝗍∣𝖿𝖿∣𝜆𝑥:𝐴.𝑒. The core call-by-value dynamics are
𝑒1⟼𝑒′1
𝑒1𝑒2⟼𝑒′1𝑒2
E-AppL
𝑣1𝗏𝖺𝗅𝗎𝖾𝑒2⟼𝑒′2
𝑣1𝑒2⟼𝑣1𝑒′2
E-AppR
𝑣𝗏𝖺𝗅𝗎𝖾
(𝜆𝑥:𝐴.𝑏)𝑣⟼𝑏[𝑣/𝑥]
E-Beta
𝑒⟼𝑒′
𝗂𝖿(𝑒;𝑒1;𝑒2)⟼𝗂𝖿(𝑒′;𝑒1;𝑒2)
E-If
𝗂𝖿(𝗍𝗍;𝑒1;𝑒2)⟼𝑒1
E-True
𝗂𝖿(𝖿𝖿;𝑒1;𝑒2)⟼𝑒2
E-False
The propositional extension adds 𝐴,𝐵::=⋯∣𝐴×𝐵∣𝐴+𝐵∣𝟏∣𝟎,𝑒::=⋯∣(𝑒1,𝑒2)∣𝖿𝗌𝗍(𝑒)∣𝗌𝗇𝖽(𝑒)∣⋆∣𝗂𝗇𝗅(𝑒)∣𝗂𝗇𝗋(𝑒)∣𝖼𝖺𝗌𝖾(𝑒;𝑥.𝑒1;𝑦.𝑒2)∣𝖺𝖻𝗈𝗋𝗍𝐴(𝑒). Its formation and typing rules are
𝐴𝗍𝗒𝗉𝖾𝐵𝗍𝗒𝗉𝖾
𝐴×𝐵𝗍𝗒𝗉𝖾
Ty-Prod
𝐴𝗍𝗒𝗉𝖾𝐵𝗍𝗒𝗉𝖾
𝐴+𝐵𝗍𝗒𝗉𝖾
Ty-Sum
𝟏𝗍𝗒𝗉𝖾
Ty-Unit
𝟎𝗍𝗒𝗉𝖾
Ty-Empty
Γ⊢𝑒1:𝐴Γ⊢𝑒2:𝐵
Γ⊢(𝑒1,𝑒2):𝐴×𝐵
Pair
Γ⊢𝑒:𝐴×𝐵
Γ⊢𝖿𝗌𝗍(𝑒):𝐴
Fst
Γ⊢𝑒:𝐴×𝐵
Γ⊢𝗌𝗇𝖽(𝑒):𝐵
Snd
Γ⊢⋆:𝟏
Unit-I
Γ⊢𝑒:𝐴𝐵𝗍𝗒𝗉𝖾
Γ⊢𝗂𝗇𝗅(𝑒):𝐴+𝐵
Inl
𝐴𝗍𝗒𝗉𝖾Γ⊢𝑒:𝐵
Γ⊢𝗂𝗇𝗋(𝑒):𝐴+𝐵
Inr
Γ⊢𝑒:𝐴+𝐵Γ,𝑥:𝐴⊢𝑒1:𝐶Γ,𝑦:𝐵⊢𝑒2:𝐶
Γ⊢𝖼𝖺𝗌𝖾(𝑒;𝑥.𝑒1;𝑦.𝑒2):𝐶
Case
Γ⊢𝑒:𝟎𝐶𝗍𝗒𝗉𝖾
Γ⊢𝖺𝖻𝗈𝗋𝗍𝐶(𝑒):𝐶
Empty-E
Extended values add ⋆,(𝑣1,𝑣2),𝗂𝗇𝗅(𝑣),𝗂𝗇𝗋(𝑣). Their call-by-value rules are
𝑒1⟼𝑒′1
(𝑒1,𝑒2)⟼(𝑒′1,𝑒2)
E-PairL
𝑣1𝗏𝖺𝗅𝗎𝖾𝑒2⟼𝑒′2
(𝑣1,𝑒2)⟼(𝑣1,𝑒′2)
E-PairR
𝑒⟼𝑒′
𝖿𝗌𝗍(𝑒)⟼𝖿𝗌𝗍(𝑒′)
E-Fst
𝑣1𝗏𝖺𝗅𝗎𝖾𝑣2𝗏𝖺𝗅𝗎𝖾
𝖿𝗌𝗍((𝑣1,𝑣2))⟼𝑣1
E-Fst-Pair
𝑒⟼𝑒′
𝗌𝗇𝖽(𝑒)⟼𝗌𝗇𝖽(𝑒′)
E-Snd
𝑣1𝗏𝖺𝗅𝗎𝖾𝑣2𝗏𝖺𝗅𝗎𝖾
𝗌𝗇𝖽((𝑣1,𝑣2))⟼𝑣2
E-Snd-Pair
𝑒⟼𝑒′
𝗂𝗇𝗅(𝑒)⟼𝗂𝗇𝗅(𝑒′)
E-Inl
𝑒⟼𝑒′
𝗂𝗇𝗋(𝑒)⟼𝗂𝗇𝗋(𝑒′)
E-Inr
𝑒⟼𝑒′
𝖼𝖺𝗌𝖾(𝑒;𝑥.𝑒1;𝑦.𝑒2)⟼𝖼𝖺𝗌𝖾(𝑒′;𝑥.𝑒1;𝑦.𝑒2)
E-Case
𝑣𝗏𝖺𝗅𝗎𝖾
𝖼𝖺𝗌𝖾(𝗂𝗇𝗅(𝑣);𝑥.𝑒1;𝑦.𝑒2)⟼𝑒1[𝑣/𝑥]
E-Case-L
𝑣𝗏𝖺𝗅𝗎𝖾
𝖼𝖺𝗌𝖾(𝗂𝗇𝗋(𝑣);𝑥.𝑒1;𝑦.𝑒2)⟼𝑒2[𝑣/𝑦]
E-Case-R
𝑒⟼𝑒′
𝖺𝖻𝗈𝗋𝗍𝐴(𝑒)⟼𝖺𝖻𝗈𝗋𝗍𝐴(𝑒′)
E-Abort
There is no root contraction for abort. Call-by-name on the untyped core uses 𝐹::=[−]∣𝐹𝑒∣𝗂𝖿(𝐹;𝑒1;𝑒2) and the roots (𝜆𝑥.𝑏)𝑎⟼n𝑏[𝑎/𝑥],𝗂𝖿(𝗍𝗍;𝑒1;𝑒2)⟼n𝑒1,𝗂𝖿(𝖿𝖿;𝑒1;𝑒2)⟼n𝑒2.
The propositional natural-deduction rules are
(ℎ:𝐴)∈Δ
Δ⊢𝖭𝐴
Hyp
Δ⊢𝖭⊤
→p I
Δ⊢𝖭⊥
Δ⊢𝖭𝐶
E
Δ⊢𝖭𝐴Δ⊢𝖭𝐵
Δ⊢𝖭𝐴∧𝐵
I
Δ⊢𝖭𝐴∧𝐵
Δ⊢𝖭𝐴
E_1
Δ⊢𝖭𝐴∧𝐵
Δ⊢𝖭𝐵
E_2
Δ,ℎ:𝐴⊢𝖭𝐵
Δ⊢𝖭𝐴⇒𝐵
I
Δ⊢𝖭𝐴⇒𝐵Δ⊢𝖭𝐴
Δ⊢𝖭𝐵
E
Δ⊢𝖭𝐴
Δ⊢𝖭𝐴∨𝐵
I_1
Δ⊢𝖭𝐵
Δ⊢𝖭𝐴∨𝐵
I_2
Δ⊢𝖭𝐴∨𝐵Δ,ℎ:𝐴⊢𝖭𝐶Δ,𝑘:𝐵⊢𝖭𝐶
Δ⊢𝖭𝐶
E
Finally, the proof root relation is (𝜆𝑥:𝐴.𝑏)𝑎⇝𝗉𝑏[𝑎/𝑥],𝖿𝗌𝗍((𝑎,𝑏))⇝𝗉𝑎,𝗌𝗇𝖽((𝑎,𝑏))⇝𝗉𝑏,𝖼𝖺𝗌𝖾(𝗂𝗇𝗅(𝑎);𝑥.𝑏;𝑦.𝑐)⇝𝗉𝑏[𝑎/𝑥],𝖼𝖺𝗌𝖾(𝗂𝗇𝗋(𝑎);𝑥.𝑏;𝑦.𝑐)⇝𝗉𝑐[𝑎/𝑦],𝗂𝖿(𝗍𝗍;𝑏;𝑐)⇝𝗉𝑏,𝗂𝖿(𝖿𝖿;𝑏;𝑐)⇝𝗉𝑐. Its compatible closure is generated by 𝐾::=[−]∣𝜆𝑥:𝐴.𝐾∣𝐾𝑒∣𝑒𝐾∣𝗂𝖿(𝐾;𝑒1;𝑒2)∣𝗂𝖿(𝑒;𝐾;𝑒2)∣𝗂𝖿(𝑒;𝑒1;𝐾)∣(𝐾,𝑒)∣(𝑒,𝐾)∣𝖿𝗌𝗍(𝐾)∣𝗌𝗇𝖽(𝐾)∣𝗂𝗇𝗅(𝐾)∣𝗂𝗇𝗋(𝐾)∣𝖺𝖻𝗈𝗋𝗍𝐴(𝐾)∣𝖼𝖺𝗌𝖾(𝐾;𝑥.𝑒1;𝑦.𝑒2)∣𝖼𝖺𝗌𝖾(𝑒;𝑥.𝐾;𝑦.𝑒2)∣𝖼𝖺𝗌𝖾(𝑒;𝑥.𝑒1;𝑦.𝐾). The closure rule is 𝑟⇝𝗉𝑞𝐾[𝑟]⟶𝗉𝐾[𝑞]P−Ctx.