删除Coq中的所有双重否定

时间:2018-10-29 18:13:29

标签: logic coq coq-tactic ltac

我想系统地消除我的假设和目标中可能出现的所有双重否定。我知道~~A -> A并不是直觉主义逻辑的一部分,但是我所学的课程是经典的,所以我不介意。

我知道Coq.Logic.Classical_Prop.NNPP可以访问所提到的公理,但是该公理无助于从更复杂的句子(例如say)中消除双重否定

H : ~ ~ A \/ (B /\ ~ C)

最好,我希望能够对H应用Ltac策略,这样它才能转化为

H1 : A \/ (B /\ ~C)

非常感谢您撰写此类策略或其他任何建议。

1 个答案:

答案 0 :(得分:3)

您可以使用rewrite策略,因为它可以在逻辑上下文中以逻辑等效方式重写,即可以进行setoid重写。首先,您需要以下简单的引理:

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 *的意思是“将策略应用于上下文和目标”。