Coq证明Selection monad是一个应用程序和monad

时间:2017-02-09 16:49:20

标签: functor coq applicative theorem-proving

我对coq很新,到目前为止,我只能证明我能用手工证明的事情。因此,当我遇到Selection monad并决定在haskell中实现它时,我认为这将是一个很好的练习,但我卡住了。有人可以提供一个证据的例子,选择monad是一个应用程序和monad?这是函子的haskell实现。

newtype Sel r a = Sel { runSel :: (a -> r) -> a }

instance Functor (Sel r) where
  fmap ab (Sel ara) = Sel (ab . ara . (. ab))

非常感谢你们也可以证明monad法律。

编辑:以下是我的仿函数存在的证据:

Definition sel (R A : Type) := (A -> R) -> A.

Theorem functor_exists : forall (R A B : Type),
    (A -> B) -> sel R A -> sel R B.
  intros R A B. unfold sel. intros AB ARA BR.
  apply AB. apply ARA. intro. apply BR. apply AB. exact X.
  Qed.

1 个答案:

答案 0 :(得分:3)

您不必使用策略,因为它的Coq:您可以将其用作与Haskell非常相似的编程语言。

首先,因为R将成为本节中一直存在的变量,所以我们可以通过一劳永逸地提及它来使符号更轻松:

Section SelMon.
Variable (R : Type).

然后,我们可以复制您对sel的定义(不包含R变量,因为它已经在上下文中)。写fmap作为一个很好的定义而不是使用策略的证明:

Definition sel (A : Type) := (A -> R) -> A.

Definition fmap {A B : Type} (f : A -> B) (s : sel A) : sel B :=
  fun br => f (s (fun a => br (f a))).

证明您有应用的下一步是提供pure方法。它很容易:我们可以使用常量函数。

Definition pure {A : Type} (a : A) : sel A :=
  fun _ => a.

然后它变得有点毛茸茸。我建议您从join开始,然后使用规范结构派生bind(和app):

Definition join {A : Type} (ssa : sel (sel A)) : sel A.
Admitted.

Definition bind {A B : Type} (sa : sel A) (asb : A -> sel B) : sel B.
Admitted.

Definition app {A B : Type} (sab : sel (A -> B)) (sa : sel A) : sel B.
Admitted.

完成上述操作后,您可以关闭该部分,R将作为参数添加到您的所有定义中。

End SelMon.