Удалить все двойные отрицания в Coq
Я хотел бы систематически убрать все двойные отрицания, которые могут появиться в моих гипотезах и целях. я знаю это ~~A -> A
это не часть интуиционистской логики, но курс, который я выбираю, классический, поэтому я не против.
Я знаю, что упомянутая аксиома может быть доступна Coq.Logic.Classical_Prop.NNPP
но эта аксиома не помогает убрать двойное отрицание из более сложных предложений, таких как, скажем,
H : ~ ~ A \/ (B /\ ~ C)
Предпочтительно я хотел бы иметь возможность применять тактику Ltac к H
так что это превратится в
H1 : A \/ (B /\ ~C)
,
Любая помощь в написании такой тактики или любые другие предложения очень ценятся.
1 ответ
Вы можете использовать rewrite
тактика, потому что она может переписать с логическими эквивалентами в логическом контексте, то есть она может делать переписывание сетоидов. Во-первых, вам понадобится следующая простая лемма:
From Coq Require Import Classical_Prop.
Lemma NNP_iff_P (P : Prop) : ~~ P <-> P.
Proof. split; [apply NNPP | intuition]. Qed.
Теперь вы можете использовать NNP_iff_P
добиться того, что вы хотите:
Section Example.
Context (A B C D : Prop).
Context (H : ~ ~ A \/ (B /\ ~ C)).
Goal ~~ A.
rewrite !NNP_iff_P in *.
Abort.
End Example.
!
означает "переписать ноль или много раз, пока перезапись невозможна" и in *
означает "применять тактику в контексте и к цели".