8

それらは存在しますか?それらはどのように実装されていますか?

SWI-Prolog(、など)のcoroutining述語には、ガード機能あります。それらは、好ましいPrologプログラミングスタイルにどのように適合しますか?freezewhendif

私は論理プログラミング(Prologとまったく)に非常に慣れておらず、それが純粋に宣言型ではなく、非常に単純な場合でも手続き上の考慮が必要であるという事実に多少混乱しています(またはの使用に関するこの質問を\==dif参照してください)。重要なものが欠けていますか?

4

3 に答える 3

5

最初の用語の問題:いかなる状況においても、警備員と呼ばれることも、呼ばれることもあり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はゴールに直接表示されなかったため 、この結果は唯一のソリューションとして保存されます。1Xg(Y)g(Y)Y = 1g/1freeze

freeze/2制約論理プログラミングのgotoと見なされるのは、このような理由によるものです。

もう1つの問題はdif/2、今日、制約と見なされている問題です。および他のcoroutiningプリミティブとは対照的にfreeze/2、制約は一貫性を管理する能力がはるかに高く、終了プロパティもはるかに優れています。これは主に、制約によって明確に定義された言語が導入され、具体的なプロパティが証明され、特定のアルゴリズムが開発され、一般的な目標が許可されないという事実によるものです。しかし、彼らにとってさえ、解決策ではない答えを得ることが可能です。CLPでの答えと成功についての詳細。

于 2012-12-08T20:39:26.507 に答える
4

freeze/2とwhen/2は、論理プログラミングの「後藤」のようなものです。それらは純粋ではなく、可換性などではありません。

一方、dif / 2は完全に純粋で宣言型、単調、可換性などです。dif/ 2は宣言型の述語であり、引数が異なる場合に保持されます。「好ましいPrologプログラミングスタイル」について:何が成り立つかを述べてください。2つの一般的な用語が異なるという制約を表現したい場合は、dif/2がまさにこれを示しています。

Prologの純粋な宣言型サブセットでプログラミングしないが、可換ではない不純な述語などを使用する場合、通常、手続き上の考慮事項が最も必要です。最近のPrologシステムでは、純粋で宣言型のサブセットを残す理由はほとんどありません。

于 2012-12-07T09:23:29.613 に答える
0

CCを説明するEvanTickによる論文があります。

非公式には、プロシージャの呼び出しは、ヘッド引数を照合し(パッシブ統合)、ガードの目標を達成することにより、句にコミットします。目標がプロシージャ内の複数の句にコミットできる場合、それらの1つに非決定論的にコミットします(他の候補は破棄されます)。節の先頭とガードに現れる構造は、目標の対応する引数が十分にインスタンス化されていない場合、実行の中断を引き起こします。一時停止された呼び出しに関連付けられた変数が十分にインスタンス化されたときに、一時停止された呼び出しを後で再開できます。


並行論理プログラミング言語の進化EvanTick - 1995https:
//core.ac.uk/download/pdf/82787481.pdf

ですから、when / 2の魔法を使えば、コミットされた選択コードを通常のPrologに書き直すことができると思います。アプローチは次のようになります。同じ述部のコミットされた選択ルールのセットの場合:

H1 :- G1 | B1.
...
H2 :- Gn | Bn.

これは次のように書き直すことができます。ここで、Hi'とGi'はパッシブユニファイを実装する必要があります。たとえば、ISO正誤表subsumes_term/2を使用します。

H1' :- G1', !, B1.
..
H1' :- Gn', !, Bn.
H :- term_variables(H, L), when_nonvar(L, H).

上記の翻訳は、CHRが候補者を破棄しないため、CHRでは機能しません。

于 2018-11-04T02:20:27.477 に答える