フラクタル代数言語 Fractal の構文
フラクタル代数言語 Fractal の構文は Prolog と同様(サブセット)とします。以下 Wikipedia の Prolog の項から必要な部分を引用します。
項
Prolog のデータを項と呼びます。項は定数、変数、複合項のいずれかとなります。
- 定数
- アトム:小文字で始まる文字列。
- 数値:数字で始まる文字列。
- 変数
- 通常の変数:大文字か下線「_」で始まる文字列で無名変数でないもの。
- 無名変数:下線「_」のみからなるもの。
- 複合項
- 通常の複合項:アトムの後に1個以上の項をカンマ「,」で区切ってかっこ「(」と「)」囲んでだものを付け加えたもの。
- リスト:1個以上の項をカンマ「,」で区切って角かっこ「[」と「]」囲んでだもの、または「[]」だけのもの(これは要素のないリストを表す)。
プログラム
プログラムはホーン節を並べたものとなります。
ホーン節は以下のどれかとなります。
- 頭部.
- 頭部 :- 本体部.
本体部は
- 副目標1,副目標2, ... 副目標n
という形となります(目標と呼びます)。
頭部と各副目標は通常の複合項となります(述語項と呼びます)。
Prolog プログラムの実行
「?- 本体部.」の形(質問)が入力されることによって Prolog のプログラムが実行されます。
Prolog のプログラムは論理式を表しています。ホーン節
は
という論理式を表しています。
本体部がない
という形は の場合 で
という論理式を表しています。
は、ホーン節の頭部がない場合で、頭部が「偽」の場合を表し
または
という論理式を表します( は「偽」を表します)。
Prolog のプログラムの実行を説明するために、論理式のプログラムによる1回の変換を考えます。
述語項 のプログラム
による1回の変換 は を
に変換するものとします。 は と が一致することを表すもので、述語項とプログラムの変数は重複しないようにあらかじめ変数を置き換えておくものとします。 を で変換したものを と書きます。
述語項から と を繰り返してできる論理式 は
という形に書くことができます。この形を選言標準形と呼びます。
を で変換した を
とします。すべての述語項とプログラムの変数は重複しないようにあらかじめ変数を置き換えておくものとします。 も選言標準形に変形することができるので、 による変換を繰り返すことができます。 を で 回変換したものを と書きます。
の本体部をすべて「真」に変えたものを とします。 の本体部をすべて「偽」に変えたものを とします。これを使ってプログラムの実行を有限回で止めたものを考えます。
が入力されたとき、 に対して と を考えます。
項全体の集合を とします。変数を含まない項全体の集合を とします。 の定数化 を に含まれる各変数 を変数を含まない項 に変換する写像とします。
ある に対して、ある定数化 に対して が真であるとき、 の による 回の変換は成功ということにします。このような が存在するとき、 の による(無限回の)変換は成功ということにします。
ある に対して、任意の定数化 に対して が偽であるとき、 の による 回の変換は失敗ということにします。このような が存在するとき、 の による(無限回の)変換は失敗ということにします。
このようにして 回で変換を止めたものの列によって無限の回数実行されるプログラムを表すプログラミング言語を作るということが目的ですが、変換を途中で止める方法がこれでは不十分ではないかと思われますので、今後検討していくことにします。
Prolog のプログラムの実行順序は、基本的にはこの考え方で説明できると考えられます。 は の後に 、 は の後に 、のように非可換と考えて順に調べていけば良いということになるのですが、これも今後検討していきます。