2016-11-01 2 views
1

Im Prinzip habe ich eine Liste von Fakten wie folgt aus:Prolog - einen Maximalwert von Satz aus einer Liste von Fakten bekommen (mit Prädikat gescheitert)

set(x,2). 
set(x,7). 
set(x,10). 
set(x,4). 

Ich brauche das maximale Element dieses Satzes zu finden.

Eingang: maximum(x, MaxElement)

Ausgang: MaxElement = 10.

Nun ist die Idee an sich ist nicht kompliziert und ich sah mich viele Beispiele online. Das Problem ist, dass ich das Prädikat fail verwenden muss.

Hier war meine Idee (was nicht funktioniert):

maximum(Set, Element1):- 
    set(Set,Element1), 
    set(Set,Element2), 
    Element2 > Element1, 
    fail. 

maximum(Set, Element) :- set(Set, Element). 

Die Idee dabei war, dass die erste Regel für jedes Element sieht, das ein größeres Element in der Menge hat. Wenn es ein größeres Element gibt, versagen wir und hören auf.

Dann würden wir im Idealfall für die größte (10) nicht scheitern und zur nächsten Regel übergehen, die nur sieht, dass sie in der Menge ist und wahr zurückgibt.

Aber so geht es immer noch zur zweiten Regel mit jeder Nummer. Auch Schnitt scheint nicht zu funktionieren.

Irgendwelche Ideen Leute?

+0

Siehe auch [diese Frage] (http://stackoverflow.com/questions/27317069/Collect-all-Minimum-Lösungen-from-a-Prädikat) und die Antworten darauf. –

Antwort

1

Sie könnten einfach forall/2 Prädikat verwenden jedes Element wie zu prüfen:

maximum(Set, Element1):- 
    set(Set,Element1), 
    forall(set(Set,Y),(Y>Element1->fail;true)). 

Jetzt Abfrage:

?- maximum(x,X). 
X = 10 ; 
false. 
+0

Das funktioniert, danke. Ich denke ich verstehe auch warum. Aus Neugier, gibt es trotzdem meine originelle Idee (wenn Sie irgendwelche Ideen haben)? – PadaKatel

+0

Ich habe über Ihre Idee nachgedacht, aber ich sehe zwei Probleme, die zuerst mit fail am Ende Ihr Prädikat nie zum Erfolg führen und sagen Sie, Sie finden einen Weg, um dann erfolgreich zu sein: set (Set, Element1), set (Set, Element2) wird nicht jedes Element untersuchen, so sehe ich keinen Weg. Der Grundgedanke meiner Antwort war, einen Weg zu finden, jedes Element zu untersuchen und zu erzwingen, dass es das Maximum mit Hilfe des Fehlerprädikats zurückgibt. – coder

+1

Es wäre genug zu schreiben: 'set (Set, Max), \ + (set (_, Y), Y> Max) '. Siehe auch [hier] (http://stackoverflow.com/a/32881005/1812457). –

Verwandte Themen