Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coq 证明或与SSReflect交换_Coq_Ssreflect - Fatal编程技术网

Coq 证明或与SSReflect交换

Coq 证明或与SSReflect交换,coq,ssreflect,Coq,Ssreflect,我试图学习一些基本的逻辑知识,主要是从书中学习,但也试图学习更多关于Coq的知识。书中使用上述Z的第一个证明是逻辑or是可交换的,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. righ

我试图学习一些基本的逻辑知识,主要是从书中学习,但也试图学习更多关于Coq的知识。书中使用上述Z的第一个证明是逻辑or是可交换的,
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.

我浏览了一下,没有看到任何明显看起来像是它试图取代
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.

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

From Coq Require Import ssreflect.

Lemma disj_comm P Q : P \/ Q -> Q \/ P.
Proof. by case; [right | left]. Qed.

我觉得ssreflect方法应该是应用适当的构造函数:
apply或\u introl
。但在这种情况下,没有理由不使用
/
。@p在尝试证明时,我如何发现
或_introl
?(事实上,在尝试应用你的建议时,我还是被卡住了,所以如果你有时间给出更详细的答案,我将不胜感激!)
在SSReflect校对中是惯用的,而
或_into(l/r)
则不是。@AntonTrunov编辑,你觉得我的新证明是SSreflect的惯用用法吗?@DanielLyons回答你关于查找构造函数的问题:首先你可以使用
Locate“\/”
,它会告诉你它代表“Logic.or”。然后您可以
打印逻辑。或者。
这将显示定义,包括两个构造函数。我觉得ssreflect方法应该是应用正确的构造函数:
apply或\u introl
。但在这种情况下,没有理由不使用
/
。@p在尝试证明时,我如何发现
或_introl
?(事实上,在尝试应用你的建议时,我还是被卡住了,所以如果你有时间给出更详细的答案,我将不胜感激!)
在SSReflect校对中是惯用的,而
或_into(l/r)
则不是。@AntonTrunov编辑,你觉得我的新证明是SSreflect的惯用用法吗?@DanielLyons回答你关于查找构造函数的问题:首先你可以使用
Locate“\/”
,它会告诉你它代表“Logic.or”。然后你可以
打印逻辑。或者。
这将显示定义,包括两个构造函数。这对我来说很尴尬,但我只是在我的Coq(8.10.1)中尝试了它,我得到了
错误:不是一个归纳产品。
不管怎样,问题是我有
对于所有的pq:Prop,P\/Q->Q->P
,因此,我需要在
之前按情况移动=>pq.
;[右|左]。。谢谢你的帮助!SSReflect样式更喜欢将非依赖参数放在冒号的左边,即
引理disjêcomm pq:P\/Q->Q\/P.
引理disjêcomm:forall pq,P\/Q->Q\/P更可取。
这对我来说很尴尬,但我只是在我的Coq(8.10.1)中尝试过它我得到了
错误:不是一个归纳产品。
不过,问题是我有
所有pq:Prop,P\/Q->Q->P
,所以我需要
移动=>pq.
之前按情况;[右|左]。
。谢谢你的帮助!SSReflect样式更喜欢将非依赖参数放在冒号的左侧,即
引理disj_comm P Q:P\/Q->Q\/P.
引理disj_comm:forall P Q,P\/Q->Q\/P更可取。