一般的なデータ型に対するプリミティブな再帰関数の定義


9

プリミティブな再帰関数は自然数に対して定義されます。ただし、この概念は他のデータ型に一般化する必要があるようで、たとえば、リストをバイナリツリーにマップするプリミティブな再帰関数について説明できます。同様に、自然数に対する部分的な再帰関数は、あらゆるデータ型の計算可能な関数にうまく一般化します。また、プリミティブな再帰関数に対して同じ種類の一般化を行う方法を理解したいと思います。

直感的に、たとえばリスト(連結、先頭と末尾の取得、要素の比較など)に対する基本的な操作を許可する単純な命令型言語と、発生する反復の数を事前に知る必要がある反復の形式を定義する場合(不変のリストの要素を反復するなど)、そのような言語では、リストに対してプリミティブな再帰関数を計算できるはずです。しかし、これを正式に理解するにはどうすればよいのでしょうか。具体的には、私の言語がリストのすべてのプリミティブな再帰関数を計算することを証明するにはどうすればよいでしょうか。

明確にするために、私は単純なように見えるプリミティブ再帰自体の操作ではなく、プリミティブ再帰関数を明確に定義された関数のクラス(実際にはそうである場合)として理解することに興味があります。一般的なデータ構造に対するプリミティブな再帰、または自然数以外のコンテキストで書かれたものへのポインターに興味があります。

更新: McAllesterとArkoudasによるWalther Recursionと呼ばれる論文で答えを見つけたかもしれません。(CADE 1996の議事録。)これには、プリミティブ再帰の一般化されたバージョンと、より強力なWalther再帰が含まれているようです。私はこれを消化したら自己回答を書くつもりですが、その間、このメモは同じ質問を持つ他の人に役立つかもしれません。


1
あなたが正確に何を探しているのか私にはわかりません。Wタイプを検索しようとしているようですが、それだけではありません。
Andrej Bauer

3
「通常の」(ツリーのような)データ型はかなり単純な方法で自然数にエンコードでき、自然に対するPR関数は必要なものをかなり適切に表現できることに注意することはおそらく役に立ちます。あるいは、「通常の」再帰子を使用して、厳密に正の1次データ型に拡張されたゲーデルのシステムTを使用することもできます。
cody

1
この「機能」を排除したい場合は、エリミネーターの出力のタイプを基本タイプに制限できます。
cody

1
制限されたWタイプの形式があなたが探しているものであるように私にはまだ思えます。有限の分岐を持つWタイプのようなものや、リカーサーは他の制限されたWタイプへの排除に限定されています。
Andrej Bauer 2016

1
CADEカンファレンス1996の訪問:dblp.org/db/conf/cade/cade96
John Fisher

回答:


5

一般に、データ型(リスト、ツリーなど)を持つ言語では、プリミティブな再帰が動作することを期待するのとまったく同じように動作する関数の言語を記述するのは簡単です。

たとえば、データ型がで、コンストラクタ型がDc1,,cn

ci:T1iT2iTk1iDD

次いでrecursor出力タイプのためのタイプを有することになりますrecDOO

recDO:(T11Tk11DDOO)DO

運用上のセマンティクスは次のとおりです。

recDO f1  fn (ci t1tki d1dm)fi t1tki (recDO f1 fn d1)(recDO f1fn dm)

各。i

口いっぱいの何か!少なくとも自然数については、確かに

recNO:(NOO)ONO

recNO f0 f1 0f1 0
および
recNO f0 f1 (S n)f0 n (recNO f0 f1 n)

期待どおり(ゼロコンストラクターには引数がありません!)。

ここで定数関数と射影を許可し、非関数型に対して任意の使用を許可すると、正確にプリミティブな再帰になります。recDOO

確かに、すべてのも機能しない場合、データ型の通常のゲーデル符号化は、同じ基本的な再帰関数を提供します。Tij


しかし、このプロセスについてよりエレガントな説明があればよいでしょう。これがカルロスの答えです。これらのデータ型は、多項式ファンクターと呼ばれることがある特定のファンクターの初期代数として、カテゴリー理論でよりエレガントに説明できます。その場合、再帰子は、この代数の最初の射の(の変形)であり、物事を混乱させようとする人々によってカタモルフィと呼ばれることもあります。このモーフィズムは、初期代数の構築によって存在します。

paramorphismは、私は上記のちょうど特定の変異体です。


これは私を少し超えていると思います。なぜ我々は、取得するために望んでいたとして型署名?それは自動的にそれが原始的な再帰性を表すことを意味しますか?(私はそれが関数の型からしか読み取れないことを想像するのに苦労します。)私はHaskellでプログラムできる範囲で型理論に精通していますが、あなたの形式主義には精通していません。ここで再使用。あなたが書いたものを理解するのに十分な背景をどこに読みに行けますか?recNO:(NOO)ONO
ナサニエル

のタイプは、上記のより一般的なスキーマに従います。操作上のセマンティクスはPR関数の定義からの再帰操作を表すため、これは原始的な再帰性を表します。運用セマンティクスについてはまだ説明していませんので、コメントを拡大します。recN
cody

基本的なリファレンスはありませんが、これらのスライドは素晴らしいソフトな紹介を提供していると思います。ラルフマットの論文の第3章では、「一次」以外の帰納型を許可していますが、技術的な詳細について説明しています。
cody

2

最近、まさにこの質問をしていたところ、興味のある記事がいくつか見つかりました。

Finitary Inductively Presented Logics:(a)特定の要件を満たす任意のデータ型に対するプリミティブ再帰の一般的な概念を提供するロジックを定義します(b)このロジックがプリミティブ再帰演算の保守的な拡張であることを証明します

ループプログラムの複雑さループプログラムの概念が基本的な再帰関数と同等であることを証明します。

プリミティブ再帰セットのロジックプログラム:ロジックプログラムのクラスがプリミティブ再帰関数と同等であることを証明します。

プリミティブな再帰集合関数の証明論的特性評価:与えられたセットのすべてのプリミティブな再帰関数が、非常に弱い集合理論で定義可能なものであることを証明します。


0

たぶん、あなたはパラモーフィズムの概念を考えていますか?

バナナ、レンズ、封筒、有刺鉄線による関数型プログラミングから:

自然数の場合、準同型は、次の形式の関数です。h=(b,)

h0=bh(n+1)=n(hn)

たとえば、階乗関数にはおよびます。b=1nm=(n+1)×m

リストの場合、準同型は次の形式の関数になります。h

hnil=bh(consab)=a(b,hb)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.