Разъединение Commutavity в Coq
Я хотел бы иметь тактику Ltac, которая выполняет работу Disjunction Commutavity. Главным образом, если у меня есть подтермы P \/ Q
где-то в гипотезе H
, Ltac Com H
добавлю Q \/ P
как еще одна гипотеза для контекста.
Я попытался поставить правило коммуникативности через аксиому и apply
Это; но это работает только для простых гипотез, например, не в R -> (P \/ Q)
; где это должно добавить в контекст R -> (Q \/ P)
,
1 ответ
Вы можете использовать библиотеку переписывания setoid, которая позволяет переписывать с отношениями, отличными от равенства. Следующий фрагмент показывает, как заменить A \/ B
с B \/ A
в гипотезе:
Require Import Setoid.
Variables A B C : Prop.
Goal ~ (A \/ B -> C).
intros H.
rewrite or_comm in H.
Abort.
Чтобы реализовать желаемую тактику, нам просто нужно продублировать гипотезу и переписать ее. Обратите внимание на использование fresh
тактика, которая генерирует новую гипотезу имени.
Ltac Comm H :=
let H' := fresh "H" in
pose proof H as H';
rewrite or_comm in H'.
Вот демо Comm
В бою.
Goal ~ (A \/ B -> C).
intros H.
Comm H.
Abort.
Редактировать В руководстве Coq есть раздел о переписывании сетоидов. Грубо говоря, вы можете переписать с любым отношением R
в гипотезе, при условии, что вы докажете, что операции, которые появляются в этой гипотезе, совместимы с отношением. Например, если мы возьмем R
быть <->
вышеуказанное переписывание работает, потому что в стандартной библиотеке есть леммы, показывающие, что логическая эквивалентность соблюдается косвенно.
Заметьте, что я бы вообще рекомендовал не допускать, чтобы Coq называл гипотезы сами по себе: эти имена, как правило, довольно нестабильны, что часто приводит к поломке сценариев проверки. Как правило, вы должны позволить Coq выбирать имена самостоятельно, если вы пишете полностью автоматизированные сценарии проверки, которые никогда не ссылаются на автоматически выбранные имена. Вот еще одна версия Comm
что позволяет избежать этой проблемы
Ltac Comm' H H' :=
pose proof H as H';
rewrite or_comm in H'.
Goal ~ (A \/ B -> C).
intros H.
Comm H H'.
Abort.