用 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,没有看到任何明显看起来像是在尝试替换 leftright 的内容。在 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.