Loading article…
1983年、David HD Warrenは、メモリアーキテクチャと命令セットで構成されるProlog実行用の抽象マシンを設計しました。[1] [2] [3]この設計はWarren Abstract Machine (WAM)として知られるようになり、 Prologコンパイラの事実上の標準ターゲットになりました。
目的
Prolog コードをより低レベルの WAM コードにコンパイルする目的は、その後の Prolog プログラムの解釈をより効率的にすることです。Prolog コードは、より効率的に解釈できる WAM 命令に変換するのが比較的簡単です。また、その後のコード改善やネイティブ コードへのコンパイルは、より低レベルの表現で行う方が簡単な場合が多くあります。
効率的な Prolog プログラムを書くには、WAM の仕組みを基本的に理解しておくと有利です。WAM の最も重要な概念には、最初の引数のインデックスと選択ポイントとの関係、末尾呼び出しの最適化、および失敗時のメモリの再利用などがあります。
メモリ領域
WAM には次のメモリ領域があります。
- 複合項を格納するために使用されるグローバルスタックまたはヒープ
- 環境フレームと選択ポイントのローカルスタック
- バックトラック時にどの変数バインディングを解除する必要があるかを記録するための証跡
例
以下は Prolog コードの一部です。
女の子(サリー)。
女の子(ジェーン)。
男の子( B ) :- \+ 女の子( B )。
WAM ベースの Prolog コンパイラは、これを次のような WAM 命令にコンパイルします。
述語(女の子/ 1 ) :
switch_on_term ( 2 、1 、fail 、fail 、fail )、
ラベル( 1 ) : switch_on_atom ( [(サリー、3 )、(ジェーン、5 )])
ラベル( 2 ) : try_me_else ( 4 )
ラベル( 3 ) : get_atom (サリー、0 )
続行
ラベル( 4 ) : trust_me_else_fail
ラベル( 5 ) : get_atom (ジェーン、0 )
続行
述語(男の子/ 1 ) :
get_variable ( x ( 1 ), 0 )
put_structure (女の子/ 1 , 0 )
unify_local_value ( x ( 1 ))
実行( ( \+ ) / 1 )])
このコードの重要な特徴は、述語が呼び出されるさまざまなモードに対応できることです。引数は、変数、基底項、または部分的にインスタンス化された項である可能性があります。「switch」命令は、さまざまなケースを処理します。
参考文献
- ^ David HD Warren (1983年10月). 抽象Prolog命令セット(PDF) . 米国カリフォルニア州メンロパーク:SRIインターナショナルの人工知能センター。 2022年6月19日時点のオリジナルよりアーカイブ(PDF) 。
- ^ Hassan Aït-Kaci (1999 年 2 月 18 日). Warren の抽象マシン: チュートリアルの再構築(PDF)。2003 年 2 月 13 日時点のオリジナルよりアーカイブ。
{{cite book}}: CS1 メンテナンス: 不適切 URL (リンク) - ^ Hassan Aït-Kaci. 「Warren's Abstract Machine: A Tutorial Reconstruction; the book, errata and slides」. 2022年1月19日時点のオリジナルよりアーカイブ。2011年3月7日閲覧。
