プリミティブ再帰汎関数のクラスは、胎児が終了することを証明した関数のクラスと同等ですか?


9

Foetusは、まだ聞いたことがない場合は、こちらで読むことができます。これは、関数の再帰呼び出しのすべての「再帰動作」を見つけるために、「呼び出し行列」と「呼び出しグラフ」のシステムを使用します。関数が終了することを示すには、関数に対して行われた再帰呼び出しのすべての再帰動作が特定の「辞書式順序」に従うことを示します。終了チェッカーは、すべてのプリミティブな再帰関数とアッカーマン関数などの関数を許可します。基本的に、これは複数引数のプリミティブ再帰を可能にします。これは基本的にAgdaの終了チェッカーでもあります。Coqにも同様の機能がいくつかあると思います。

DAターナーの論文「Total Functional Programming」を読んだところから。ゴデルが研究したシステムTに見られるように、彼の提案する言語はすべての「原始再帰関数」を表現できると彼は説明する。彼はさらに、このシステムは「全体が一次論理で証明できるすべての再帰関数を含むことが知られている」と述べています。

線量胎児はすべての基本的な再帰的機能を許可しますか?もしそうなら、それはプリミティブな再帰的関数ではない関数を許可しますか?これに対する回答を引用できますか?(私はただ興味があるので、これは実際には必要ではありません。それは、問題についてのいくつかの読書夫婦がいいだろうということだけです)

おまけの質問:プリミティブ再帰汎関数は、コンビネーターに関して非常に簡潔な定義を持っています。型付きのSおよびK(固定小数点コンビネーターを表現できない)、ゼロ、後続関数、および反復関数。それでおしまい。そのような簡潔な定義を持ち、すべての表現が終了する他のより一般的なそのような言語はありますか?


Agda vs Coq:私は常により高度でより多くの機能を受け入れるようにAgdaの終了チェッカーを読んでいますが、これは反対の最初の主張です(これはAgdaをCoqと比較するときの優れた経験則ですが、Agdaには戦術がないためです:Agdaより研究が進んでおり、安定性があまり確立されていない拡張機能に対してオープンです)。Andreas Abelは、サイズ設定された型に基づいてさらに高度な終了チェッカーに取り組んでいます。MiniAgdaに関する彼の研究とこのペーパーを参照してください。
Blaisorblade 2014年

「より多くの関数定義を受け入れる」と「より大きなクラスの計算可能な関数を持っている」があります。2つは比類のないです。アグダは最初のカウントで勝利しますが、コックは明らかに2番目の勝利です。
コーディ

私はCoqをまったく使用しておらず、Agdaを少ししか使用していないことを明確にする必要があります。私が読んだ小さなことから、Coqはより広いクラスの計算可能な関数を定義できるように見えましたが、私は知りませんでした。「信じる」と「おそらく」は、私が知らなかったことを伝えるために使用されました。
Jake

回答:


7

はい、胎児チェッカーはGoedelのTのすべてをタイプチェックできます。チェッカーを使用してこれを表示し、Tの反復演算子が終了していることを示すことができます。たとえば、次の定義は機能します。

iter:A(AA)NAiterif0=iiterif(n+1)=f(iterifn)

これは明らかに構造的に再帰的な定義であるため、Fetusチェッカー(または他のほとんどの終了チェッカー)によるチェックは非常に簡単です。

AgdaとCoqはどちらも、1次演算での合計が証明できるものをはるかに超える関数の終了を証明できます。これを可能にする機能は、データの再帰によって型を定義できることです。これは「大消去法」と呼ばれます。(ZFセット理論では、置換公理スキームはほぼ同じ目的を果たします。)

Tを超えるものの簡単な例は、GoedelのT自体の一貫性です。構文をデータ型として指定できます。

data T : Set where 
   N : T 
   _⇒_ : T → T → T

data Term : T → Set where 
   zero : Term N
   succ : Term (N ⇒ N)
   k    : {A B : T} → Term (A ⇒ B ⇒ A)
   s    : {A B C : T} → Term ((A ⇒ B ⇒ C) ⇒ (A ⇒ B) ⇒ A ⇒ C)
   r    : {A : T} → Term (A ⇒ (A ⇒ A) ⇒ N ⇒ A)
   _·_  : {A B : T} → Term (A ⇒ B) → Term A → Term B

型の依存関係により、Tの適切に型付けされた用語のみを含む用語のデータ型を定義できることに注意してください。次に、型の解釈関数を指定できます。

interp-T : T → Set 
interp-T N       = Nat 
interp-T (A ⇒ B) = (interp-T A) → (interp-T B)

これはN、アグダの自然数である必要があることを示し、Tの矢印はアグダ関数空間として解釈されます。データ型Tの構造に対する再帰によってセットを定義するため、これは「大きな」排除です。

次に、解釈関数を定義して、GoedelのTのすべての項をAgda項で解釈できることを示します。

interp-term : {A : T} → Term A → interp-T A
interp-term zero    = 0 
interp-term succ    = \n → n + 1
interp-term k       = \x y → x
interp-term s       = \x y z → x z (y z)
interp-term r       = Data.Nat.fold 
interp-term (f · t) = (interp-term f) (interp-term t)

(私はこのマシンにAgdaを持っていないので、いくつかの欠落したインポート、修正宣言、およびタイプミスがあります。修正は、読者の演習であり、編集者でもかまいません。)

Agdaの一貫性の強さは何なのかはわかりませんが、Benjamin Werner氏は、誘導構造の計算(Coqのカーネル計算)がZFCに加えて、アクセスできない多数の枢機卿と同等であることを示しています。


あなたの例では大きな消去を使用していないことに注意してください。大規模な除去は、実際には計算能力を追加しません。Impredicativityはありません:F前者はありませんが、システムTに表現できない機能を表現することができるシステム
コーディ

@cody:interp-T関数は項からセットを計算しますが、これは私にとって大きな消去のように見えます!大きな消去法が力を追加するのは間違いなく事実です。マーティンリーフ型理論では、大きな消去法がないと0 = 1からの不整合さえ導き出すことができません。(これを確認するには、ユニバース/大きな消去がないと、すべての依存関係を消去して単純に型付けされた用語を取得できることに注意してください。これは、ハーパーとプフェニングがLFの妥当性証明で行ったものです。)
Neel Krishnaswami

申し訳ありません:はい、interp-T関数は確かに大きな消去法を使用しています。0!= 1を証明することは確かにそれを必要とすることにも同意します。ただし、計算可能な関数を定義することは、数学的なステートメント証明することと同じではありません。私の答えはこれを少し明確にします。たとえば、純粋な構造計算では0!= 1を証明できませんが、アッカーマン関数を比較的簡単に定義できます。
コーディ

これは、Agdaがより一般的な意味でシステムTのインタープリターを作成できることを示していますが、天候を示していないか、依存しない型付けの言語であるFoetusがより一般的ではありません。胎児はこれを行うことができますか?Agdaは、「大規模な消去」を行わない場合でも、これを実行できますか?
Jake

1
Agdaのドキュメントによると、その終了チェッカーはFetusアルゴリズムを使用しています。Tを取得し、Footusによってチェックされたパターンマッチングと再帰的な定義で拡張した場合、その中にTのインタープリターを作成することはできません。実際、Tが計算できる関数はまったく変更しません。Fetusが計算するすべての終了順序は、ペアノ演算で十分に立証されています。(codyの回答を参照してください。)Fetusアルゴリズムを使用すると、計算できる関数のセットを変更することなく、より多くの定義を記述できます。Agdaの大幅な削除により、実際には機能のセットが増えます。
Neel Krishnaswami 2014年

3

明確にするために、Fetusは、Agdaの元の終了チェッカーも開発したAndreas Abelによって開発され、それ以来、より高度な終了技術に取り組んだことに注意してください。

NNFPA2FPAT

PA

T


終了する可能性がある(PA ^ 2)と思われる関数のクラスが、システムFで、私が知る限り終了できないことが証明されている関数のクラスとどのようにして等価になるのでしょうか。また、あなたが私の質問にどのように答えているのかわかりません。システムTにはより大きなクラスの計算可能な機能があると言っていますか、それとも胎児がそうであると言っていますか?あなたの論理には、私が実際に持っているよりも多くのバックグラウンドがあると予想した飛躍があったと思います。また、提供されたリンクは、正しく表示されない不良ページにつながるようです。
ジェイク

システムFの機能はすべて終了します。胎児はシステムTよりも大きなクラスの計算可能な関数をキャプチャしますが、「偶然」にポリモーフィズムを削除すると、胎児はシステムTのみをキャプチャします。どのリンクが機能しないか教えていただけますか?(および使用しているブラウザ:)
cody

1

原始再帰的な汎関数によって、あなたが意味する場合は原始再帰関数を、あなたは胎児が、その後胎児はアッカーマン関数としてPR関数のクラスと一致していないアッカーマン関数が含まれていることを知っている原始再帰的ではありません。これはAckermannによって示され、後で簡略化された証明がRosza Peterによって " Konstruktion nichtrekursiver Funktionen " 1935(残念ながら私が知る限りドイツ語でのみ)で与えられました。

Fetusによってキャプチャされた関数のクラスと一致する可能性がある、終了することが保証されている再帰関数のより大きなクラスを探す場合、Rosza Peterの他のいくつかの作業に興味があるかもしれません。

f(a,b)f(a,b1)f(a1,b)

<

(a,b)<(c,d)(a<cbd)(acb<d)
ω2,ω3piiz=p1np2x1p3x2nzxiωω

[編集]プリミティブ再帰関数は、以下のコメントで述べられているように、プリミティブ再帰関数と同じではありません。しかし、私は超有限再帰の概念を汎関数に移すことができると思います。ただし、機能設定に対してそれがより強力であるかどうかは明確ではありません。


2
有限タイプのプリミティブ再帰汎関数のクラスは、プリミティブ再帰関数のクラスよりも一般的です。これは、例えばアッカーマン関数を表現することができますし、ゲーデルのシステムT.で見ることができます
ジェイク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.