[英]Church numerals
Poly模塊中有4個與教堂數字相關的練習:
Definition cnat := forall X : Type, (X -> X) -> X -> X.
據我所知,cnat是一個函數,它接受函數f(x),它的參數x並返回它的參數值:f(x)。
然后有4個例子,0,1,2和3用Church表示法表示。
但是如何解決這個問題? 我知道我們必須再次應用這個功能。 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) <- ?
據我所知,cnat是一個函數,它接受函數f(x),它的參數x並返回它的參數值:f(x)。
請注意, cnat
本身不是一個功能。 相反, 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 fx
),我們將獲得X
的元素,但這不是我們想要的,因為最終結果將再次為n
。 相反,我們需要申請f
某處的額外時間。 你能看到哪里嗎? 有兩種可能性。
請記住,教會數字是兩個參數的函數(如果您也計算類型,則為三個參數)。 參數是函數f
和起始值x0
。 教會數字將f
應用於x0
若干次。 Four f x0
將對應於f (f (f (f x0)))
並且Zero f x0
將忽略f
並且僅為x0
。
對於n
的后繼者,請記住n
將為你應用任何函數f
n
次,所以如果你的任務是創建一個函數,在某些x0
n+1
次上應用一些f
,只需將大部分工作留給教會數字n
,給它你的f
和x0
,然后用另外一個f
應用完成n
返回的結果。
您將不需要任何match
因為函數不是可以通過案例分析的歸納數據類型...
您可以通過以下方式編寫succ
的Definition
:
Definition succ (n : cnat) : cnat :=
fun (X : Type) (f : X -> X) (x : X) => f (n X f x).
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.