JP2590126B2 - Prolog処理方法 - Google Patents
Prolog処理方法Info
- Publication number
- JP2590126B2 JP2590126B2 JP62203711A JP20371187A JP2590126B2 JP 2590126 B2 JP2590126 B2 JP 2590126B2 JP 62203711 A JP62203711 A JP 62203711A JP 20371187 A JP20371187 A JP 20371187A JP 2590126 B2 JP2590126 B2 JP 2590126B2
- Authority
- JP
- Japan
- Prior art keywords
- machine instruction
- pointer
- frame
- cut operator
- instruction
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Lifetime
Links
Landscapes
- Devices For Executing Special Programs (AREA)
Description
【発明の詳細な説明】 [発明の目的] (産業上の利用分野) 本発明は論理言語PROLOGで記述されたプログラムを実
行するPROLOG処理方法に関わり、特にカットオペレータ
をゴールとして持つ節を効率良く処理できるようにした
PROLOG処理方法に関するものである。
行するPROLOG処理方法に関わり、特にカットオペレータ
をゴールとして持つ節を効率良く処理できるようにした
PROLOG処理方法に関するものである。
(従来の技術) PROLOGは人工知能関連分野、例えば自然言語処理やエ
キスパートシステムの構築等に使用される論理型プログ
ラミング言語である。PROLOGシステムでは非数値処理が
中心となるため数値処理の高速化に重点を置いて設計さ
れた汎用計算機では効率が悪く、PROLOG処理専用のアー
キテクチャの構築が各所で進められている。これらの多
くは、Warrenの著“An Abstract PROLOG Instruction S
et",AI Center,SRI International,August 1983,(以下
“文献1"と呼ぶ)に基づいており、本発明が対象とする
PROLOGマシンも根本概念はこのアイデアに基づいてい
る。
キスパートシステムの構築等に使用される論理型プログ
ラミング言語である。PROLOGシステムでは非数値処理が
中心となるため数値処理の高速化に重点を置いて設計さ
れた汎用計算機では効率が悪く、PROLOG処理専用のアー
キテクチャの構築が各所で進められている。これらの多
くは、Warrenの著“An Abstract PROLOG Instruction S
et",AI Center,SRI International,August 1983,(以下
“文献1"と呼ぶ)に基づいており、本発明が対象とする
PROLOGマシンも根本概念はこのアイデアに基づいてい
る。
文献1で提唱されたPROLOGマシンでは、主記憶を第13
図記憶のようにプログラム領域、ヒープ領域、スタック
領域及びトレイル領域に分割して使用する。プログラム
領域はPROLOGのプログラムコードを格納する領域であ
る。またヒープ領域は単一化(unification)やプロセ
ジャの起動によって作られた構造体(structure)やリ
ストやグローバル変数を含む領域である。またローカル
スタック領域には選択点フレームや環境フレームを形成
する。この2つのフレームに就いては後述する。またト
レイル領域にはトレイルスタックが形成され、単一化の
過程でバインドされた変数へのポインタが含まれる。こ
れらの変数はバックトラッキングの際アンバインドする
必要があるが、トレイルスタックにポインタを登録され
た変数がアンバインドの対象となる。通常のPROLOGの実
行では以上述べた4つの主記憶領域が最低限使われる。
図記憶のようにプログラム領域、ヒープ領域、スタック
領域及びトレイル領域に分割して使用する。プログラム
領域はPROLOGのプログラムコードを格納する領域であ
る。またヒープ領域は単一化(unification)やプロセ
ジャの起動によって作られた構造体(structure)やリ
ストやグローバル変数を含む領域である。またローカル
スタック領域には選択点フレームや環境フレームを形成
する。この2つのフレームに就いては後述する。またト
レイル領域にはトレイルスタックが形成され、単一化の
過程でバインドされた変数へのポインタが含まれる。こ
れらの変数はバックトラッキングの際アンバインドする
必要があるが、トレイルスタックにポインタを登録され
た変数がアンバインドの対象となる。通常のPROLOGの実
行では以上述べた4つの主記憶領域が最低限使われる。
さて上述の各種の領域に対しては種々の専用レジスタ
が用意されている。先ずプログラム領域に対しては、現
在実行中の節のコードアドレスを格納するPレジスタ、
及び次に実行すべきゴールのコードアドレスを格納する
CPレジスタが用意されている。またヒープ領域にはヒー
プの先頭アドレス(トップオブスタック・TOS)を格納
するHレジスタ、ヒープ上の構造体やリストの位置を格
納するSレジスタ等が用意されている。ローカルスタッ
ク領域では現在の選択点フレーム位置を指すBレジス
タ、現在の環境フレーム位置を指すEレジスタが用意さ
れている。またトレイル領域ではトレイルスタックの先
頭アドレスを格納するTRレジスタが用意されている。
が用意されている。先ずプログラム領域に対しては、現
在実行中の節のコードアドレスを格納するPレジスタ、
及び次に実行すべきゴールのコードアドレスを格納する
CPレジスタが用意されている。またヒープ領域にはヒー
プの先頭アドレス(トップオブスタック・TOS)を格納
するHレジスタ、ヒープ上の構造体やリストの位置を格
納するSレジスタ等が用意されている。ローカルスタッ
ク領域では現在の選択点フレーム位置を指すBレジス
タ、現在の環境フレーム位置を指すEレジスタが用意さ
れている。またトレイル領域ではトレイルスタックの先
頭アドレスを格納するTRレジスタが用意されている。
PROLOGではプロセジャ中に単一化可能な節が複数個あ
る時は前節の実行が失敗してバックトラックが起った場
合に備えて、プロセッサ情報を格納するため選択点フレ
ームをローカルスタックに形成する。第14図に選択点フ
レームの構成を示す。本図から明らかな様にこのフレー
ムには、プロセジャが起動された時のアーギュメント
(引数)が格納され、更にこの時のトップオブヒープレ
ジスタ即ちHレジスタ、トップオブトレイルレジスタ即
ちTRレジスタ、その他前選択点フレームへのポインタ
(図でBと書かれたスロット)等が格納される。PROLOG
プログラム実行中、別解を持つプロセジャが起動される
毎にローカルスタックに選択点フレームが次々と形成さ
れ、プロセジャ中の節が全て実行完了した時に、或いは
実行が失敗してバックトラックが発生した時に、そのプ
ロセジャに対応する選択点フレームがローカルスタック
から棄却される。この時、第14図のBと記されたスロッ
トの内容を辿って前選択点フレームへの巻戻しが行われ
る。
る時は前節の実行が失敗してバックトラックが起った場
合に備えて、プロセッサ情報を格納するため選択点フレ
ームをローカルスタックに形成する。第14図に選択点フ
レームの構成を示す。本図から明らかな様にこのフレー
ムには、プロセジャが起動された時のアーギュメント
(引数)が格納され、更にこの時のトップオブヒープレ
ジスタ即ちHレジスタ、トップオブトレイルレジスタ即
ちTRレジスタ、その他前選択点フレームへのポインタ
(図でBと書かれたスロット)等が格納される。PROLOG
プログラム実行中、別解を持つプロセジャが起動される
毎にローカルスタックに選択点フレームが次々と形成さ
れ、プロセジャ中の節が全て実行完了した時に、或いは
実行が失敗してバックトラックが発生した時に、そのプ
ロセジャに対応する選択点フレームがローカルスタック
から棄却される。この時、第14図のBと記されたスロッ
トの内容を辿って前選択点フレームへの巻戻しが行われ
る。
また、節の実行中、その節が永久変数を持つ場合、バ
インドされた変数情報を格納するため環境フレームがロ
ーカルスタックに割付けられる。このフレームは第15図
のような構成で、この環境フレームが形成される直前の
状態でのEレジスタの内容、言い換えれば前環境フレー
ムへのポインタ(図では“継続環境フレームポイン
タ”)及び、本節の実行が完了した後で実行すべきゴー
ルのコードアドレス(図では“継続ゴールアドレス”)
が格納される。以上の2つの情報を指して、コンティニ
ュエーションと呼ぶことがある。この後更に、節で使わ
れる永久変数が、寿命の長い順に(これは実行中不要に
なった変数領域を次々と環境フレームから切り落として
行く、所謂環境フレームトリミング(environment trim
ming)を行なうため)ローカルスタックに割付けて行
く。この部分が第15図で永久変数の値セルと書かれた部
分である。選択点フレームと同様、環境フレームもPROL
OGプログラムで永久変数を持つ節の実行毎に次々とロー
カルスタックに割付け、節の実行が終わるとコンティニ
ュエーション部の継続環境フレームポインタで指される
環境フレームへ巻戻す。
インドされた変数情報を格納するため環境フレームがロ
ーカルスタックに割付けられる。このフレームは第15図
のような構成で、この環境フレームが形成される直前の
状態でのEレジスタの内容、言い換えれば前環境フレー
ムへのポインタ(図では“継続環境フレームポイン
タ”)及び、本節の実行が完了した後で実行すべきゴー
ルのコードアドレス(図では“継続ゴールアドレス”)
が格納される。以上の2つの情報を指して、コンティニ
ュエーションと呼ぶことがある。この後更に、節で使わ
れる永久変数が、寿命の長い順に(これは実行中不要に
なった変数領域を次々と環境フレームから切り落として
行く、所謂環境フレームトリミング(environment trim
ming)を行なうため)ローカルスタックに割付けて行
く。この部分が第15図で永久変数の値セルと書かれた部
分である。選択点フレームと同様、環境フレームもPROL
OGプログラムで永久変数を持つ節の実行毎に次々とロー
カルスタックに割付け、節の実行が終わるとコンティニ
ュエーション部の継続環境フレームポインタで指される
環境フレームへ巻戻す。
ところで節が永久変数を持つか否かの判定は、文献1
によれば、当該節が本体部に2個以上のゴールを持ち、
ある変数が節の頭部および本体部の第1ゴールのうちの
少なくとも一方に現われた場合を1回とカウントし、以
後現われるその変数を2回からカウントすると、2回以
上現われた場合に、その変数を永久変数と呼ぶ。節が永
久変数を持つ場合既に述べた様に、ローカルスタックに
環境フレームが形成される。更に文献1によれば、節の
本体部のゴール数が2個以上であって当該節が永久変数
を持たない場合はローカルスタックのコンティニュエー
ションのみを割付ける。後で詳しく述べるが、本発明で
は、本体部のゴールが2個未満の時もコンティニュエー
ションを割付けることがある。
によれば、当該節が本体部に2個以上のゴールを持ち、
ある変数が節の頭部および本体部の第1ゴールのうちの
少なくとも一方に現われた場合を1回とカウントし、以
後現われるその変数を2回からカウントすると、2回以
上現われた場合に、その変数を永久変数と呼ぶ。節が永
久変数を持つ場合既に述べた様に、ローカルスタックに
環境フレームが形成される。更に文献1によれば、節の
本体部のゴール数が2個以上であって当該節が永久変数
を持たない場合はローカルスタックのコンティニュエー
ションのみを割付ける。後で詳しく述べるが、本発明で
は、本体部のゴールが2個未満の時もコンティニュエー
ションを割付けることがある。
さて、順序が多少前後したが、PROLOG言語で書かれた
プログラムはHorn形式と呼ばれる次の様な一次の論理文
で構成されている。
プログラムはHorn形式と呼ばれる次の様な一次の論理文
で構成されている。
P:−Q1,Q2,…,Qn. …… ここでP,Q1,Q2,…,Qnは項(term)と呼ばれ、この項
は更に細かく見ると、f(a,b)などの形をしており、
fをファンクタ(functor)a,bをその引数(argument)
と呼ぶ。以下の説明では簡単のためファンクタと引数と
をまとめた項を大文字のアルファベットP,Q1,Q2,…Qnな
どで表わして扱う。さてで:−記号の左辺にあるAは
頭部(head)、:−記号の右辺を本体(body)と呼ぶ。
本体に含まれるQ1,Q2,…,Qnをゴール(gool)と呼び、
また全体を節(clause)と呼ぶ。の節の意味論的解釈
は“PはQ1,Q2,…,Qnのコンジャンクトで暗示(imply)
される”だが、手続き的解釈は“Q1,Q2,…,Qnが全て満
足されれば、Pは成功する”である。
は更に細かく見ると、f(a,b)などの形をしており、
fをファンクタ(functor)a,bをその引数(argument)
と呼ぶ。以下の説明では簡単のためファンクタと引数と
をまとめた項を大文字のアルファベットP,Q1,Q2,…Qnな
どで表わして扱う。さてで:−記号の左辺にあるAは
頭部(head)、:−記号の右辺を本体(body)と呼ぶ。
本体に含まれるQ1,Q2,…,Qnをゴール(gool)と呼び、
また全体を節(clause)と呼ぶ。の節の意味論的解釈
は“PはQ1,Q2,…,Qnのコンジャンクトで暗示(imply)
される”だが、手続き的解釈は“Q1,Q2,…,Qnが全て満
足されれば、Pは成功する”である。
さて、の節が永久変数を持つと仮定すると、この節
は第16図のようなマシン命令(擬似マシン命令を含む)
で実行される。この図でallocate命令はローカルスタッ
クに環境フレームを割付ける働きを持ち、逆にdealloca
te命令がローカルスタックから環境フレームを棄却する
働きを持つ。但し、allocate命令・1実行時点では環境
フレームのコンティニュエーション部のみが形成される
ことに注意しなければならない。更にcall命令は次の命
令番地をリターンポインタにセットした上で、オペラン
ドのプロセジャに実行を移す命令である。またexecute
命令ではcall命令と同様にオペランドのプロセジャに実
行を移すが、リターンポインタのセットは行わない。こ
の場合直前のdeallocate命令実行時に環境フレームから
リストアした継続ゴールアドレスをリターンポインタと
して使う。
は第16図のようなマシン命令(擬似マシン命令を含む)
で実行される。この図でallocate命令はローカルスタッ
クに環境フレームを割付ける働きを持ち、逆にdealloca
te命令がローカルスタックから環境フレームを棄却する
働きを持つ。但し、allocate命令・1実行時点では環境
フレームのコンティニュエーション部のみが形成される
ことに注意しなければならない。更にcall命令は次の命
令番地をリターンポインタにセットした上で、オペラン
ドのプロセジャに実行を移す命令である。またexecute
命令ではcall命令と同様にオペランドのプロセジャに実
行を移すが、リターンポインタのセットは行わない。こ
の場合直前のdeallocate命令実行時に環境フレームから
リストアした継続ゴールアドレスをリターンポインタと
して使う。
get−args−of命令およびput−args−of命令は擬似マ
シン命令である。即ち、get−args−of命令は親ゴール
(あるゴールを呼出した呼び元のゴール)からアーギュ
メントレジスタを介して渡された引数と節の引数とのマ
ッチングをとるget命令の総称で、またput−args−of命
令は本体部のゴールの引数をアーギュメントレジスタに
ロードするput命令の総称である。各マシン命令の詳細
動作は文献1に詳しいので、ここではこれ以上の説明を
省略する。第16図から明らかなように環境フレームは本
体部の最終ゴール実行直前にdeallocate命令でローカル
スタックから取除かれる。
シン命令である。即ち、get−args−of命令は親ゴール
(あるゴールを呼出した呼び元のゴール)からアーギュ
メントレジスタを介して渡された引数と節の引数とのマ
ッチングをとるget命令の総称で、またput−args−of命
令は本体部のゴールの引数をアーギュメントレジスタに
ロードするput命令の総称である。各マシン命令の詳細
動作は文献1に詳しいので、ここではこれ以上の説明を
省略する。第16図から明らかなように環境フレームは本
体部の最終ゴール実行直前にdeallocate命令でローカル
スタックから取除かれる。
次にPROLOGのプログラム実行中、特に節の本体にカッ
トオペレータ(!)を含む場合、環境フレームや選択点
フレームがローカルスタックに生成,棄却される様子を
示す。最初に次の2つの節で構成されるPROLOGプログラ
ムを考える。
トオペレータ(!)を含む場合、環境フレームや選択点
フレームがローカルスタックに生成,棄却される様子を
示す。最初に次の2つの節で構成されるPROLOGプログラ
ムを考える。
このプログラムの第1節の本体部でゴールBとゴール
Cの間にカットゴール(!)が含まれている。このカッ
トゴールの意味するところはゴールBの実行が成功した
場合には、ゴールCの実行に移るが、この時第2節の実
行を放棄する。従ってもしゴールCが成功すれば第1節
全体の実行が成立するが、仮りにゴールCが失敗に終わ
ればこのプロセジャ全体が失敗する。即ち第2節の実行
が試されるのは第1節でカットゴールを左から右へ通過
する以前、言い換えれば第1節のゴールBが不成立に終
わる場合のみで、このことからプログラムはカットオ
ペレータを使わずに次の様に書くこともできる。
Cの間にカットゴール(!)が含まれている。このカッ
トゴールの意味するところはゴールBの実行が成功した
場合には、ゴールCの実行に移るが、この時第2節の実
行を放棄する。従ってもしゴールCが成功すれば第1節
全体の実行が成立するが、仮りにゴールCが失敗に終わ
ればこのプロセジャ全体が失敗する。即ち第2節の実行
が試されるのは第1節でカットゴールを左から右へ通過
する以前、言い換えれば第1節のゴールBが不成立に終
わる場合のみで、このことからプログラムはカットオ
ペレータを使わずに次の様に書くこともできる。
上の2つのプログラム,は同一の意味合いを持つ
が、プログラムの実行速度が大きく異なる。文献W.F.Cl
ocksin,et al“Programming in Prolog",Springer−Ver
lagに示されるように、ゴールBが非常に複雑で実行に
多くの時間を費すような場合プログラムではゴールB
の実行を1回だけ試せば良いのに対し、プログラムで
は2回試す必要がある。このためプログラムは実行に
多くの時間を費し、カットオペレータを使ったプログラ
ムの方が実行効率が良い。
が、プログラムの実行速度が大きく異なる。文献W.F.Cl
ocksin,et al“Programming in Prolog",Springer−Ver
lagに示されるように、ゴールBが非常に複雑で実行に
多くの時間を費すような場合プログラムではゴールB
の実行を1回だけ試せば良いのに対し、プログラムで
は2回試す必要がある。このためプログラムは実行に
多くの時間を費し、カットオペレータを使ったプログラ
ムの方が実行効率が良い。
更にカットオペレータはローカルスタック(従ってメ
モリ)の使用効率を高める効果も持っている。これを第
17図のプログラムと第18図のローカルスタックを示す図
を使って説明する。第17図のプログラム例で、最初に節
1が起動された場合を考える。節1のゴールPを実行す
るため先ず節2を実行するとすると、この節には別解が
あるため、第18図のローカルスタックに選択点フレーム
が形成される。これをプロセジャPの選択点フレームと
いう意味でCP(P)と図示する。以下プロセジャQ,R等
についても同じ)節1のゴールQに対して節4を実行す
る場合も、この節に別解があるため第18図の如く、選択
点フレームCP(Q)が生成される。ここで、節4は永久
変数を持つとすると、第18図の環境フレームENV(Q)
が生成され、本体部のゴールR,Sを実行するため、節6,
節8を実行するとすると、これらは共に別解を持つた
め、第18図のようにCP(R),CP(S)がローカルスタ
ックに生成される。この時点で現選択点フレームを指す
BレジスタはCP(S)を指している。またCP(S)の前
選択点ポインタはCP(R)を指している。即ち、節8,節
9共に失敗すると、バックトラックが起こってBレジス
タがCP(R)迄巻戻され、Rの別解節7が試される。同
時にCP(R)の前選択点フレームポインタはCP(Q)を
指しており、仮りに節7が失敗すると、BレジスタはCP
(Q)まで巻戻され、Qの別解節5が試される。この様
にプロセジャ中の全ての節の実行が失敗すると、選択点
フレームポインタのチェインを逆に辿ってバックトラッ
クを起こし、順次ローカルスタックから旧い選択点フレ
ームが取除かれる。
モリ)の使用効率を高める効果も持っている。これを第
17図のプログラムと第18図のローカルスタックを示す図
を使って説明する。第17図のプログラム例で、最初に節
1が起動された場合を考える。節1のゴールPを実行す
るため先ず節2を実行するとすると、この節には別解が
あるため、第18図のローカルスタックに選択点フレーム
が形成される。これをプロセジャPの選択点フレームと
いう意味でCP(P)と図示する。以下プロセジャQ,R等
についても同じ)節1のゴールQに対して節4を実行す
る場合も、この節に別解があるため第18図の如く、選択
点フレームCP(Q)が生成される。ここで、節4は永久
変数を持つとすると、第18図の環境フレームENV(Q)
が生成され、本体部のゴールR,Sを実行するため、節6,
節8を実行するとすると、これらは共に別解を持つた
め、第18図のようにCP(R),CP(S)がローカルスタ
ックに生成される。この時点で現選択点フレームを指す
BレジスタはCP(S)を指している。またCP(S)の前
選択点ポインタはCP(R)を指している。即ち、節8,節
9共に失敗すると、バックトラックが起こってBレジス
タがCP(R)迄巻戻され、Rの別解節7が試される。同
時にCP(R)の前選択点フレームポインタはCP(Q)を
指しており、仮りに節7が失敗すると、BレジスタはCP
(Q)まで巻戻され、Qの別解節5が試される。この様
にプロセジャ中の全ての節の実行が失敗すると、選択点
フレームポインタのチェインを逆に辿ってバックトラッ
クを起こし、順次ローカルスタックから旧い選択点フレ
ームが取除かれる。
さて節4でゴールSの実行が成功して、カットゴール
を左から右へ通過した場合を考える。この時点で仮りに
その後ゴールTの実行が不成功に終わったとしても、バ
ックトラックしてSの別解を求めるために節9を試した
り、またRの別解を求めるため節7を試したりすること
が不要となる。また既に述べたようにゴールTの実行が
不成功に終わった場合、Qの別解を求めるため節5を試
す必要もない。以上の事情から、節4の本体部でカット
オペレータを左から右へ通過した時点で、第18図のロー
カルスタックからCP(S),CP(R),CP(Q)を棄却す
ることが必要となる。カットゴールを左から右へ通過す
る時点でBレジスタはCP(S)を指していたので、ここ
から一気にCP(P)まで巻戻せることになる。
を左から右へ通過した場合を考える。この時点で仮りに
その後ゴールTの実行が不成功に終わったとしても、バ
ックトラックしてSの別解を求めるために節9を試した
り、またRの別解を求めるため節7を試したりすること
が不要となる。また既に述べたようにゴールTの実行が
不成功に終わった場合、Qの別解を求めるため節5を試
す必要もない。以上の事情から、節4の本体部でカット
オペレータを左から右へ通過した時点で、第18図のロー
カルスタックからCP(S),CP(R),CP(Q)を棄却す
ることが必要となる。カットゴールを左から右へ通過す
る時点でBレジスタはCP(S)を指していたので、ここ
から一気にCP(P)まで巻戻せることになる。
この様にカットオペレータをゴールとして使うことに
よって、それ以後の実行で不要なフレームが明確にな
り、これをローカルスタックから取除くことによって効
率良くローカルスタック領域が使えることになる。
よって、それ以後の実行で不要なフレームが明確にな
り、これをローカルスタックから取除くことによって効
率良くローカルスタック領域が使えることになる。
以上述べたように、カットオペレータを使うことでPR
OLOGプログラムの実行スピードが上がり、またメモリの
使用効率が向上するという利点が得られるが、PROLOGプ
ログラムを実行するPROLOGマシン上でカットオペレータ
をどう実現するかが大きな課題となっている。即ち、通
常選択点フレームや環境フレームなどローカルスタック
上に形成されるフレームは文献1の明確なマシン命令に
よって生成,廃棄が行なわれるが、カットオペレータに
ついてはそれに対応するマシン命令は明確に規定されて
いない。しかも以上の説明でも明らかな様に、カットオ
ペレータを使用した場合にローカルスタックからフレー
ムを解放する情況は、ある選択点フレームから直前の選
択点フレームに巻戻す、或いはある環境フレームから直
前の環境フレームに巻戻すという単純な規則には従わ
ず、不特定多数個のフレームを飛び越して前に戻るとい
うことが発生するため、巻戻す位置をどう効率良く見つ
けるか、或いは、どの時点で巻戻せば副作用を発生させ
ずに済むかといった点で、カットオペレータが高速で処
理できるインプリメンテーションを考えることは非常に
重要な課題になって来ている。
OLOGプログラムの実行スピードが上がり、またメモリの
使用効率が向上するという利点が得られるが、PROLOGプ
ログラムを実行するPROLOGマシン上でカットオペレータ
をどう実現するかが大きな課題となっている。即ち、通
常選択点フレームや環境フレームなどローカルスタック
上に形成されるフレームは文献1の明確なマシン命令に
よって生成,廃棄が行なわれるが、カットオペレータに
ついてはそれに対応するマシン命令は明確に規定されて
いない。しかも以上の説明でも明らかな様に、カットオ
ペレータを使用した場合にローカルスタックからフレー
ムを解放する情況は、ある選択点フレームから直前の選
択点フレームに巻戻す、或いはある環境フレームから直
前の環境フレームに巻戻すという単純な規則には従わ
ず、不特定多数個のフレームを飛び越して前に戻るとい
うことが発生するため、巻戻す位置をどう効率良く見つ
けるか、或いは、どの時点で巻戻せば副作用を発生させ
ずに済むかといった点で、カットオペレータが高速で処
理できるインプリメンテーションを考えることは非常に
重要な課題になって来ている。
(発明が解決しようとする問題点) このように、従来、PROLOGプログラムを高速で実行し
たり、メモリの使用効率を高める上でカットオペレータ
が重要な役割を担っているにも拘らず、実際にカットオ
ペレータをPROLOGマシンにインプリメントして効率良く
処理することが困難であるという問題があった。
たり、メモリの使用効率を高める上でカットオペレータ
が重要な役割を担っているにも拘らず、実際にカットオ
ペレータをPROLOGマシンにインプリメントして効率良く
処理することが困難であるという問題があった。
本発明は、このような事情に鑑みてなされたもので、
カットオペレータを効率良く処理してPROLOGプログラム
の高速実行を可能にするPROLOG処理方法を提供すること
を目的とする。
カットオペレータを効率良く処理してPROLOGプログラム
の高速実行を可能にするPROLOG処理方法を提供すること
を目的とする。
[発明の構成] (問題点を解決するための手段) 本発明は、PROLOGプログラムを解釈し、同一のローカ
ルスタック上に環境フレーム、コンティニュエーション
フレーム及び選択点フレームを形成しながら前記PROLOG
プログラムの実行を進めるための該プログラムに対応し
たマシン命令を生成するコンパイルを行い、該マシン命
令を実行するPROLOG処理方法において、 前記コンパイルは、 前記PROLOGプログラム中にカットオペレータを含む節
が存在するとき、現選択点フレームへのポインタ用のレ
ジスタの内容をバックトラックポイントとして前記ロー
カルスタックにプッシュする第1のマシン命令を、前記
カットオペレータを含む節の環境フレームを形成するマ
シン命令の直前または直後に生成する第1のマシン命令
生成ステップと、 前記第1のマシン命令生成ステップの後に前記カット
オペレータを含む節が別解を持つか否かを判定する判定
ステップと、 前記判定ステップにより前記カットオペレータを含む
節が別解を持たないと判定された場合には、現環境フレ
ームへのポインタから所定のオフセット量を加えたロー
カルスタック上の位置からポインタを読み出して前記レ
ジスタにロードする第2のマシン命令を、前記カットオ
ペレータを実行するマシン命令の位置に生成する第2の
マシン命令生成ステップと、 前記判定ステップにより前記カットオペレータを含む
節が別解を持つと判定された場合には、現環境フレーム
へのポインタから前記所定のオフセット量を加えたロー
カルスタック上の位置からポインタを読み出し、このポ
インタで指示される選択点フレームに格納された前選択
点フレームのポインタを読み出して前記レジスタにロー
ドする第3のマシン命令を、前記カットオペレータを実
行するマシン命令の位置に生成する第3のマシン命令生
成ステップとを有することを特徴とする。
ルスタック上に環境フレーム、コンティニュエーション
フレーム及び選択点フレームを形成しながら前記PROLOG
プログラムの実行を進めるための該プログラムに対応し
たマシン命令を生成するコンパイルを行い、該マシン命
令を実行するPROLOG処理方法において、 前記コンパイルは、 前記PROLOGプログラム中にカットオペレータを含む節
が存在するとき、現選択点フレームへのポインタ用のレ
ジスタの内容をバックトラックポイントとして前記ロー
カルスタックにプッシュする第1のマシン命令を、前記
カットオペレータを含む節の環境フレームを形成するマ
シン命令の直前または直後に生成する第1のマシン命令
生成ステップと、 前記第1のマシン命令生成ステップの後に前記カット
オペレータを含む節が別解を持つか否かを判定する判定
ステップと、 前記判定ステップにより前記カットオペレータを含む
節が別解を持たないと判定された場合には、現環境フレ
ームへのポインタから所定のオフセット量を加えたロー
カルスタック上の位置からポインタを読み出して前記レ
ジスタにロードする第2のマシン命令を、前記カットオ
ペレータを実行するマシン命令の位置に生成する第2の
マシン命令生成ステップと、 前記判定ステップにより前記カットオペレータを含む
節が別解を持つと判定された場合には、現環境フレーム
へのポインタから前記所定のオフセット量を加えたロー
カルスタック上の位置からポインタを読み出し、このポ
インタで指示される選択点フレームに格納された前選択
点フレームのポインタを読み出して前記レジスタにロー
ドする第3のマシン命令を、前記カットオペレータを実
行するマシン命令の位置に生成する第3のマシン命令生
成ステップとを有することを特徴とする。
また、前記コンパイルは、 前記PROLOGプログラム中にカットオペレータを含む節
が存在するとき、該節がサブゴールを起動する可能性が
あるか否かを判定する第1の判定ステップと、 前記第1の判定ステップにより前記カットオペレータ
を含む節がサブゴールを起動する可能性があると判定さ
れた場合には、現選択点フレームへのポインタ用のレジ
スタの内容をバックトラックポイントとして前記ローカ
ルスタックにプッシュする第1のマシン命令を、前記カ
ットオペレータを含む節の環境フレームを形成するマシ
ン命令の直前または直後に生成する第1のマシン命令生
成ステップと、 前記第1のマシン命令生成ステップの後に前記カット
オペレータを含む節が別解を持つか否かを判定する第2
の判定ステップと、 前記第1の判定ステップにより前記カットオペレータ
を含む節がサブゴールを起動する可能性があると判定さ
れ、かつ前記第2の判定ステップにより前記カットオペ
レータを含む節が別解を持たないと判定された場合に
は、現環境フレームへのポインタから所定のオフセット
量を加えたローカルスタック上の位置からポインタを読
み出して前記レジスタにロードする第2のマシン命令
を、前記カットオペレータを実行するマシン命令の位置
に生成する第2のマシン命令生成ステップと、 前記第1の判定ステップにより前記カットオペレータ
を含む節がサブゴールを起動する可能性があると判定さ
れ、かつ前記第2の判定ステップにより前記カットオペ
レータを含む節が別解を持つと判定された場合には、現
環境フレームへのポインタから前記所定のオフセット量
を加えたローカルスタック上の位置からポインタを読み
出し、このポインタで指示される選択点フレームに格納
された前選択点フレームのポインタを読み出して前記レ
ジスタにロードする第3のマシン命令を、前記カットオ
ペレータを実行するマシン命令の位置に生成する第3の
マシン命令生成ステップと、 前記第1の判定ステップにより前記カットオペレータ
を含む節がサブゴールを起動する可能性がないと判定さ
れ、かつ前記第2の判定ステップにより前記カットオペ
レータを含む節が別解を持つと判定された場合には、現
選択点フレームから前選択点フレームへのポインタを読
み出して前記レジスタにロードする第4のマシン命令
を、前記カットオペレータを実行するマシン命令の位置
に生成する第4のマシン命令生成手段とを有することを
特徴とする。
が存在するとき、該節がサブゴールを起動する可能性が
あるか否かを判定する第1の判定ステップと、 前記第1の判定ステップにより前記カットオペレータ
を含む節がサブゴールを起動する可能性があると判定さ
れた場合には、現選択点フレームへのポインタ用のレジ
スタの内容をバックトラックポイントとして前記ローカ
ルスタックにプッシュする第1のマシン命令を、前記カ
ットオペレータを含む節の環境フレームを形成するマシ
ン命令の直前または直後に生成する第1のマシン命令生
成ステップと、 前記第1のマシン命令生成ステップの後に前記カット
オペレータを含む節が別解を持つか否かを判定する第2
の判定ステップと、 前記第1の判定ステップにより前記カットオペレータ
を含む節がサブゴールを起動する可能性があると判定さ
れ、かつ前記第2の判定ステップにより前記カットオペ
レータを含む節が別解を持たないと判定された場合に
は、現環境フレームへのポインタから所定のオフセット
量を加えたローカルスタック上の位置からポインタを読
み出して前記レジスタにロードする第2のマシン命令
を、前記カットオペレータを実行するマシン命令の位置
に生成する第2のマシン命令生成ステップと、 前記第1の判定ステップにより前記カットオペレータ
を含む節がサブゴールを起動する可能性があると判定さ
れ、かつ前記第2の判定ステップにより前記カットオペ
レータを含む節が別解を持つと判定された場合には、現
環境フレームへのポインタから前記所定のオフセット量
を加えたローカルスタック上の位置からポインタを読み
出し、このポインタで指示される選択点フレームに格納
された前選択点フレームのポインタを読み出して前記レ
ジスタにロードする第3のマシン命令を、前記カットオ
ペレータを実行するマシン命令の位置に生成する第3の
マシン命令生成ステップと、 前記第1の判定ステップにより前記カットオペレータ
を含む節がサブゴールを起動する可能性がないと判定さ
れ、かつ前記第2の判定ステップにより前記カットオペ
レータを含む節が別解を持つと判定された場合には、現
選択点フレームから前選択点フレームへのポインタを読
み出して前記レジスタにロードする第4のマシン命令
を、前記カットオペレータを実行するマシン命令の位置
に生成する第4のマシン命令生成手段とを有することを
特徴とする。
さらに、第1のマシン命令生成ステップにおけるオフ
セット量は、第1のマシン命令をカットオペレータを含
む節の環境フレームを生成するマシン命令の直前に生成
する場合は−1とし、直後に生成する場合は+2とする
ことを特徴とする。
セット量は、第1のマシン命令をカットオペレータを含
む節の環境フレームを生成するマシン命令の直前に生成
する場合は−1とし、直後に生成する場合は+2とする
ことを特徴とする。
(作 用) 本発明によれば、カットオペレータを含む節の実行
時、環境フレーム若しくはコンティニュエーションフレ
ームをローカルスタックに割付ける前若しくは後に、現
選択点フレームポインタをローカルスタックにプッシュ
しているため、カットオペレータを左から右へ通過する
際環境フレームポインタをインデックスとしたローカル
スタックから先にプッシュしたポインタを取り出せる。
当該節が本体部にゴールを2つ未満しか持たない場合で
も少なくともコンティニュエーションをローカルスタッ
クに割付けるのでその節が永久変数を持つか、本体部の
ゴール数が2個以上で一時変数のみ持つのか、或いはゴ
ール数が2個未満なのかに拘らず常にEレジスタからの
オフセット(E−1又はE+2)でローカルスタックに
プッシュしたポインタに統一的にアクセスでき、処理の
簡単化が図れる。なお、ここで述べるゴール数の中には
カットオペレータ(!)は含めない。
時、環境フレーム若しくはコンティニュエーションフレ
ームをローカルスタックに割付ける前若しくは後に、現
選択点フレームポインタをローカルスタックにプッシュ
しているため、カットオペレータを左から右へ通過する
際環境フレームポインタをインデックスとしたローカル
スタックから先にプッシュしたポインタを取り出せる。
当該節が本体部にゴールを2つ未満しか持たない場合で
も少なくともコンティニュエーションをローカルスタッ
クに割付けるのでその節が永久変数を持つか、本体部の
ゴール数が2個以上で一時変数のみ持つのか、或いはゴ
ール数が2個未満なのかに拘らず常にEレジスタからの
オフセット(E−1又はE+2)でローカルスタックに
プッシュしたポインタに統一的にアクセスでき、処理の
簡単化が図れる。なお、ここで述べるゴール数の中には
カットオペレータ(!)は含めない。
更に節が別解を持つか否かによって、カットオペレー
タを左から右へ通過した際にBレジスタに戻すポインタ
が異なり、別解ありではローカルスタックにプッシュさ
れたポインタで指される選択点フレームの前に形成され
た選択点フレームに対するポインタを、また別解無しで
はローカルスタックにプッシュされたポインタの値その
ものをBレジスタに戻す必要があるが、本発明では別解
の有無によってこれら別々の値をローカルスタックにプ
ッシュすることは行れない。即ち、節の実行中カットオ
ペレータを左から右へ通過する以前のゴールで失敗した
場合、バックトラックが起きるが、その際ローカルスタ
ックにプッシュしたポインタは使われることなく棄却さ
れる。従って別解ありの場合、カットオペレータを右か
ら左へ通過した時に巻戻す選択点フレームへのポインタ
を格納すると、ローカルスタックにリードアクセスする
分が余計に無駄になってしまう。ローカルスタック、即
ちメモリへのアクセスはプロセッサの処理の中で非常に
コストの高い処理であり、しかもカットオペレータを左
から右へ通過する前に失敗してバックトラックする情況
は、実際のPROLOGプログラム実行中に非常に頻繁に発生
する。このため、先ずBレジスタ内容をローカルスタッ
クにプッシュして、カットオペレータを無事に左から右
へ通過したあと、そのポインタを使って別解の有無によ
って真の巻戻し選択点フレーム位置を設定する。これに
よって処理効率が大幅に向上する。
タを左から右へ通過した際にBレジスタに戻すポインタ
が異なり、別解ありではローカルスタックにプッシュさ
れたポインタで指される選択点フレームの前に形成され
た選択点フレームに対するポインタを、また別解無しで
はローカルスタックにプッシュされたポインタの値その
ものをBレジスタに戻す必要があるが、本発明では別解
の有無によってこれら別々の値をローカルスタックにプ
ッシュすることは行れない。即ち、節の実行中カットオ
ペレータを左から右へ通過する以前のゴールで失敗した
場合、バックトラックが起きるが、その際ローカルスタ
ックにプッシュしたポインタは使われることなく棄却さ
れる。従って別解ありの場合、カットオペレータを右か
ら左へ通過した時に巻戻す選択点フレームへのポインタ
を格納すると、ローカルスタックにリードアクセスする
分が余計に無駄になってしまう。ローカルスタック、即
ちメモリへのアクセスはプロセッサの処理の中で非常に
コストの高い処理であり、しかもカットオペレータを左
から右へ通過する前に失敗してバックトラックする情況
は、実際のPROLOGプログラム実行中に非常に頻繁に発生
する。このため、先ずBレジスタ内容をローカルスタッ
クにプッシュして、カットオペレータを無事に左から右
へ通過したあと、そのポインタを使って別解の有無によ
って真の巻戻し選択点フレーム位置を設定する。これに
よって処理効率が大幅に向上する。
更に本発明のより好ましい実施例によれば、カットオ
ペレータを含む節の本体部を実行中サブゴールを起動し
ないことがコンパイル時点で明確に判定できるものにつ
いては、ローカルスタックに環境フレームやコンティニ
ュエーションフレームを全く形成しないで、カットオペ
レータを左から右へ通過してバックトラックを起こした
際の巻戻し選択点フレームが設定できる。
ペレータを含む節の本体部を実行中サブゴールを起動し
ないことがコンパイル時点で明確に判定できるものにつ
いては、ローカルスタックに環境フレームやコンティニ
ュエーションフレームを全く形成しないで、カットオペ
レータを左から右へ通過してバックトラックを起こした
際の巻戻し選択点フレームが設定できる。
既に述べたようにローカルスタックへのフレームの形
成はコストの高い処理なので、本発明によってこの処理
が大幅に低減でき、メモリ使用上の空間的効率、プログ
ラム実行上のスピード効率共に向上する。
成はコストの高い処理なので、本発明によってこの処理
が大幅に低減でき、メモリ使用上の空間的効率、プログ
ラム実行上のスピード効率共に向上する。
本発明では以上の処理を僅か4つのマシン命令を追加
することによって実現でき、コンパイルコードの生成の
点でも簡略な処理で行えるという利点がある。
することによって実現でき、コンパイルコードの生成の
点でも簡略な処理で行えるという利点がある。
(実施例) 以下、本発明を図示の実施例に基づいて詳細に説明す
る。
る。
第1図は、本実施例に係るPROLOG処理装置の構成を示
す図である。
す図である。
この装置は、主メモリ1、命令デコード部2、レジス
タファイル3及び算術演算ユニット(ALU)4で構成さ
れている。主メモリ1は、PROLOGプログラムを格納する
領域、上記PROLOGプログラムからマシン命令を生成する
ためのコンパイラを格納する領域、このコンパイラによ
って生成されたマシン命令を格納する領域、ローカルス
タック領域、ヒープ領域、トレイル領域等を提供するメ
モリである。命令デコード部2は、上記主メモリ1に格
納されたマシン命令を解釈する。このマシン命令に従っ
て主メモリ1及びレジスタファイル3に格納されたデー
タがデータバス5を介してALU4に送られ、適宜演算処理
を施されてレジスタファイル3や主メモリ1に格納され
る。
タファイル3及び算術演算ユニット(ALU)4で構成さ
れている。主メモリ1は、PROLOGプログラムを格納する
領域、上記PROLOGプログラムからマシン命令を生成する
ためのコンパイラを格納する領域、このコンパイラによ
って生成されたマシン命令を格納する領域、ローカルス
タック領域、ヒープ領域、トレイル領域等を提供するメ
モリである。命令デコード部2は、上記主メモリ1に格
納されたマシン命令を解釈する。このマシン命令に従っ
て主メモリ1及びレジスタファイル3に格納されたデー
タがデータバス5を介してALU4に送られ、適宜演算処理
を施されてレジスタファイル3や主メモリ1に格納され
る。
上記コンパイラは、与えられたPROLOGプログラムに対
し、これに対応するマシン命令を形成する。もし、与え
られたPROLOGプログラムにカットオペレータ(!)を含
む節が含まれている場合には、その節については、第2
図及び第3図に示すような処理が行われる。
し、これに対応するマシン命令を形成する。もし、与え
られたPROLOGプログラムにカットオペレータ(!)を含
む節が含まれている場合には、その節については、第2
図及び第3図に示すような処理が行われる。
即ち、本装置では、カットオペレータを処理するた
め、次の4つのマシン命令を追加する。第1のマシン命
令を仮りにmark−cp命令と呼ぶ。この命令ではBレジス
タの内容をローカルスタックのトップオブスタック(TO
S)にプッシュする。第2の命令を仮りにcut命令と呼
ぶ。この命令では(E−1)番地、若しくは(E+2)
番地(このどちらかはインプリメンテーション時に図示
される)から読み出して、Bレジスタに格納する。第3
の命令を仮りにicut命令と呼ぶ。この命令では(E−
1)番地、若しくは(E+2)番地からポインタを読み
出して、更にこのポインタで指される選択点フレームに
格納された前選択点フレームポインタを読み出し、Bレ
ジスタにロードする。第4の命令を仮りにdcut命令と呼
ぶ。この命令ではBレジスタによって指される選択点フ
レームから前選択点フレームポインタを読み出して、B
レジスタに格納する。
め、次の4つのマシン命令を追加する。第1のマシン命
令を仮りにmark−cp命令と呼ぶ。この命令ではBレジス
タの内容をローカルスタックのトップオブスタック(TO
S)にプッシュする。第2の命令を仮りにcut命令と呼
ぶ。この命令では(E−1)番地、若しくは(E+2)
番地(このどちらかはインプリメンテーション時に図示
される)から読み出して、Bレジスタに格納する。第3
の命令を仮りにicut命令と呼ぶ。この命令では(E−
1)番地、若しくは(E+2)番地からポインタを読み
出して、更にこのポインタで指される選択点フレームに
格納された前選択点フレームポインタを読み出し、Bレ
ジスタにロードする。第4の命令を仮りにdcut命令と呼
ぶ。この命令ではBレジスタによって指される選択点フ
レームから前選択点フレームポインタを読み出して、B
レジスタに格納する。
以上の4種の命令を使って、PROLOGプログラムのコン
パイル時に、問題の節を含むプロセジャに別解があるか
否かチェックし、更に、当該節が実行時にサブゴールを
起動する可能性があるか否かをチェックしコンパイルコ
ードを以下のように作成する。
パイル時に、問題の節を含むプロセジャに別解があるか
否かチェックし、更に、当該節が実行時にサブゴールを
起動する可能性があるか否かをチェックしコンパイルコ
ードを以下のように作成する。
先ず第2図で、カットオペレータをゴールとして本体
部に含む節に対してallocate命令の前、若しくはalloca
te命令の後にmark−cp命令を生成する(S1)。ここで、
allocate命令は、当該節が永久変数を持つ場合(永久変
数を持つか否かの判定は、既に述べたように文献1の方
法で行なう。)には環境フレームの中のコンティニュエ
ーションを形成する働きをし、当該節が永久変数を持た
ない場合は、永久変数の値セルを持たないコンティニュ
エーションを単独で形成する働きをする。
部に含む節に対してallocate命令の前、若しくはalloca
te命令の後にmark−cp命令を生成する(S1)。ここで、
allocate命令は、当該節が永久変数を持つ場合(永久変
数を持つか否かの判定は、既に述べたように文献1の方
法で行なう。)には環境フレームの中のコンティニュエ
ーションを形成する働きをし、当該節が永久変数を持た
ない場合は、永久変数の値セルを持たないコンティニュ
エーションを単独で形成する働きをする。
allocate命令とmark−cp命令の前後関係で当然ローカ
ルスタックでBレジスタ内容が格納される番地が変わっ
て来る。mark−cp命令が先の場合(E−1)番地に格納
され、allocate命令が先の場合(E+2)番地に格納さ
れることなる。さて次に当該節を含むプロセジャが別解
を持つか否か判定(S2)し、別解を持つ場合には、節の
本体部のカットオペレータ位置にicut命令を生成する
(S3)。別解を持たない場合には、カットオペレータ位
置にcut命令を生成する(S4)。以上が、本装置でカッ
トオペレータを含む節のコンパイルコードを生成するた
めの第1の手順である。
ルスタックでBレジスタ内容が格納される番地が変わっ
て来る。mark−cp命令が先の場合(E−1)番地に格納
され、allocate命令が先の場合(E+2)番地に格納さ
れることなる。さて次に当該節を含むプロセジャが別解
を持つか否か判定(S2)し、別解を持つ場合には、節の
本体部のカットオペレータ位置にicut命令を生成する
(S3)。別解を持たない場合には、カットオペレータ位
置にcut命令を生成する(S4)。以上が、本装置でカッ
トオペレータを含む節のコンパイルコードを生成するた
めの第1の手順である。
第2の手順は、カットオペレータを含む節の実行中、
サブゴールを起動しないことがコンパイル時点で予め明
らかなものについてのフレーム形成を防止する手順であ
る。
サブゴールを起動しないことがコンパイル時点で予め明
らかなものについてのフレーム形成を防止する手順であ
る。
第3図において、先ずカットオペレータをゴールとし
て含む節が本体部を実行中サブゴールを起動するか否か
判定する(S5)。本体部のゴールが、数値演算、論理演
算、比較演算、その他の組込み述語のみから構成される
場合、サブゴールの起動は不要である。このようなゴー
ルは予めテーブルに登録しておくことにより、テーブル
の参照によってS5の判断が行える。サブゴールの起動が
あり得ると判定されると、既に説明した手順1の方法で
カットオペレータを処理する(S6)。サブゴールの起動
が無いと判定されると、更に当該節を含むプロセジャに
別解が有るか否かの判定に移る(S7)。ここで別解有り
と判定された場合、カットオペレータ位置にdcut命令を
生成する(S8)。又、別解無しと判定された場合は、バ
ックトラックポイントのローカルスタックへの退避が省
略できるので、特に何もする必要が無い。
て含む節が本体部を実行中サブゴールを起動するか否か
判定する(S5)。本体部のゴールが、数値演算、論理演
算、比較演算、その他の組込み述語のみから構成される
場合、サブゴールの起動は不要である。このようなゴー
ルは予めテーブルに登録しておくことにより、テーブル
の参照によってS5の判断が行える。サブゴールの起動が
あり得ると判定されると、既に説明した手順1の方法で
カットオペレータを処理する(S6)。サブゴールの起動
が無いと判定されると、更に当該節を含むプロセジャに
別解が有るか否かの判定に移る(S7)。ここで別解有り
と判定された場合、カットオペレータ位置にdcut命令を
生成する(S8)。又、別解無しと判定された場合は、バ
ックトラックポイントのローカルスタックへの退避が省
略できるので、特に何もする必要が無い。
次に、先ず手順1の場合について、カットオペレータ
を含む節が単独でプロセジャを形成している例を第4図
に示す。コンパイラは、この節の冒頭でmark−cp命令、
続いてallocate命令の順に、又はallocate命令、続いて
mark−cp命令の順にコード生成を行なう。次いでカット
オペレータ位置でcut命令を生成する。第5図は節の冒
頭の2命令を実行した時のローカルスタックで、同図
(a)はmark−cp命令、allocate命令の順で実行した場
合、同図(b)はallocate命令、mark−cp命令の順で実
行した場合について示している。既に述べた様に、Bレ
ジスタ内容が格納されるローカルスタックの番地が
(a)の場合には(E−1)番地、(b)の場合には
(E+2)番地である。更に、(b)の場合では、永久
変数の値セルのオフセットが変わって、(E+3)番地
から第1変数が格納される。このため、(b)の場合カ
ットゴールを含まない節を実行する場合の環境フレーム
を生成する時も、(E+2)番地をスキップして第1変
数を格納しなければならない。本図で、太い枠組みをし
た選択点フレームがカットオペレータを右から左へと実
行した時にバットトラックで戻る選択点フレームで、ma
rk−cp命令で格納されたポインタによって指示されてい
ることが判る。このため、カットオペレータ位置にはロ
ーカルスタックから取り出したポインタをBレジスタに
戻す機能を持つ、cut命令が使われる。
を含む節が単独でプロセジャを形成している例を第4図
に示す。コンパイラは、この節の冒頭でmark−cp命令、
続いてallocate命令の順に、又はallocate命令、続いて
mark−cp命令の順にコード生成を行なう。次いでカット
オペレータ位置でcut命令を生成する。第5図は節の冒
頭の2命令を実行した時のローカルスタックで、同図
(a)はmark−cp命令、allocate命令の順で実行した場
合、同図(b)はallocate命令、mark−cp命令の順で実
行した場合について示している。既に述べた様に、Bレ
ジスタ内容が格納されるローカルスタックの番地が
(a)の場合には(E−1)番地、(b)の場合には
(E+2)番地である。更に、(b)の場合では、永久
変数の値セルのオフセットが変わって、(E+3)番地
から第1変数が格納される。このため、(b)の場合カ
ットゴールを含まない節を実行する場合の環境フレーム
を生成する時も、(E+2)番地をスキップして第1変
数を格納しなければならない。本図で、太い枠組みをし
た選択点フレームがカットオペレータを右から左へと実
行した時にバットトラックで戻る選択点フレームで、ma
rk−cp命令で格納されたポインタによって指示されてい
ることが判る。このため、カットオペレータ位置にはロ
ーカルスタックから取り出したポインタをBレジスタに
戻す機能を持つ、cut命令が使われる。
次は同じく手順1の場合について、カットオペレータ
を含む節が複数個の節とプロセジャを形成している場
合、即ち別解ありの場合を第6図に示す。この節の冒頭
では第4図の場合と同様にmark−cp命令とallocate命令
が生成される。またカットオペレータ位置では今度にic
ut命令が生成される。第7図はこの節の冒頭の2命令を
実行した後のローカルスタックを示し、(a)がmark−
cp命令、allocate命令、(b)がallocate命令、mark−
cp命令の順で実行した場合で、Eレジスタとmark−cp命
令でプッシュされたポインタの位置関係は第4図の場合
と同様である。第7図でも、カットオペレータを左から
右へ実行した場合バックトラックで戻るべき選択点フレ
ームを太い枠組で示してあるが、第5図の場合と異な
り、mark−cp命令で格納したポインタによって直接指さ
れてはいない。従って、第6図のカットオペレータ位置
では、ローカルスタックから取り出したポインタによっ
て指される選択点フレームに格納された前選択点フレー
ムへのポインタをBレジスタにロードするicut命令を生
成する。
を含む節が複数個の節とプロセジャを形成している場
合、即ち別解ありの場合を第6図に示す。この節の冒頭
では第4図の場合と同様にmark−cp命令とallocate命令
が生成される。またカットオペレータ位置では今度にic
ut命令が生成される。第7図はこの節の冒頭の2命令を
実行した後のローカルスタックを示し、(a)がmark−
cp命令、allocate命令、(b)がallocate命令、mark−
cp命令の順で実行した場合で、Eレジスタとmark−cp命
令でプッシュされたポインタの位置関係は第4図の場合
と同様である。第7図でも、カットオペレータを左から
右へ実行した場合バックトラックで戻るべき選択点フレ
ームを太い枠組で示してあるが、第5図の場合と異な
り、mark−cp命令で格納したポインタによって直接指さ
れてはいない。従って、第6図のカットオペレータ位置
では、ローカルスタックから取り出したポインタによっ
て指される選択点フレームに格納された前選択点フレー
ムへのポインタをBレジスタにロードするicut命令を生
成する。
次いで手順2の処理法について説明する。当該節がサ
ブゴールを起動する場合は手順1と処理は同じである。
当該節がサブゴールを起動しない場合、更に別解を持た
ない場合は何もする必要が無いことを示した。別解を持
つ場合について、第8図の例で説明する。この図で、カ
ットオペレータを含む問題の節の後には、未試行の節が
残されている。この時カットオペレータ位置にdcut命令
を生成する。これによって、この節の実行時、前選択点
フレールへのポインタがBレジスタにロードされる。
ブゴールを起動する場合は手順1と処理は同じである。
当該節がサブゴールを起動しない場合、更に別解を持た
ない場合は何もする必要が無いことを示した。別解を持
つ場合について、第8図の例で説明する。この図で、カ
ットオペレータを含む問題の節の後には、未試行の節が
残されている。この時カットオペレータ位置にdcut命令
を生成する。これによって、この節の実行時、前選択点
フレールへのポインタがBレジスタにロードされる。
以上の処理で、カットオペレータを右から左へ通過す
る際、通常のバックトラックと同じ処理で所定位置まで
選択点フレームを巻戻すことができる。
る際、通常のバックトラックと同じ処理で所定位置まで
選択点フレームを巻戻すことができる。
以下に具体例に則して本実施例の装置の作用を説明す
る。先ず第2図の手順1の方法について説明する。第9
図(a)はカットオペレータを含む節が別解を持つ場合
のプログラム例である。先ず、節1が起動され、ゴール
Pに対して節2をまたゴールQに対して節4を実行する
場合を考える。節4の実行で更に、ゴールSに対して節
7を、またゴールTに対して節9を実行する場合、節1,
節4が永久変数を持つと仮定すると、節1,節4で環境フ
レームが、また、プロセジャP,Q,S,Tでそれぞれ選択点
フレームが形成され、第9図(c)の如きローカルスタ
ックが形成される。但し後で述べる様にバックトラック
ポイントを環境フレームの手前に形成するように、マシ
ン命令を生成するものと考える(以下同)。第9図
(b)は第9図(a)のプロセジャQをコンパイルして
得られたもので、問題のカットオペレータを含む節4に
対するマシン命令には(1)〜(12)の番号を付してあ
る。命令(1)のtry−me−elseでローカルスタックに
選択点フレームCP(Q)が形成される。次いで命令
(2)のmark−cpでローカルスタックにBレジスタの内
容が格納される。Bレジスタはこの直前に形成されたCP
(Q)を指しているので、CP(Q)へのポインタが格納
されることになる。次いで(6)のcall S,(8)のcal
l Tによって各々第9図(a)の節7,節9が実行され、
既に述べた第9図(c)のローカルスタックが形成され
る。この図で太く枠組みをした選択点フレーム、即ちCP
(P)がカットオペレータを右から左へ実行した時に巻
戻されるフレームである。第9図(b)の(9)icut命
令が実行されると、(E−1)からCP(Q)のポインタ
が取り出され、その中に格納された前選択点フレームポ
インタ、即ちCP(Q)へのポインタが、Bレジスタに格
納される。第9図(d)は第9図(a)の節4が永久変
数を持たない場合のローカルスタックで、環境フレーム
がコンティニュエーションに変わっている。この場合、
カットオペレータに関しては第9図(b)の(2),
(9)と同じ命令が同じ位置に生成される。
る。先ず第2図の手順1の方法について説明する。第9
図(a)はカットオペレータを含む節が別解を持つ場合
のプログラム例である。先ず、節1が起動され、ゴール
Pに対して節2をまたゴールQに対して節4を実行する
場合を考える。節4の実行で更に、ゴールSに対して節
7を、またゴールTに対して節9を実行する場合、節1,
節4が永久変数を持つと仮定すると、節1,節4で環境フ
レームが、また、プロセジャP,Q,S,Tでそれぞれ選択点
フレームが形成され、第9図(c)の如きローカルスタ
ックが形成される。但し後で述べる様にバックトラック
ポイントを環境フレームの手前に形成するように、マシ
ン命令を生成するものと考える(以下同)。第9図
(b)は第9図(a)のプロセジャQをコンパイルして
得られたもので、問題のカットオペレータを含む節4に
対するマシン命令には(1)〜(12)の番号を付してあ
る。命令(1)のtry−me−elseでローカルスタックに
選択点フレームCP(Q)が形成される。次いで命令
(2)のmark−cpでローカルスタックにBレジスタの内
容が格納される。Bレジスタはこの直前に形成されたCP
(Q)を指しているので、CP(Q)へのポインタが格納
されることになる。次いで(6)のcall S,(8)のcal
l Tによって各々第9図(a)の節7,節9が実行され、
既に述べた第9図(c)のローカルスタックが形成され
る。この図で太く枠組みをした選択点フレーム、即ちCP
(P)がカットオペレータを右から左へ実行した時に巻
戻されるフレームである。第9図(b)の(9)icut命
令が実行されると、(E−1)からCP(Q)のポインタ
が取り出され、その中に格納された前選択点フレームポ
インタ、即ちCP(Q)へのポインタが、Bレジスタに格
納される。第9図(d)は第9図(a)の節4が永久変
数を持たない場合のローカルスタックで、環境フレーム
がコンティニュエーションに変わっている。この場合、
カットオペレータに関しては第9図(b)の(2),
(9)と同じ命令が同じ位置に生成される。
次に第10図(a)のプログラムを用いて、カットゴー
ルを含む節が別解を持たない場合の処理法について説明
する。第9図(a)の場合と異なるのはプロセジャQの
中で、カットオペレータを含む節が第10図(a)では最
後に配置されている点である。プロセジャQをコンパイ
ルして生成したマシン命令を第10図(b)に示す。問題
の節6に対応するコードは(1)〜(12)のマシン命令
列である。ここでも第9図(b)の場合と同じように
(3)のallocate命令の前にmark−cp命令を置いている
が、ゴールTを実行した後は第9図(b)のicut命令で
は無くcut命令を生成する。第10図(a)で節1の起動
から始まって、節2,節6,節7,節9を実行する際のローカ
ルスタックを、節6が永久変数を持つ場合と持たない場
合について各々第10図(c),第10図(d)に示す。永
久変数を持つ場合は環境フレームが形成され、持たない
場合はコンティニュエーションが形成されるが、何れも
その下にプッシュされたポインタが、太く枠組みされた
選択点フレームを指している。
ルを含む節が別解を持たない場合の処理法について説明
する。第9図(a)の場合と異なるのはプロセジャQの
中で、カットオペレータを含む節が第10図(a)では最
後に配置されている点である。プロセジャQをコンパイ
ルして生成したマシン命令を第10図(b)に示す。問題
の節6に対応するコードは(1)〜(12)のマシン命令
列である。ここでも第9図(b)の場合と同じように
(3)のallocate命令の前にmark−cp命令を置いている
が、ゴールTを実行した後は第9図(b)のicut命令で
は無くcut命令を生成する。第10図(a)で節1の起動
から始まって、節2,節6,節7,節9を実行する際のローカ
ルスタックを、節6が永久変数を持つ場合と持たない場
合について各々第10図(c),第10図(d)に示す。永
久変数を持つ場合は環境フレームが形成され、持たない
場合はコンティニュエーションが形成されるが、何れも
その下にプッシュされたポインタが、太く枠組みされた
選択点フレームを指している。
従って第10図(a)の節6でゴールTの実行が終わっ
た時点でBレジスタはプロセジャQの選択点フレームを
指しているが、カットオペレータを左から右へ実行する
時点でcut命令を実行することにより、(E−1)番地
からポインタを取り出して、Bレジスタにロードする。
た時点でBレジスタはプロセジャQの選択点フレームを
指しているが、カットオペレータを左から右へ実行する
時点でcut命令を実行することにより、(E−1)番地
からポインタを取り出して、Bレジスタにロードする。
以上の方法で、カットオペレータを含む節が別解を持
つ場合も持たない場合も、カットオペレータを左から右
へ実行する際にローカルスタックの(E−1)番地から
取り出したポインタをそのまま、或いはインデックスと
して使ってバックトラック時の選択点フレームを設定す
ることができる。
つ場合も持たない場合も、カットオペレータを左から右
へ実行する際にローカルスタックの(E−1)番地から
取り出したポインタをそのまま、或いはインデックスと
して使ってバックトラック時の選択点フレームを設定す
ることができる。
次に第3図に示した手順2の方法について説明する。
ここではカットオペレータを含む節がサブゴールを起動
しない場合について説明すれば良い。第11図(a)が別
解を持つ場合、即ち第3図のS8の場合のプログラム例で
ある。節4は第11図(b)の(1)〜(9)のようにコ
ンパイルされる。即ちvar(X)に対しては(4),
(5)に、又X=Yに対しては(8)の既存のマシン命
令に展開でき、サブゴールの起動は不要である。今第11
図(a)で節1,節2と節4のvar(X)まで実行したと
するとローカルスタックには第11図(c)のようにフレ
ームが形成される。カットオペレータを右から左へ通過
する時にバックトラックで戻る選択点フレームはCP
(P)だが、これはBレジスタで指される現選択点フレ
ームに格納された前選択点フレームポインタで指される
フレームである。従って第11図(b)で(6)のdcut命
令を実行すれば良い。
ここではカットオペレータを含む節がサブゴールを起動
しない場合について説明すれば良い。第11図(a)が別
解を持つ場合、即ち第3図のS8の場合のプログラム例で
ある。節4は第11図(b)の(1)〜(9)のようにコ
ンパイルされる。即ちvar(X)に対しては(4),
(5)に、又X=Yに対しては(8)の既存のマシン命
令に展開でき、サブゴールの起動は不要である。今第11
図(a)で節1,節2と節4のvar(X)まで実行したと
するとローカルスタックには第11図(c)のようにフレ
ームが形成される。カットオペレータを右から左へ通過
する時にバックトラックで戻る選択点フレームはCP
(P)だが、これはBレジスタで指される現選択点フレ
ームに格納された前選択点フレームポインタで指される
フレームである。従って第11図(b)で(6)のdcut命
令を実行すれば良い。
第12図(a)はカットオペレータを含む節が別解を持
たない場合の例で、プロセジャQは第12図(b)のよう
にコンパイルされる。第11図(b)の場合と異なりカッ
トオペレータに関する特別なマシン命令の生成は不要で
ある。第12図(a)で節1,節2から節6のvar(X)ま
でを実施した時のローカルスタックが第12図(c)に示
されているが、この時点でカットオペレータを右か左へ
通過する時にバックトラックで戻るべき選択点フレーム
CP(P)がBレジスタで指されている。従ってこの場
合、特別なマシン命令の追加が不要となる。
たない場合の例で、プロセジャQは第12図(b)のよう
にコンパイルされる。第11図(b)の場合と異なりカッ
トオペレータに関する特別なマシン命令の生成は不要で
ある。第12図(a)で節1,節2から節6のvar(X)ま
でを実施した時のローカルスタックが第12図(c)に示
されているが、この時点でカットオペレータを右か左へ
通過する時にバックトラックで戻るべき選択点フレーム
CP(P)がBレジスタで指されている。従ってこの場
合、特別なマシン命令の追加が不要となる。
[発明の効果] 本発明によれば、常に現環境フレームへのポインタ
(Eレジスタ)からのオフセットでローカルスタックに
プッシュしたポインタに統一的にアクセスでき、処理の
簡単化が図れる。
(Eレジスタ)からのオフセットでローカルスタックに
プッシュしたポインタに統一的にアクセスでき、処理の
簡単化が図れる。
また、本発明によれば、コストの高いローカルスタッ
クへのフレームの形成処理が大幅に低減でき、メモリ使
用上の空間的効率、プログラム実行上のスピード効率共
に向上する。
クへのフレームの形成処理が大幅に低減でき、メモリ使
用上の空間的効率、プログラム実行上のスピード効率共
に向上する。
本発明では以上の処理を僅か4つのマシン命令を追加
することによって実現でき、コンパイルコードの生成の
点でも簡略な処理で行えるという利点がある。
することによって実現でき、コンパイルコードの生成の
点でも簡略な処理で行えるという利点がある。
従って、本発明によればPROLOG言語で重要な約割りを
果たし、しかも効率の良いインプリメンテーションが難
しかったカットオペレータが高速で処理できる。
果たし、しかも効率の良いインプリメンテーションが難
しかったカットオペレータが高速で処理できる。
第1図〜第12図は本発明の一実施例を説明するための図
で、第1図は本発明の一実施例に係るPROLOG処理装置の
構成を示すブロック図、第2図は同処理装置におけるコ
ンパイラのカットオペレータの第1の手順の処理フロー
を示す流れ図、第3図は同処理装置におけるコンパイラ
のカットオペレータの第2の手順の処理フローを示す流
れ図、第4図は前記第1の手順の具体例を説明するため
の図、第5図は同具体例を実行する際のローカルスタッ
クの様子を示す図、第6図は前記第1の手順の他の具体
例を説明するための図、第7図は同具体例を実行する際
のローカルスタックの様子を示す図、第8図は前記第2
の手順の具体例を説明するための図、第9図は第2図の
ステップS2の処理例を示す図で、同図(a)はプログラ
ム例、同図(b)は同プログラムに対応するマシン命
令、同図(c)及び(d)はローカルスタックの様子を
それぞれ示す図、第10図は第2図のステップS4の処理例
を示す図で、同図(a)はプログラム例、同図(b)は
同プログラムに対応するマシン命令、同図(c)及び
(d)はローカルスタックの様子をそれぞれ示す図、第
11図は第3図のステップS8の処理例を示す図で、同図
(a)はプログラム例、同図(b)は同プログラムに対
応するマシン命令、同図(c)はローカルスタックの様
子をそれぞれ示す図、第12図は第3図のステップS7で別
解が無い場合の処理例を示す図で、同図(a)はプログ
ラム例、同図(b)は同プログラムに対応するマシン命
令、同図(c)はローカルスタックの様子をそれぞれ示
す図、第13図はPROLOG処理装置におけるメモリ割付け例
を示す図、第14図は選択点フレームの構成図、第15図は
環境フレームの構成図、第16図は従来のPROLOG処理装置
でプログラムをマシン命令に展開した図、第17図はカッ
トオペレータを含むPROLOGプログラム例、第18図は同プ
ログラム実行中のローカルスタックの様子を示す図であ
る。 1……主メモリ、2……命令デコード部、3……レジス
タファイル、4……ALU、5……データバス。
で、第1図は本発明の一実施例に係るPROLOG処理装置の
構成を示すブロック図、第2図は同処理装置におけるコ
ンパイラのカットオペレータの第1の手順の処理フロー
を示す流れ図、第3図は同処理装置におけるコンパイラ
のカットオペレータの第2の手順の処理フローを示す流
れ図、第4図は前記第1の手順の具体例を説明するため
の図、第5図は同具体例を実行する際のローカルスタッ
クの様子を示す図、第6図は前記第1の手順の他の具体
例を説明するための図、第7図は同具体例を実行する際
のローカルスタックの様子を示す図、第8図は前記第2
の手順の具体例を説明するための図、第9図は第2図の
ステップS2の処理例を示す図で、同図(a)はプログラ
ム例、同図(b)は同プログラムに対応するマシン命
令、同図(c)及び(d)はローカルスタックの様子を
それぞれ示す図、第10図は第2図のステップS4の処理例
を示す図で、同図(a)はプログラム例、同図(b)は
同プログラムに対応するマシン命令、同図(c)及び
(d)はローカルスタックの様子をそれぞれ示す図、第
11図は第3図のステップS8の処理例を示す図で、同図
(a)はプログラム例、同図(b)は同プログラムに対
応するマシン命令、同図(c)はローカルスタックの様
子をそれぞれ示す図、第12図は第3図のステップS7で別
解が無い場合の処理例を示す図で、同図(a)はプログ
ラム例、同図(b)は同プログラムに対応するマシン命
令、同図(c)はローカルスタックの様子をそれぞれ示
す図、第13図はPROLOG処理装置におけるメモリ割付け例
を示す図、第14図は選択点フレームの構成図、第15図は
環境フレームの構成図、第16図は従来のPROLOG処理装置
でプログラムをマシン命令に展開した図、第17図はカッ
トオペレータを含むPROLOGプログラム例、第18図は同プ
ログラム実行中のローカルスタックの様子を示す図であ
る。 1……主メモリ、2……命令デコード部、3……レジス
タファイル、4……ALU、5……データバス。
Claims (6)
- 【請求項1】PROLOGプログラムを解釈し、同一のローカ
ルスタック上に環境フレーム、コンティニュエーション
フレーム及び選択点フレームを形成しながら前記PROLOG
プログラムの実行を進めるための該プログラムに対応し
たマシン命令を生成するコンパイルを行い、該マシン命
令を実行するPROLOG処理方法において、 前記コンパイルは、 前記PROLOGプログラム中にカットオペレータを含む節が
存在するとき、現選択点フレームへのポインタ用のレジ
スタの内容をバックトラックポイントとして前記ローカ
ルスタックにプッシュする第1のマシン命令を、前記カ
ットオペレータを含む節の環境フレームを形成するマシ
ン命令の直前または直後に生成する第1のマシン命令生
成ステップと、 前記第1のマシン命令生成ステップの後に前記カットオ
ペレータを含む節が別解を持つか否かを判定する判定ス
テップと、 前記判定ステップにより前記カットオペレータを含む節
が別解を持たないと判定された場合には、現環境フレー
ムへのポインタから所定のオフセット量を加えたローカ
ルスタック上の位置からポインタを読み出して前記レジ
スタにロードする第2のマシン命令を、前記カットオペ
レータを実行するマシン命令の位置に生成する第2のマ
シン命令生成ステップと、 前記判定ステップにより前記カットオペレータを含む節
が別解を持つと判定された場合には、現環境フレームへ
のポインタから前記所定のオフセット量を加えたローカ
ルスタック上の位置からポインタを読み出し、このポイ
ンタで指示される選択点フレームに格納された前選択点
フレームのポインタを読み出して前記レジスタにロード
する第3のマシン命令を、前記カットオペレータを実行
するマシン命令の位置に生成する第3のマシン命令生成
ステップとを有することを特徴とするPROLOG処理方法。 - 【請求項2】前記第1のマシン命令生成ステップにおい
て前記カットオペレータを含む節の前記環境フレームを
生成するマシン命令の直前に前記第1のマシン命令を生
成する場合は、前記オフセット量を−1とすることを特
徴とする特許請求の範囲第1項記載のPROLOG処理方法。 - 【請求項3】前記第1のマシン命令生成ステップにおい
て前記カットオペレータを含む節の前記環境フレームを
生成するマシン命令の直後に前記第1のマシン命令を生
成する場合は、前記オフセット量を+2とすることを特
徴とする特許請求の範囲第1項記載のPROLOG処理方法。 - 【請求項4】PROLOGプログラムを解釈し、同一のローカ
ルスタック上に環境フレーム、コンティニュエーション
フレーム及び選択点フレームを形成しながら前記PROLOG
プログラムの実行を進めるための該プログラムに対応し
たマシン命令を生成するコンパイルを行い、該マシン命
令を実行するPROLOG処理方法において、 前記コンパイルは、 前記PROLOGプログラム中にカットオペレータを含む節が
存在するとき、該節がサブゴールを起動する可能性があ
るか否かを判定する第1の判定ステップと、 前記第1の判定ステップにより前記カットオペレータを
含む節がサブゴールを起動する可能性があると判定され
た場合には、現選択点フレームへのポインタ用のレジス
タの内容をバックトラックポイントとして前記ローカル
スタックにプッシュする第1のマシン命令を、前記カッ
トオペレータを含む節の環境フレームを形成するマシン
命令の直前または直後に生成する第1のマシン命令生成
ステップと、 前記第1のマシン命令生成ステップの後に前記カットオ
ペレータを含む節が別解を持つか否かを判定する第2の
判定ステップと、 前記第1の判定ステップにより前記カットオペレータを
含む節がサブゴールを起動する可能性があると判定さ
れ、かつ前記第2の判定ステップにより前記カットオペ
レータを含む節が別解を持たないと判定された場合に
は、現環境フレームへのポインタから所定のオフセット
量を加えたローカルスタック上の位置からポインタを読
み出して前記レジスタにロードする第2のマシン命令
を、前記カットオペレータを実行するマシン命令の位置
に生成する第2のマシン命令生成ステップと、 前記第1の判定ステップにより前記カットオペレータを
含む節がサブゴールを起動する可能性があると判定さ
れ、かつ前記第2の判定ステップにより前記カットオペ
レータを含む節が別解を持つと判定された場合には、現
環境フレームへのポインタから前記所定のオフセット量
を加えたローカルスタック上の位置からポインタを読み
出し、このポインタで指示される選択点フレームに格納
された前選択点フレームのポインタを読み出して前記レ
ジスタにロードする第3のマシン命令を、前記カットオ
ペレータを実行するマシン命令の位置に生成する第3の
マシン命令生成ステップと、 前記第1の判定ステップにより前記カットオペレータを
含む節がサブゴールを起動する可能性がないと判定さ
れ、かつ前記第2の判定ステップにより前記カットオペ
レータを含む節が別解を持つと判定された場合には、現
選択点フレームから前選択点フレームへのポインタを読
み出して前記レジスタにロードする第4のマシン命令
を、前記カットオペレータを実行するマシン命令の位置
に生成する第4のマシン命令生成手段とを有することを
特徴とするPROLOG処理方法。 - 【請求項5】前記第1のマシン命令生成ステップにおい
て前記カットオペレータを含む節の前記環境フレームを
生成するマシン命令の直前に前記第1のマシン命令を生
成する場合は、前記オフセット量を−1とすることを特
徴とする特許請求の範囲第4項記載のPROLOG処理方法。 - 【請求項6】前記第1のマシン命令生成ステップにおい
て前記カットオペレータを含む節の前記環境フレームを
生成するマシン命令の直前に前記第1のマシン命令を生
成する場合は、前記オフセット量を+2とすることを特
徴とする特許請求の範囲第1項記載のPROLOG処理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP62203711A JP2590126B2 (ja) | 1987-08-17 | 1987-08-17 | Prolog処理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP62203711A JP2590126B2 (ja) | 1987-08-17 | 1987-08-17 | Prolog処理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPS6446839A JPS6446839A (en) | 1989-02-21 |
JP2590126B2 true JP2590126B2 (ja) | 1997-03-12 |
Family
ID=16478584
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP62203711A Expired - Lifetime JP2590126B2 (ja) | 1987-08-17 | 1987-08-17 | Prolog処理方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2590126B2 (ja) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113760193B (zh) * | 2021-08-26 | 2024-04-02 | 武汉天喻信息产业股份有限公司 | 用于资源受限制装置的数据读写方法、装置及指令集 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS61213930A (ja) * | 1985-03-19 | 1986-09-22 | Hitachi Ltd | Prolog言語処理方式 |
-
1987
- 1987-08-17 JP JP62203711A patent/JP2590126B2/ja not_active Expired - Lifetime
Also Published As
Publication number | Publication date |
---|---|
JPS6446839A (en) | 1989-02-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Hermenegildo | An abstract machine for restricted AND-parallel execution of logic programs | |
Abdulla et al. | Source sets: A foundation for optimal dynamic partial order reduction | |
US20030188300A1 (en) | Parallel processing system design and architecture | |
US7426719B2 (en) | Method and system for rewriting unwind data in the presence of exceptions | |
CN112487092A (zh) | 一种基于区块链的智能合约调用方法及装置 | |
Shen | Overview of DASWAM: exploitation of dependent AND-parallelism | |
JP2590126B2 (ja) | Prolog処理方法 | |
US6427231B1 (en) | System and method for multiple entry point access to an object | |
JP2752094B2 (ja) | 論理型言語におけるバックトラック処理方式 | |
Tamitani et al. | An encoder/decoder chip set for the MPEG video standard | |
Prabhala et al. | Efficient computation of expressions with common subexpressions | |
Richards | The BCPL programming manual | |
JP2590127B2 (ja) | Prolog処理方法 | |
Levy | A GHC abstract machine and instruction set | |
Albert et al. | Systematic testing of actor systems | |
Kuchen et al. | Independent AND-parallel implementation of narrowing | |
Tarau | A Hitchhiker's Guide to Reinventing a Prolog Machine | |
Kliger | Compiling concurrent logic programming languages | |
JP3461185B2 (ja) | ロードモジュールへのソースコード行番号登録方法および装置 | |
US20040243792A1 (en) | Efficiently releasing locks when an exception occurs | |
Zhou | A Novel Implementation Method of Delay. | |
Krall | Implementation techniques for Prolog. | |
Pontelli et al. | Efficient backtracking in and-parallel implementations of non-deterministic languages | |
Ramkumar et al. | A join algorithm for combining AND parallel solutions in AND/OR parallel systems | |
JPH01237840A (ja) | 論理型言語処理方式 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
EXPY | Cancellation because of completion of term | ||
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20071205 Year of fee payment: 11 |