そこで、Coq を学習しながら、ゲームの紙、はさみ、ロックを使った簡単な例を作成しました。データ型を定義しました。
Inductive PSR : Set := paper | scissor | rock.
そして3つの機能:
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
!!!