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

所以,在学习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
  | scissor => rock
 end.

Definition beatenBy (elem: PSR) : PSR :=
 match elem with
  | paper => rock
  | rock => scissor
  | scissor => paper
 end.
我还定义了组合(尽管它应该在标准库中的某个地方)

我实现了所描述的类monoid

我终于设法证明了你可以
PSR
compose
as
+
me
as
1

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
作为单元。这对于任何一组自同态都是正确的。你的校样很好用