2011-01-13 4 views
0

Arbeiten mit SWI-Prolog. Ich habe eine Liste der Reihen sagen:Erhalten Sie Wiederholungsantworten beim Vergleich von Fakten in Prolog

rank(London, 3.5). 
rank(New York, 3.5). 
rank(Seattle, 2.3). 

Und ich versuche, meinen Kopf zu bekommen um eine Regel zu machen, die Drucke/Tatsachen mit dem gleichen Rang zurück. Also in diesem Fall würde es mit London & New York zurückkommen.

Hier ist, was ich bisher gefunden habe, das einzige Problem ist die Duplikate, die ich damit bekomme (obwohl sie mit der aktuellen Regel vollkommen Sinn machen). Würde die Rekursion irgendwie helfen?

equal_rank(_):- 
    rank(U1, R1), 
    rank(U2, R2), 
    U1 \== U2, 
    R1 == R2, 
    print(R1), print(': '), print(U1), print(', '), print(U2), nl, 
    fail. 

würde der Ausgang sein:

3.5: London, New York 
3.5: New York, London 

Ich kann einfach nicht herausfinden, wie diese zweite Linie zu stoppen.

+2

Ein kleiner Kommentar zu den vielen unbequemen "print/1" -Aufrufen: Verwenden Sie stattdessen format/2: Format ("~ w: ~ w, ~ w \ n", [R1, U1, U2]) gibt Ihnen genau das gleiche Ergebnis und ist viel einfacher zu lesen und zu schreiben. – mat

Antwort

1

Ein einfacher Ansatz wäre, den Ungleich-Test zwischen U1 und U2 mit einem weniger-als-Test zu ersetzen:

U1 @< U2. 

diese Weise ein gegebenes Paar nur einmal erscheint.

+0

Arbeitete ein Vergnügen, keine doppelten Ergebnisse. Vielen Dank. –

1

Ich würde wahrscheinlich für etwas gehen, das bagof/3 verwendet, aber ich weiß nicht, ob das der bevorzugte oder geeignetere Ansatz für das Problem ist, das Sie zur Hand haben. Mit den Fakten, die Sie definiert, scheint folgendes Ziel, das Ergebnis, das Sie ausgeben wollen:

| ?- bagof(C, rank(C, X), Cs), length(Cs, L), L > 1. 

Cs = [london,'new york'] 
L = 2 
X = 3.5 

yes 

Es einiges an Arbeit auf die Formatierung muss, natürlich; Die Idee, Ergebnisse in einer Liste zu sammeln, kann für Sie nützlich sein oder auch nicht. Oh, und nebenbei, ich war mir nicht sicher, ob Stadtnamen Variablen sein müssten, so wie Sie sehen können, habe ich rank/2 Fakten behauptet, die reine Atome verwenden.

Für ein wenig zusätzliche Informationen auf bagof/3, können Sie die online SWI-Prolog manual page darüber konsultieren.

+0

Obwohl ich sicher bin, dass das funktioniert hätte, fügt es mehr Komplexität hinzu als die andere Antwort, die ich vermeiden möchte. Danke trotzdem. –