最初の用語の問題:いかなる状況においても、警備員と呼ばれることも、呼ばれることもありfreeze/2
ませwhen/2
ん。dif/2
ガードは、CHRなどの拡張機能、またはGHC(日本語のリンク)やその他の並行論理プログラミング言語などの関連言語で表示されます。あなたも(特定の制限の下で)フォームの句を検討するかもしれません
ヘッド:-
ガード, !,
..。
ガードとカットを含む句は、この場合はむしろコミットと呼ばれます。ただし、上記のプリミティブには適用されません。警備員は、1975年のダイクストラのGuardedCommandLanguageに触発されています。
freeze(X, Goal)
(元々はと呼ばれgeler
ていました)はと同じでwhen(nonvar(X), Goal)
あり、どちらも宣言的に。と同等Goal
です。警備員の機能とは直接の関係はありません。ただし、if-then-elseと一緒に使用すると、そのようなガードを実装できます。しかし、それはかなり異なります。
freeze/2
同様の構成は、しばらくの間、Prologの実行メカニズムを改善するための一般的な方法と見なされていました。しかし、それらは使用するのに非常に壊れやすいことが判明しました。多くの場合、彼らはあまりにも保守的だったので、不必要に目標を遅らせました。つまり、ほとんどすべての興味深いクエリは、以下のクエリのように「ひどい」答えを生成しました。また、終了プログラムと非終了プログラムの境界線は、今でははるかに複雑になっています。終了する純粋な単調なPrologプログラムの場合、プログラムに終了目標を追加すると、プログラム全体の終了が保持されます。ただし、freeze/2
これはもはや当てはまりません。次に、概念的な観点から、freeze/2
システムのトップレベルによって十分にサポートされていませんでした。成功/回答と解決策の違いを理解するために重要な包括的な方法で遅延目標を示したシステム(SICStusなど)はごくわずかでした。目標が遅れると、Prologは次のような解決策のない答えを生成する可能性があります。
?-freeze(X、X = 1)、freeze(X、X = 2)。
フリーズ(X、X = 1)、
フリーズ(X、X = 2)。
のもう1つの問題freeze/2
は、終了条件を決定するのがはるかに難しいことでした。そのfreeze
ため、終了に関するすべての問題を解決するはずでしたが、多くの場合、新しい問題が発生しました。
freeze/2
また、ループを防ぐための特にwrtタブリングやその他の手法に関連する技術的な問題もあります。目標をfreeze(X, Y = 1)
明確に考えてください。まだバインドされていなくても、最初にバインドされるのを待っY
ています。ここで、実装は目標のテーブル化を検討する場合があります。これで、ソリューションがないか、ソリューションが1つだけになります。-goalはゴールに直接表示されなかったため 、この結果は唯一のソリューションとして保存されます。1
X
g(Y)
g(Y)
Y = 1
g/1
freeze
freeze/2
制約論理プログラミングのgotoと見なされるのは、このような理由によるものです。
もう1つの問題はdif/2
、今日、制約と見なされている問題です。および他のcoroutiningプリミティブとは対照的にfreeze/2
、制約は一貫性を管理する能力がはるかに高く、終了プロパティもはるかに優れています。これは主に、制約によって明確に定義された言語が導入され、具体的なプロパティが証明され、特定のアルゴリズムが開発され、一般的な目標が許可されないという事実によるものです。しかし、彼らにとってさえ、解決策ではない答えを得ることが可能です。CLPでの答えと成功についての詳細。