Черч-кодирование логического значения и STLC

Часто говорят, что

tru t f = t
fls t f = f

представляют True и False в том смысле, что «мы можем использовать эти термины для выполнения операции по проверке истинности логического значения».

Но за этим скрывается важное предостережение, поскольку оно кажется истинным только в нетипизированном лямбда-исчислении. Если я просто подставлю эти значения в haskell, я смогу написать функцию:

tryMeOnFalse ∷  (∀ t f. t → f → t) → String
tryMeOnFalse tr = "Hi"
a' = tryMeOnFalse tru
b' = tryMeOnFalse fls  -- type error !

что различает tru и fls на уровне типа. Насколько неправильно/правильно было бы сказать, что:

  • в STLC tru и fls являются свидетелями уровня значений некоторого расширенного типа 'Boolean, который имеет типы 'True и 'False
  • в STLC (принудительно) типизированные значения (tru :: ∀ t . t → t → t) и (fls :: ∀ t . t → t → t) представляют собой True и False (а в нетипизированных, как обычно)

Изменить: теперь я понимаю, благодаря ответу @Daniel Wagner, что я думал о лямбда-исчислении второго порядка, а не о STLC в своем вопросе.


person nicolas    schedule 05.06.2016    source источник


Ответы (1)


Это верно не только для нетипизированного лямбда-исчисления; но в типизированных исчислениях нужно быть немного осторожным с типизацией, как обычно. Мы должны определить:

type Boolean = forall r. r -> r -> r

У нас определенно есть tru, fls :: Boolean, и мы должны аннотировать их как таковые. Но у нас нет tryMeOnFalse :: Boolean -> String! Так что настоящего противоречия здесь нет.

Ваши комментарии о STLC немного странные, поскольку у STLC совсем другая система типизации. Нам потребуются отдельные логические типы для каждого типа результата, так как здесь нет полиморфизма.

В Haskell, безусловно, можно определить типы, которые содержат только tru или только fls (ну, конечно, каждый тип также содержит undefined); но это, как правило, не очень полезно.

person Daniel Wagner    schedule 05.06.2016
comment
Думаю, я путал STLC с типизированным исчислением второго порядка. когда вы определяете type Boolean = forall r. r -> r -> r, вы также используете его. - person nicolas; 05.06.2016
comment
Типичное название типизированного исчисления второго порядка — System F, fyi. - person Brendan Murphy; 01.11.2017