向 Coq 添加断言及其否定

Add an assertion and its negation to Coq

我想证明下面的定理:

Theorem T1 : forall s x,
  Ps s x -> PPs s x /\ ~IPs s x \/ ~PPs s x /\ IPs s x.

其中Ps是原语,PPs和IPs定义如下(F也是原语):

Definition PPs x y := Ps x y /\ ~ F y x.
Definition IPs x y := Ps x y /\ F y x.

所以我想要一个定理来说明如果 Ps s x 那么我们有 PPs s x xor IPs s x (我不知道如何写异或运算符在 Coq 中,所以我分解了它)。

现在,我想在我关于命题 F x s 的证明中引入一个假设。我想要它和它的否定(不是同时),这样我就可以很容易地证明我的定理。但是,我不知道该怎么做。所以我的问题是如何证明假设一个新命题的东西,然后它的否定?

(如有必要,请随时更改标题。我不知道。)

如果我没理解错的话,你是在找排中律。因此,您想假设 F x s \/ ~ F x s 并在每种情况下进行不同的推理。

如果您知道 F x s 是可判定的,例如如果 F x s : bool,则析取是可证明的,您可以通过以下方式将其放入上下文中。

Lemma name : ... .
Proof.
  ...
  destruct (F x s) eqn:eF.
  - (* assume F x s = true *)  admit.
  - (* assume F x s = false *) admit.

如果你不知道 F x s 是可判定的,这是标准的 if F x s : Prop 并且你没有其他假设,那么你可以通过假设排中律来凑合。这不是 Coq 基础理论的一部分,但可以接受:

Require Import Classical.
Check classic.
(* classic : forall P : Prop, P \/ ~ P *)

因此您的开发可能如下所示:

Require Import Classical.

Lemma name : ... .
Proof.
  ...
  destruct (classic (F x s)) as [yesF|notF].
  - (* assume F x s *) admit.
  - (* assume ~ F x s *) admit.