首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >证明OR与SSReflect是交换的

证明OR与SSReflect是交换的
EN

Stack Overflow用户
提问于 2019-12-11 21:38:45
回答 1查看 113关注 0票数 0

我正在努力研究一些基本的逻辑知识,主要来自于使用Z:规范、精化、证明一书,但也试图了解更多关于Coq的知识。使用上面提到的Z的书中的第一个证明之一是逻辑-或者是可交换的,P \/ Q => Q \/ P。这本书使用了自然演绎树表示法,所以假设P,然后引入Q或P,或者假设Q或P,然后引入Q或P,我已经把它翻译成Coq,不管你怎么称呼标准库,如下所示:

代码语言:javascript
复制
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,我被困住了:

代码语言:javascript
复制
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参考资料,没有看到任何明显看起来它试图取代leftright的使用的东西。在SSReflect中对这个证明进行编码的正确方法是什么?

编辑:我现在有以下使用SSreflect的证据:

代码语言:javascript
复制
(* 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来实现呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-11 23:21:11

我会说,在SSReflect中,一个惯用的解决方案在策略和句法层面上都是这样的:

代码语言:javascript
复制
From Coq Require Import ssreflect.

Lemma disj_comm P Q : P \/ Q -> Q \/ P.
Proof. by case; [right | left]. Qed.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59294498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档