2016-07-01 3 views
1

Ich brauche eine Liste von Absendern, indem Prolog-Regel zu zeigen, wenn sie in absteigender Reihenfolge ihrer Netzwerkgebühr für das Senden einer Nachricht sind. Wenn dies der Fall ist, geben Sie true zurück, andernfalls geben Sie false zurück.Holen Sie sich die absteigende Reihenfolge der Kosten durch Schreiben des Namens der Absender in Abfrage

So habe ich unten Regel erstellt, die mir die Nummer in absteigender Reihenfolge zeigt, aber nehmen Sie an, die Zahlen sind die Kosten der Nachrichten, aber ich weiß nicht, wie kann ich Liste der Absender nach ihrer absteigenden Reihenfolge der Kosten .

nehmen wir an 8,4,3,2 ist die Kosten und durch die folgende Regel zeigt es mir die richtige absteigende Reihenfolge, wenn ich Frage wie diese :-?message([8,4,3,2]) schreibe.

message(8). 
message(4). 
message(3). 
message(2). 

Die Regel i für diese Daten erstellt ist

message([_]):-!. 
message([_]):-!. 
message([A,B|T]) :-A >= B,!,message([B|T]). 

Meine ursprüngliche Datenbank sieht wie folgt aus. Jetzt wird meine Abfrage wie :-?message([sonny,robert,fred,nayna]).

sein. Dies sollte wahr, da sie in absteigender Reihenfolge ihrer Kosten sind.

%message(Sender, Receiver, Date, Cost_of_sending_a_message) 
message(sonny,robert,'2012-05-12',8). 
message(robert,sarah,'2012-05-12',5). 
message(julie,mary,'2012-05-12',6). 
message(fred,nayna,'2012-05-13',6). 
message(fred,daniel,'2012-05-14',6). 
message(nayna,lucia,'2012-05-15',3). 

Könnten Sie mir bitte sagen, wo ich falsch mache, weil ich durch das Schreiben die Namen von Absendern in Abfrage die absteigende Reihenfolge der Kosten zu bekommen?

+0

@CommuSoft könnten Sie mir bitte Hinweise geben? Ich habe gesehen, dass du so viele Fragen bezüglich Prolog beantwortet hast. –

Antwort

2

order_by/2 von SWI-Prolog-Bibliothek (solution_sequences) können Ihnen helfen:

Beispiel Nutzung:

?- order_by([desc(C)], message(F,S,D,C)). 
C = 8, 
F = sonny, 
S = robert, 
D = '2012-05-12' ; 
C = 6, 
F = julie, 
S = mary, 
D = '2012-05-12' 
... 

bearbeiten:

?- findall(C, (order_by([desc(C)], message(F,S,D,C))), L). 

Auch Bibliothek (Aggregat), oder das klassische Set/3 bietet mögliche Lösungen, aber das Schreiben von Hand wäre der bessere Weg, um Prolog zu lernen. Es hängt davon ab, was Sie suchen ...

+0

Das braucht ';' eingegeben werden, um jeden Wert zu erhalten. Wie können wir alle Werte auf einmal erhalten? Können wir das mit "finden" kombinieren? – rnso

+0

Willkommen bei (SWI) Prolog, ich hoffe, Sie genießen Ihren Aufenthalt. Siehe meine Edit ... – CapelliC

+0

Es produziert nur L = [8, 6, 6, 6, 5, 3] .. Wie können alle Datensätze (F, S, D, C) in der Reihenfolge von C aufgeführt werden? – rnso

Verwandte Themen