簡體   English   中英

教堂數字

[英]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元素cnatX作為參數。 它有助於牢記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 -> XXfx作為前提。

如果我們將n應用於Xfx (作為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 ,給它你的fx0 ,然后用另外一個f應用完成n返回的結果。

您將不需要任何match因為函數不是可以通過案例分析的歸納數據類型...

您可以通過以下方式編寫succDefinition

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM