Loading article…
1983年、David HD Warrenは、メモリアーキテクチャと命令セットからなるProlog実行用の抽象マシンを設計した。[ 1 ] [ 2 ] [ 3 ]この設計はWarren Abstract Machine(WAM )として知られるようになり、 Prologコンパイラの事実上の標準ターゲットとなった。
Prologコードをより低レベルのWAMコードにコンパイルする目的は、Prologプログラムのその後の解釈をより効率的にすることです。Prologコードは比較的容易にWAM命令に変換でき、WAM命令はより効率的に解釈できます。また、その後のコードの改善やネイティブコードへのコンパイルも、より低レベルの表現の方が容易に行える場合が多いです。
効率的なPrologプログラムを作成するには、WAM(Webアクセスメカニズム)の基本的な仕組みを理解しておくと有利です。WAMの最も重要な概念には、最初の引数のインデックス付けと選択ポイントとの関係、末尾呼び出しの最適化、および障害発生時のメモリ解放などがあります。
WAMには以下のメモリ領域があります。
以下はPrologコードの一部です。
女の子(サリー)。女の子(ジェーン)。男の子(B ):- \+女の子(B )。WAMベースのPrologコンパイラは、これを以下のようなWAM命令にコンパイルします。
述語( girl / 1 ) : switch_on_term ( 2 , 1 , fail , fail , fail ), label ( 1 ) : switch_on_atom ([( sally , 3 ),( jane , 5 )]) label ( 2 ) : try_me_else ( 4 ) label ( 3 ) : get_atom ( sally , 0 ) proceed label ( 4 ) : trust_me_else_fail label ( 5 ) : get_atom ( jane , 0 ) proceed述語( boy / 1 ) : get_variable ( x ( 1 ), 0 ) put_structure ( girl / 1 , 0 ) unify_local_value ( x ( 1 )) execute (( \+ ) / 1 )])このコードの重要な特徴は、述語が呼び出されるさまざまなモードに対応できることです。引数は変数、基底項、または部分的にインスタンス化された項のいずれかである可能性があります。「switch」命令は、これらの異なるケースを処理します。