所以在学习 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.
我还定义了组合(虽然这应该在标准库的某个地方)
Definition compose {A B C} (g : B -> C) (f : A -> B) : (A -> C) :=
fun x : A => g (f x).
我按照这里的描述实现类幺半群
Class Monoid {A : Type} (dot : A -> A -> A) (unit : A) : Type := {
dot_assoc : forall x y z:A,
dot x (dot y z)= dot (dot x y) z;
unit_left : forall x,
dot unit x = x;
unit_right : forall x,
dot x unit = x
}.
我终于设法证明你可以在as和asPSR
下形成一个幺半群compose
+
me
1
Instance MSPR : Monoid compose me.
split.
intros. reflexivity.
intros. reflexivity.
intros. reflexivity.
Qed.
问题
为什么Instance MSPR : Monoid compose me.
工作证明只是通过应用intros
和reflexivity
?老实说,我做了split
并且intros
知道我在做什么,但是在intros
我得到类似的东西之后
3 subgoal
x : PSR -> PSR
y : PSR -> PSR
z : PSR -> PSR
______________________________________(1/3)
compose x (compose y z) = compose (compose x y) z
试过apply compose.
了,但没有用。神奇地reflexivity.
解决了它,但我不知道为什么。
边注
如果你这样定义权力,这非常有效
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) paper.
产生
= rock
: PSR
哪个做到了beats (beats paper) = beats scissor = rock
!