組み合わせ論理は、数理論理学における量化変数の必要性を排除するための記法です。これは、モーゼス・シェーンフィンケル[ 1 ]とハスケル・カリー[ 2 ]によって導入され、近年ではコンピュータ科学において計算の理論モデルとして、また関数型プログラミング言語の設計の基礎として使用されています。これは、シェーンフィンケルが1920年に導入したコンビネータに基づいています。コンビネータは、特に述語論理において、関数を構築するための類似の方法を提供し、変数の言及を排除するという考えに基づいています。コンビネータは、関数適用と先に定義されたコンビネータのみを使用して引数から結果を定義する高階関数です。
組み合わせ論理はもともと、量化変数の役割を明確にするための「前論理」として意図されており、本質的には量化変数を排除することによってそれを実現しようとした。量化変数を排除するもう1つの方法は、クワインの述語関数論理である。組み合わせ論理の表現力は通常、一階述語論理の表現力を上回るが、述語関数論理の表現力は一階述語論理の表現力と同一である(クワイン 1960、1966、1976)。
組み合わせ論理の発明者であるモーゼス・シェーンフィンケルは、1924年の最初の論文以降、組み合わせ論理について何も発表していません。ハスケル・カリーは、 1927年後半にプリンストン大学で講師として働いていたときにコンビネータを再発見しました。[ 3 ] 1930年代後半、アロンゾ・チャーチとプリンストンの彼の学生は、関数抽象化のライバル形式であるラムダ計算を発明し、これは組み合わせ論理よりも人気を博しました。これらの歴史的偶然の結果、1960年代と1970年代に理論計算機科学が組み合わせ論理に興味を持ち始めるまで、この主題に関するほぼすべての研究はハスケル・カリーとその学生、またはベルギーのロバート・フェイズによるものでした。カリーとフェイズ(1958)とカリーら(1972)は、組み合わせ論理の初期の歴史を概観しています。組み合わせ論理とラムダ計算のより現代的な扱いについては、1960年代と1970年代にダナ・スコットが考案した組み合わせ論理のモデルを概説したバレンデレグトの著書[ 4 ]を参照してください。
コンピュータ科学において、組み合わせ論理は計算の簡略化されたモデルとして用いられ、計算可能性理論や証明論で活用されている。その単純さにもかかわらず、組み合わせ論理は計算の多くの本質的な特徴を捉えている。
組み合わせ論理は、ラムダ計算の変形と見なすことができ、ラムダ式(関数抽象化を表す)を、自由変数を持たないプリミティブ関数であるコンビネータの限られたセットに置き換えたものです。ラムダ式をコンビネータ式に変換するのは容易であり、コンビネータの簡約はラムダの簡約よりもはるかに簡単です。そのため、組み合わせ論理は、一部の非厳密関数型プログラミング言語やハードウェアのモデリングに用いられてきました。この考え方の最も純粋な形は、プログラミング言語Unlambdaです。Unlambdaの唯一のプリミティブは、文字入出力機能を追加したSコンビネータとKコンビネータです。Unlambdaは実用的なプログラミング言語ではありませんが、理論的には興味深いものです。
組み合わせ論理にはさまざまな解釈が可能である。カリーによる初期の論文の多くは、従来の論理の公理セットを組み合わせ論理の方程式に変換する方法を示した。[ 5 ]ダナ・スコットは1960年代と1970年代に、モデル理論と組み合わせ論理を融合する方法を示した。
ラムダ計算はラムダ項と呼ばれるオブジェクトに関係しており、ラムダ項は次の3つの形式の文字列で表現できます。
どこは、定義済みの無限の変数名セットから抽出された変数名であり、そしてラムダ項です。
フォームの利用規約これらは抽象化と呼ばれます。変数これは抽象化の形式パラメータと呼ばれ、抽象化の本体です。は、引数に適用すると仮パラメータを束縛する関数を表します。引数に対して、結果の値を計算します。つまり、それは返される毎回引数に置き換えられました。
フォームの利用規約これらはアプリケーションと呼ばれます。アプリケーションは関数呼び出しまたは実行をモデル化します。呼び出す必要があります。引数として、結果が計算されます。(時には適用対象とも呼ばれる)は抽象概念であり、この用語は次のように簡略化できる。議論は、本文に置き換えることができる。形式パラメータの代わりに、その結果は、古いラムダ項と同等の新しいラムダ項になります。ラムダ項に次の形式のサブ項が含まれていない場合そうなると、それは還元できず、正規形であると言われる。
その表現項を取る結果を表すそして、すべての自由な出現箇所を置き換えるその中にということで、次のように書きます。
慣例として、略語として(つまり、適用は左結合である)。
この還元の定義の動機は、それがすべての数学関数の本質的な振る舞いを捉えている点にある。例えば、ある数の二乗を計算する関数を考えてみよう。次のように書くことができる。
(「(乗算を表す。) ここに、関数の仮引数を示します。特定の引数(例えば3)に対して二乗を計算するには、定義の中で仮引数の代わりに3を挿入します。
結果として得られる式を評価する乗算と数 3 の知識に頼らざるを得ません。あらゆる計算は適切な関数を適切な原始引数に対して評価することの合成にすぎないため、この単純な置換原理で計算の本質的なメカニズムを捉えるのに十分です。さらに、ラムダ計算では、「3」や「は、外部で定義された基本演算子や定数を必要とせずに表現できます。ラムダ計算では、適切に解釈すると数値 3 や乗算演算子のように振る舞う項を識別することが可能です( Church エンコーディングを参照) 。
ラムダ計算は、チューリングマシンを含む他の多くの妥当な計算モデルと計算能力において同等であることが知られています。つまり、これらの他のモデルで実行可能な計算はすべてラムダ計算で表現でき、その逆もまた同様です。チャーチ=チューリングのテーゼによれば、どちらのモデルもあらゆる可能な計算を表現できます。
ラムダ計算が、単純な変数への項のテキスト置換に基づく関数抽象化と適用という単純な概念のみを使用して、考えられるあらゆる計算を表現できるというのは、おそらく驚くべきことだろう。しかし、さらに注目すべきは、抽象化さえ必要としないということだ。組み合わせ論理は、ラムダ計算と同等の計算モデルだが、抽象化は含まれていない。この利点は、ラムダ計算では、変数キャプチャの問題を避けるために置換の意味論を非常に慎重に指定する必要があるため、式の評価が非常に複雑になることである。対照的に、組み合わせ論理では置換の概念がないため、式の評価ははるかに簡単である。
ラムダ計算では抽象化によってのみ関数を生成できるため、組み合わせ計算ではそれに代わる何らかの方法が必要となる。組み合わせ計算では、抽象化の代わりに、他の関数を構築するための限られた基本関数セットを提供する。
組み合わせ項は、以下のいずれかの形式をとります。
基本関数はコンビネータ、つまりラムダ項として見た場合、自由変数を含まない関数です。
表記を簡略化するために、一般的な慣例として、あるいは、は用語を表しますこれは、ラムダ計算における多重適用の場合と同じ一般的な慣例(左結合性)です。
組み合わせ論理では、各基本コンビネータには次の形式の還元規則が付属する。
どこセット内の変数のみに言及する用語ですこのようにして、原始的なコンビネータは関数のように振る舞う。
コンビネータの最も単純な例は、同一性コンビネータ、定義は
すべての条件についてもう一つの単純なコンビネータは定数関数を生成するもの:は、任意の引数に対して、だから私たちは言う
すべての条件についてそしてまたは、複数適用に関する慣例に従い、
3番目のコンビネータはこれは、アプリケーションの一般化バージョンです。
適用するに最初に置換した後それぞれの中へ。言い換えれば、適用される環境内部。
与えられたそして、それはそれ自体は不要である。なぜなら、他の2つから構築できるからである。
いかなる期間においても. ただし、いかなる場合でも、 それ自体は等しくない。これらの項は外延的に等しいと言います。外延的等価性は、関数の等価性という数学的概念を捉えています。つまり、2 つの関数は、同じ引数に対して常に同じ結果を生成する場合に等しいとみなされます。対照的に、項自体は、原始コンビネータの縮小とともに、関数の内包的等価性の概念を捉えています。つまり、2 つの関数は、原始コンビネータの展開まで同一の実装を持つ場合にのみ等しいとみなされます。恒等関数を実装する方法はたくさんあります。そしてこれらもその方法の一つです。もう一つはこれです。ここでは「等価」という言葉を外延的等価性という意味で使います。
より興味深いコンビネータは固定点コンビネータまたはコンビネータは、再帰を実装するために使用できます。
SとKを組み合わせることで、任意のラムダ項と外延的に等しいコンビネータを生成でき、したがって、チャーチのテーゼによれば、あらゆる計算可能な関数と等価である。証明は、任意のラムダ項を等価なコンビネータに変換する変換T [ ]を提示することである。
T [ ] は次のように定義できます。
与えられたT [ ] は、型付けされた数学関数ではなく、項書き換え関数であることに注意してください 。最終的にはコンビネータを生成しますが、変換によって、規則 (5) により、ラムダ項でもコンビネータでもない中間式が生成される場合があります。
このプロセスは抽象化除去とも呼ばれます。この定義は網羅的です。任意のラムダ式は、これらの規則のうち正確に1つに従います(上記のラムダ計算の概要を参照)。
これは、変数と適用から構築された式Eを受け取り、[ x ] E x = Eが成り立つような変数 x が自由でないコンビネータ式 [ x ]E を生成するブラケット抽象化のプロセスに関連しています。ブラケット抽象化の非常に単純なアルゴリズムは、式の構造に関する帰納法によって次のように定義されます。[ 6 ]
括弧抽象化は、括弧抽象化アルゴリズムを用いてラムダ抽象化を解釈することにより、ラムダ項からコンビネータ式への変換を誘導します。
例えば、ラムダ項λx . λy .( y x ) を組み合わせ項に変換してみましょう。
この組み合わせ項を任意の2つの項xとyに適用すると(それらをキューのように「右側から」コンビネータに投入することによって)、次のように簡略化されます。
組み合わせ表現 ( S ( K ( SI )) ( S ( KK ) I )) は、ラムダ項λx . λy .(yx) としての表現よりもはるかに長い。これは典型的な例である。一般に、T [ ] 構成は、長さn のラムダ項を長さΘ ( n 3 )の組み合わせ項に展開することができる。[ 7 ]
T [ ] 変換は抽象化を排除したいという 願望から生じています。 2 つの特別なケース、ルール 3 と 4 は自明です。λx . xは明らかにIと等価であり、x がEで自由でない場合にλx . Eは明らかに ( K T [ E ])と等価です。
最初の2つのルールも単純です。変数はそれ自身に変換され、組み合わせ論的に許容される適用は、適用対象と引数をコンビネータに変換するだけでコンビネータに変換されます。
注目すべきはルール5とルール6です。ルール5は、複雑な抽象化をコンビネータに変換するには、まずその本体をコンビネータに変換し、次に抽象化を消去する必要があることを単純に述べています。ルール6は実際に抽象化を消去します。
λx .( E 1 E 2 ) は、引数aを受け取り、それをxの代わりにラムダ項 ( E 1 E 2 ) に代入して( E 1 E 2 )[ x : = a ] を生成する関数です。しかし、xの代わりにa を( E 1 E 2 ) に代入することは、 E 1とE 2 の両方に代入することと同じなので、
外延的等価性により、
したがって、 λx .( E 1 E 2 )と同等のコンビネータを見つけるには、( S λx . E 1 λx . E 2 )と同等のコンビネータを見つけるだけで十分であり、
明らかに条件を満たしています。 E 1とE 2はそれぞれ ( E 1 E 2 ) よりも厳密に少ない適用を含んでいるため、再帰は適用がまったくないラムダ項 (変数、またはλx . Eの形式の項) で終了する必要があります。
T [ ]変換によって生成されるコンビネータは、η縮小 規則を考慮に入れると小さくすることができる。
λx .( E x) は、引数xを受け取り、関数Eを適用する関数です。これは、関数E自体と外延的に等価です。したがって、 E を組み合わせ形式に変換すれば十分です。
この簡略化を考慮すると、上記の例は次のようになります。
このコンビネータは、先に述べたより長いコンビネータと同等です。
同様に、 T [ ] 変換の元のバージョンでは 、恒等関数λf . λx .( f x ) が ( S ( S ( KS ) ( S ( KK ) I )) ( KI )) に変換されました。η 縮小規則では、λf . λx .( f x ) はIに変換されます。
あらゆるコンビネータを外延的に任意のラムダ項と等しく構成できるような一点基底が存在する。そのような基底の簡単な例は { X } であり、ここで次のようになる。
以下のことは容易に確認できる。
{ K , S } は基底であるため、{ X } も基底となる。Iotaプログラミング言語は、Xを唯一のコンビネータとして使用する。
1点基準のもう一つの簡単な例は次のとおりです。
最も単純な既知の1点基底は、Sを少し修正したものである。
実際、そのような基底は無限に存在する。[ 8 ]
SとKに加えて、シェーンフィンケル(1924)は現在BとCと呼ばれる2つのコンビネータを含めており、以下の簡略化が行われている。
彼はまた、それらがSとKのみを使用してどのように表現できるかについても説明しています。
これらのコンビネータは、述語論理やラムダ計算をコンビネータ式に変換する際に非常に役立ちます。これらはカリーによっても使用され、さらに後にはデビッド・ターナーによっても使用され、彼の名前はこれらの計算上の使用と関連付けられています。これらを使用すると、変換のルールを次のように拡張できます。
BおよびCコンビネータを使用すると、 λx . λy .( y x )の変換は次のようになります。
そして実際、(C I x y )は( y x )に簡略化されます。
ここで重要なのは、BとCはSの限定版であるという点です。Sは値を受け取り、適用前にその値を対象物とその引数の両方に代入しますが、Cは対象物のみに代入を行い、Bは引数のみに代入を行います。
コンビネータの現代的な名称は、ハスケル・カリーの1930年の博士論文に由来する(B、C、K、Wシステムを参照)。シェーンフィンケルの原著論文では、現在 S、K、I、B 、 Cと呼ばれているものは、それぞれS、C、I、Z、Tと呼ばれていた。
新しい変換規則によって生じるコンビネータサイズの縮小は、BとCを導入することなく達成することもでき、これはTromp(2008)のセクション3.2で実証されています。
本稿で説明するCL KとCL I計算の間には区別を設ける必要がある。この区別はλ Kとλ I計算の区別に対応する。λ K計算とは異なり、λ I計算では抽象化を以下のように制限する。
その結果、コンビネータKは λ I計算にもCL I計算にも存在しません。CL Iの定数はI、B、C、Sであり、これらがすべてのCL I項を構成する基底を形成します(等号を法として)。すべての λ I項は、上記で λ K項をCL Kコンビネータに変換する場合と同様の規則に従って、外延的に等しいCL Iコンビネータに変換できます。Barendregt (1984) の第 9 章を参照してください。
組み合わせ項からラムダ項への変換L [ ]は自明である。
ただし、この変換は、これまで見てきたT [ ]のどのバージョンの逆変換でもないことに注意してください。
正規形とは、出現する原始的な組み合わせ子が、簡略化できるほど十分な引数に適用されていない組み合わせ項のことである。一般的な組み合わせ項が正規形を持つかどうか、2つの組み合わせ項が等価であるかどうかなどは、決定不能である。これは、ラムダ項に関する同様の問題と同様の方法で示すことができる。
上記の決定不能問題(同値性、正規形の存在など)は、適切な符号化(例えば、チャーチ符号化)の下での項の構文表現を入力として受け取ります。項の構文表現ではなく、項自体に直接適用されるコンビネータによって項のプロパティを「計算」する、おもちゃのような自明な計算モデルも考えることができます。より正確には、述語を、適用するとTまたはFを返すコンビネータとします(ここで、 TとF は、組み合わせ論理に変換された、真と偽の従来のチャーチ符号化λx . λy . xとλx . λy . yを表します。組み合わせバージョンでは、T = KおよびF = ( K I )となります)。述語Nは、 NA = TかつN B = Fとなる2 つの引数AとBが存在する場合に非自明です。コンビネータN は、すべての引数Mに対してN M が正規形を持つ場合に完全です。このおもちゃのモデルに対するライスの定理の類似物は、すべての完全な述語は自明であると述べている。この定理の証明はかなり簡単である。[ 9 ]
背理法による。完全な非自明な述語、例えばNがあると仮定する。N は非自明であると仮定されるため、次のような組み合わせ子AとBが存在する。
不動点定理によれば、ABSURDUM = (NEGATION ABSURDUM) となります。
Nは完全であると想定されているため、以下のいずれかになります。
したがって、(N ABSURDUM)はTでもFでもなく、 Nが完全な非自明な述語であるという前提に矛盾する。証明終了
この定義不可能性定理から、正規形を持つ項と正規形を持たない項を区別できる完全な述語は存在しないことが直ちに導かれる。また、次のような完全な述語(例えば EQUAL)は存在しないことも導かれる。
EQUALが存在するならば、すべてのAに対してλx. (EQUAL x A )は完全な非自明な述語でなければならない。
しかし、この定義不可能性の定理から、明らかに決定可能な項の多くの性質も完全な述語では定義できないことがすぐに導かれることに注意すべきである。例えば、項に最初に現れる原始関数文字がKであるかどうかを判定できる述語は存在しない。これは、述語による定義可能性が決定可能性の妥当なモデルではないことを示している。
デビッド・ターナーは、自身のコンビネータを用いてSASLプログラミング言語を実装した。
Kenneth E. Iverson は、APLの後継である自身のプログラミング言語 Jで、Curry のコンビネータに基づくプリミティブを使用しました。これにより、Iverson が暗黙的プログラミングと呼んだもの、つまり変数を含まない関数式でのプログラミングが可能になり、そのようなプログラムを扱うための強力なツールも提供されました。暗黙的プログラミングは、ユーザー定義演算子を備えた APL ライクな言語であればどれでも可能であることが判明しました。[ 10 ]
カリー・ハワード同型性は、論理学とプログラミングの間の関連性を示唆している。直観主義論理の定理の証明はすべて、型付きラムダ項の還元に対応し、その逆もまた然りである。さらに、定理は関数型のシグネチャと同一視できる。具体的には、型付き組み合わせ論理は、証明論におけるヒルベルト系に対応する。
KおよびSコンビネータは、以下の公理に対応します。
そして関数適用は分離(モーダス・ポネンス)規則に対応する
AK、AS、MPからなる計算体系は、直観主義論理の含意部分については完全であり、それは次のように見ることができる。包含関係によって順序付けられた、演繹的に閉じたすべての論理式の集合の集合Wを考える。するとは直観主義的クリプキフレームであり、モデルを定義します。このフレーム内で
この定義は、→を満たす条件に従います。一方では、、 そしては、そして、 それからモーダス・ポネンスによって。一方、もし、 それから演繹定理により、演繹的閉包は要素ですそのため、、 そして。
A を、計算において証明できない任意の式とする。このとき、Aは空集合の演繹的閉包Xに属さないので、、そしてAは直観的に妥当ではない。
{{cite book}}ISBN /日付の不一致(ヘルプ)章
として再録。
組み合わせ論理を確立した記事。英語翻訳:
シェーンフィンケル (1967)
鳥の観察を比喩として用いた、一連の楽しいパズル形式で提示される。
組み合わせ論理のより正式な入門であり、特に不動点定理に重点を置いている。
シェーンフィンケル(1924年)
によってコンビネータが提唱されてから100年を記念する祝賀行事。
(電子書籍: ISBN) 978-1-57955-044-8)