用 SSReflect 证明 OR 是可交换的
Proving OR is commutative with SSReflect
我正在尝试学习一些基础逻辑知识,主要来自 Using Z: Specification, Refinement, Proof 一书,但我也在尝试学习更多关于 Coq 的知识。上面提到的 Using Z 一书中的第一个证明是逻辑或是可交换的,P \/ Q => Q \/ P
。这本书使用自然演绎树表示法,所以假设 P,然后引入 Q 或 P,或者假设 Q,然后引入 Q 或 P 就足够了。我已经将它翻译成 Coq,无论你怎么称呼标准库,就像这样:
Theorem disj_comm : forall P Q : Prop, P \/ Q -> Q \/ P.
Proof.
intros P Q H.
destruct H. right. apply H.
left. apply H.
Qed.
你在这里看到了类似的东西。无论如何,试图将其转换为 SSReflect,我有点卡住了:
Theorem disj_comm' : forall P Q : Prop, P \/ Q -> Q \/ P.
Proof.
move => P Q H.
case H.
right. (* isn't there a better approach here? *)
Abort.
我查看了 SSReflect reference I found,没有看到任何明显看起来像是在尝试替换 left
和 right
的内容。在 SSReflect 中编码此证明的正确方法是什么?
编辑:我现在使用 SSreflect 得到以下证明:
(* And here's disj_comm in ssreflect *)
Theorem disj_comm' : forall P Q : Prop, P \/ Q -> Q \/ P.
Proof.
move => P Q H.
destruct H.
right.
by [].
left.
by [].
Qed.
感觉这篇比较啰嗦。使用 SSreflect 有更好的方法吗?
我会说 SSReflect 中的惯用解决方案在策略和句法层面上看起来都像这样:
From Coq Require Import ssreflect.
Lemma disj_comm P Q : P \/ Q -> Q \/ P.
Proof. by case; [right | left]. Qed.
我正在尝试学习一些基础逻辑知识,主要来自 Using Z: Specification, Refinement, Proof 一书,但我也在尝试学习更多关于 Coq 的知识。上面提到的 Using Z 一书中的第一个证明是逻辑或是可交换的,P \/ Q => Q \/ P
。这本书使用自然演绎树表示法,所以假设 P,然后引入 Q 或 P,或者假设 Q,然后引入 Q 或 P 就足够了。我已经将它翻译成 Coq,无论你怎么称呼标准库,就像这样:
Theorem disj_comm : forall P Q : Prop, P \/ Q -> Q \/ P.
Proof.
intros P Q H.
destruct H. right. apply H.
left. apply H.
Qed.
你在这里看到了类似的东西。无论如何,试图将其转换为 SSReflect,我有点卡住了:
Theorem disj_comm' : forall P Q : Prop, P \/ Q -> Q \/ P.
Proof.
move => P Q H.
case H.
right. (* isn't there a better approach here? *)
Abort.
我查看了 SSReflect reference I found,没有看到任何明显看起来像是在尝试替换 left
和 right
的内容。在 SSReflect 中编码此证明的正确方法是什么?
编辑:我现在使用 SSreflect 得到以下证明:
(* And here's disj_comm in ssreflect *)
Theorem disj_comm' : forall P Q : Prop, P \/ Q -> Q \/ P.
Proof.
move => P Q H.
destruct H.
right.
by [].
left.
by [].
Qed.
感觉这篇比较啰嗦。使用 SSreflect 有更好的方法吗?
我会说 SSReflect 中的惯用解决方案在策略和句法层面上看起来都像这样:
From Coq Require Import ssreflect.
Lemma disj_comm P Q : P \/ Q -> Q \/ P.
Proof. by case; [right | left]. Qed.