2010-10-03 18 views
8

Mam problem z uzyskaniem kodu, który zwraca unikalne odpowiedzi na moje zapytanie. Na przykład, definiowanieDuplikaty rozwiązań

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

następnie uruchomiony

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

daje wyjście:

A = a 
B = b ? ; 

A = a 
B = b ? ; 

yes. 

Jak widać oba rozwiązania są takie same. Czy istnieje sposób na uzyskanie PROLOG, aby zwrócić unikalne rozwiązania, i, e. dać wyjście:

A = a 
B = b ? ; 

yes. 
+0

+1 za prolog pytanie. Nie widzę ich tu zbyt często. –

+2

To pytanie zostało już omówione na http://stackoverflow.com/questions/724358/ – Kaarel

Odpowiedz

2

Można również użyć

| ?- setof(sol(A,B),morestuff([A,A],[A,B],[a,b]),L). 
L = [sol(a,b)] ? 
yes 
1

Jedynym sposobem wiem jest użycie findall/3 wygenerować wszystkie wyniki, a następnie usunąć duplikaty siebie. (Pomijając najbardziej oczywiste rozwiązanie - uniknąć algorytmy overgenerate, ale wtedy, w wielu przypadkach nie można tego zrobić.)