Coq中纸张、剪刀、岩石作为幺半群实例的证明
所以,在学习Coq的时候,我用游戏纸、剪刀和石头做了一个简单的例子。我定义了一个数据类型Coq中纸张、剪刀、岩石作为幺半群实例的证明,coq,proof,monoids,Coq,Proof,Monoids,所以,在学习Coq的时候,我用游戏纸、剪刀和石头做了一个简单的例子。我定义了一个数据类型 Inductive PSR : Set := paper | scissor | rock. 和三个功能: Definition me (elem: PSR) : PSR := elem. Definition beats (elem: PSR) : PSR := match elem with | paper => scissor | rock => paper | scis
Inductive PSR : Set := paper | scissor | rock.
和三个功能:
Definition me (elem: PSR) : PSR := elem.
Definition beats (elem: PSR) : PSR :=
match elem with
| paper => scissor
| rock => paper
| scissor => rock
end.
Definition beatenBy (elem: PSR) : PSR :=
match elem with
| paper => rock
| rock => scissor
| scissor => paper
end.
我还定义了组合(尽管它应该在标准库中的某个地方)
我实现了所描述的类monoid
我终于设法证明了你可以PSR
在compose
as+
和me
as1
Instance MSPR : Monoid compose me.
split.
intros. reflexivity.
intros. reflexivity.
intros. reflexivity.
Qed.
问题:
为什么实例MSPR:Monoid的证明构成了我。
仅仅通过应用简介和自反性来工作?老实说,我确实知道自己在做什么,但在intros
之后,我得到了
3 subgoal
x : PSR -> PSR
y : PSR -> PSR
z : PSR -> PSR
______________________________________(1/3)
compose x (compose y z) = compose (compose x y) z
已尝试应用撰写。
但无效。神奇地反身性。
解决了它,但我不知道为什么
旁注
如果你这样定义权力的话,它的效果非常好
Fixpoint power {A dot one} {M : @Monoid A dot one}(a:A)(n:nat) :=
match n with 0 % nat => one
| S p => dot a (power a p)
end.
然后Compute(power-beats 2)纸张。
= rock
: PSR
这是谁干的?比(比纸)=比剪刀=石头
Coq中的自反性原则实际上比人们所期望的仅仅是句法上的平等更强大。粗略地说,Coq认为可以简化为相同值的任何两个事物是相等的。这里的简化比代数中的简化要严格一些,例如,可以根据代数定律操作公式。相反,Coq提供了一组固定的计算规则,用于描述程序的计算方式。在您的示例中,简化表达式将产生
compose x (fun a => y (z a)) = compose (fun a => x (y a)) z
fun a => x (y (z a)) = fun a => x (y (z a))
其中,“fun”是Coq对匿名函数的表示法,即没有名称的函数。既然这两件事是相等的,反身性就足够了。同样的想法也适用于其他目标 Coq中的自反性原则实际上比人们所期望的仅仅是句法上的平等更强大。粗略地说,Coq认为可以简化为相同值的任何两个事物是相等的。这里的简化比代数中的简化要严格一些,例如,可以根据代数定律操作公式。相反,Coq提供了一组固定的计算规则,用于描述程序的计算方式。在您的示例中,简化表达式将产生
compose x (fun a => y (z a)) = compose (fun a => x (y a)) z
fun a => x (y (z a)) = fun a => x (y (z a))
其中,“fun”是Coq对匿名函数的表示法,即没有名称的函数。既然这两件事是相等的,反身性就足够了。同样的想法也适用于其他目标 Coq中的自反性原则实际上比人们所期望的仅仅是句法上的平等更强大。粗略地说,Coq认为可以简化为相同值的任何两个事物是相等的。这里的简化比代数中的简化要严格一些,例如,可以根据代数定律操作公式。相反,Coq提供了一组固定的计算规则,用于描述程序的计算方式。在您的示例中,简化表达式将产生
compose x (fun a => y (z a)) = compose (fun a => x (y a)) z
fun a => x (y (z a)) = fun a => x (y (z a))
其中,“fun”是Coq对匿名函数的表示法,即没有名称的函数。既然这两件事是相等的,反身性就足够了。同样的想法也适用于其他目标 Coq中的自反性原则实际上比人们所期望的仅仅是句法上的平等更强大。粗略地说,Coq认为可以简化为相同值的任何两个事物是相等的。这里的简化比代数中的简化要严格一些,例如,可以根据代数定律操作公式。相反,Coq提供了一组固定的计算规则,用于描述程序的计算方式。在您的示例中,简化表达式将产生
compose x (fun a => y (z a)) = compose (fun a => x (y a)) z
fun a => x (y (z a)) = fun a => x (y (z a))
其中,“fun”是Coq对匿名函数的表示法,即没有名称的函数。既然这两件事是相等的,反身性就足够了。同样的想法也适用于其他目标 在介绍
之后,您可以执行展开撰写
要求Coq只展开撰写
定义,您将看到等式的两面在语法上是相同的,因此自反性
能够解决您的目标(自反性
可以通过定义“看到”)
问题是:为什么它们是一样的:见亚瑟的答案;)
V.在介绍
之后,您可以执行展开撰写
要求Coq只展开撰写
定义,您将看到等式的两面在语法上是相同的,因此自反性
能够解决您的目标(自反性
可以通过定义“看到”)
问题是:为什么它们是一样的:见亚瑟的答案;)
V.在介绍
之后,您可以执行展开撰写
要求Coq只展开撰写
定义,您将看到等式的两面在语法上是相同的,因此自反性
能够解决您的目标(自反性
可以通过定义“看到”)
问题是:为什么它们是一样的:见亚瑟的答案;)
V.在介绍
之后,您可以执行展开撰写
要求Coq只展开撰写
定义,您将看到等式的两面在语法上是相同的,因此自反性
能够解决您的目标(自反性
可以通过定义“看到”)
问题是:为什么它们是一样的:见亚瑟的答案;)
V.me
是身份功能;你已经证明了函数空间PSR->PSR
是一个幺半群,其中compose
作为二进制op,id
作为单元。这对于任何一组自同态都是正确的。你的校样很好用