JPH03136140A - コンピュータ・システムを操作する方法及びコンピュータ・システム - Google Patents

コンピュータ・システムを操作する方法及びコンピュータ・システム

Info

Publication number
JPH03136140A
JPH03136140A JP2210576A JP21057690A JPH03136140A JP H03136140 A JPH03136140 A JP H03136140A JP 2210576 A JP2210576 A JP 2210576A JP 21057690 A JP21057690 A JP 21057690A JP H03136140 A JPH03136140 A JP H03136140A
Authority
JP
Japan
Prior art keywords
prolog
prologue
interrupt
predicate
address
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.)
Granted
Application number
JP2210576A
Other languages
English (en)
Other versions
JPH0623956B2 (ja
Inventor
Marc J L Gillet
マーク・ジイーンルイス・ジレツト
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Publication of JPH03136140A publication Critical patent/JPH03136140A/ja
Publication of JPH0623956B2 publication Critical patent/JPH0623956B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4812Task transfer initiation or dispatching by interrupt, e.g. masked
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4496Unification in logic programming

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】本公報は電子出願前の出願データであるた
め要約のデータは記録されません。

Description

【発明の詳細な説明】 A、産業上の利用分野 本発明は総括的にプロローグ・コンパイラ/インタプリ
タの改善に関し、詳細にいえばプロローグ命令に割込み
処理機能を付加する手法に関する。
B、従来技術及びその課題 本発明はIBMの370用プロローグを作成するために
行なわれた一連の改善の1つである。その名前が意味す
るように、コンパイラはIBMの370/XA環境に合
わせて最適化されている。
しかしながら、本発明はその他のあらゆる32ビツト・
アーキテクチャにおいても同様に作動するものである。
したがって、たとえば、本発明はインテル80X86プ
ロセツサまたはモトローラ680XOで実現できる。
最初のプロローグ・インタプリタは1972年にフィリ
ップ・ラッセルによって、フランスで開発された。彼の
初期の研究は拡張され、カナダのウォータールー大学で
行なわれた研究によって、IBM  S/370で初め
て実現された。プロローグ言語の歴史及び内容の優れた
要約は、デビット・H−D−ウォレン(David H
,D、 Varren)による、rImplement
ing PrologJ 1DAI Re5earch
 ReportNo、39(1977年5月)という報
告に収められている。
その論文において、ウオレン氏はプロローグ言語の2つ
の基本部分、すなわちホーン節といわれる論理ステート
メント及びプルーフを構築する際にプログラマが使用す
る制御言語を説明している。
第4.1節は本発明の理解の基礎となるプロローグの構
文と用語を開示している。言語は正式なブルーフで作成
される。したがって、たとえば、P←Q&R&SはQ及
びR及びSであればPと解釈される。第4.1節を慎重
に読めば、充分な知識のない読者がプロローグの構文と
主要なコマンドを理解できるようになろう。
プロローグの命令はゲット、プツト、ユニファイ、プロ
シージャ及びインデックス命令を含んでいる。プロロー
グの命令セットの優れた要約が、rAn Abstra
ct Prolog In5truction 5et
J )Technical Note 309、SRI
 Project 4776 (1983年10月)と
いうウォレン氏の他の記事に収められている。ウォレン
氏の記事はすべてのプロロー−4−b − グ・コンパイラ/インタプリタに標準として受は入れら
れている古典的なプロローグの構文を説明している。プ
ロローグ言語はrA Tutorial on the
Warren Abstract Machine f
or ComputationalLogicJガブリ
エル他(Gabriel et al) 1Argon
neNational Laboratory (19
85年6月)によって、さらに明確となろう。
伝統的なプロローグ・システムはその発明者に敬意を表
してウォレン・アブストラクト・マシン(WAM)と呼
ばれる。WAMのアーキテクチャはウォレン氏のrAn
 Abstract PrologInstructi
on 5etJに開示されている。本発明はウォレン氏
が取り上げなかった問題のいくつかを取り上げるWAM
の改良である。
rProlog Processing System
Jという名称の最近の米国特許第454E3432号明
細書は、各種のプロローグ・スタックに関連したレジス
タを管理するための効率的な方法を論じている。しかし
ながら、この特許はプロローグのアドレス空間を増加さ
せ、ポインタをより効率的に管理すること−c− によって全体的なパフォーマンスを改良する方法を開示
していない。
上述のように、従来技術はいずれもプロローグ・インタ
プリタ/コンパイラに割込み処理を提供する手法を教示
していない。
C0課題を解決するための手段 本発明によれば、プロローグ・インタプリタ/コンパイ
ラの改善が、割込み処理を付加することによって達成さ
れる。割込み処理は一連のシステム制御ワードを管理す
ることによって容易とされる。割込みが検出された場合
、システム制御ワードをテストしてから、次の述語が発
火(fire)  され、かつ制御は割込み制御ブロッ
クを介して割込み処理ルーチンに渡される。割込み処理
ルーチンが完了した場合、制御は述語プロセッサに戻さ
れ、次の述語または割込みを処理する。
D、実施例 して構成されている。1)再帰的プロシージャ呼出し、
2)ユニフィケーシヨン、3)バックトラッキング、及
び4)カット・オペレージピン。再帰が有効に機能する
には、適切なスタック管理が必要である。ユニフィケー
シヨンは強力なデータ処理方法であって、従来のプログ
ラミング言語で見られる比較及び割当ての両方の命令を
含んでいる。
ユニフィケーシヨンは効率的なデータ構造処理に依存す
る。このことはポインタへの依存性を意味し、ポインタ
管理におけるあらゆる改良が実行の拡張をもたらすこと
を意味する。
バックトラッキングは以前の計算環境を復元する。バッ
クトラッキングは、割込みが典型的なオペレーティング
・システムによって処理された場合に現れるプログラム
文脈の保管及び復元と類似している。バックトラッキン
グはプロローグ・システムの保全性とパフォーマンスを
維持するために、データ構造の効率的な管理を必要とす
る。バックトラッキングは一般に、現在の変更のリスト
を維持することによって実現される。バックトラックを
実行すると、これらの変更が取り消される。
リレーシロナル・データベース環境におけるプロローグ
・バックトラックの操作に類似した機能は、リレーシロ
ナル・データベースの「ロールバック」である。CUT
オペレータはプロローグ処理を、CUTオペレータの発
生までに行なわれたすべての計算に委託する。
プロローグ・システムは複数のデータ域に分割される。
第1はコード域である。この区域はプログラムの命令及
びリテラルを含んでいる読取り専用域である。マシンの
3つの主要書込み可能データ域は、ローカル・スタック
、グローバルまたはヒープ・スタック、及びトレール・
スタックである。これらの3つのスタックはグローバル
変数及びローカル変数の記憶域、ならびにプロローグ・
システム復元用の記憶域として使用される。入城変数は
長期変数であって、ユーザによって定義され、処理が完
了するか、バックトラッキングまたはガーベジ・コレク
シ1ン、あるいはこれら両方がプロローグのスペースを
検索するまで活動状態 6− に維持される。局所変数は一時記憶セルとして使用され
、情報を1つのゴールから他のゴールへ通信する。ゴー
ルが完了し、代替物が残っていなくなった場合、スペー
スをローカル・スタックから容易に回復できる。スタッ
クの操作には、ポインタの効率的な管理が必要である。
他の書込み可能域はトレールと呼ばれる後入れ先出しく
L I FO)スタックである。トレールはバックトラ
ッキングが発生した場合にUNDEFへのリセットを必
要とする変数セルのアドレスを記憶する。トレールのサ
イズはゴールの数に比例して増加する。トレールのサイ
ズはバックトラッキングによって減少する。レジスタは
スタックの各々に独自の各種のスタック・ポインタを管
理するために使用される。ウォレン氏の報告は各種のス
タック及び関連したレジスタ・ポインタに関する伝統的
なプロローグ・システム管理を論じている。
ガーベジ・コレクシ1ン ガーベジ・コレクシロンはスタック・スペース 7− を短縮し、再マツプし、プロローグ・システムに戻して
、以降の処理を容易とするプロセスである。
最近のプロローグ・インタプリタ及びコンパイラの起源
は、ウォレン氏の当初の研究及び彼がプロローグ・シス
テムの伝統的な標準に導入し、組み込んだ改良まで遡る
ものである。
命令セット ウォレン氏の報告は命令及びその構文を論じ、かつプロ
ローグ・ステートメントから生成されたアセンブル済み
コードを説明している。好ましい実施例の説明はウォレ
ン氏の報告で開示されている不完全に最適化されたコー
ドから分かれたものである。報告書で強調されているよ
うに、ウォレン・プロローグ・コンパイラは情報の獲得
に間接的なアドレス指定を必要とする。それゆえ、別個
のレジスタをインデックス・レジスタとして使用しなけ
ればならず、また命令からの情報がオフセットとして使
用される。オフセットはインデックス・レジスタに加え
られ、有効なアドレスを得る。
プロローグ命令を使用して、プロローグ・プロダラムを
実現する。一般に、伝統的なプロローグ・アブストラク
ト・マシンにおいては、命令とプロローグの記号の1対
1の対応はない。典型的なプロローグ命令は、複数個の
オペランドを有するオペレーション・コード(opco
de)からなっている。opcodeはプロローグの記
号のタイプを、これが発生する文脈と相関させる。op
codeは8ビツトすなわち1バイトを占有する。
オペランドは小整数、オフセット及びアドレスを含んで
いる。これらのオペランドは次いで、各種のプロローグ
の記号に対応する。個々のプロローグの実施形態にもよ
るが、オペランドはニップル、バイト、ワードまたはダ
ブル・ワードを占有することができる。
データ・オブジェクト 第1図には、従来技術のプロローグ・データ・オブジェ
クトが示されている。これはタグ・フィールド10及び
アドレス20によって表される。典型的なデータ・オブ
ジェクトは32ビツトを占有する。タグ・フィールドは
項のタイプを区別するものであり、少なくとも2ビツト
、一般には8ビツトすなわち1バイトでなければならな
い。主なタイプは参照、リスト、構造、リスト、スケル
トン、アトム、及び整数である。8ビツトのタグ・フィ
ールドがアドレス可能性に残しているのは、24ビツト
だけである。それゆえ、たとえば、370/XA環境に
おいては、31ビツトのアドレス・スペースを完全に利
用することはできない。
データ、変数及び変数に対する値の割当てがわかるFO
RTRAN、PL/r、C0BOL、Cなどとは異なり
、リスプ及びプロローグにはデータ、変数及びパインデ
ィングがわかる。変数はフリー(値なし)またはバウン
ド(インスタンシェード済み)のいずれかである。しか
しながら、プロローグの変数がインスタンシェードされ
ると、変数がアンバウンドされない限り(バックトラッ
キングによって)、変数を再インスタンシェードするこ
とはできない。
この強力な相違はプロローグのパターン・マツチングに
よって活用される。たとえば、A及びB10 がプロローグ・オブジェクト(おそら(、変数)である
A=Bの操作において、AとBのユニファイを試みる。
AとBが変数の場合、2つの変数は等しくなり、ユニフ
ィケーションは成功する。AまたはBが変数の場合、変
数はバウンドされ(他の値にインスタンシェードされる
)、ユニフィケーションは成功する。A及びBが両方と
もデータであると、これらはこれらを等しくするために
パターン・マツチされ、おそらくはAまたはB1あるい
はその両方の内部で変数を再帰的にユニファイする。こ
れが生じた場合、ユニフィケーションが成功するか、あ
るいは失敗し、バックトラッキングが行なわれる。
これはプロローグの命令X=1が、Xがアンバウンド変
数である場合にXを1にバインドするか、Xがバウンド
である場合にXが1に等しいことをチエツクする表記で
ある理由を説明する。A=BはAに対するポインタをB
に配置するプロローグ・システムによって、内部で処理
される。B=CはBに対するポインタをCに置くことに
よって達成1− されるo C”h e l l oはアトムrhell
oJのアドレスをCに置くことによって完了する。Bの
値を得るためには、2つのポインタの値を解かなければ
ならない。ポインタの使用がプロローグ処理に浸透する
ので、この使用はこれらのステップに浸透する。それゆ
え、ポインタ処理に対して行なわれるあらゆる改良は、
プロローグの実行に大幅な改良をもたらす。
第4図は従来技術によるポインタ処理に関連する論理を
示す。第5図は本発明によるポインタ処理に関連する論
理を示す。これらの図について、以下で詳細に説明する
第1図には、従来技術の伝統的なプロローグ・オブジェ
クト・ワードが示されている。情報の最初のバイトはタ
グ・フィールド10を含んでいる。
情報の他のバイトはアドレス・タグ20を含んでいる。
タグ・フィールド10は整数値で、次のような各種のプ
ロローグ・オブジェクトを表す。ポインタ、フリー変数
、定数(アトム、整数、。
)、またはスケルトン(プロローグ・リスト)。定数は
定数の関連する記述子に対するポインタとしてアドレス
・タグ20を用いる。アドレス・タグ20はアドレスの
代わりに即値データを含むことができる。アドレス・タ
グ20のスペースに適合する小整数は、通常このように
して表される。
スケルトンはアドレス・タグ20を、スケルトンの記述
子に対するポインタとして利用する。このアーキテクチ
ャは1バイト・タグ・フィールド10に基づくアドレス
・タグ20の少ないサイズによって制限される。それゆ
え、31ビツトのアドレス・スペースを活用できるので
はなく、24ビツトのアドレス指定のみが利用できる。
プロローグの実施形態の中には、1バイト未満のタグ・
フィールドを用いるものもあるが、単一のビットを使用
するものはない。なぜなら、伝統的なプロローグにおけ
るタグ・フィールドは工ないし16の範囲の数値を伝え
なければならないからである。
1バイト・アーキテクチャは最も一般的な手法であるが
、これはほとんどの既存のコンピュータが1バイトを取
り出すための命令を持っているが、3ないし5ビツトを
取り出すための命令を有しているコンピュータがほとん
どないからである。
本 日のアーキテクチャ プロローグ・オブジェクトは以下のタイプのうちの1つ
の「タグ付きワード」である。
1)他のタグ付きワードに対するポインタ2)フリー変
数 3)小整数 4)グローバル・スタックに記憶されているプロローグ
・オブジェクトに関連したもの(グローバル・スタック
のオブジェクト記述子に対して、アドレス・フィールド
・ポイントを暗示する) 5)コード域に記憶されているプロローグ・オブジェク
トに関連したもの(コード域のオブジェクト記述子に対
して、アドレス・フィールド・ポイントを暗示する) 本発明のプロローグ・システムはタイプ「フリー変数」
のあらゆるオブジェクトを、アドレス・14− フィールドがそれ自体をポイントしているタイプ・ポイ
ンタのオブジェクトによって置き換える。ポインタをフ
リー変数と区別するのは容易であるが、これはポインタ
がそれ自体をポイントすることがないからである。
本発明の処理はアドレス・フィールドの初期設定にあま
り多くの作業を必要としないが、参照解除処理(der
eferer+cing )は付加的なテストを必要と
する。しかしながら、プロローグで最も一般的な命令の
セット、複写は最適化されている。
伝統的なプロローグ・システムにおいて、オブジェクト
を複写するには、システムには次のことが必要である。
(a)  フリー変数であるかチエツクする(b) フ
リー変数である場合には、オブジェクトはフリー変数に
対するポインタである (c)  フリー変数でない場合には、複写はオブジェ
クトである。
この手法を用いると、複写は常に単純な複写となる。
= 15− カテゴリ(4及び5)のオブジェクトのタイプの複写を
、オブジェクト記述子の始めに置く。この追加はコード
域におけるものではない。なぜなら、これが静的コード
であり、このバイトをグローバル・スタックのオブジェ
クトに付加することは、グローバル・スタックを線形に
走査することを可能とし、ガーベジ・コレクシロンの圧
縮を容易とするからである。小整数以外の各タグ付きオ
ブジェクトにおいて、オブジェクトのアドレス部分は他
のポイントまたはタグ付きワードをポイントする。
次のステップはタイプ小整数を抑制し、整数タイプのみ
を使用する。欠点は小整数が1ポインタだけで表される
ことである。この問題はきわめて小さい整数に対しては
、定数域にこれらのテーブルを作成することによって解
決される。
各タグ付きオブジェクトの場合、アドレス部分は他のポ
インタまたはタグ付きワードをポイントする有効なポイ
ンタである。各タグ付きオブジェクトは以下のいずれか
である。
1)タグ・ポインタ、または 2)他のタグ、アドレス・フィールドによってポイント
される値によって回復できるものタグ・フィールドはも
はや必要ないが、これはこのフィールドがオブジェクト
記述子によって回復できるからである。ポインタをポイ
ントするタイプ・ポインタのオブジェクトと、オブジェ
クト記述子をポイントするタイプ・フリー変数のオブジ
ェクトを区別できるだけでよい。これはオブジェクト記
述子の高位ビットをセットし、以下で詳述するように、
アドレス・スペースを31ビツトに制限することによっ
て達成される。高位ビットを使用するのは、MVS/X
Aマシンでテストするのが最も容易であり、かつアドレ
ス指定に使用されないからである。当分野の技術者には
、下位ビットを過度の実験を行なわずに置換できること
が認識できよう。
本発明は第2図及び第3図に示す2種類のオブジェクト
・ワードを用いる。第2図は本発明によるタイプ・ポイ
ンタのオブジェクトを示す。32ビツト・ワードの第1
ビツト30はタイプ・フィールドである。タイプ・フィ
ールドはタイプ・ポインタとタイプ記述子のオブジェク
ト・ワードを区別する。ビットが非ゼロの場合、タイプ
は記述子である。情報の次の31ビツト40はプロロー
グ・オブジェクトのアドレスである。それゆえ、370
/XA環境の全アドレス・スペースが活用される。
第3図は本発明によるタイプ記述子のプロローグ・オブ
ジェクト・ワードを表す。第1ビツト50は1にセット
され、記述子タイプを示す。次の7ビツトは伝統的なプ
ロローグの手法では、タグ・フィールド60として使用
される。残りの24ピツ)70はタグ・フィールド80
の値に基づいて変化する。若干の例を後述し、各種のオ
ブジェクトの実施形態の使用法を明らかにする。
コンパイラ・テクノロジーの通常の技術者には、このア
ーキテクチャによって得られる利点が容易に理解されよ
う。タイプ・ポインタのプロローグ・オブジェクト・ワ
ードを他のオブジェクトから区別するには、単純なビッ
ト・テストで充分である。
18− この場合、アドレスはすでに実行可能な形態となってい
る。これはタグ・フィールドが8ピツトを占める従来技
術の技術と対照的なものである。
プロローグ・オブジェクト・ワードのタイプを決定する
には、初期のCOMPARE操作が必要であった。次い
で、タグ・フィールドを除去し、有効なアドレスに対す
る24ビツトのみを残すには、他のAND操作が必要で
あった。それゆえ、31ビツトのアドレス・スペース全
体を活用することができず、各ポインタ・オブジェクト
には付加的な処理オーバヘッドが関連していた。ポイン
タ・オブジェクトがプロローグ処理、及び最も一般的に
使用されるオブジェクトの1つに必須であるから、コン
パイルされ、インタブリットされたプロローグ・コード
の最適化が大幅に低下した。
本発明はプロローグ・ポインタ・オブジェクト処理に関
連するオーバヘッドを大幅に軽減する。
オブジェクト・ワードの簡単なテストによって、ポイン
タのアドレスが完全に決定される。それゆえ、アドレス
が実行に利用できるようになるまで19− に、他の処理は必要ない。タグ・フィールドを除去する
ためのマスクされたCOMPARE及びAND操作は、
完全に除去される。
第4図は本発明による伝統的なプロローグ・オブジェク
ト処理の例を示す。この例はレジスタRに含まれている
プロローグ・オブジェクトの参照解除を行なう。
処理は、レジスタRに含まれているタグ・フィールドが
ユーザ指定レジスタXにロードされる関数ブロック10
0から始まる。次いで、関数ブロック102において、
これがポインタであるか、他のタイプのオブジェクトで
あるかを判定するため、レジスタXがテストされる。ポ
インタの場合には、24ビツトのアドレスを有するレジ
スタRをRにロードし、そのアドレスにおける情報のワ
ードを、ポインタの有効アドレスとしてRにロードする
あるいは、タイプのテストが変数を示している場合には
、プロローグ変数を処理するためのルーチンへの分岐が
106で作られる。タイプのテストがアトムを示してい
る場合には、プロローグのアトムを処理するためのルー
チンへの分岐が108で作られる。タイプのテストがス
ケルトンを示している場合には、プロローグのスケルト
ンを処理するための分岐が110で作られる。
第5図は本発明によるプロローグ・オブジェクト処理に
関連する詳細な論理の流れ図である。関数ブロック12
0はレジスタRによってポイントされたワードを、レジ
スタXにロードする。次いで、判断ブロック122はレ
ジスタXの負数のテストを行なう。
Xが正である場合には、プロローグはX及びRを関数ブ
ロック124でユニファイしようとする。
X及びRが変数である場合には、2つの変数は等しくな
り、ユニフィケーションは成功し、Xが変数を含んでい
るので、情報は126において変数として処理される。
他の場合には、レジスタXの内容は関数ブロック128
においてレジスタRに複写され、処理は完了する。
レジスタXが最初負である場合には、関数ブロック13
0のおいて、Xの高位バイトがレジスタRの低位バイト
にロードされ、高位3バイトがシフト・アウトされる。
次いで、関数ブロック135において、タイプがアトム
であるか、スケルトンであるかを判定するためのテスト
が行なわれる。
アトムである場合には、制御は140においてアトム・
プロローグ・オブジェクト・プロセッサに渡される。ス
ケルトンである場合には、制御は150においてスケル
トン・プロローグ・オブジェクト・プロセッサに渡され
る。
第6図は本発明によるプロローグ・オブジェクト・ワー
ドのフリー変数を表す。プロローグのフリー変数が実際
にはメモリ内の位置なのであるから、オブジェクトは効
果的にアドレスとなる。それゆえ、200はゼロにセッ
トされ、残りの31ビツト210は変数の有効なアドレ
スとなる。このことはオブジェクトがアドレスであり、
そのアドレスにおける情報を変数情報として処理できる
ことを、プロローグ・オブジェクト・ワードのテストが
示すことを意味する。処理オーバヘッドの相当程度の節
減が達成される。さらに、変数の有22 効記憶域が大幅に増加する。
第7図は本発明によるプロローグ・オブジェクト・ワー
ドの定数の例である。特別な定数はプロローグ・アトム
である。それゆえ、第1ビツト300はゼロにセットさ
れ、オブジェクトがポインタであることを示し、また残
りの31ビツト310はアトムに関連したデータ構造に
対するアドレスとなる。
データ構造は311.312.313及び314で示す
ようにメモリに記憶される。第1ビツト311はオブジ
ェクト・ワードがアドレスでないことを示す。それゆえ
、情報の次のバイト312はプロローグ定数のタイプを
決定するために処理されるタグ・フィールドである。こ
の場合は、アトム。タグ・フィールド312の後のバイ
ト(313及び314)は、プロローグ定数のタイプに
よって変化する。非ポインタ・オブジェクトの場合であ
っても、本発明によってプロローグ・オブジェクト・ア
ーキテクチャを活用することによって、処理の利点は得
られる。
3− 第8図は本発明によるプロローグ・オブジェクトにおけ
るスケルトンの例である。スケルトンは特定のスケルト
ンに関する情報を含んでいるデータ構造に対するポイン
タとして表される。それゆえ、スケルトンの第1ビツト
400はゼロにセットされて、アドレスが残りの31ビ
ツト410に含まれていることを示す。このアドレスは
スケルトン41L412.414.41B及び418に
関連するデータ構造に対するポインタとして使用される
データ構造の第1ビツト411は1にセットされ、次の
7ビツト412がタグ・フィールド値であることを示す
。この場合、値はデータ構造がスケルトンであることを
示す。残りの情報414.416及び418は伝統的な
プロローグ・スケルトン・データ構造である。
暗示引数 前述のウォレン氏のプロローグ・インタプリタ/コンパ
イラなどのプロローグの伝統的な実施形態において、命
令は第9図に示すように、複数のフィールドの明示の記
載を必要とする。したがって、たとえば、C)L he
llo)命令の第2の引数に対するコードはget  
constanthello、A2であり、第9図に示
すようにして符号化される。
命令の第2の引数のフィールドは操作510に対して使
用されるレジスタに対する参照、code  op50
0及び定数に対するインデックス520を含んでいる。
フィールドの各々を別々に分解し、正しい情報が提供さ
れていることを検査しなければならない。また、520
などのインデックス・フィールドは定数のアドレスを得
るために、インデックス・フィールドに含まれている、
適切なオフセット・レジスタに追加される値を必要とす
る。これらの操作は時間のかかるものであり、インタプ
リタに関連する実行速度の低下のほとんどを説明するも
のである。
本発明は第10図に示すように、命令形式を簡素化する
。命令に必要な唯一の情報は定数のアドレス550であ
る。この命令は第1ビツト(符号ビット)をテストする
ことによって、上述のオブジェクトと区別される。
情報のワードが負(1ビツト)である場合には、命令が
存在する。情報のワードが正(0ビツト)である場合に
は、プロローグ・オブジェクトに対するポインタが存在
する。それゆえ、この例においては、命令の第2の引数
が情報のワードとして符号化され、このワードの第1ビ
ツトはゼロにセットされ、情報の他の31ビツトは定数
rhellO」のアドレスを含むポインタである。
インタプリタは他の予備処理なしでget  cons
tant命令を実行するに必要なすべての情報を有して
いる。get  constantに使用されるレジス
タは、レジスタの現在の割振りに基づいてインタプリタ
によって暗示的に割り当てられる。命令によるレジスタ
の明示の割当てはない。
命令のレジスタ・フィールドをd (U*V、X。
(DU*V)+ (U*DV)) に対するWAMが生
成したコードから省略することができる。
26− get 5tructure ”’/2.AI    
 X d(”2(unify  variable  
Al           χ ロ。
unify  variable  YI      
   X  V)。
get variable Y2.A2       
 X X。
get  5tructure  ’+’/2.A3 
       N  +/2(unify varia
ble A4         X SSI。
unify variable A5        
% 5S2)+get−structure ”’/2
.A4    X SSI = ”/2(unify 
variable A3      % DI。
unify value YI           
X V)+get 5tructure ”’/2.A
5     X SS2 = ”/2(unify v
alue Al          % U。
unify variable Y3        
X Dυ)上記を以下に示す2つの新しい命令を追加し
て、本発明の符号化手法によって置き換えることができ
る。
unify  5tack unify  5tackはunify  vari 
ab l eと同様な作用をするが、引数をレジスタに
記憶するのではなく、引数をスタックに記憶27 する。
pOp 5tructure  F l)op 5tructure  Fはget  5t
ructure  F+ Aiと同様な作用をするが、
スタックからワードを取り出し、A 1の代わりにこの
ワードを使用する。
これらの命令によって、上記の従来のコードを次のよう
に書き換えることができる。
get 5tructure ”’/2.A1    
* d(”/2(unify variable Al
      ! U。
unify variable Yl      ! 
V)+get variable Y2+A2    
  %X。
get 5tructure ’+’/2.A3   
 X +/2(unify 5tack       
   %unify 5tack          
%pop 5tructure ”’/2     %
 = ’/2(unify value Al    
    χU。
unify variable Y3      ! 
Dtl)pop 5tructure ″’/2   
  χ= ”/2(unify variable A
3      % DLI。
unify  value  Yl         
  % V)。
上記のコードにおいて、最初のget  、、。
命令は常にA1を使用し、次のget  、、、命令の
インデックスiはAtを使用する。trylo、などの
命令によってリセットされ(述語の処理の開始前に)、
get  、、、命令が実行されるたびに1増加される
レジスタSOを加えることができる。それゆえ、各ge
t  、、、はレジスタ引数として、レジスタのインデ
ックスSOを使用するので、この引数を命令の一部とし
て明示的に符号化する必要はない。同じステップはpu
t  、、、命令にも同様に有効である。
プロローグ命令b(hello)の節の最後の述語の最
初の引数はput  constanthello、A
1である。第11図は最初の引数の伝統的な符号化を示
している。命令5θ0のCode  ol)はput 
 constant命令を示す値である。
code  op5EtOの後ろにはレジスタへの参照
が付けられ、これは操作570及び定数に対するインデ
ックス580に使用される。フィールドの各々を別々に
解析し、正しい情報が与えられていることを検査しなけ
ればならない。また、580などのインデックス・フィ
ールドでは、インデックス・フィールドに含まれている
値を適切なオフセット・レジスタに加え、定数のアドレ
スを得る必要がある。これらの操作は時間のかかるもの
であり、インタプリタに関連した実行速度の低下のほと
んどを引き起こすものである。
他の方法はオフセットまたはアドレスとして完全な定数
を符号化する代わりに、これを命令に入れることである
。この手法は定数の取出しを若干早くするが、大きな命
令を生成する。
第12図は本発明による最初の引数の符号化を示す。定
数rhelloJのアドレスだけが命令に必要なのであ
るから、ゼロにセットされた符号ビットの付いた情報の
ワードが、最初の引数に必要な情報を完全に伝えるのに
充分なものとなる。
この場合も、引数の値の明示の記述は、インタプリタが
命令を実行するのに必要なくなる。さらに、0 定数のアドレスを得るのに、間接インデクシングの処理
時間は必要なくなる。
あるいは、すべてのアブストラクト命令が1バイトのo
pコードで始まり、プロローグ・オブジェクトが最初の
バイトがタグであるタグ付きワードであるから、uni
fY  constant命令のOpコードに対して、
タイプ・アトムの値を選択することができる。それゆえ
、unify  co n s t a n t ” 
h e I I o ”命令をアトム「helloJの
表示によって置き換えることができる。また、これをタ
イプ・スケルトンを使用して、g e j  COn 
S j a n j % pu j  COn S t
a n tlpu j  S i r u Cj u 
r e及びgetstructureに対して行なうこ
とができる。
この変形をunifV  C0n5janj1put 
 constant及びget  constantの
すべてに適用した場合、問題はこれらの命令の各々がま
ったく同じ表示を有していることである。この問題は第
13A図ないし第13C図に示すような有限オートマト
ン・プロセッサを用1− いることによって解決される。個々の命令は4主要状態
オートマトンを使用することによって区別される。状態
はアーク、構築、読取り、書込みである。オートマトン
はunify  、、、命令のいずれかの処理中の実行
モード(読取り/書込み)の明示テストを行なうステッ
プを回避する。
場合によっては、オートマトンに次の命令のモードを予
測させるには、文脈が充分でないことがある。たとえば
、解釈しなければならないアトムが、後にget  v
ariableが続いたunify  constan
tを有している場合、オートマトンにはget  va
riableを□アープ・モードで実行しなければなら
ないことがわかる。
しかしながら、unifY  constantとして
解釈しなければならないアトムの後に、他のアトムが続
いている場合には、これは第2のアトムをunify 
 constantとして解釈しなければならないので
あれば、充分であるが、get  constantと
して解釈しなければならないのであれば、コード・ジェ
ネレータはこれらの命令の間にpop head命令を
挿入しなければならない。pol)  headはエミ
ュレーシヨンをさらにアーク・モードで行なわなければ
ならないことを意味する。
プロローグの命令は一般にopcodeと、上記のge
t  constant及びput  c。
n5tant命令と類似した複数のフィールドを含む形
式を有している。これまで明示レジスタ表記または暗示
アドレス計算、あるいはこの両方を必要としていた命令
は、本発明によって変位される引数を復号する必要性を
抑制することによる実行時に、大幅な改善を実現する。
第13A図ないし第13C図は本発明による命令処理に
関連した論理をグラフィック式に表した流れ図である。
割込み処理 プロローグ・システムの発明による特徴の1つはプロロ
ーグにおける割込みの新しい概念である。
ある程度のマルチタスク機能がプロローグに必要である
が、プロローグが事前割り振りされた線形スタックを必
要とするため、割込み処理を追加することはきわめて困
難である。それゆえ、システムの保全性を確保するには
、各プロローグ・タスクに対するスタック全体の複写が
必要である。割込み処理は実現が容易であるが、これは
割り込まれたプログラムのすべてが同一のスタックを共
用できるからである。
割込み処理は割込みの発生を登録するフラグをセットす
ることによって可能となる。次いで、新しい述語が出現
するたびに、フラグ・トラッキングの割込みをチエツク
し、割込みが生じたかどうかを判定し、割込みの処理を
開始しなければならない。このアーキテクチャは割込み
処理を、プロローグ・システム処理内の単一のロケーシ
ョンに制限し、したがって標準のプロローグ述語処理機
構を活用する。述語の実行を他の述語の実行によってい
つでも優先使用可能とすることは、プロローグに対する
最適化コンパイラの作成をきわめて困難にする。
2種類の割込みの導入を使用して、この問題を34− 拡散する。第1のタイプ1は実行を変更するので、現在
の述語C(、、、)の代わりに、述語p (X)などの
割込みが活動化された場合に、実行されるゴールは次の
ようになる。
p (X) &c (、、、) 注:p(X)の実行は失敗するか、何らかのバックトラ
ック・ノードを作成する。
第2のタイプ2は実行を変更するので、現在の述語C(
、、、)の代わりに述語p (X)などの割込みが活動
化された場合に、実行されるゴールは次のようになる。
(p(X)&failitrue)&c(、、、)注:
 (p(X)&fail;true)の実行がバックト
ラックを生じたり、あるいはプロローグ変数のインスタ
ンシェーシ日ソ状態を変更することはない。
タイプ1は比較的ランダムにバックトラック導入ノード
に割り込み、完全にコンパイルされたコードでこれらを
使用することは、特定の割込みの小さなサブセットに限
定される。プロローグ・スタフ= 35− りの内容は、タイプ2の割込みの実行の前後においてま
ったく同一であるから、プロローグはこれがコンパイル
されたプログラムの長期の最適化を行なう場合に、タイ
プ2の割込みを無視できる。
それゆえ、タイプ2の割込みを活動化してから、コンパ
イルされたプロローグのコードの任意の述語の活動化を
行なうことができる。
割込みはプロローグにおいて次のことを行なうのに有益
である。
1、凍結された述語を活動化する 2、段階的にデバッグする 3、ガベージ・コレクションを活動化する4、ユーザが
非同期事象を処理できるようにする込み処理に する 
ポーリング プロローグ・システムは実行の最適化を行なう実行の際
に、割込みに対するソフトウェア・ポーリングを回避し
なければならない。論理割込み及びデーモンを使用して
、非ポーリング割込み処理をもたらす。論理割込みはソ
フトウェアの混成物であって、プロローグ・プログラム
の実行中に発生する非同期事象の発生セグメントを登録
する。
事象は最終的に、プロローグによって定義された、ある
いはユーザ・プロローグ・プログラムによってカストム
化されたデーモンという他のプロローグ・プログラムを
開始する。伝統的なコンピュータ処理においてデーモン
に最も類似しているのは、タスクである。タスクはしば
しば単一の目的のための一連の命令であって、この目的
は実行に特定の入力をしばしば必要とする。タスクを抑
制し、抑制されたタスクに情報を供給できる他のタスク
の完了を待つことができる。プロローグのデーモンを開
始して、述語の間の指定時間中に割込みを処理する。論
理割込み処理のいくつかの例を以下に挙げる。
1亙豆貞 事前定義プロローグ論理割込みは遅延評価を含んでいる
。遅延評価は凍結変数のインスタンシェーションである
。凍結変数はその処理を完了するために、他のゴールの
完了を待っている変数である。
デーモンはこの例において待機述語である。凍結変数は
特殊アンバウンド変数である。値をこの変数に与えた場
合、ユーザ定義のプロローグ述語はトリガされる。
ガーベジ・コレクシロン 論理割込みはトレール・スタック・オーバフローのグロ
ーバルであり、デーモンはガーベジ・コレクタである。
スタックのオーバーフローが生じた場合、スタックのサ
イズは少量増加し、次のタイプ1の割込みが検出される
まで、プロローグ処理が継続することが可能となる。次
いで、ガーベジ・コレクタはスタックを処理し、スペー
スを回復する。トレール・スタックに1つ、グローバル
・スタックに1つという小さな増加域が、スタックが開
始されたときに事前割り振りされる。
スタック・オーバーフローが生じた場合、ガーベジ・コ
レクションを行なうことはできないが、これは次の述語
の活性化時に発生する。これは計算の途中における活動
要素の不確実度によるものである。
 38− 段階的デバッガ 論理割込みはある述語から次の述語までのステップであ
り、デーモンはデバッガそのものである。
−外謳ll」肌改点 論理割込みは端末入力によるユーザの活動であり、デー
モンは端末割込みのハンドラとして上述したプロローグ
・ユーザ・コードである。
割込み処理論理 割込み事象は論理割込み処理によって、正規のプロロー
グ実行から非同期的に取り込まれる。しかしながら、事
象は実行「セーフ・ポイント」だけで分析処理される。
「セーフ・ポイント」はある述語から次の述語への切換
え時に発生する。その時点で、プロローグはチエツクを
行なって、何らかの待機割込みが注目を必要としている
かどうかを判定しなければならない。この判定はメモリ
・ロケーション(フラグ)、すなわち次の約2つの命令
のテストのみを必要とする。
1、待機割込みに対するフラグのテスト2、論理割込み
ハンドリング・ルーチンに対する39− フラグにおける分岐 プロローグが待機論理割込みを明示的にテストせずに、
これらを取り扱うよりよい方法を必要としていることは
明らかである。本発明はすべてのプロローグ・システム
において使用されている述語処理の共通呼出し機構を活
用する。割り込まれたか、逓増コンパイルされたか、あ
るいは完全にコンパイルされたかにかかわりなく、すべ
ての述語は、rcsINTJという永続読み書き域に共
通して配置された命令の同一の(短い)シーケンスを使
用する。rC8INTJ内のロケーションrEXEcJ
で、述語の呼出しが開始される。
待機している論理割込みがない場合、シーケンスは次の
述語実行アドレスを見つけだし、正規の実行に対する述
語へ分岐する。これは標準的なプロローグの述語処理で
ある。しかしながら、論理割込みが待機している場合に
は、このシーケンスの最初の命令は、論理割込みハンド
ラ・ルーチンへの分岐によって置き換えられる。
置換は非同期事象が発生したとき、すなわち論理割込み
が記録されたときに発生する。割込みトラップをrEX
ECJ命令に設定する他に、論理割込みは外部論理割込
み待ち行列に入れられる。
rEXEcJから分岐した場合、論理割込みハンドラは
外部待ち行列の内容を内部論理割込み待ち行列へ移し、
外部待ち行列は空にされる。外部待ち行列を慎重に使用
することが、論理割込み記録ルーチン及び論理割込みハ
ンドリング・ルーチンにおけるその変更がrcsJ命令
(比較及びスワップ)を用いるようにするために必要で
ある。
外部待ち行列から内部待ち行列への移行中に、論理割込
みは優先順依願に配列される。次いで、最も高い優先順
位を存する待機論理割込みが待ち行列解除され、その関
連デーモンが実行のためにスケジユールされる。
内部待ち行列が待ち行列解除によって空にされると、割
込みトラップはその正規の値を逆転し、正規の次の述語
を実行する。
詳細な割込み論理 述語p (X、Y、k (0))に関連した割込みが検
出された場合、第14図に示す制御ブロックがヒープ・
スタックに作成され、論理割込みを処理する。IT  
BLOCK  800はp (*、 *。
*)の述語記述子のアドレスである。<−−−INTE
X  805は次の割込み制御ブロックのアドレスに対
するポインタであるか、あるいは処理を必要としている
他の割込みがなければゼロである。X 810はXに対
するグローバル化情報に対するポインタである。Y 8
15はYに対するグローバル化情報に対するポインタで
ある。k(0)  820はk(0)に対するグローバ
ル化情報に対するポインタである。
共通記憶域内の2つのグローバル・ワード、WAITI
TSおよびWAITITUを使用して、割込みの発生事
象にフラグを付ける。WA I T ITSはバックト
ラッキングに敏感な割込みにフラグを付けるために使用
され、WAITITUはバックトラッキングに鈍感な割
込みにフラグを付けるために使用される。ワードWA 
I T I TU/WAITITUは割込みが発生して
いない場合にはゼ2− 口を、また割込みが発生している場合には最初の割込み
制御ブロックに対するアドレスを含んでいる。WA I
 T I TUまたはWAITITUが非ゼロの場合に
、割込みトラップがセットされる。バックトラックに敏
感な割込み及びバックトラックに鈍感な割込み両方の使
用法がある。たとえば、システム・コマンド5top 
 Predicate(SP)に関連したプロローグ割
込みがある場合、及び割込みに関連した述語プロローグ
が「現在のコマンドの実行を停止する」と定義されてい
る場合、誰かがSPコマンドを入力した後、関連するプ
ロローグ割込みが活動化され、実行を停止する。
バックトラックがSPコマンドの入力と関連する割込み
の実行の間に活動化されても、プログラムは停止する。
それゆえ、この種の割込みはバックトラック処理に鈍感
である。
バックトラッキングに敏感でなければならない割込みの
例を以下に示す。
a(4,0)。
a(、)。
 43− ニー ge(X、0)  when not var(
X)、a(X、1)。
’ge(X、O)  when not var(X)
’activates theinterrupt a
ssociated  withge(X、0)aS 
5oon as X receives a valu
e。
この例において、実行はゴールニーa(X、1)がa(
X、1)をa (4,O)にユニファイしようとするこ
とである。これを行なうために、実行はXを4にバイン
ドする。これはg e (X+ O)に関連する割込み
をトリガする。ge (4,0)であるから、ge (
4+  O)が活動割込みのリストに追加される。次い
で、プロローグは1とOをユニファイしようと試みる。
このステップが失敗するので、バックトラックが活動化
する。このバックトラックはXをフリー状態に復元する
。Xが変数でないことに、割込みge (X、O)が関
連付けられたら、g e (X+  O)を活動割込み
のリストから除去して、エラーを避けなければならない
この種の割込みがバックトラックに敏感でなければなら
ないのは明らかである。
WAITITU/WAITITSワードの更新後、第1
4図と同様な割込み制御ブロックがWAITITU/W
AITITSに含まれているアドレスによってアンカさ
れた割込み制御ブロックの連係されたリストの終わりに
追加される。初期割込み制御ブロックがすでに存在して
いる場合には、ゼロに等しい次の割込みポインタ805
が見つかるまで、次の割込みポインタ805のチエイン
が横切られる。ゼロにされた次の割込みポインタ805
は新しい割込み制御ブロックのアドレスによって更新さ
れる。次いで、割込み後に処理を復元するために、バッ
クトラッキングが必要な場合には、バックトラッキング
のための情報がトレール・スタックに乗せられるので、
バックトラックは割込み処理後に適切な値を復元する。
プロローグEXEC述語プロセッサが変更され、WAI
TITS/WAITITUの内容をチエツクしてから、
次の述語を処理する。非ゼロ値が検出されると、最初の
割込み制御ブロックが活動化され、WAITITS/W
AITITUワードがITNEXT  805で見つか
る次の割込み制御ブロックによって更新される。
更新がWAITITSにおけるものである場合ニハ、ト
レール・スタックも更新される。次に、新しいフレーム
が割振り命令を実行し、Procの述語記述子及びPr
ocの引数をローカル・フレームに押し込むことによっ
て作成される。p(*、 *、 *’)の引数が割込み
制御ブロック810.815及び820からAtレジス
タにロードされる。次いで、継続ポインタがシステム・
アドレスITRETにセットされ、割込みに関連する節
が活動化される。
割込み処理が完了すると、プロローグはITRETのア
ドレスに戻り、次の操作を行なう。まず、Atレジスタ
が以前のフレームから、継続ポインタを用いることによ
って再ロードされる。次いで、述語記述子、E及びPポ
インタがフレームから再ロードされる。最後に、実行が
述語付き記述子によって指定されたアドレスから開始さ
れる。
第15A図ないし第15F図は本発明によるプロローグ
への割込み処理の追加に関連する論理を46− 示すブロック図である。プロローグのスタック及びその
他の要素は上記で詳述した。
第15A図は割込みが活動していないときに、割込みに
対するテストを行なってから、述語の例a(V、b)を
実行する場合のプロローグの状態を示す。
第15B図は述語p (X、Y、k (0))に関連し
たタイプ2の割込みが待機しているときの、述語a (
V、b)の実行の直前の割込み実行に対するテストの前
のプロローグの状態を示す。
第15C図は述語a (V、b)の実行前に、述語p 
(X、Y、k (0))に関連したタイプ2の割込みが
処理されている場合のプロローグの状態を示す。
第15D図は述語a (V、b)の実行前の割込みのテ
スト前のプロローグの状態を示す。待機している述語q
(3)に関連したタイプ1の割込みがある。
第15E図は述語a (V、b)の実行前に、述語q(
3)に関連したタイプ1の割込みが処理さ7− れている場合のプロローグの状態を示す。
第15F図は述語a (V、b)の実行直前に、述語q
(3)に関連したタイプ1の割込みが処理されている場
合のプロローグの状態を示す。
共通呼出しシーケンスの最初の命令の経路指定は、何の
ポーリング・オーバーヘッドもないプロローグの論理割
込み処理を容易とする。
汎用言語インタフェース 他のプログラミング言語にインタフェースするためにプ
ロローグが使用するデータ構造の詳細を以下に示す。デ
ータ構造はプロローグから他の言語へのデータ引数の変
換に用いられる。本明細書で説明するデータ構造及びそ
の他の処理は、プロローグでこれまで見られなかった機
能を提供する。
l」lbJ五 プoo−グはcs C0BOL1FORTRAN及びP
L/Iで作成したプロシージャを呼び出すことができる
。プロローグは引数を、言語の必要に応じて様式化され
たプロシージャに伝えることができる。
プロローグ形式から、プロシージャが期待している形式
にデータ引数を変換するために、プロローグはプロロー
グの形式を、目標言語が受は取ると考えている形式にマ
クロ拡張した処理を用いた、記述子テーブルを使用する
記述子テーブルによって、プロローグが言語に無関係な
形態で、引数を他の言語に変換することを可能とする。
この手法は融通性が高い新しいバージョンにも適合する
。プロローグは実際には、言語に無関係なものとなって
いるが、これは個々の言語の変形がデータ構造に配置さ
れるからである。
言語の新しいリリースが利用できるようになった場合に
、ユーザ・プログラムに対する変更は必要ない。関連す
るテーブルの変更だけが必要である。それゆえ、ソース
・コードの変更は最小限となる。また、記述子テーブル
の設計の一般化は、すべてのデータ形式、アレイ、及び
構造をサポートする。
一般的な背景 プロローグの場合、外部拡張は別個にコンパイルされた
プログラム・モジュールである。これはプロローグ外部
拡張として認識可能であるが、それはこれが外部拡張ヘ
ッダを含んでいるからである。ヘッダは外部拡張の外部
述語セット・タイプに対する識別子として役立つ。すべ
ての外部述語または外部コンピュータプル式を、その名
前、アリティ類に記述し、また他の言語の外部式の場合
には、その期待される引数で記述する。
アセンブラで作成した外部拡張プロローグのデータ構造
を直接処理できることもあるが、他の言語で作成した外
部拡張はそのデータを、その言語に該当する形態で受は
取らなければならない。この要件は言語の外部拡張への
インタフェースがプロローグのデータ構造を、コンパイ
ルされた外部拡張による処理に適した形態に変換しなけ
ればならないことを意味する。さらに、インタフェース
は外部拡張によって戻された結果をプロローグに戻さな
ければならない。
言語の外部述語ないし外部コンピュータプル式はサブプ
ログラムである。C0BOLの場合、こ 50− れは入力を意味し、FORTRANの場合には、サブル
ーチンまたは関数を意味し、PL/Iの場合には、プロ
シージャを意味し、Cの場合には、関数を意味する。サ
ブプログラムが期待するパラメータは名前で宣言され、
外部拡張ソース・ファイルのサブプログラムをオープン
する他の言語のステートメントでは、タイプで宣言され
る。
汎用外部述語または外部コンピュータプル式の外部拡張
ヘッダの一部として、PRODECEマクロ命令はすべ
ての外部拡張−外部コンピュータプル式を順に記述する
。外部拡張を言語タイプの外部拡張として記述した場合
、PRODECEマクロのARGS:DeSCript
or  Labelは特定の外部述語または外部コンピ
ュータプル式のPROARGSマクロ命令をポイントす
る。
PROARGSマクロの記述 PROARGSマクロ命令は次の形式を有している。
’−−−−− PROARGS FORMAT −−一
−−−−−−−−−−−−−−−−−Label PR
OARGS Descriptor 1.Descri
ptor 2−51− L−−−−−End  of  PROARGS  F
ormat  −−−−−−−−−−−−−Jただし、
すべての記述子は言語のサブプログラムの1つのパラメ
ータを順に記述するか、あるいはCプログラミング言語
の場合には、ストラクト内のネスティング及びフィール
ドを記述する。1つの記述子は次の4つの形式の1つを
有している。
1)(cの場合のみ)Cストラクトのレベルをオープン
する。
2)(cの場合のみ)Cストラクトのレベルをクローズ
する。
3)(DATA  TYPE  IOTYPE)は1つ
のスカラ・パラメータを記述する。あるいは、(cの場
合のみ)ストラクトの1つのスカラ・パラメータを記述
する。
4)(DATA  TYPE  IOTYPE  DI
MENS I 0NS)は1つのアレイ・パラメータを
記述する。あるいは、(cの場合のみ)ストラクトの1
つのアレイ・フィールドを記述する。
Data  Typeは可能な変換目標タイプを指定す
る。これは標準/XAデータ・タイプに属している。第
16図はData  Type  900と、370/
XAアセンブラ905、C910、C0BOL  91
5、FORTRAN  920、及びPL/I  92
5との間の対応を示す。
10  ’rypeは引数が言語のサブプログラムに対
する入力であるか、あるいはこれからの出力であるかを
指定する。Cストラクトで使用した場合、ストラクトの
すべてのIO’rypeは同じ値を取らなければならな
い。IOTypeは以下の値を取ることができる。
■  パラメータ・リストのメンバであり、サブプログ
ラムへの入力である。Cの場合、ポインタによって渡さ
れる引数で、*パラメータとして使用される。
0  パラメータ・リストのメンバであり、サブプログ
ラムの結果である。Cの場合、ポインタによって渡され
る引数で、*パラメータとして使用される。
IOパラメータ・リストのメンバであり、サブ■ プログラムによって変更されたサブプログラムへの入力
、及びサブプログラムの結果である。Cの場合、ポイン
タによって渡される引数で、*パラメータとしては使用
されない。
レジスタ戻り引数(FORTRAN関数、PL/Iプロ
シージャ、、、RETURNS(、、、)、及びC関数
)。サブプログラムの結果。Cの場合、値によって戻さ
れる引数で、*パラメータとしては使用されない。
(cの場合のみ)パラメータ・リストのメンバ。サブプ
ログラムへの入力。値によって戻される引数で、*パラ
メータとしては使用されない。
(cの場合のみ)レジスタ戻り引数(c関数)。ポイン
タによって戻されるサブプログラムの結果で、*パラメ
ータとして使用される。値によって戻されるサブプログ
ラム引数で、*パラメータとしては使用され4− ない。
最後に、ディメンションが指定された場合、これは引数
またはCストラクト・フィールドがアレイであることを
示す。ディメンションはアレイの正確なデイメンシロン
を記述する1つまたは複数のN1または他の記述子、す
なわち引数/ストラクト・フィールドの増加シーケンス
内のランクの1つが実際のディメンションを含むことを
指定するARGN (ディメンション参照)である。
第17図には、本発明のインタフェースの例に対するC
サブプログラムが示されている。第18図はCサブプロ
グラムに対するProlog  Proargsインタ
フェースを示す。第17図において、Uc  950は
入力、SI  955は入力、Dv  957は入力、
[)p  959は入力及び出力であり、Cp  9E
tlは入力、Fa963は出力、Ip965は入力及び
出力であり、SI  955はアレイIp9Ef5の実
際のデイメンシロンを含んでいる。対応するPROAR
GSマクロ命令を、第18図に示す。
55− 引数記述子の形式 PROARGSマクロ命令は、プロローグ言語インタフ
ェースがプロローグのデータを他の言語の形式に変換す
るのに使用する一連の2進記述子に変換される。インタ
フェースはこれらの2進記述子の汎用インタプリタであ
る。
2進記述子の形式を第19図に示す。変換処理は記述子
駆動型であり、完了するまでに6つのステップを取る。
ステップ1 0 記述子のRead  Write記憶域に複写する
O”FORCDIMI“参照フィールドを再配置する。
O’FORFDIM、FORFDEF”フラグを設定す
る。
OCのフィールド整合規則にしたがって、“FORDA
L2.FORDAL4.FORDAL8“′フラグを設
定する。
OCのフィールド整合規則に合わせた、Cストラット・
ネスティングのすべてのレベルに対するアリティ″FO
RDSKE ”のコンビュテーシロン。
O外部述語または外部コンピュータプル式のアリティを
チエツクする。
ステップ2 0 すべでのI/IO/V引数の変換 ステップ3 0 すべでの0引数に対する記憶域の割振りステップ4 0 v引数がある場合には、パラメータ・リスト及びV
引数を一緒に複写する。
ステップ5 0 実際の言語呼出し ステップ6 0 すべでのl010/R/A引数の逆変換プロローグ
と他の言語の間のインタフェースは、コンパイルされた
プログラムが期待する形式でデータを構築するためにP
ROARGSマクロによって提供される情報に広範囲に
依存している。すべての既知のタイプのデータ(2進、
浮動小数点、文字)、任意数のアレイ・デイメンシロン
及び任意のアレイ・デイメンシロン、−度だけ固定され
たデイメンシロン、またはコンパイルされたプログラム
が他の引数、値ごと、アドレスごと、またはレジスタご
とのパラメータ引渡し、入力として渡される、または出
力として戻される、あるいはその両方であるパラメータ
、ネストされたストラクトを含むあらゆる種類のC構造
を、自動整合チエツクとともに処理するのに、この形式
は充分豊富なものであり、またこれに充分強力な変換ル
ーチンである。
インタフェースの詳細 本発明のプロローグ・システムはコンパイルされた言語
で作成されたルーチンに対する汎用インタフェースを提
供する。このインタフェースの値の1つは、広範囲のコ
ンビュテーションをサポートする際のプロローグの欠点
を助成するものである。プログラマはアプリケ−シロン
の数値計算部分を、より適する言語で実施するために予
約する8− ことができる。インタフェースによって、プロローグの
アプリケ−シロンがFORTRANサブルーチンまたは
関数、PL/I非MA I Nプロシージャ、及び他の
言語の同様な機構を、決定論的なプロローグの述語とし
て、あるいはプロローグの式として用いることを可能と
なる。プロローグ・インタフェースはコンパイルされた
プログラムのオペレーティング・システム依存部分も管
理し、かつプロローグ・データ・タイプとコンパイルさ
れた言語の同等物との間の変換を行なう。
FORTRANの例 基本的なVS/FORTRANの例がZIFORTI 
 FORTRANで提供される。同様な機能がC0BO
L1PL/I、PASCALlG及びアセンブラなどの
他のプログラミング言語に提供される。他の言語に対す
るインタフェースの間の相違は、別の節で論じる。
外部述語の編成 1、 コンパイルされた言語の1つまたは複数の関数/
サブルーチンを作成する。たとえば、ソー59− スをMYFORTI  FORTRANにit<ことが
できる。同一のソース・ファイルに、プロローグ・プロ
グラムが使用するすべてのサブルーチン及び関数をまと
め、環境設定専用の時間を最適化することが、宵月であ
る。
さらに、FORTRAN及びC0DOL言語は一時に単
一の活動プログラムのみを認める。
この制限はPASCALやPL/Iなどの「ブロック構
造コンパイル化言語」には適用されない。
2゜ ソース・コードのメイン・プログラム・ステート
メントの後に、第20図に示す情報を付加する。他の言
語においては、メイン・プログラムZIMAIHに命名
し、メイン・プログラムに引数のないZICOMHのみ
を呼び出させる。これらの名前は固定される。
注:メイン・プログラムは任意のグローバル宣言及び初
期設定を含んでいなければならない。FORTRANに
おいては、これはC0MM0N域の宣言と初期設定を意
味する。ZICOMHへの呼び出し前に、この処理を行
なわなければならない。
必要な場合には、グローバル・クリーンナ・ツブもZI
COMHへの呼び出し後に行なわなければならない。
3、 次の章の命令にしたがって、MYFORTOAS
SEMBLEという名前のASSEMBLE記述子ファ
イルを作成する。
4、、  FORTRANソース・ファイルをコンパイ
ルし、MYFORTI  TEXTを生成する。
5、  ASSEMBLE記述子ファイルをMACLI
B:プロローグによってASSEMBLE記述子ファイ
ルをアセンブルし、MYFORTo  TEXTを生成
する。
6、 以下の3つのファイルを、この順序で、1つのT
EXTファイル、たとえばMYFORTTEXTに連結
する。
a、 コンパイルされた記述子ファイルから得られたT
EXTファイル(MYFORTOTEXT) b、 プロローグによって提供されるZICOMPI 
 TEXTファイル c、  FORTRANソース・ファイルをコンパイル
することによって生成されるTEXTファイル(MYF
ORTI  TEXT) コンパイルされた言語ライブラリに対するGLOBAL
  TXTLIBに連係を提供する(VS/FORTR
AN  V2の場合、これはVSF2FORTという名
前となる)。
8、 連結されたTEXTファイルをオプションN0A
UTOCLEARRLDSAVEによってLOADする
9、 連結されたテキスト・ファイルをGENMODす
る。
10、次の形式のファイルProlog  NAMES
に項目を追加する。
’−−FORTRAHNICKNAME IN Pro
log NAMES−: n ick 、 MYF(I
RT :type、PREXTERN 7゜ 2− :file、)IYFORT  MODULE  AL
−END  FORTRAN  NICKHAME  
IN  Prolog NAMES−Jll、コンパイ
ルされた言語に必要な場合には、GLOBAL  LO
ADLIBまたはGLOBAL  TXTLIBを維持
することを忘れてはならない(vS/FORTRAN 
V2におけるGLOBAL  LOADLIB  VS
F2LOAD)。
12、以下のように述語及び式を使用する。
13、実行の完了時に、コンパイルされた言語によって
捕捉されたエラーの何らかのログを期待する。
パラメータの引渡し プロローグ・インタフェースは各種のプログラミング言
語が使用するデータ・タイプの大多数に適合するように
設計されている。それゆえ、FORTRANが認識する
すべてのデータ・タイプを、プロローグとFORTRA
Nの間の両方向で交換できる。
FORTRANが実行できる命令のタイプには、3 制限はない。すなわち、C0MM0N管理、ファイルま
たは端末IO,FORTRANが回復したエラー100
.はすべて認められる。しかしながら、FORTRAN
プログラムはFORTRANに割り当てられたデータ域
にアクセスできるだけである。それゆえ、FORTRA
NアプTR−ションからプロローグ域への直接アクセス
は、呼出しインタフェースによるものを除き、認められ
ない。
コードの例 第21図、第22図、及び第23図にいくつかの例を示
す。第21図は5TUP IDという関数のソース・コ
ードを示す。関数5TUPIDはインタフェースおよび
FORTRANエラTR後をテストするために使用され
る。第22図はZIFORTOASSEMBLEのソー
ス・リストによる5TUP ID関数の宣言を示す。第
23図はプロローグ・プログラムの実行中に5TUP 
I Dが呼び出された場合に表示される情報を示す。
アレイを宣言するには、そのタイプ及び入出力制御の他
に、引数の記述子にディメンション情報を入れる。アレ
イの各ディメンションに対し、このディメンションが固
定されているのであれは、数値を入れるか、あるいはデ
ィメンションを含んでいるFORTRAN引数の位置を
記述するARGn(ただし、nは正の整数)などの参照
を入れる。
以下の規則がアレイの定義を規定する。ディメンション
が参照の場合、対応する引数のタイプは4バイトの整数
(I4)でなければならない。アレイはプロローグ・リ
ストから変換され、双方向アレイはリストのプロローグ
・リストから変換される。アレイがIO制御IまたはI
Oを有している場合には、インタフェースはプロローグ
・リストからアレイのディメンションを計算できる。そ
れゆえ、デイメンシロンを含んでいるFORTRA N
 引数はインタフェースによって構築され、述語に現れ
ることはできない。アレイがIO制御OまたはRを有し
ている場合には、インタフェースは結果アレイに対して
記憶域を割り振らなければならず、ディメンションを含
んでいるFORTRAN引数はインタフェースによって
構築され、述語に現れなければならない。
デイメンシロンの記述子は行の主要順序の左から右へ、
すなわち複数ディメンションのアレイをスィーブする標
準的方法で配置される。それゆえ、C,FORTRAN
、PASCAL、PL/I及びC0BOLは、第24図
に示すプロローグ記述と比較して逆の順序でプログラム
に現れるディメンションとインタフェースする。
総称宣言の例 各FORTRANサブルーチン及び関数に述語名を使用
する代わりに、プロローグ・アプリケーションはFOR
TRANに対するすべての呼出しに1つの述語のみを使
用する。これをGENERIC形式と呼ぶ。これを使用
するために、ASSEMBLE記述子ファイルの内部に
特別なPRODECEマクロが存在しなければならない
。たとえば、プロローグ・アプリケーションは1つの述
語名と1つの式を介してすべてのFORTRANサブル
ーチンと関数を使用しようとする。この場 66− 合、記述子ファイルは第25図に示す情報を含んでいる
総称記述子ファイルを使用するために、アプリケーショ
ンは次のインタフェースを使用する。
goals ext pred(pred gener
ic(”、、、)、 myfort。
pgeneric); and ext func(f
unc generic(”、、、)+myfort、
 fgeneric)。
次いで、 <−” := my 5tupide(2)といったゴ
ールを使用する場合、これは次のものによって置き換え
られる。
<−” := func generic(stupi
de、2)、。
さらに、 <−testtab l ([100,101、102
,103)、 [[200,201] 、 [300゜
301]、[400,401]]、[’Chainel
’、’Chaine2’l)を使用した場合、これは次
のものによって置き換えられる。
<−pred  generic(testtabl、
[100,101,102,103]。
[[200,2011、[300,3011、[400
,40111、[’Chainel’ 。
’ Cha 1ne2’ ]) 、− 67− 総称述語及び式はアプリケージリンが用いるサブルーチ
ンまたは関数を定義する特別な第1引数を使用する。こ
れは総称PRODECEが現れる外部モジュールのPR
ODECEマクロのNAMEフィールドと比較されるア
トムまたは文字ストリングを含んでいる。
コンパイルされた述語と関 FORTRANサブルーチンを述語として使用させ、F
ORTRANの関数を式として使用させる1対1の関係
はない。実際には、サブルーチン及び関数を両方ともプ
ロローグの述語として使用できることがある。唯一の相
違は関数がIO制御Rを使用するPROARGS宣言に
あり、宣言はまずPROARGSリストに現れなければ
ならない。関数をプロローグの述語として使用した場合
、関数によって戻される結果は述語の第1引数によって
ユニファイされる。この意味で、関数を呼び出す述語は
結果を受は取るために、関数が期待するものよりも1つ
多い引数を使用する。
同一の論理で、サブルーチンと関数の両方を、これらが
次の規則に従うことを条件として、式として使用するこ
とができる。
1.1つの引数をIO制御0.l01R(関数の場合の
み)のいずれかによって宣言し、式の結果を与える。
2、 他のすべての引数を工0制御Iによって宣言する
。コンパイルされた述語とコンパイルされた式の間の相
違は、次のリストを含んでいる。
a、 コンパイルされた述語がプロローグから変換され
ただけの引数を受は入れるのに対し、コンパイルされた
式は評価され、次いでプロローグから変換された引数を
受は取る。
b、 コンパイルされた式によるグローバル・スタック
の管理は、コンパイルされた述語よりも経済的であり、
これはグローバル・スタックのオーバフローが起こりに
くいことを意味する。
上記の第1項の例として、第26図に示すような式を書
く。この例はO+0などのコンパイルされた式の使用法
を示しており、これは式の引数の自動内部評価を実証し
ている。
相違点 0BOL 1、 メイン・プログラムは別な処理手順部でなければ
ならない。
2、 サブルーチンを1つの処理手順部に集めなければ
ならないが、この場合すべてのサブルーチンは別のEN
TRYステートメントを使用する。ZICOBOLI 
 C0BOLを調べる。
3、10進形式(PACKEDまたはZONED)を使
用したデータ・タイプへの変更はできない。C0BOL
の場合、これは非2進整数タイプを意味する。
PASCAL 1、  PASCAL構造またはポインタへの変換はで
きない。
2、 データの編成により、PASCALにおける=7
0 パラメータ引渡しはPASCALスタックにおけるPl
istのC0PYを引き起こす。
これは行52からのzIPASCOASSEMBLEで
行なわれる。
PL/1 1、  PL/I構造またはポインタへの変換はできな
い。
2、  PL/Iが総計のためのPlistにおける引
数の代わりに記述子を期待するため、すべての総計をR
ASED属性及びADDRビルトインによってBIN 
 FIXED(31)として宣言しなければならない。
プロローグからCへ プロローグはCプログラミング言語に対する強力なイン
タフェースを備えている。インタフェース情報に関して
上述したことはすべて、Cインタフェースに適用される
。Cインタフェースの例を第27図に示すZICI C
で与えられる。
Cの編成 1.1つまたは複数のC関数をCソース・ファイ1− ル、たとえばMMCI  Gに書き込む。
2. この同じソース・ファイルに、第28図に示す#
INCLUDE宣言を追加する。
この同じソース・ファイルに、第29図に示すようなC
コードのMAIN関数を追加する。
これは呼出しProlog  INITを含んでいなけ
ればならない。Prolog  INITの前に、Cコ
ードのグローバル・データを初期化するCコードを追加
することもできるo Prolog  INITの後に
、グローバル・クリーンナツプ・コードを追加すること
もできる。
4、 以下の命令にしたがって、MYCOASSEMB
LEという名前のASSEMBLE記述子ファイルを作
成する。
コンパイラ・オプションRENTによってCソース・フ
ァイルをコンパイルし、MYCITEXTを作成する。
6、  MACLIB:PrologによってASSE
MBLE記述子ファイルをアセンブルし、3゜ 5゜ MYCI  TEXTを生成する。
7、次の順序の次の4つから、CコンパイラのCPLI
NKユーティリティによって、たとえばMYCTEXT
という第30図に示すようなTEXTファイルを1つ構
築する。
a、  ASSEMBLE記述子ファイル(MYCo 
 TEXT)から得られるTEXTファイル b、 プロローグが提供するZ I COMP ITE
XTTEXT フアイルロローグが提供するZICOMP2TEXTフ
ァイル d、  Cソース・ファイル(MMCI  TEXT)
から得られるTEXTフアイル 8、  GLOBAL  TXTLIBをC言語ライブ
ラリ、LIB及びCBASEに割り当てる。
9、  CPLINKが作成したTEXTファイルを、
オフ’ショアN0AUTo  CLEARRLDSAv
EによってLOADする。
10、プログラムをGENMODする。
11、次の形態のファイル、プロローグNAMEsに項
目を追加する。
’−−− CNICKHAME E Prolog H
AMES −−−−−−−:n1ck、MYC : type 、 PREXTERN :fileCMODULEΔ L−−END OF CNICKNAME IN Pr
olog NAMES −J12、Cコードの実行中に
、GLOBAL  LOADLIB  CLINKおよ
びGLOBALTXTLIB  CBASEを連結する
13、何らかのCコードを使用する前に、EXECDL
IB  LOADを使用する。Cおよびプロローグが完
了したら、BXECDLIBUNLOADを使用する。
14、以下に示すように述語と式を使用する。
15、<−fin、によるファンクション・コールの実
行時に、コンパイルされた言語によって捕捉されたエラ
ーの何らかのログを期待する。
パラメータの引渡し及び宣言 第21図に示す関数5TUPIDのFORTR74 ANのサンプルはCに変換され、第31図に示される。
引数IO制御I、OまたはIOを、Cがポインタとして
受は取ることに留意されたい。これはこの例のTSIが
常に、C*参照解除演算子によって使用されることを説
明する。
Cの5TUPID関数の実行によって、第32図に示す
情報が与えられる。
Cに対するサポート関数 外部述語の場合にのみ、インタフェースは3つの分野に
分類されるサポート関数をもたらす。
1、 記憶域管理 2、 バックトラッキングまたはエラー・ハンドリング
、あるいはこれら両方の制御 3、 プロローグ・データ・オブジェクトの分析記憶域
管理 インタフェースはPROI N Iマクロによって定義
されるような、COMAREAに対するアクセスを提供
する。また、これはバックトラック全体にわたって保持
される作業記憶域を見つけだす特別なデータ・タイプA
ももたらす。
=75= P r o 1 o g  GET  COMAREA
 ()この関数はポインタを、外部式の記憶域ローディ
ングの一部として永続的に割り振られるCOMAREA
に戻す。COMAREAはローディング時にインタフェ
ースによってゼロにされるが、それ以降に変更されるこ
とはない。これはCコードによって自由に使用されるも
ので、外部式のすべてのC関数に共通である。
PROARGS、、、(AN、I)、、。
インタフェースは要求に応じ、C関数が使用する作業記
憶域を割り振る。記憶域はデータ・タイプAによってP
ROARGSマクロに記述され、ユーザ定義のデータ長
n(たとえば、256バイトの作業域の場合、(A25
8.1))及びIO制御Iを有している。対応するC関
数はchar*パラメータを有するこの引数を受は取る
ことができる。
作業記憶域は、PROARGSマクロにこれを定義する
特定のC関数専用である。これはC関数が正常に呼び出
された場合にゼロにされ、この間数のバックトラック呼
出し全体にわたって維持される。C関数のバックトラッ
ク呼出し全体にわたってデータを維持するために使用で
きる。
バックトラッキング/エラー管理 C関数は省略時に、決定論的述語としてプロローグに対
して定義される。Cのファンクシロン・コールはインタ
フェースによって提供される若干の関数によって、この
挙動を変更する。第1セツトは戻り処理特性を決定する
ために使用される。この情報はプロローグによって、C
関数がインタフェースに戻ったときに、成功するか、失
敗するか、あるいはエラーを生じるかを判定するために
使用される。
この関数は正規の成功状態に戻る。それゆえ、プロロー
グの実行は通常、C関数のC戻りステートメントの後に
進む。
Prolog  SET  BACK()この関数はC
関数のC戻りステートメントの直後に、プロローグの実
行を失敗させる。
Prolog   SET   ERROR(ERRO
RCODE) この関数はC関数のC戻りステートメントの後で、タイ
プError  Codeのエラーで、プロローグの実
行を停止させる。いくつかの事前定義Error  C
odeがProlog、Hインクルート・ファイルによ
って提供される。
Prolog  ERRGLOBAL グローバル・スタックのオーバフロー Prolog  ERRLOCAL ローカル・スタックのオーバフロー Prolog  ERRTRAIL トレール・スタックのオーバフロー Prolog  ERR5YNTAX 構文エラー また、プロローグ・オブジェクトを分析するサポート関
数のいくつかは、上述のError  Codeをセッ
トする。
Pro l og  TEST  ERROR()この
関数はError  Codeセットがある78 かどうかを判定する。Error  Codeが検出さ
れた場合には、エラー・コードに等しい非ゼロ値を戻す
第2のセットはC関数が将来、バックトラッキング処理
の一部として再度呼び出されるかどうかを決定するため
に使用される。たとえば、C関数は選択ポイントを作成
した。関数が選択ポイントを作成するかどうかが、サポ
ート関数の第1セツトによって管理されるその戻り状!
!J(成功、失敗またはエラー)に無関係であることに
留意されたい。しかしながら、関数が失敗し、選択ポイ
ントを作成した場合、この選択ポイントが最新のもので
あるため、これが直ちに再呼び出しされる。
Prolog  RESET  CHOICE()この
関数は正規の選択なしポイント状態に戻る。
この関数は活動選択ポイントを作成する。バックトラッ
キングが生じた場合、C関数が同じ引数によって再度呼
び出される。
79 Prolog   TEST   CHOICE  (
)この関数はC関数が正常に呼び出されたか、あるいは
バックトラッキング処理の一部として呼び出されたかを
判定する。後者が真の場合には、非ゼロ値を戻す。C関
数がバックトラッキング処理の一部として正常に呼び出
された場合には、活動選択ポイントをもはや有していな
いことになる。
バックトラックによって呼び出された関数が再帰的な場
合には、選択ポイントを再作成しなければならない。
プロローグ・データ・オブジェクトの分析このセットの
関数はプロローグ・オブジェクトを記述し、プロローグ
・オブジェクト内部のサブオブジェクトを選択し、プロ
ローグ・オブジェクトをCに、またC変数をプロローグ
・オブジェクトに変換し、複数のプロローグ・オブジェ
クトをユニファイする。
ECT) この関数はProlog  0BJECTのタイプを返
す。Prolog  TYPEが理解するプロローグの
タイプの完全なリストは、Prol。
g  TYPE  0THERに関連した値を戻す。
未知のタイプはProlog  TYP  VARIA
BLEに関連した値を戻す。正規のプロローグ変数はP
rolog  TYP  NILに関連した値を戻す。
NILアトムはProlog  TYPATOMに関連
した値を戻す。NIL以外のアトムはProlog  
TYP  5TRINGに関連した値を戻す。文字スト
リングはPrologTYP  INTに関連した値を
戻す。浮動小数点数はProlog  TYP  LO
NGINTに関連した値を戻す。有理数はProlog
  TYPRATIONALに関連した値を戻す。スケ
ルトンはProlog  TYP  5KELETON
に関連した値を戻す。拡張スケルトンはProl。
g  T Y P  E X T E N D E D
 S K E L E T ONに関連した値を戻す。
リスト・ペアはProl。
g  TYP  LISTに関連した値を戻す。
Prolog   FUNCTOR(PrologOB
JECT) この関数はProlog  0bject形式のPro
log  0bjectのファンフタを戻す。
○ オブジェクトがタイプProlog  TYPSK
ELETONまたはタイプProl。
g  TYP  EXTENDEDSKELETONの
ものである場合、関数は項ファンクタを戻す。
OオブジェクトがタイプProlog  TYPLIS
Tのものである場合、関数はアトム四、′″を戻す。
OオブジェクトがNULLポインタの場合、関数はC関
数を呼び出すのに使用された外部述語のファンフタを戻
す。
O上記以外の場合、関数はError  CodeをP
rolog  ERR5YNTAXにセットし、NUL
Lポインタを戻す。
Prolog   ARITY(Prolog   0
BJECT) この関数はCint形式で、PrologObject
のアリティを戻す。
Q オブジェクトがタイプProlog  TYPSK
ELETONまたはタイプProl。
g  TYP  EXTENDEDSKELETONの
ものである場合、関数は項のアリティを戻す。
OオブジェクトがタイプProlog  TYPLIS
Tのものである場合、関数は数字2を戻す。
OオブジェクトがNULLポインタの場合、関数はC関
数を呼び出すのに使用された外部述語のアリティを戻す
O上記以外の場合、関数はError  CodeをP
rolog  ERR5YNTAXにセットし、−1と
いう値を戻す。
 82− 83− Prolog   PREFIX(Prolog   
0BJECT) この関数はProlog  0bject形式で、Pr
olog  0bjectの接頭部を戻す。
OオブジェクトがNULLポインタの場合、これはC関
数を呼び出すのに使用された外部述語の接頭部を戻す。
O上記以外の場合、関数はError  CodeをP
rolog  ERR5YNTAXにセットし、NUL
Lポインタを戻す。
Prolog  ARG(Prolog  0BJEC
T、RANK) この関数はProlog  0bject形式で、Pr
olog  0bjectのランク番目のサブオブジェ
クトを戻す。
○ オブジェクトがタイプProlog  TYPSK
ELETONまたはタイプProl。
g  TYP  EXTENDEDSKELETONの
ものである場合、これはランク番目のサブオブジェクト
を戻す。
OオブジェクトがタイプProlog  TYPLIS
Tで、ランクが0または1である場合、関数はランク番
目のサブオブジェクトを戻す。
○ 上記以外の場合、関数はError  Codeを
Prolog  ERR5YNTAXにセットし、NU
LLポインタを戻す。
この関数はProlog  0bject形式で、ラン
ク番目の要素を戻す。最初の要素のランクは0である。
OオブジェクトがタイプProlog  TYPLIS
Tのものであり、選択がProl。
g  LST  VALUEの場合、関数はリストのラ
ンク番目の要素を戻す。
○ オブジェクトがタイプProlog  TYPLI
STのものであり、選択がProl。
g  LST  NEXTの場合、関数はランク+1番
目のリスト・ペアを戻す。
OオブジェクトがタイプProlog  TYPLIS
Tのものであり、選択がProl。
g  LST  CURRENTの場合、関数はランク
番目のリスト・ペアを戻す。
O上記以外の場合、関数はError  CodeをP
rolog  ERR5YNTAXにセットし、NUL
Lポインタを戻す。
Prolog  LIST  LENGTH(Pr。
log  0BJECT) この関数はリストを形成するために連鎖されたリスト・
ペアの数をカウントし、これを戻す。Prolog  
0bjectがリスト・ペアである場合、カウントはゼ
ロである。関数が非リスト・ペアとともに、リスト・ペ
ア(正規のリストの終了ニル、またはリスト・ペア以外
のその他のPrologタイプ)の第2フイールドとし
て提示された場合には、カウントは終了する。
Prolog  COMP  FLOAT(FLOAT
ING  POINT、FLOATING  POIN
T) Cの倍数形式の2つの浮動小数点数が現行のProlo
gファズ値よりも互いに近い場合に、この関数は非ゼロ
値を戻す。
P r o ] og  C0N5TANT (RAN
K)この関数はPROCONSマクロのセットで定義さ
れるランク番目の定数オブジェクトを戻す。
最初の定数オブジェクトのランクはOである。定数がP
ROCONS  LISTまたはPROCONS  5
KELの場合には、プロローグ変数が埋め込まれた新し
いリスト・ペア、または右側のファンフタ及びアリティ
ならびに引数としてプロローグ変数を備えた新しいプロ
ローグ類が、グローバル・スタックに割り振られる。
この関数はランクの事前定義値を存する定数オブジェク
トも備えている。
Prolog  C8T  NIL 特別なプロローグ・アトム・ニル Prolog  C8T  LIST 変数引数を備えた、新たに割り振られたリスト・ペア 6− 87 Prolog   C8T   EMPTY空のプロロ
ーグ文字ストリング グローバル・スタックがオーバフローした場合、これは
Error  CodeをProlog  ERRGL
OBALにセットし、NULLポインタを戻す。
log   0BJECT) し、整数を戻す。
OオブジェクトがタイプProlog  TYPINT
のものである場合には、これはオブジェクトの整数形式
値を戻す。
○ 上記以外の場合、関数はError  Codeを
Prolog  ERR5YNTAXにセットし、ゼロ
値を戻す。
rolog   0BJECT) し、この倍数を戻す。
OオブジェクトがタイプProlog  TYPFLO
ATのものである場合には、これはオブジェクトの倍数
形式値を戻す。
OオブジェクトがタイプProlog  TYPLON
GINTまたはProlog  TYP  RATIO
NALのものである場合には、これはオブジェクトの倍
数形式変換値を戻す。
O上記以外の場合、関数はError  CodeをP
rolog  ERR5YNTAXにセットし、ゼロ値
を戻す。
この関数はオブジェクトをCのchar*形式に変換し
、このchar*を戻す。
OオブジェクトがタイプProlog  TYPSTR
INGのものである場合には、関数はオブジェクトのc
har*形式で変換した値を戻す。
Q オブジェクトがタイプProlog  TYPAT
OMまたはProlog  TYP  NILのもので
ある場合には、関数はオブジェクトのPrint−Na
meのchar*形式で変換した値を戻す。
○ ローカル・スタックがオーバフローした場合、これ
はError  CodeをPrologERRLOC
ALにセットし、NULLポインタを戻す。
O上記以外の場合、関数はError  CodeをP
rolog  ERR5YNTAXにセットし、NUL
Lポインタを戻す。
T   ORC0BJECT、TYPE   DEST
) この関数はオブジェクトを、タイプTyp eDest
のProlog  0bjectに変換し、変換された
Prolog  0bjectを戻す。
Type  OrgはProlog  0bjectの
Prolog  ’rypeであり% PrologT
YP  0THERとして指定できる。しかし0− ながら、オブジェクトがCのオブジェクトである場合に
は、Type  Orgを指定しなければならず、また
次のセットに属さなければならない。
Prolog  TYP  BINARYSTRING Cchar*形式の文字ストリング Prolog  TYP  BINARYINTCのi
nt形式の整数 Prolog  TYP  BINARYFLOATC
の倍数形式の浮動小数点数 サポートされている変換を以下に列挙する。
OProlog  TYP  BINARY  5TR
INGからProlog  TYP  5TRINGへ OProlog  TYP  BINARYSTRIN
GからProlog  TYP  ATOMへ OProlog   TYP   BINARYSTR
INGからProlog  TYP  NILへOPr
olog  TYP  5TRINGからP 91− rolog  TYP  5TRINGへOProlo
g  TYP  5TRINGからProlog  T
YP  ATOMへ ○ Prolog  TYP  5TRINGがらPr
010g TYP NILへ OProlog  TYP  ATOMがらPr。
log  TYP  ATOMへ OProlog  TYP  ATOMがらPr。
log  TYP  5TRINGへ OProlog  TYP  NILがらProlog
  TYP  NILへ ○ Prolog  TYP  NILがらPro 1
og  TYP  5TRINGへ OProlog  TYP  INTがらPro 1o
g  TYP  INTへ OProlog  TYP  BINARY  INT
からProlog  TYP  INTへ○ Prol
og  TYP  FLOATがらProlog  T
YP  FLOATへ ○ Prolog  TYP  BINARYFLOA
TからProlog  TYP  FLOATクローバ
ル・スタックがオーバフローシタ場合、これはErro
r  CodeをProlog  ERRGLOBAL
にセットし、NULLポインタを戻す。これ以外の場合
には、関数はErr。
r  CodeをProlog  ERR5YNTAX
にセットし、NULLポインタを戻す。
る。成功した場合、これは最初のユニファイされたバー
ジョンすなわちProlog  0bjectを戻す。
失敗した場合、バックトラッキングが生じる。パフォー
マンス上の理由から、プロローグの単純な非凍結変数、
プロローグ整数、アトム、及びストリングは動的に処理
される。しがしながら、他のタイプがCからプロローグ
への文脈切換えを行ない、完全なプロローグ・ユニファ
イアを呼び出してから、Cへの文脈再切換えを行なうこ
とができる。
トレール・スタックがオーバフローシタ場合、関数はE
rror  CodeをProlog  ERRTRA
ILにセットし、NULLポインタを戻す。
既存のアプリケーション プロローグへの連絡を必要とする既存のアプリケーショ
ンについては、このようなアプリケーシヨンからプロロ
ーグへのインタフェースもある。FORTRANかられ
かるように、インタフェースは第33図に示すT E 
X T 7 y イア1/、ZICOMPF  TEX
Tである。インタフェースは「INTEGER関数」と
いうプロローグをもたらす。
INTEGEHの結果は要求の戻りコードである。
r−−−−−FORTRAN CALL FORMAT
 SAMPLE −−−−−−−−C−−We dec
lare the external Functio
nINTEGERProlog C−−IJe reserve 5pace for 
the Return CodeINTEGERRET
CODE C−−We use a sample Ca1l t
o show the Format4− RETCODE = Prolog(jSTART’、
’Prolog’、    C’PrologWS’、
  ’REUSE’、”)L−END  OF  FO
RTRAN  CALL  FORMAT SAMPL
E  −−−−〜」注: FORTRANが空の文字ス
トリングをサポートしないので、空の文字ストリングを
1スペ一ス文字のストリングと置き換える必要がある。
プロローグに対するCインタフェース Cインタフェースは第33図に示すZICOMPCTE
XTというTEXTファイルに示されている。このイン
タフェースはプロローグというrint関数」をもたら
す。intの結果は要求の戻りコードである。
「−CCALL FORMAT SAMPLE −一−
−−−−−−−−−−−−−−−/l″−Declar
e the external Function−−
−−−−−−”/旧nclude  <Prolog、
H>/”−−Re5erve 5pace for t
he Return Code −−−”/int R
etcode; /”−−Use a sample Ca1l to 
show the Format−’/Retcode
=Prolog(”5TART−”Prolog 。
”PrologWS−”REuSE”%”’)i5− L−−END  OF  CCALL  FORMAT
 SAMPLE−一−−−−−−−JCOBOL COBOLからプロローグへのインタフェースは第35
図に示すZICOMPB  TEXTのソース・リスト
に示されている。要求の戻りコードはCALL rプロ
ローグ」ステートメントの最初の引数として戻される。
また、C及びFORTRANが文字ストリングを使用で
きる場合には、C0BOLは文字ストリング自体ととも
に文字ストリングの長さを供給しなければならない。
r−−−−−C0BOL CALL FORMAT S
AMPLE −−−−−−−−” We Re5erv
e 5pace for all arguments
ol RETCODE PIC59(09)BINAR
Y。
015TART−STRCT。
055TART−LGTHPIC9 (04)BINARY VALUE 5゜05  5T
ART−STRPICX (05)VALUE ”5TART” 01 Prolog−STRCT。
05 Prolog−LGTHPIC9(04)BIN
ARY VALUE 5゜05 Prolog−STR
PICX (05)VALUE  ”Prolog  。
01  PrologWS−STRCT。
05 Prolog−LGTHPIC9(04)BI)
IARY VALUE 7゜05 Prolog−ST
RPICX (07)VALUE  ”Prolog”IJS−01
REUSE−STRCT。
05  REUSE−LGTHPIC9(04)BIN
ARY VALtlE 5゜05  REUSE−ST
RPICX (05)VALUE  ”REUSE”。
01    0PTION−STRCT。
05 0PTION−LGTHPIC9(04)BIN
ARY VALUE O。
”  Sample Ca1l  to Show t
he FormatCALL  ”Prolog”  
USING  RETCODE、5TART−STRC
T。
Prolog−STRCT、PrologWS−STR
CT、REUSE−STRCT。
0PTIOI(−STRCT。
じ−END OF C0BOL CALL FORMA
T SAMPLE−vまとめの検討では、Cの構文を連
絡媒体として使用する。
プロローグへの言語インタフェースは4つの基本コマン
ドを備えている。
5TART   プロローグを初期設定し、まだロード
されていなければ、新しいワー クスペースを新しいセツションに ロードし、ワークスペースの初期 ゴールを活動化する。
5TOP    プロローグのセ・νションを完了し、
関連する記憶域を解放する。
CALL    呼出しプログラムから変換されたデー
タによってプロローグの述語 を実行し、述語が成功した場合に は、結果を呼出しプログラムに変 換する。
RECALL  R新のCALLコマンドの次の解8 
− を要求し、述語が成功した場合に は、結果を呼出しプログラムから、 元のCALLコマンドによって供 給されるデータに変換する。
5TARTコマンド 5TARTコマンドはすべて文字ストリングの5つの引
数を必要とする。構文は以下の通りである。
r−CINTERFACE 5TART COMMAN
D −−−−−−−−−−Retcode =    
Prolog(”5TART”、 Token。
Workspace、  5hare、  0ptio
ns);ビーEND OF CINTERFACE 5
TART COMMAND −−−Jただし、TOKE
Nは8文字以下のセツション・トークンであり、プログ
ラムがCALLlRECALL及び5TOPコマンドを
サブミツトした場合に、プロローグのセツションを識別
するのに使用される。
WORKSPAGEは8文字以下のワークスペース名で
あり、ファイルタイプ・プロローグWSの既存のファイ
ルを識別する。アプリケーションが99= プロローグが供給した元の初期ワークスペースである場
合には、プロローグWSという名前を使用する0 8HAREは8文字以下のセレクション・ストリングで
、値NEWまたはREUSEを取らなければならない。
ストリングが空の場合、省略時価(NEW)が取られる
OPT I ONSは5TARTコマンドによってLP
rolog  EXECに供給されるオプションを含ん
でいる文字ストリングである。
NEWシェア・セレクションが使用中の場合には、5T
ARTコマンドはセツション名トークンによってあらゆ
るセツションを5TOPする。次いで、5TARTはフ
オームLProlog  NAME )−クンWSワー
クスペース・オプションの0MS17ンドを出す。LP
rolog  EXECの処理中に、プロローグは初期
化される。それまでに行なわれていなければ、コマンド
は必要な任意のオプションを付けた、プロローグWSか
ら読み取られたワークスペースによってネーム・トーク
ンのセツションを構築する。
5TARTJ77ドはLProlog:+マントの戻り
コードを、それ自体の戻りコードとして戻すか、コマン
ドの構文が無効であったことを示すプロローグのエラー
・コードを戻すか、あるいはLPrologコマンドを
wi築するのに必要な記憶域割振り要求が失敗した場合
には、プロローグ外部記憶域障害を戻す。
TOP STOPコマンドは2つの文字引数を必要とする。構文
は次のとおりである。
’−−−−− CIHTERFACE 5TOP CO
MMAND −−−−−−−Retcode = Pr
olog(”5TOP”、 Token);L7−−−
−END OF CINTERFACE 5TOP C
OMMAND −Jただし、TOKENは8文字以下の
セツション・トークンで、5TARTコマンドにおける
プロローグ・セツションを識別する。
5TOPコマンドはフオームNUCXDROPトークン
の0MSコマンドを出す。次いで、NUCXDROPコ
マンドの処理中に、ネーム・トークンのセツションは完
了し、その記憶域は解除される。他のプロローグ活動セ
ツションがなければ、プロローグ自体がメモリから除去
される。
5TOPコマンドはNUCXDROPコマンドの戻りコ
ードをそれ自体の戻りコードとして戻すか、あるいはコ
マンドが無効であれば、プロローグ構文エラーを戻す。
CALLコマンド CALLコマンドは少なくとも5つの文字引数を必要と
し、その最初の5つは文字ストリングである。構文を以
下に示す。
r−−−−−CINTERFACE CALL COM
MAND −−−−−−−Retcocle = Pr
olog(”CALL”、 Token、 Prefi
x。
predicate、 Descriptor、 Ar
guments 、、、);L−−−−−END OF
 CrNTERFAcE CALL COMMAND 
−Jただし、TOKENは8文字のセツション・トーク
ンで、5TARTコマンドにおけるプロローグ・セツシ
ョンを一意に識別する。
REFIX 呼び出された述語の接頭部である。空ストリ02 − ングとして供給された場合には、述語には接頭部は与え
られない。この場合、述語名の優先述語が呼び出され、
述語は呼び出される述語の名前であり、文字ストリング
で、大文字小文字の区別がある。
DESCRI PTOR 入力及び出力引数の変換の記述子文字ストリングである
。ゼロ・アリティの場合には空であってもかまわないが
、その場合には、プロローグ呼出しの記述子の後に引数
があってはならない。
ARGUMENTS 述語の呼び出し前にプロローグ・データ構造に変換され
なければならす、またこの述語の引数として渡されなけ
ればならない、ゼロまたはそれ以上のデータ引数である
結果の引数については、述語は対応する位置に変数を受
は取り、述語が成功した場合には、これらの変数におか
れたプロローグ・データは呼出しプログラムの形式に逆
変換される。
103 CALLコマンドは呼出しプログラムから変換された入
力引数及び変数として供給された出力号数の付いたプロ
ローグの述語または接頭部:述語を実行する。プロロー
グ・エラーがあった場合には、CALLコマンドは戻り
コードとして、エラー・コードを戻す。述語が失敗した
場合には、CALLコマンドはそれ自体の戻りコードを
戻す。
述語が成功した場合には、CALLコマンドは変数によ
ってユニファイされたプロローグ・データからの出力引
数を逆変換し、その戻りコードとしてゼロを戻す。CA
LLコマンドが無効な場合には、プロローグ構文エラー
をそれ自体の戻りコードとして戻す。
RECALLコマンド RECALLコマンドは2つの文字引数を必要とする。
構文を以下に示す。
r−−−−−CIHTERFACE RECALL C
OMMAND −−−−−−−Retcode = P
rolog(”RECALL”、 Token);L−
−−−−CINTERFACE RECALL COM
MAND −−−−−m−−,,。
ただし、TOKENは8文字のセツション識別子である
。RECALLコマンドは最新のCALLコマンドから
次の解を要求する。これはCALLコマンドと同じ戻り
コードを戻す。述語が再度成功した場合には、解の結果
をCALLコマンドが供給する出力引数に戻す。
呼出し記述子 記述子はゼロまたはそれ以上の引数の文字ストリングで
ある。これはPROARGS構文のサブセットを使用す
る。PROARGS構文の以下の場合をCALL記述子
に使用することはできない。
データ・タイプ04、AN IO制御V1R,A また、IO制御入力及び出力は呼び出されたプロローグ
述語に関するものであり、呼び出されたコンパイルされ
た言語の外部述語に関するものではない。PROARG
Sマクロの2つの形式(正規記述子及びCストラクト記
述子)は有効である。
データ・タイプB1、B2、B4.11、I2、I4、
B4、B8、J4、J8、CN1CO1I、Ol IO
及び ディメンシジン記述子N、ARGN ディメンションをARGNとして記述した場合、N対応
引数はデータ・タイプエ4でなければならず、IO制御
Iでなければならず、またプログラム・データとして正
しい値を付けて供給されなければならない。述語は多デ
ィメンション・アレイに対するLi5t;すなわちリス
トのリストの形式のアレイと、スカラ数としてのディメ
ンションの両方を受は入れる。ディメンション数が述語
に渡されるのに対し、プロローグからコンパイルされた
言語へのインタフェースにおいては、呼出しプロローグ
の述語がこれらを入力アレイに供給する必要はない。コ
ンパイルされた言語からプロローグへのインタフェース
においては、アレイが入力であって、リストとして与え
られるのか、あるいは出力であって、変数として与えら
れるのかのディメンション数が述語に与えられる。
ディメンション数によって供給されるサイズと正確に同
じ出力アレイを構築するには、述語が必要である。ない
場合には、逆変換は失敗し、エラー106 となる。
プロローグから外部プロセスへ プロローグから外部プロセスへの通信の論理を第36A
図ないし第36C図に示す。実行は970で始まり、機
能ブロックに示す1つの引数を有する述語mV  5t
ul)idが外部Non−C。
nnectedとして定義される。その実行アドレスは
プロローグのシステム域のATTACHFをポイントす
る。機能ブロック971において、プロローグはまず、
mV  5tuI)ide (3)に対する参照に遭遇
する。制御が外部プロセスに対する参照を処理するため
にATTACHFに渡される。外部プロセスが構築され
たファイル名を含んでいるファイルが、機能ブロック9
72において、プロローグが処理しようとしている特定
の外部プロセスについて探索される。ファイルは外部プ
ロセスがユーザ定義されたファイル名を含んでいる。こ
れはMYFORTOASSEMBLEの複数のMACR
OPRODECEによって作成された述語リストを含ん
でいる。外部プロセ07− スを実行するのに必要な情報は、リストに記憶される。
この情報は外部プロセスの実行アドレスを含んでいる。
機能ブロック973において、外部プロセスは以前にロ
ードされていなければ、メモリに入れられる。次いで、
機能ブロック974において、MYFORTOASSE
MBLEのMACROPROINI (上述)によって
作成された外部プロセスのヘッドが調べられる。ヘッダ
はバナー及びプロローグのバージョン数を含んでいる。
バナーは外部プロセスに対する正しい識別情報について
テストされ、バージョン番号は現行のプロローグのバー
ジョンが活動していることを確認するために問合せを受
ける。
機能ブロック975において、外部プロセスに対するア
ドレス情報を得るために、述語リストが探索される。述
語リストはMYFORTOASSEMBLEの1つまた
は複数のMACROPRODECEによって構築済みで
ある。5TUPIDは外部FORTRAN名であり、5
TUPIDEはext  funcの3番目の引数とし
て使用される名前である。次いで、機能ブロック976
において、述語my  5tupide(*)は外部接
続されたものとして定義され、ATTACHFは接続ア
ドレスに分岐する。これはATTACHF処理を完了す
る。
機能ブロック977において、連係コードは外部プロセ
スの入口点アドレス、メインFORTRANアドレス及
びPROARGSテーブルのアドレスを、一連の事前定
義レジスタに記憶する。次いで、制御は事前定義アドレ
スITFFORT2でプロローグに戻される。外部プロ
セスが期待する形式へのプロローグの引数の変換は、P
ROARGSテーブルによって管理される。機能ブロッ
ク980において、保全性チエツクがPROARGSテ
ーブルで行なわれる。次いで、述語の呼出しをチエツク
して、引数のカウントを検査する。
機能ブロック982において、各引数が変換ループ98
3を介して渡され、プロローグからの引数を外部プロセ
スが期待する形式に変換する。次いで、すべての出力引
数が機能ブロック884及び処理ループ985において
、メモリに割り振られる。PROARGSテーブル内の
情報がこの処理を管理する。
判断ブロック986において、外部プロセス環境の状態
の照会が行なわれ、これがまだ活動していなければ、機
能ブロック987に示すように開始される。外部環境が
活動化すると、特定の外部プロセスが、これの期待する
変換されたパラメータ・リストによって活動化される。
外部プロセスが実行を完了した場合、外部引数は機能ブ
ロック992に示すように、プロローグ形式に逆変換さ
れる。最後に、制御がプロローグに戻され、述語が機能
ブロック993に示すように進行する。
外部プロセスからプロローグへ プロローグから外部プロセスへの通信の論理を、第37
A図ないし第37C図に示す。第37A図において、実
行はtoooで始まり、アプリケーションはAPPLと
いうワークスペースを有するAPPLという名前で、プ
ロローグをスタートし−110− ようとする。プロローグ連係ル−チンはコマンドを走査
し、5TARTを認識し、アプリケーション名とワーク
スペース名を抽出する。連係ル−チンハ機能ブロック1
010に示すコマンドを、オペレーティング・システム
に対して出すことしこよってプロローグをスタートし、
制御をアプリケージ日ソに戻す。
アプリケーションは述語rl)refix:predi
cateJを実行しようとし、機能ブロック1012に
示す変換された引数をこれに与えようとする。変換は記
述子テーブル内の情報、及びPROARGS  MAC
RO内の形式に基づく。
連係ルーチンはコマンドを走査し、CALLを認識する
。連係ルーチンはシステム・コールを、コマンドAPP
L  HLLならびに引数の接頭部、述語、記述子、及
び引数を用いて、スーパー/(イザ・コールを介して、
機能ブロック1016に示すようなプロローグに様式化
する。
プロローグのシステム・コールAPPL  HLLは変
換処理を呼び出して、外部プロセスからの−111− 引数を、機能ブロック1018に示すようなプロローグ
の内部形式に変換する。機能ブロック1020は変換処
理へループ・バックし、引数の各々の変換を容易とする
。入力引数が変換されると、述語が機能ブロック102
5に示すように実行される。次いで、述語が成功した場
合には、各出力引数が機能ブロック1034及び103
6のループに示すような外部プロセス形式に逆変換され
、制御が外部プロセスに戻される。外部プロセスへの逆
変換は、正しい様式化のために記述子テーブルを用いる
。述語が失敗した場合には、プロローグのシステム・コ
ールは1032で終了し、制御をエラー・コードを付け
て外部プロセスに戻す。
外部プロセスは機能ブロック1040に示すような処理
によって、以前の呼出しの次の解を獲得する。連係コー
ドはプロローグ・システム・コールを機能ブロック10
42に示すように出す。連係情報の以前のセットを使用
して、プロローグと連絡する。それゆえ、プロローグ・
システムは機能ブロック1044に示すような以前の述
語を戻す。次いで、判断ブロック1046でテストされ
て、述語が成功した場合には、出力引数は機能ブロック
1052において外部プロセス形式に逆変換され、プロ
ローグ・システムは制御を外部プロセスに戻す。述語が
失敗した場合には、プロローグのシステム・コールは終
了し、エラー〇コードを戻す。
外部プロセスがプロローグ処理を完了し、セツションを
クリーンアップしようとした場合には、機能ブロック1
056に示すように5TOPコマンドを出す。プロロー
グの連係ルーチンは5TOPを認識し、セラシロン名A
PPLを抽出する。
連係ルーチンはオペレーティング・システムに対して機
能ブロック1058に示すコマンドを出すことによって
、APPLというセツションを終了する。
E0発明の効果 本発明はプロローグ・インタプリタ/コンパイラに割込
み処理を提供する。
【図面の簡単な説明】
第1図は、オブジェクトを表す従来技術のプロローグ・
レコードの図である。 第2図は、本発明によるタイプ・ポインタのプロローグ
・ワードを示す図である。 第3図は、本発明によるタイプ記述子のプロローグ・ワ
ードを示す図である。 第4図は、プロローグ・オブジェクトの伝統的な従来技
術の手法の流れ図である・ 第5図は、本発明によるプロローグ・オブジェクト処理
の流れ図である。 第6図は、本発明によるフリー変数のブローログの表示
を示す図である。 第7図は、本発明によるブローログの定数を示す図であ
る。 第8図は、本発明によるプロローグのスケルトンを示す
図である。 第9図は、従来技術のプロローグget  c。 n5tant命令を説明する図である。 第10図は、本発明のプロローグget  C014 nstant命令を説明する図である。 第11図は、従来技術のプロローグput  Con5
tant命令を説明する図である。 第12図は、本発明によるプロローグputconst
ant命令を説明する図である。 第13A図ないし第13C図は、本発明による命令処理
の論理を表す流れ図である。 第14図は、本発明による割込み処理に用いられるデー
タ構造を説明する図である。 第15A図ないし第15F図は、本発明によるプロロー
グに対する付加割込み処理に関連した論理を示すブロッ
ク図である。 第16図は、本発明による各種の言語におけるデータ・
タイプの相関テーブルである。 第17図は、本発明によるCプログラムのソース・リス
トである。 第18図は、本発明によるProlog  Pr□ga
rgsのソース・リストである。 第19図は、本発明による2進記述子形式のアセンブラ
のソース・リストである。 −115− 第20図は、本発明による主プログラムのFORTRA
Nのソース・リストである。 第21図は、本発明によるサンプル関数のFORTRA
Nのソース・リストである。 第22図は、本発明によるFORTRAN関数5TUP
IDのプロローグ宣言を説明する図である。 第23図は、本発明によるFORTRAN関数5TUP
IDの実行のリストである。 第24図は、本発明による記述子宣言の例を示す図であ
る。 第25図は、本発明による記述子ファイルの例を示す図
である。 第26図は、本発明による式の例を示す図である。 第27図は、本発明によるCプログラムの例を示す図で
ある。 第28図は、本発明によるCインクルート・ファイルに
対するプロローグの例を示す図である。 第29図は、本発明によるC主プログラムに必要なCコ
ードの例を示す図である。 第30図は1本発明によるCPLINK関数に対するC
テキスト・ファイルのリストである。 第31図は、本発明による5TUPIDのCバージョン
のリストである。 第32図は、本発明による5TUPIDのC実行のリス
トである。 第33図は、本発明によるFORTRAN−プロローグ
・インタフェースの例を示す図である。 第34図は、本発明によるC−プロローグ・インタフェ
ースの例を示す図である。 第35図は、本発明によるC0BOL−プロローグ・イ
ンタフェースの例を示す図である。 第36A図ないし第36C図は、本発明による外部プロ
セスに対するプロローグ通信の論理を示す流れ図である
。 第37A図ないし第37C図は、本発明によるプロロー
グに対する外部プロセス通信の論理を示す流れ図である
。 次の形のレコードによってプロローグ・オブジェクトを
表す代りに□  CPUワード 4−m−ワード・タイプ・ポインタ □タイプ記述子の
ワード 第4図 フリー変数の表示 峰−m−ワード・タイプ・ポインター−プロローグ変数
の表示 □ワード・タイプ・ポインタ□ 500千「)−510 □ ワード・タイプ記述子−一←−その他のワード −
−−スケルトンの表示 □ワード・タイプ・ポインタ□ 400f■ト410 ド・タイプ記述子−−チ(□−その他のワードまた11 ド・タイプ記述子        −その他のワード第
8図 第9図 第10図 第11図 11112図 FORCTARG FORCFLAG FORCDEPT FORCFREE FORC5ADD FORCEADD FORCDSKE FORCDIMC ネ FORCDIMl * DSECT  。 DS    IX フラグ・バイト この引数はアレイのディメンションであるこの引数はI
Nアレイのディメンションであるこの引数はINまたは
IOの18部分であるDS DS FORCDIMCフィールドはディメンションを含むこ
の引数は工0である この引数はレジスタ(RまたはA)であるこの引数は値
(VまたはR)による この記述子はa<or>である タイプ/サイズ・タイプ FORCTYPEバイトのタイプ・マスクFORCTY
PEバイトのサイズ・マスクこの引数タイプは符号骨ぎ
整数である この引数タイプは符号なし整数である この引数タイプは実浮動小数点数であるIX この引数タイプは複素浮動小数点数であるこの引数タイ
プは文字−1である この引数タイプはプロローグ・オブジェクト−4である
この引数タイプは選択域−1である ネスティング・バイト この記述子はパラメータを開く この記述子はパラメータを閉しる この記述子けaく、ルベル・アップであるこの記述子は
a〉、ルベル・ダウンであるこの<or>記述子は8つ
のアラインメントが必要このくo「〉記述子は4つのア
ラインメントが必要この<or>記述子は2つのアライ
ンメントが必要この記述子の最初のフリー・バイトをオ
フセットする変換済み引数記憶開始アドレス A 変換済み引数記憶終了アドレス 現1テネステイング・レベルに対するアリティ、<or
>多重度(省略時は1、Jでは2、Cnならn)、また
は参照記述子の場合には、実際のディメンション参照デ
ィメンション記述子に対するポインタ、またけ固定デイ
メンシコンの対向 16 ヰ \ 娃 986 第66B図 手続補正書(方式) 平成2年11月9日

Claims (1)

  1. 【特許請求の範囲】 (1)コンピュータを含んでおり、該コンピュータが複
    数のハードウェア・レジスタ及びメモリを有しており、
    該メモリが複数の命令からなるプログラムを含んでいる
    、連係されたリスト処理環境において割込みを処理する
    方法において、 (a)割込みを認識し、関連する割込み処理ルーチンに
    対するアドレスを含んでいる割込み制御ブロックをメモ
    リ内に構築し、 (b)割込みの発生を示すフラグをメモリにセットし、 (c)次いでフラグをテストし、 (d)フラグ内のアドレス及び割込み制御ブロック内の
    情報によって、割込み処理ルーチンに分岐し、 (e)割込みを処理する ステップからなる方法。 (2)バックトラック処理に対するサポートをさらに含
    んでいる、請求項1記載の方法。(3)変数の遅延評価
    に対するサポートをさらに含んでいる、請求項1記載の
    方法。 (4)ガーベジ・コレクションに対するサポートをさら
    に含んでいる、請求項1記載の方法。 (5)デバッグに対するサポートをさらに含んでいる、
    請求項1記載の方法。 (6)非同期事象に対するサポートをさらに含んでいる
    、請求項1記載の方法。 (7)コンピュータを含んでおり、該コンピュータが複
    数のハードウェア・レジスタ及びメモリを有しており、
    該メモリが複数の命令からなるプログラムを含んでいる
    、連係されたリスト処理環境において割込みを処理する
    装置において、 (a)割込みを認識し、関連する割込み処理ルーチンに
    対するアドレスを含んでいる割込み制御ブロックをメモ
    リ内に構築する手段と、 (b)割込みの発生を示すフラグをメモリにセットする
    手段と、 (c)次いでフラグをテストする手段と、 (d)フラグ内のアドレス及び割込み制御ブロック内の
    情報によって、割込み処理ルーチンに分岐するための手
    段と、 (e)割込みを処理する手段 とからなる装置。 (8)バックトラック処理をサポートする手段をさらに
    含んでいる、請求項7記載の装置。 (9)変数の遅延評価をサポートする手段をさらに含ん
    でいる、請求項7記載の装置。 (10)ガーベジ・コレクションをサポートする手段を
    さらに含んでいる、請求項7記載の装置。 (11)デバッグをサポートする手段をさらに含んでい
    る、請求項7記載の装置。 (12)非同期事象をサポートする手段をさらに含んで
    いる、請求項7記載の装置。
JP2210576A 1989-08-14 1990-08-10 コンピュータ・システムを操作する方法及びコンピュータ・システム Expired - Lifetime JPH0623956B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US39372289A 1989-08-14 1989-08-14
US393722 1989-08-14

Publications (2)

Publication Number Publication Date
JPH03136140A true JPH03136140A (ja) 1991-06-10
JPH0623956B2 JPH0623956B2 (ja) 1994-03-30

Family

ID=23555975

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2210576A Expired - Lifetime JPH0623956B2 (ja) 1989-08-14 1990-08-10 コンピュータ・システムを操作する方法及びコンピュータ・システム

Country Status (3)

Country Link
US (1) US5396632A (ja)
EP (1) EP0414651A1 (ja)
JP (1) JPH0623956B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008503833A (ja) * 2004-06-22 2008-02-07 ゼネラル・エレクトリック・カンパニイ 並列通信バスに連結された装置内で割込みメッセージを待ち行列に入れるためのコンピュータシステム及び方法

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5590332A (en) * 1995-01-13 1996-12-31 Baker; Henry G. Garbage collection, tail recursion and first-class continuations in stack-oriented languages
US5832492A (en) * 1995-09-05 1998-11-03 Compaq Computer Corporation Method of scheduling interrupts to the linked lists of transfer descriptors scheduled at intervals on a serial bus
DE19535546B4 (de) * 1995-09-25 2004-04-08 Siemens Ag Verfahren zum Betreiben eines durch ein Realzeit-Betriebssystem gesteuerten Realzeit-Computersystems
US6701516B1 (en) 1998-05-21 2004-03-02 Qifang Li P++ software
PL363432A1 (en) * 2001-01-31 2004-11-15 International Business Machines Corporation Method and apparatus for transferring interrupts from a peripheral device to a host computer system
US9811484B1 (en) * 2014-06-30 2017-11-07 Altera Corporation Methods and apparatus for rapid interrupt lookups

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS5941064A (ja) * 1982-08-31 1984-03-07 Nec Corp プロログ処理装置
US4783752A (en) * 1986-03-06 1988-11-08 Teknowledge, Inc. Knowledge based processor for application programs using conventional data processing capabilities
US4989132A (en) * 1988-10-24 1991-01-29 Eastman Kodak Company Object-oriented, logic, and database programming tool with garbage collection
US4970657A (en) * 1989-01-06 1990-11-13 U.S. Advanced Technologies, N.V. Expert knowledge system development tool
US4970658A (en) * 1989-02-16 1990-11-13 Tesseract Corporation Knowledge engineering tool
US5274821A (en) * 1989-08-14 1993-12-28 International Business Machines Corporation Communication between prolog and an external process

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008503833A (ja) * 2004-06-22 2008-02-07 ゼネラル・エレクトリック・カンパニイ 並列通信バスに連結された装置内で割込みメッセージを待ち行列に入れるためのコンピュータシステム及び方法

Also Published As

Publication number Publication date
EP0414651A1 (en) 1991-02-27
US5396632A (en) 1995-03-07
JPH0623956B2 (ja) 1994-03-30

Similar Documents

Publication Publication Date Title
US5274821A (en) Communication between prolog and an external process
Diaz et al. Design and implementation of the gnu prolog system
Appel et al. A standard ML compiler
US5956512A (en) Computer program debugging in the presence of compiler synthesized variables
US6149318A (en) Link-time and run-time error detection, and program instrumentation
KR960003138B1 (ko) 다중 언어 최적화 컴파일러의 유도 수식 분석
US5274820A (en) Method and system for eliminating operation codes from intermediate prolog instructions
Ugawa et al. eJSTK: Building JavaScript virtual machines with customized datatypes for embedded systems
Doolin et al. JLAPACK–compiling LAPACK Fortran to Java
Smith et al. POPLOG's Two-level virtual machine support for interactive languages
JPH03136140A (ja) コンピュータ・システムを操作する方法及びコンピュータ・システム
JPH03136137A (ja) オブジェクト・ワード処理方法及び装置
Gassanenko Context-oriented programming
JPH03136138A (ja) プロローグと外部プロセスの間の通信方法及び装置
JPH03136139A (ja) コンピュータ・システムおよびその動作方法
Hardin et al. Concepts and semantics of programming languages 1: a semantical approach with OCaml and Python
Mogensen Intermediate-Code Generation
Behera Principle Of Programming Language
Acharya Principle Of Programming Language
Royko The Dynamic Mapping Architecture
Coelho et al. PIPS: Extension of the Internal Representation for C
Jipping et al. The Imperative Language Paradigm.
Beevi et al. MetaJC++: A flexible and automatic program transformation technique using meta framework
Christensen Methods for handling exceptions in object-oriented programming languages
Àµ½ ½Á et al. ¹® º» ¼º» µ «5® ³½ «eµ²½µf¶¥¥ § «5º» º¿ ¾