Каково математическое значение "все (==1) [1,1..] "не прекращается?
Интуитивно я ожидал бы, что "математический" ответ на all (==1) [1,1..]
будет True
, потому что все элементы в списке, который содержит только 1, равны 1. Однако я понимаю ,что" вычислительно "процесс вычисления бесконечного списка, чтобы проверить, что каждый элемент действительно равен 1, никогда не закончится,поэтому выражение вместо этого "вычисляет" до дна или ⊥
.
⊥
или True
?
Было бы также весьма полезно уточнить, почему один ответ является более правильным, чем другой.
Edit: это может косвенно иметь отношение к изоморфизму Карри-Говарда (программы - это доказательства и типы теоремы) итеоремы неполноты Геделя . Если я правильно помню, одна из теорем неполноты может быть(невероятно грубо) резюмирована следующим образом: "достаточно мощные формальные системы (такие как математика или язык программирования) не могут доказать все истинные утверждения, которые могут быть выражены в системе"
3 ответа:
Значение
all (==1) [1,1..]
- наименьшая верхняя граница последовательности
all (==1) (⊥) all (==1) (1 : ⊥) all (==1) (1 : 1 : ⊥) ...
И все члены этой последовательности являются ⊥, поэтому наименьшая верхняя граница также является ⊥. (Все функции Хаскелла непрерывны: сохраняют наименьшие верхние границы.)
Это использование денотационной семантики для Хаскелла и не зависит (напрямую) от выбора какой-либо конкретной стратегии оценки.
В программировании мы используем не классическую логику, а интуитивистскую (конструктивную) логику. Мы все еще можем интерпретировать типы как теоремы, но нас не волнует истинность этих теорем; вместо этого мы говорим о том, являются ли они конструктивно доказуемыми . Хотя
В конструктивной логике у нас нет ни закона исключенной середины, ни двойного отрицания. в результате. Функция Хаскелла типаall (== 1) [1, 1 ..]
является истинным , мы не можем доказать это в Хаскелле, поэтому мы получаем ⊥ (здесь, бесконечный цикл).all (== 1) :: [Int] -> Bool
не представляет теорему [Int] → Bool, которая была бы полной функцией; она представляет теорему [Int] → Bool. Еслиall
может доказать теорему, произведя результат, то этот результат будет иметь типBool
; в противном случае результат будет нижним.
Я не знаю достаточно о вычисляемости, чтобы ответить на этот вопрос правильно, но я утешаюсь простотой в языковом дизайне. В этом случае я нахожу простым и элегантным, что
Конечно, теперь было бы хорошо для понимания бесконечного списка как-то сказатьall
не должен ничего знать о вводе, который он дает. Возможно, человеку проще рассуждать о фрагменте, который вы дали.all
, что это бесконечный список единиц. Но... вот что там написано " by быть такой ценностью". Наличие немного более общих метаданных о повторяющейся последовательности было бы более успешным для целей оптимизации, но я думаю, что простота будет уменьшена, а сложность введена.