Можно ли связывать обязательно разные термины в Ltac-match? - PullRequest
2 голосов
/ 27 июня 2019

Когда сопоставление с образцом (с match goal with) в определенной пользователем тактике, мы можем использовать ?x, чтобы связать термин Галлина, чтобы позже мы могли обратиться к нему. Мы можем использовать несколько таких идентификаторов в одном предложении (... ?x ... ?y ...) или даже использовать один и тот же идентификатор (... ?x ... ?x ...), чтобы указать, что для совпадения предложения в этих двух позициях должен присутствовать один и тот же термин Gallina. В некотором смысле это ограничивает возможные совпадения с требованием «одинаковости». Это удобно, но было бы удобнее (так), чтобы иметь возможность выставить «другое» требование. Есть ли способ написать предложение соответствия в форме ... ?x ... ?y ..., где мы требуем, чтобы термины, связанные с ?x и ?y, различались?

Под различимым я не обязательно подразумеваю не равное, а просто другое (их имена [или представления] не совпадают). Например, скажем, у меня есть два условия a,b:C. Эти два термина могут быть равны в том смысле, что мы можем доказать утверждение a = b, но это не имеет значения для моих целей. Что отличает a и b друг от друга, так это то, что их имена разные.

Итак, могу ли я сопоставить с шаблоном, задав требование, что две мета-переменные ?x и ?y должны связывать разные термины?

Чтобы поместить это в некоторый контекст, скажем, мы определили пары, проекции и пусть R будет некоторым (соответствующим образом типизированным) двоичным отношением. Предположим, я каким-то образом в результате предположил следующие два.

H  : R (proj1 (pair a b)) c
H' : R (proj1 (pair a b)) a

Я бы хотел написать в своей тактике предложение о совпадении, которое будет соответствовать только H, а не H'. Есть ли уловка для этого?

Если нет способа сопоставить только H, то, возможно, я мог бы сопоставить оба, где я связываю a с ?x и c (или снова a) с ?y. Но затем в правой части предложения о совпадении я хотел бы выполнить проверку " are-они-разные? " между x и y и выполнить idtac in В случае, если два связывают буквально одинаковые термины.

1 Ответ

4 голосов
/ 28 июня 2019

Есть несколько тактик, чтобы проверить, равны ли два термина .

Я думаю, вы можете объединить его с tryif или assert_fails делать то, что вы хотите.

match goal with
  | [H : ... |- _] => tryif (constr_eq x y) then fail else some_tactic
end.
...