私はいつも、pred
は、データ型のコード化のための計算の微積分で一定の時間に表現できないことが証明されていると仮定しました。私は実際に全体の用語を入力の代わりに、再帰を使用してい除き、ちょうどスコットエンコーディングですCoCにO(1)predを付けることが不可能な場合、なぜこれが機能しますか?
S0 : ∀ (r : *) . (r -> r) -> r -> r
S0 = λ s z . z
S1 : ∀ (r : *) (((∀ (r : *) . (r -> r) -> r -> r) -> a) -> (a -> a)))
S1 = λ s z . (s (λ s z . z))
S2 : (∀ (r : *) . ((∀ (r : *) . ((∀ (r : *) . (r -> r) -> r -> r) -> a) -> a -> a) -> a) -> a -> a)
S1 = λ s z . (s (λ s z . (s (λ s z . z))))
:今、NATのためにこのエンコーディングを気に。私が気づいた何、この一見愚かなエンコーディングの下で、私は実際にゼロとSuccとして、だけでなく、O(1)
PREDないだけを定義することができるよ:
SNat
= λ (n : Nat)
-> (n *
(λ (p:*) -> (∀ (r:*) . (p -> r) -> r -> r))
(∀ (r:*) -> (r -> r) -> r -> r))
SNat_Zero
= λ (r : *)
-> λ (s : r -> r)
-> λ (z : r)
z
SNat_Succ
= λ (k : Nat)
-> λ (n : SNat k)
-> λ (r : *)
-> λ (s : (SNat k) -> r)
-> λ (z : r)
(s n)
SNat_Pred
= λ (k : Nat)
-> λ (n : SNat (Succ k))
-> λ (n (Maybe (SNat k))
(p:(SNat k) (Maybe_Just (SNat k) p))
(Maybe_Nothing (SNat k)))
注:私はちょうど別の構文から目でこれを翻訳します。何かが間違っている場合、thisが正しいです。私の実装では、バグのいくつかの種類を持っているので
cd calculus-of-constructions
npm i -g
cd lib
coc type SNat_Pred
coc norm SNat_Pred
が、このことは可能ですか、私は言った証拠の有無について間違っていた:あなたはこのレポのクローンを作成し、入力してそれを実行することができますか?
あなたの 'SNat_Succ'は' z'を使用しません。それは正しいことではありません。 –
6行目に 'S2 = ...'をつけたのですか? –
純粋なラムダ計算に自然数のエンコーディングがあり、 'O(1)'前任関数をプログラムすることはできますが、参照が見つからないことを漠然と覚えています... –