Finden der max in einer Liste - Prolog
Ich wurde nur eingeführt, um Prolog und bin versucht zu schreiben, ein Prädikat, findet die Max-Wertes einer Liste von ganzen zahlen. Ich muss eins schreiben, der vergleicht von Anfang an und die andere, vergleicht am Ende. Bisher habe ich:
max2([],R).
max2([X|Xs], R):- X > R, max2(Xs, X).
max2([X|Xs], R):- X <= R, max2(Xs, R).
Merke ich, dass R noch nicht eingeleitet worden, noch, so es ist nicht in der Lage, einen Vergleich. Brauche ich 3 Argumente, um diese abzuschließen?
InformationsquelleAutor user2796815 | 2013-11-05
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
anderen Weg
max2([],R).
erste Abfrage:-max2([],R)
matchmax2([],R)
Aber es ist nicht möglich zu bestimmen, dieR
.Danke. Dies wäre als Vergleich vom Anfang oder Ende? Wie würden Sie gehen über das tun es in die andere Richtung?
Ich werde verglichen werden, die von Anfang an auf diese Weise.
Grund für den downvote?
InformationsquelleAutor BLUEPIXY
Ignorieren die Hausaufgaben Einschränkungen etwa ab dem Anfang oder am Ende, die richtige Art und Weise zu implementieren, die ein Prädikat, erhält das numerische maximum ist wie folgt:
InformationsquelleAutor salva
Als alternative zu BLUEPIXY' Antwort, SWI-Prolog ist ein builtin-Prädikat,
max_list/2
, das macht die Suche für Sie. Sie könnten auch erwägen, eine langsamere Methode, IMO nützlich, zu gewinnen Vertrautheit mit mehr gelieferten und nondeterminism (und dann backtracking):Erträge
Bearbeiten
Beachten Sie nicht streng müssen drei Argumente, sondern nur über ordnungsgemäß instanziiert Variablen der Vergleich durchzuführen. Dann können Sie 'reverse' die flow-Werte:
wieder, das ist langsamer, als die drei Argumente Schleifen, schlug im anderen Antworten, weil es zu besiegen 'tail recursion optimization'. Auch spielt es nur finden eine von maxima:
InformationsquelleAutor CapelliC
Hier ist, wie es mit lambda-Ausdrücke und meta-Prädikat
foldl/4
, und, Optional, clpfd:Lasst uns laufen einige Abfragen!
Was ist, wenn die Liste leer ist?
Endlich, einige Abfragen zeigen Unterschiede zwischen
numbers_max/2
undfdvars_max/2
:InformationsquelleAutor repeat
Einen sehr einfachen Ansatz, bei dem von Anfang an) ist die folgende:
Als Sie sagte, Sie muss die Variablen instanziiert, wenn Sie auswerten wollen einen arithmetischen Ausdruck. Um dieses Problem zu lösen, müssen Sie zuerst, um den rekursiven Aufruf, und dann vergleichen Sie.
Hoffe, es hilft!
InformationsquelleAutor toioski
InformationsquelleAutor Tanusree Roy
InformationsquelleAutor Harsh Mehta