Дублирующие решения - PullRequest
       17

Дублирующие решения

8 голосов
/ 03 октября 2010

У меня проблема с попыткой получить код, который возвращает уникальные ответы на мой запрос. Например, определение

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.

Как видите, два решения одинаковы. Есть ли способ просто заставить PROLOG возвращать уникальные решения, т.е. дать вывод:

A = a
B = b ? ;

yes.

Ответы [ 2 ]

2 голосов
/ 06 октября 2010

Вы также можете использовать

| ?- setof(sol(A,B),morestuff([A,A],[A,B],[a,b]),L).
L = [sol(a,b)] ? 
yes
1 голос
/ 03 октября 2010

Единственный известный мне способ - использовать findall/3 для генерации всех результатов, а затем самостоятельно удалять дубликаты. (За исключением наиболее очевидного решения - избегайте чрезмерных алгоритмов; но во многих случаях вы не можете этого сделать.)

...