Logic 删除Coq中的所有双重否定

Logic 删除Coq中的所有双重否定,logic,coq,coq-tactic,ltac,Logic,Coq,Coq Tactic,Ltac,我想系统地消除我的假设和目标中可能出现的所有双重否定。我知道~~A->A不是直觉主义逻辑的一部分,但我所学的课程是经典的,所以我不介意 我知道上述公理可以通过Coq.Logic.classic_Prop.NNPP访问,但该公理无助于从更复杂的句子(如say)中删除双重否定 H:~~A\/(B/\~C) 我希望能够对H应用Ltac策略,以便将其转换为 H1:A\/(B/\~C) 非常感谢您对编写此类策略的任何帮助或任何其他建议。您可以使用重写策略,因为它可以在逻辑上下文中使用逻辑等价物进行重写,即

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

我知道上述公理可以通过
Coq.Logic.classic_Prop.NNPP
访问,但该公理无助于从更复杂的句子(如say)中删除双重否定

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

我希望能够对
H
应用Ltac策略,以便将其转换为

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


非常感谢您对编写此类策略的任何帮助或任何其他建议。

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

From Coq Require Import Classical_Prop.

Lemma NNP_iff_P (P : Prop) : ~~ P <-> P.
Proof. split; [apply NNPP | intuition]. Qed.

的意思是“重写零次或多次,直到不可能重写为止”,而*
中的
的意思是“在上下文中应用策略并达到目标”。

您可以使用
重写
策略,因为它可以在逻辑上下文中使用逻辑等价物进行重写,也就是说,它可以执行setoid重写。首先,您需要以下简单引理:

From Coq Require Import Classical_Prop.

Lemma NNP_iff_P (P : Prop) : ~~ P <-> P.
Proof. split; [apply NNPP | intuition]. Qed.
的意思是“重写零次或多次,直到不可能重写为止”,而*
中的
的意思是“在上下文中应用策略并实现目标”