Мне было интересно, может ли порядок объявлений индуктивного типа иметь значение.
Например, в Coq вы можете определить Nat
либо:
Inductive Nat :=
| O : Nat
| S : Nat -> Nat.
или
Inductive Nat :=
| S : Nat -> Nat
| O : Nat.
Возможно, это изменит порядок параметров в автоматически сгенерированном элиминаторе, но это не имеет большого значения.
Что мне интересно, так это то, можно ли написать декларацию
Inductive typewhereordermatters :=
| cons1 : type1
| cons2 : type2.
где type2
зависимый тип, в зависимости от cons1
? (и в этом случае запись объявлений в другом порядке не будет иметь никакого смысла, поскольку type2
будет ссылаться на то, cons1
чего еще не существует).
источник
circle
типloop
конструктора зависит отbase
конструктора.Имеет ли значение заказ, как вы просите? Нет.
Но порядок совершенно не имеет отношения к функционированию помощника доказательства? Опять нет. В Matita, ассистенте доказательства, очень похожем на Coq, порядок, в котором конструкторы записываются в индуктивном определении, имеет значение для проверки типа, особенно при проверке типа выражения соответствия.
Сначала Матита должен проверить, сопоставляются ли все конструкторы в теле совпадения. Это делается путем циклического перебора конструкторов в порядке их объявления. Затем идет проверка типа собственно выражения соответствия, что происходит в обратном порядке, сначала проверяется регистр для последнего объявленного конструктора. Этот тип затем проводится и используется для проверки других случаев.
Это очень часто обнаруживается при написании выражения большого соответствия. Сначала вы должны заполнить простые случаи, оставляя сложные случаи под символом подстановки, периодически проверяя написанное, чтобы убедиться, что это имеет смысл. Иногда Матита не может определить тип выражения неполного совпадения, но вполне с радостью сделает это, если заполнить регистр для последнего конструктора, определенного в индуктивном типе.
Я предполагаю, хотя я не уверен, что Coq делает что-то подобное.
источник