Immer der kleinste Wert einer Liste
Ich bin auf der Suche nach den Minimalwert einer Liste (als Lernerfahrung, also ohne min
).
Mein Ansatz ist der folgende:
minimo([X], X).
minimo([X,Y|Tail], N):-
(X > Y, minimo([Y,Tail], Y));
(X <= Y, minimo([X,Tail], X)).
Dies gibt mir die folgende Fehlermeldung:
Syntax Fehler: Operator erwartet
Also meine Fragen sind:
- Was die Ursache der syntax-Fehler?
- Ich werde versuchen, es selbst einmal zu, dass ist fest, wenn es tatsächlich gibt den richtigen Wert zurück, aber wäre das tatsächlich der richtige Ansatz?
Vielen Dank im Voraus.
InformationsquelleAutor Trufa | 2011-11-08
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt mehrere bugs in Ihrem Programm:
wie bereits von Joe Lehmann, es gibt keine
'<='/2
. Es muss'=<'/2
.beim Aufruf
minimo/2
rekursiv erstellen Sie die Listen falsch. Statt[Y,Tail]
verwenden[Y|Tail]
. Andernfalls erhalten Sie eine Liste, die eine Liste als zweites element.binden Sie das zweite argument des rekursiven Aufrufs von
minimo/2
zuY
oderX
. Stattdessen muss es gebunden werden, umN
. Ansonsten, IhrN
wird nie instanziiert werden.Können Sie verbessern Ihr Programm weiter, indem Schnitte oder mit if-then-else (
'->'
+;
):Zusätzlich zu den anderen Versionen schon gepostet, sollten auch eine version ohne wenn-dann-sonst, und mit einem mehr beschreibenden Namen für die relation (die sich eine Liste auf minimum):
Solch ein Muster aufgerufen wird, eine Falten (von Links), und wir können schreiben es gleichbedeutend mit `foldl/4:
Beispiel-query:
Beachten Sie aber, dass dies nicht eine echte Beziehung und kann nicht verwendet werden, die in alle Richtungen durch die Verwendung von low-level-Arithmetik. Zum Beispiel, wenn wir versuchen, es in der anderen Richtung erhalten wir:
Machen es zu einem wahren Lösung, verwenden Sie Einschränkungen wie clpfd und clpq. Zum Beispiel, für eine Lösung über Ganzzahlen:
Dieser funktioniert in alle Richtungen:
Den syntax-Fehler ist, weil weniger oder gleich im Prolog ist =<, nicht <=.
Ich denke, dass der Ansatz funktionieren wird, aber man sollte wirklich vermeiden, in einer Klausel. Nur es aufgeteilt in zwei Klauseln.
Ich denke auch, dass Sie etwas tun wollen gerne [X|Tail] in der Rekursion statt [X,Tail]
=<
scheinen, um es zu beheben, danke. Aber jetzt habe ich diese Fehlermeldung:ERROR: >/2: Arithmetic:
[]/0' ist keine Funktion`und wenn ich es teilen in zwei, erhalte ich:- minimo([1,2,3],X). ERROR: >/2: Arithmetic: `[]/0' is not a function Exception: (8) minimo([[3], []], [3]) ?
Danke! +1