3

置換SとリストXsがあり、 Xsで発生する各変数はSでも発生するとします。リストS(Xs)、つまりリストXsに置換Sを適用して得られるリストを見つけるにはどうすればよいでしょうか。

より具体的には、次のような一連の述語と DCG ルールがあります。

pat(P)   --> seg(_), P, seg(_).
seg(X,Y,Z) :- append(X,Z,Y).

リストに対してパターンPと変数を一致させようとすると、置換Sが返されます。

?- pat([a,X,b,Y],[d,a,c,b,e,d],[]).
   X = c,
   Y = e

置換S = {X = c, Y = e}を変数XおよびYを持つリストXsに適用し、置換が行われたリストを受け取りたいのですが、問題にアプローチする最善の方法がわかりません.

Haskell でこの問題に取り組んでいた場合、変数から値への有限マップを作成してから、置換を実行します。同等のアプローチは、変数と値のペアの DCG ルールでリストを作成し、マップを使用して目的のリストを見つけることです。ただし、これは適切なアプローチではありません。

4

1 に答える 1

1

置換は具体化されていない (Prolog オブジェクトではない) ため、リストを変数にバインドして、統合にその作業を任せることができます。

?- Xs = [a,X,b,Y], pat(Xs,[d,a,c,b,e,d],[]).
Xs = [a, c, b, e],
X = c,
Y = e .

編集:置換後に元のリストを保持したい場合は、次を使用しますcopy_term

?- Xs = [a,X,b,Y], copy_term(Xs,Ys), pat(Xs,[d,a,c,b,e,d],[]).
Xs = [a, c, b, e],
X = c,
Y = e,
Ys = [a, _G118, b, _G124] .
于 2011-06-06T07:55:04.983 に答える