Что означает Ошибка: несогласованность Вселенной в Coq?

Я работаю с Основами программного обеспечения и в настоящее время выполняю упражнения по церковным числам. . Вот подпись типа натурального числа:

Definition nat := forall X : Type, (X -> X) -> X -> X.

Я определил функцию succ типа nat -> nat. Теперь я хотел бы определить такую ​​функцию сложения:

Definition plus (n m : nat) : nat := n nat succ m.

Однако я получаю следующее сообщение об ошибке:

Error: Universe inconsistency.

Что на самом деле означает это сообщение об ошибке?


person augurar    schedule 22.08.2015    source источник
comment
Вы можете передать флаг -type-in-type в Coq, чтобы отключить все проверки согласованности юниверса. Использование этого флага опасно, поскольку оно разрешает парадокс Жирара (объяснено здесь) .   -  person Konstantin Weitz    schedule 23.08.2015
comment
Обратите внимание, что -type-in-type работает только для бета-версии Coq 8.5 (не для текущей стабильной версии 8.4)   -  person Catalin Hritcu    schedule 14.09.2015


Ответы (1)


В Coq у всего есть тип. Type не является исключением: если вы спросите Coq с командой Check, он скажет вам, что его тип ... Type!

На самом деле это немного неправда. Если вы запросите более подробную информацию, выполнив директиву Set Printing Universes., Coq сообщит вам, что этот Type не такой же, как первый, а более крупный. Формально с каждым Type связан индекс, называемый его уровнем юниверса. Этот индекс обычно не отображается при печати выражений. Таким образом, правильный ответ на этот вопрос состоит в том, что Type_i имеет тип Type_j для любого индекса j > i. Это необходимо для обеспечения непротиворечивости теории Кока: если бы был только один Type, можно было бы показать противоречие, подобно тому, как можно получить противоречие в теории множеств, если предположить, что существует множество всех множеств.

Чтобы упростить работу с индексами типов, Coq дает вам некоторую гибкость: на самом деле ни один тип не имеет связанного с ним фиксированного индекса. Вместо этого Coq генерирует одну новую индексную переменную каждый раз, когда вы пишете Type, и отслеживает внутренние ограничения, чтобы гарантировать, что они могут быть созданы с конкретными значениями, которые удовлетворяют ограничениям, требуемым теорией.

Сообщение об ошибке, которое вы видели, означает, что решатель ограничений Coq для уровней юниверса говорит, что не может быть решения для системы ограничений, которую вы просили. Проблема в том, что forall в определении nat количественно превышает Type_i, но логика Coq заставляет nat быть самим собой типа Type_j с j > i. С другой стороны, приложение n nat требует этого j <= i, что приводит к невыполнимому набору ограничений индекса.

person Arthur Azevedo De Amorim    schedule 22.08.2015
comment
Есть ли способ определить плюс, повторяя функцию succ, как пытался сделать OP, и проверить ее тип? Единственный способ, которым мне это удалось, - это встраивание определений succ и нуля, и результат выглядел совершенно ужасно. - person hugomg; 15.09.2016
comment
@hugomg Добавьте Set Universe Polymorphism. перед определением nat. Это должно решить проблему. - person Anton Trunov; 13.01.2017
comment
@hugomg Вместо того, чтобы определять добавление как n succ m, вы можете определить его как λ f. λ x. n f (m f x). - person augurar; 14.01.2017
comment
конечно, но вы не можете сделать что-то подобное с возведением в степень. Вы должны определить это как повторное умножение. - person hugomg; 14.01.2017
comment
@hugomg Вы можете определить возведение в степень без повторного умножения. См. Статью Церковное кодирование в Википедии. В Coq почти то же самое, просто нужно разобраться с параметрами типа. - person Anton Trunov; 22.03.2018
comment
@AntonTrunov Не могли бы вы подробнее рассказать о том, как избежать повторного умножения? Я пробовал немного сейчас, но не могу понять, как настроить параметры типа. - person LeonidR; 04.03.2019
comment
@LeonidR Definition exp (n m : nat) : nat := fun X => m (X -> X) (n X). Фактически, Coq может вывести аргументы типа, т.е. следующее также работает Definition exp (n m : nat) : nat := fun X => m _ (n _).. - person Anton Trunov; 04.03.2019
comment
@AntonTrunov Спасибо! Теперь я понимаю, что выводы типа Coq более тонкие (мощные), чем то, к чему я привык. - person LeonidR; 04.03.2019