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