Цель состоит в том, чтобы отсортировать все или, по крайней мере, подмножество сигнатур недопустимых типов, подобных приведенным выше. Я благодарен за каждую подсказку.
Вы можете ознакомиться с перепиской Карри и Ховарда.
В основном типы в функциональных программах соответствуют логическим формулам. Просто замените ->
на импликацию, (,)
на союз (И) и Either
на дизъюнкт (ИЛИ). Обитаемые типы — это именно те, у которых есть соответствующая формула, являющаяся тавтологией в интуиционистской логике.
Существуют алгоритмы, которые могут определить доказуемость в интуиционистской логике (например, использование исключения вырезания в последовательностях Генцена), но проблема PSPACE-полна, поэтому в целом мы не можем работать с очень большими типами. Тем не менее, для шрифтов среднего размера алгоритм удаления вырезов работает нормально.
Если вам нужно только подмножество необитаемых типов, вы можете ограничиться теми, у которых есть соответствующая формула, которая НЕ является тавтологией в классической логике. Это правильно, поскольку интуиционистские тавтологии также являются классическими. Проверить, не является ли формула P
классической тавтологией, можно, спросив, является ли not P
выполнимой формулой. Значит, проблема в НП. Ненамного, но лучше, чем PSPACE-complete.
Например, оба вышеупомянутых типа
a -> b
(a -> b) -> a -> c
явно НЕ тавтологии! Следовательно, они не заселены.
Наконец, обратите внимание, что в Haskell undefined :: T
и let x = x in x :: T
для любого типа T
, поэтому технически каждый тип является обитаемым. Как только кто-то ограничивается завершением программ, свободных от ошибок времени выполнения, мы получаем более осмысленное понятие «заселенных», к которому обращается переписка Карри-Ховарда.
person
chi
schedule
13.02.2018
djinn-lib
и/илиdjinn-ghc
несколько полезными. См. такжеdjinn
. См. также hedonisticlearning.com/djinn и обратите внимание, что lambdabot также умеет использовать djinn. - person dfeuer   schedule 13.02.2018