Итак, изучая 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
}.
Наконец-то мне удалось доказать, что можно PSR
формировать моноид под 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
!!!
me
— функция тождества; вы доказали, что функциональное пространствоPSR -> PSR
является моноидом сcompose
в качестве двоичной операции иid
в качестве единицы. Это верно для любого набора эндоморфизмов. Ваши доказательства работают рефлексивно, потому что композиция функций ассоциативна (попробуйте использоватьunfold compose
и посмотрите, что произойдет). - person gallais   schedule 26.06.2014