Prolog の動作を説明するため、集合 に対して と を考えました。 は Prolog のデータの「標準形」を作るためのもので、 は理論的な論理プログラミングのデータの「標準形」を作るためのものです。
は半環になっています。半環の場合は「選言標準形」に変形することができるので「標準形」を作る議論は必要ないのですが、Prolog と対応させるために定義してあります。
理論的な論理プログラミングは証明に対応しています。Prolog のデータはそれを非可換にしたものと考えられ、演算の順序が実行順序に対応しています。ここでは、理論的な論理プログラミングの実行順序を決める方法を考えるため、Prolog と関連付けて議論しています。これは Prolog と関連付ける方がわかりやすいかもしれないためですが、本来はこの議論は不要かもしれません。
論理プログラミングと証明の関係について「論理計算と随伴関手(13)」で説明していたのですが、説明が間違っていました。関数名と述語名は有限個しかないのでそれらの関係を全部付け加えればできると簡単に考えていたのですが、そんなに簡単ではないようです。今回説明をやり直します。
まず の「プログラム微分」と「代入」について考えます。「プログラム微分」は Prolog のプログラムの基本的な単位を1回だけ実行することに対応したものです。
論理プログラミングのプログラム微分
集合 に対して は半環(単位元を持つ自明ではない冪等可換半環)となります。
を単位元を持つ自明ではない半環とし、 とします。 は
と順序を除いて一意的に表すことができます。よって を
と定義することができます。 は半環の準同型となります。
集合 から集合 への写像 に対して と考えると半環の準同型 を定義することができます。
を集合、、 とします。、 に対して、 を のとき 、 のとき と定義します。
論理プログラミングのデータ
集合 と に対して、 と の直和を 、 と の直積を と書きます。 の 個の直積( は自然数)を と書きます。 個の直積も考えます。 と書きます。
(Prolog の定数名に対応)、 (Prolog の関数名に対応)、 (Prolog の述語名に対応)を有限集合、 (Prolog の変数名に対応)を可算集合とします。
- (Prolog の項に対応)、
- (Prolog の述語の項に対応)、
- (Prolog のホーン節に対応)、
- (Prolog のプログラムに対応)、
- (Prolog の述語の項が一致することを表すものに対応)、
- (Prolog の述語の項が一致することを表すもの、または述語の項に対応)
とします。これらのもののうち変数を含まないものを
- (Prolog の変数を含まない項に対応)、
- (Prolog の変数を含まない述語の項に対応)、
- (Prolog の変数を含まないホーン節に対応)、
- (Prolog の変数を含まないプログラムに対応)、
- (Prolog の変数を含まない述語の項が一致することを表すものに対応)、
- (Prolog の変数を含まない述語の項が一致することを表すもの、または変数を含まない述語の項に対応)
とします。
論理プログラミングの定義
を と に対して と定義します。 は と が一致することを表すものとします。
を と に対して と定義します。ただし と に現れる変数は重複しないものとします。 に現れる変数は に含まれるとし、 とします。
に対して を のとき 、 のとき と定義します。
となります。 を 回繰り返したものを とします。ただし 回目の ( とします)と 回目の ( とします) に現れる変数は重複しないものとします。 に現れる変数は に含まれるとし、 とします。 は可算集合としたので可算回繰り返すことができます。変数以外は同じものとします。
論理プログラミングの代入
を代入と呼びます。代入全体の集合を とおきます。変数以外は保存されるものとして、 を に拡張することができます。
を恒等写像とします。
- を満たす が存在するとき は 回で成功
- を満たす が存在しないとき は 回で失敗
ということにします。
シークエント計算
これをシークエント計算に対応させます。シークエント計算の 回はプログラム微分の 回に対応するものとします。
、 とし、 は 回で成功とします。このときシークエント計算の図を書くことができることを示します。これを 回の図ということにします。
まず のときを考えます。
ホーン節に対応する論理式を考えます。
(Prolog の項に対応)の元が のとき を関数 の引数の個数と呼び と表すことにします(-ary ( 項の)を表す)。引数の個数が異なる関数は異なる関数とします(Prolog では関数名は同じものにできるが関数としては異なるものとする)。
各 に対して とするとき述語 を追加し、 を証明の前提に追加します。
(Prolog のホーン節に対応)、 とします。
に関数が現れるごとにそれに対応した変数を追加します。 に関数 が現れたとします。その の出現を、この出現に対応する変数 で置き換えます。そして の列に を追加します。この変形によって関数の出現が1つ減ります。よってこの変形を繰り返すことにより、 に関数が現れないように変形することができます。
関数が現れないように変形した に対して を とおきます。ここで は に現れるすべての変数とします。
に対して を とおきます。
同様に を関数が現れないように変形します。 を とおきます。ここで は に現れるすべての変数とします。
上で追加した の全体を とし、 とおきます。
すると を証明する図を書くことができます。
LK の記法を一部使って書きます。
ここで は の先頭の をすべて取り除いたもの、ここで は の先頭の をすべて取り除いたもの、ここで は の先頭の をすべて取り除いたものとします。
簡単に書くために を 、 を 、 を と書きます。 のとき
となります。ここで のとき
となります。ここまでが1回目とします。 のとき1回で成功とします。
2回目からは の代わりに として から続けます。
を途中で増やすことはできないものとして、 ( の個数は 個、 と書きます)の図を書くことができるとき 回の図を書くことができるとします。
論理プログラミングの に対応する「 回までの図」を考えることができます。 から始めて 回まで書いたものを とします。
を のとき 、 のとき とします。定数は有限個なので定義できます。
論理プログラミングの述語の項に対応するものを、シークエントでも述語の項と呼ぶことにします。述語の項 と に対して、 を
- のとき(このとき としました) 、
- のとき
と定義します。
あまりうまく書けていないので、この項は後でちゃんと書き直すことにします。
シークエント計算の半環
(シークエントを表す)、 ( を表す)とします。 とおいて (シークエントで生成される半環を表す)の計算を考えます。
と考えて、 を と に対して と定義します。
この場合も、先頭の と を取り除いたものから始めます。
の加法を 、乗法を 、 の加法を 、乗法を と書くことにして、「LKの変形版」で書くと
のように書けます。ここから を取り除いて書くこととし、 を と書くと となります。(さらに進めると ( と の述語名が一致するとき、各 は引数の項)、または ( と の述語名が一致しないとき)となります。この説明もわかりにくいので後で考えることとします。)
を と に対して と定義します。ただし と に現れる変数は重複しないものとします。 に現れる変数は に含まれるとし、 とします。
これを「LKの変形版」で書くと
となります。
に対して を のとき 、 のとき と定義します。
となります。 を 回繰り返したものを とします。ただし 回目の ( とします)と 回目の ( とします) に現れる変数は重複しないものとします。 に現れる変数は に含まれるとし、 とします。 は可算集合としたので可算回繰り返すことができます。変数以外は同じものとします。
シークエント計算の代入
は 全体の集合とします。
- を満たす代入 が存在するとき のシークエント計算は 回で成功
- を満たす代入 が存在しないとき のシークエント計算 は 回で失敗
ということにします。
論理プログラミングの と シークエント計算の は対応しているので
- 論理プログラミングが 回で成功 シークエント計算は 回で成功
- 論理プログラミングが 回で失敗 シークエント計算は 回で失敗
が成り立ちます。
この項はうまく説明できていないので後で書き直すことにします。