8

クエリに対して一意の回答を返すコードを取得しようとすると問題が発生します。たとえば、

stuff(A,B,C) :- A=C ; B=C.
morestuff([],[],[]).
morestuff([A|AA],[B|BB],[C|CC]) :- stuff(A,B,C), morestuff(AA,BB,CC).

その後、実行中

morestuff([A,A],[A,B],[a,b]).

出力を与えます:

A = a
B = b ? ;

A = a
B = b ? ;

yes.

ご覧のとおり、2 つのソリューションは同じです。PROLOGに一意のソリューションを返す方法はありますか? 出力を与える:

A = a
B = b ? ;

yes.
4

2 に答える 2

2

使用することもできます

| ?- setof(sol(A,B),morestuff([A,A],[A,B],[a,b]),L).
L = [sol(a,b)] ? 
yes
于 2010-10-06T19:25:30.870 に答える
1

私が知っている唯一の方法は、使用findall/3してすべての結果を生成し、重複を自分で削除することです。(最も明白な解決策を除けば、過度に生成するアルゴリズムは避けてください。ただし、多くの場合、それはできません。)

于 2010-10-03T15:46:56.333 に答える