Я полагаю, вы говорите о просто типизированного лямбда-исчисления расширенной с типами данных int
и boolean
, с точки зрения _≤_
, 1
и 2
, а также правила типизации деривации
--------------------------------
Γ ⊢ _≤_ : int → int → boolean
------------
Γ ⊢ 1 : int
------------
Γ ⊢ 2 : int
Используя эти и стандартные STLC введите тип, тип вашего термина: неint → boolean
, скорее, это boolean
, как мы увидим ниже. Кроме того, он β-уменьшает до 2 ≤ 1
, так что это должно показать вам довольно легко, что это boolean
.
Но теперь к мясу его: типирование дерева вывода:
{x : int} ⊢ _≤_ : int → int → boolean {x : int} ⊢ x : int
----------------------------------------------------------------
{x : int} ⊢ x ≤_ : int → boolean {x: int} ⊢ 1 : int
--------------------------------------------------------------------
{x: int} ⊢ x ≤ 1 : boolean
Чтобы сэкономить на горизонтальном пространстве, давайте сделаем все остальное в новом дереве:
{x: int} ⊢ x ≤ 1 : boolean
----------------------------------------
{} ⊢ (λx : int. (x ≤ 1) : int → boolean {} ⊢ 2 : int
-------------------------------------------------------------------
{} ⊢ ((λx : int. (x ≤ 1)) 2) : boolean ∎