教堂数字

时间:2019-02-16 21:40:35

标签: coq logical-foundations

“多边形”模块中有4个与教堂数字有关的练习:

Definition cnat := forall X : Type, (X -> X) -> X -> X.

据我所知,cnat是一个接受函数f(x)的函数,它是参数x并返回该参数的值:f(x)。

然后有4个示例以教会符号表示0、1、2和3。

但是如何解决呢?我知道我们必须再次应用该功能。 cnat返回的值将作为参数。但是如何编码呢?使用递归吗?

Definition succ (n : cnat) : cnat
  (* REPLACE THIS LINE WITH ":= _your_definition_ ." *). Admitted.

更新

我尝试过:

Definition succ (n : cnat) : cnat :=
match n with
| zero => one
| X f x => X f f(x) <- ?

3 个答案:

答案 0 :(得分:1)

  

据我所知,cnat是一个接受函数f(x)的函数,它是参数x并返回该参数的值:f(x)。

请注意,print(confusion_matrix(y_test, my_result)) 本身不是函数。而是cnat是所有此类函数的类型。另请注意,cnat的元素也将cnat作为参数。请牢记X的定义。

cnat

此后,我们的目标只是Definition succ (n: cnat): cnat. Proof. unfold cnat in *. (* This changes `cnat` with its definition everywhere *) intros X f x. ,并且我们以Xn : forall X : Type, (X -> X) -> X -> XXf为前提。

如果我们将x应用于nXf(作为x),我们将得到n X f x的元素,但这并不是我们想要的,因为最终结果将再次为X。相反,我们需要在某个地方多加n的时间。你看到哪里了吗?有两种可能性。

答案 1 :(得分:1)

请记住,教堂数字是两个参数的函数(如果还计算类型,则为三个)。参数是函数f和起始值x0。教堂数字多次使用fx0Four f x0对应于f (f (f (f x0)))Zero f x0将忽略f而只是x0

对于n的后继者,请记住n会为您应用f次任何功能n,因此,如果您的任务是创建一个函数,则会应用一些{ {1}} fx0上,只需将您的n+1n分配给教堂数字f ,然后再将x0应用于f返回的结果。

您将不需要任何n,因为函数不是可以进行案例分析的归纳数据类型。

答案 2 :(得分:1)

您可以通过以下方式为Definition编写succ

Definition succ (n : cnat) : cnat :=
    fun (X : Type) (f : X -> X) (x : X) => f (n X f x).