論理プログラミングとシークエント計算
集合の記法
集合 に対して は半環(単位元を持つ自明ではない冪等可換半環)となります。
を単位元を持つ自明ではない半環とし、 とします。 は
と順序を除いて一意的に表すことができます。よって を
と定義することができます。 は半環の準同型となります。
集合 から集合 への写像 に対して と考えると半環の準同型 を定義することができます。
を集合、、 とします。、 に対して、 を のとき 、 のとき と定義します。
集合 と に対して、 と の直和を 、 と の直積を と書きます。 の 個の直積( は自然数)を と書きます。 個の直積も考えます。 と書きます。
論理プログラミング
論理プログラミングのデータ
(Prolog の定数名に対応)、 (Prolog の関数名に対応)、 (Prolog の述語名に対応)を有限集合、 (Prolog の変数名に対応)を可算集合とします。
に対して のアリティという自然数 が決まっているとします。 のアリティは の引数の個数を表します。アリティの異なる元は異なる元とします。 とおくと となります。 はなくても良いのですが含めることにします。
に対して のアリティという自然数 が決まっているとします。 のアリティは の引数の個数を表します。アリティの異なる元は異なる元とします。 とおくと となります。 はなくても良いのですが含めることにします。
- (Prolog の項に対応)、
- (Prolog の述語の項に対応)、
- (Prolog のホーン節に対応)、
- (Prolog のプログラムに対応)、
- (Prolog の述語の項が一致することを表すものに対応)、
- (Prolog の述語の項が一致することを表すもの、または述語の項に対応)
とします。
論理プログラミングのプログラム微分
を と に対して と定義します。 は と が一致することを表すものとします。
を と に対して と定義します。ただし と に現れる変数は重複しないものとします。 に現れる変数は に含まれるとし、 とします。
に対して を のとき 、 のとき と定義します。
となります。 を 回繰り返したものを とします。ただし 回目の ( とします)と 回目の ( とします) に現れる変数は重複しないものとします。 は と元の個数が同じ集合とします。 に現れる変数をそれに対応する の元で置き換えたものを とおきます。 は可算集合としたので とすることができます。
論理プログラミングの代入
論理プログラミングの変数を含まないデータを定義します。
- (Prolog の変数を含まない項に対応)、
- (Prolog の変数を含まない述語の項に対応)、
- (Prolog の変数を含まないホーン節に対応)、
- (Prolog の変数を含まないプログラムに対応)、
- (Prolog の変数を含まない述語の項が一致することを表すものに対応)、
- (Prolog の変数を含まない述語の項が一致することを表すもの、または変数を含まない述語の項に対応)
とします。
を代入と呼びます。代入全体の集合を とおきます。変数以外は保存されるものとして、 を に拡張することができます。
を恒等写像とします。
- を満たす が存在するとき は 回で成功
- を満たす が存在しないとき は 回で失敗
ということにします。
シークエント計算
これをシークエント計算に対応させます。
シークエント計算のデータ
論理プログラミングのデータからシークエント計算のデータを作ります。
各 に対して とするとき述語 を に追加します。すべての を に追加したものを とおきます。
、 、 とおきます。
(Prolog のホーン節に対応)、 とします。
に関数が現れるごとにそれに対応した変数を追加します。 に関数 が現れたとします。その の出現を、この出現に対応する変数 で置き換えます。そして の列に を追加します。この変形によって関数の出現が1つ減ります。よってこの変形を繰り返すことにより、 に関数が現れないように変形することができます。すべての を に追加したものを とおきます。
関数が現れないように変形した に対して を とおきます。ここで は に現れるすべての変数とします。
に対して を とおきます。
同様に を関数が現れないように変形します。 を とおきます。ここで は に現れるすべての変数とします。
すべての の組み合わせに対する の全体を とし、 とおきます。
論理プログラミングが 回で成功するとするとき、適当な をとり とすると を証明する図を書くことができます。
LK の記法を一部使って書きます。簡単に書くために を と書きます。
ここで は の先頭の をすべて取り除いたもの、 は の先頭の をすべて取り除いたものとします。
簡単に書くために を 、 を と書きます。 のとき
となります。ここで のとき
となります。ここまでが論理プログラミングの 回分となります(記法の説明は後述)。
- (Prolog の項に対応)、
- (Prolog の述語の項に対応、 は の元のうちアリティが であるもの全体)、
- (Prolog のホーン節に対応)、
- (Prolog のプログラムに対応)、
- ( の形のシークエントを表す)、
- ( の形のシークエントを表す)、
- ( または の形のシークエントを表す)
とします。
シークエント計算の推論ブロック
論理プログラミングの 回分に相当するシークエント計算の推論を推論ブロックと呼ぶことにします。
(シークエントで生成される半環を表す)の計算を考えます。
の加法を 、乗法を 、 の加法を 、乗法を と書くことにします(上記の説明でこの記法を使っています)。
を以下の変換とします。
に対して を以下の変換とします。
に対して を のとき 、 のとき と定義します。
となります。 を 回繰り返したものを とします。ただし 回目の ( とします)と 回目の ( とします) に現れる変数は重複しないものとします。 に現れる変数は に含まれるとし、 とします(論理プログラミングの場合と同様)。
シークエント計算の代入
- を満たす代入 が存在するとき のシークエント計算は 回で成功
- を満たす代入 が存在しないとき のシークエント計算 は 回で失敗
ということにします。
論理プログラミングの に上記の変換をしたシークエント計算の を対応させることによって
となるので
- 論理プログラミングが 回で成功 シークエント計算は 回で成功
- 論理プログラミングが 回で失敗 シークエント計算は 回で失敗
が成り立ちます。シークエント計算が 回で失敗のとき、否定を表す図を書くことができます。
この項は以前書いたものを修正したものです。定数に必要なものをすべて付け加えれば良いと書いていたのに付け加えていなかった点を修正しました。ただしすべて付け加えると無限になってしまって、何も条件のない論理式として書くことができないので、個々の場合に分けて有限個で書くようにしています。
他にも間違っているところがあるかもしれないので、後で検討します。
その前に、この議論は書き方が複雑すぎるので、式を簡単に書くためにPrologのような書き方で書く方法について検討します。