“多边形”模块中有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) <- ?
答案 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.
,并且我们以X
,n : forall X : Type, (X -> X) -> X -> X
,X
和f
为前提。
如果我们将x
应用于n
,X
和f
(作为x
),我们将得到n X f x
的元素,但这并不是我们想要的,因为最终结果将再次为X
。相反,我们需要在某个地方多加n
的时间。你看到哪里了吗?有两种可能性。
答案 1 :(得分:1)
请记住,教堂数字是两个参数的函数(如果还计算类型,则为三个)。参数是函数f
和起始值x0
。教堂数字多次使用f
到x0
。 Four f x0
对应于f (f (f (f x0)))
,Zero f x0
将忽略f
而只是x0
。
对于n
的后继者,请记住n
会为您应用f
次任何功能n
,因此,如果您的任务是创建一个函数,则会应用一些{ {1}} f
次x0
上,只需将您的n+1
和n
分配给教堂数字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).