Проблема унификации с альфа-преобразованием в стиле HOL в Coq (соответствие равенству)

#coq #hol

Вопрос:

Я экспериментирую с возможностью встраивания доказательств HOL4 в Coq.

В HOL можно дать такое определение, как

 fun ALPHA t1 t2 = TRANS (REFL t1) (REFL t2)  

Можно ли каким-то образом определить эту функцию в Coq аналогичным образом? Моя попытка не удалась на последней строке из-за

 The term "REFL t2" has type "t2 == t2" while it is expected to have type "t1 == ?t3" (cannot unify  "t2" and "t1").  

Код:

 Axiom EQ : forall {aa:Type}, aa -gt; aa -gt; Prop. Notation " x == y " := (@EQ _ x y) (at level 80). Axiom REFL : forall {aa:Type} (a:aa), a == a. Axiom TRANS :forall {T:Type}{t1 t2 t3:T},  (t1 == t2) -gt; (t2 == t3) -gt; (t1 == t3). Definition ALPHA t1 t2 := TRANS (REFL t1) (REFL t2).  

добавлен: Может быть, существует такой метод определения АЛЬФА, чтобы мы могли предположить, что t1=t2? (Я имею в виду действительно, в стандартном смысле равенства Кока). Я не могу добавить предположение (H:t1=t2), но тогда мне нужно как-то сопоставить. Как выполнить сопоставление с равенством?

 Definition ALPHA (t1 t2:T) (H:t1=t2) : t1==t2 := match H with | eq_refl _ =gt; TRANS (REFL t1) (REFL t2) end . (*fails*)  

Ответ №1:

Можете ли вы подробнее рассказать о том, как это определение должно работать в HOL? Если я правильно догадываюсь, ALPHA должна ли быть вещь, которая не проверяет тип, если ее аргументы не являются альфа-конвертируемыми? В Coq вы можете использовать

 Notation ALPHA t1 t2 := (TRANS (REFL t1) (REFL t2)).  

Вы также могли бы сделать

 Notation ALPHA t1 t2 := (REFL t1 : t1 == t2).  

или

 Notation ALPHA t1 t2 := (eq_refl : t1 = t2).  

Затем вы можете написать что-то вроде Check ALPHA foo bar того, чтобы посмотреть, являются ли две вещи конвертируемыми. Но я не думаю, что это будет полезно в большинстве ситуаций. Если вы ищете тактическое программирование, возможно, вы ищете unify тактику или constr_eq тактику?

В качестве альтернативы, если вы хотите, чтобы ваше match заявление сработало, вы можете написать

 Definition ALPHA {T:Type} (t1 t2 : T) (H : t1 = t2) : t1 == t2 :=  match H with eq_refl =gt; REFL _ end.  

Ответ №2:

Это не проблема унификации, это действительно проблема типизации. REFL t1 имеет тип t1 == t1 и REFL t2 имеет тип t2 == t2 , как указано в сообщении об ошибке. Транзитивность работала бы только в том случае, если бы каким-то образом t1 и t2 были одинаковыми, но это априори не так.

Возможно, то, что вы написали, не то, что вы думаете, что написали. Если бы мы использовали только t1 , то TRANS (REFL t1) (REFL t1) имеет тип t1 == t1 . Вы ожидали ALPHA t1 t2 , что у вас будет типаж t1 == t2 ? Если это так, то ваши EQ отношения были бы тотальными.

Комментарии:

1. Может быть, существует такой метод определения АЛЬФА, чтобы мы могли предположить, что t1=t2? (Я имею в виду действительно, в стандартном смысле равенства Кока). Я не могу добавить предположение (H:t1=t2), но тогда мне нужно как-то сопоставить.

2. Что ALPHA должно быть? Если вы хотите сделать инъекцию x = y , x == y есть более простые способы.