Coq не имеет этой встроенной тактики, но, к счастью, вы можете определить свою собственную тактику.Обратите внимание, что
destruct H as [H1 | H1]; [contradiction |].
помещает H1 : B
в контекст, как вы и просили.Таким образом, вы можете создать псевдоним для этой комбинированной тактики:
Ltac disj_syllogism AorB notA B :=
destruct AorB as [? | B]; [contradiction |].
Теперь мы можем легко имитировать правило дизъюнктивного силлогизма, например:
Section Foo.
Context (A B : Prop) (H : A \/ B) (H0 : ~ A).
Goal True.
disj_syllogism H H0 H1.
End Foo.
Позвольте мне показать пару менее автоматизированных подходов:
Ltac disj_syllogism AorB notA B :=
let A := fresh "A" in
destruct AorB as [A | B]; [contradiction (notA A) |].
Этот подход не просит Coq найти противоречие, он предоставляет его непосредственно к тактике contradiction
(термин notA A
).Или мы могли бы использовать явный термин с тактикой pose proof
:
Ltac disj_syllogism AorB notA B :=
pose proof (match AorB with
| or_introl a => False_ind _ (notA a)
| or_intror b => b
end) as B.
Надеюсь, это поможет.Я не уверен, что нужно какое-то дополнительное объяснение - не стесняйтесь просить разъяснения, и я обновлю свой ответ.