2010-10-03 15 views
8

Ich habe ein Problem versucht, Code zu erhalten, der eindeutige Antworten auf meine Abfrage zurückgibt. Zum Beispiel gibtDoppelte Lösungen

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

definieren dann

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

läuft die Ausgabe:

A = a 
B = b ? ; 

A = a 
B = b ? ; 

yes. 

Wie Sie die beiden Lösungen sind gleich sehen können. Gibt es eine Möglichkeit, PROLOG einfach dazu zu bringen, die einzigartigen Lösungen zurückzugeben, d. gibt die Ausgabe:

A = a 
B = b ? ; 

yes. 
+0

+1 für eine Prolog Frage verwenden können. Ich sehe sie hier nicht allzu oft. –

+2

Diese Frage wurde bereits in http://stackoverflow.com/questions/724358/ diskutiert – Kaarel

Antwort

2

Sie auch

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

Die einzige Möglichkeit, die ich kenne, ist findall/3 zu verwenden, um alle Ergebnisse zu erzeugen, dann Duplikate entfernen sie. (Barring die naheliegendste Lösung - vermeiden Algorithmen, die overgenerate, dann aber in vielen Fällen kann man das nicht tun.)