Prolog, finden mindestens in einer Liste
kurz: Wie finden Sie min Wert in einer Liste? (vielen Dank für die Beratung kaarel)
lange Geschichte:
Habe ich einen gewichteten Graphen in Amzis prolog und 2 Knoten, ich bin in der Lage, zum abrufen einer Liste von Pfaden. Ich muss jedoch finden Sie den minimalen Wert in diesem Pfad aber nicht in der Lage bin zum Durchlaufen der Liste, um dies zu tun. Kann ich bitte suchen Sie Ihren Rat auf wie um zu bestimmen, die minimalen Wert in der Liste?
mein code sieht derzeit ungefähr so aus:
Bogen(1,2). arc(2,3). arc(3,4). arc(3,5). arc(3,6). arc(2,5). arc(5,6). arc(2,6). Pfad(X,Z,A) :- (arc(X,Y),Pfad(Y,Z,A1),A is A1+1;arc(X,Z), A ist 1).
so, "keying" - Funktion findall(Z), Pfad(2,6,Z),L).' im Hörer ermöglicht es mir, Sie zu erreichen, Sie auf eine Liste [3,2,2,1].
Ich brauche zum abrufen der Mindestwert von hier aus und multiplizieren Sie mit einem Betrag. Kann mir bitte jemand raten, wie das abrufen der minimal-Wert? danke!
InformationsquelleAutor Roy | 2010-10-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es üblich, eine so genannte "verzögerte argument" zum Wohle von first-argument-indexing:
Dieses Muster heißt ein Falten (von Links), und
foldl/4
zur Verfügung, das in den letzten SWI-Versionen, können Sie dies schreiben als:Aber feststellen, dass diese nicht verwendet werden, in alle Richtungen, zum Beispiel:
Wenn Sie die Argumentation über Ganzzahlen, wie scheint der Fall in deinem Beispiel, daher empfehle ich Sie verwenden CLP(FD) constraints natürlich verallgemeinern das Prädikat. Statt
(is)/2
einfach(#=)/2
und profitieren Sie von einer mehr deklarative Lösung:Dies kann verwendet werden, als eine echte Beziehung, die funktioniert in alle Richtungen, zum Beispiel:
nachgeben:
InformationsquelleAutor mat
Das sieht mir Recht sein (von hier aus).
Es ist schon Jahre da ich gedacht habe, im Prolog, aber ich vermute, @Matte hat die Lesbarkeit Rand, an was ich gepostet...
Das problem mit deiner Lösung ist auch, dass Sie vergleichen Sie H und K zweimal, die min-Funktion wahrscheinlich nicht tun...
InformationsquelleAutor andersoj
SWI-Prolog bietet Bibliothek(aggregieren). Generalisierte und Leistung Weise.
InformationsquelleAutor CapelliC
Lösung ohne "ist".
min([1,1],X).
erfolgreich sein sollte, aber es funktioniert nicht.Vielen Dank, jetzt funktioniert es.
InformationsquelleAutor Daniel Libanori
Die zweite Regel gilt die Rekursion, in Englisch "erhalten Sie den kleinsten Wert in den Schwanz, und die Mindestanforderungen festzulegen, um die kleineren und den Kopf". Die erste Regel ist die Basis-Fall", der Minimalwert einer Liste mit einer, ist nur der Wert in der Liste".
Test:
Können Sie es verwenden, um zu überprüfen, ein Wert in dem ersten Fall, oder Sie können prolog berechnen Sie den Wert des zweiten Fall.
InformationsquelleAutor Joe Flynn
SWI-Prolog hat
min_list/2
:Seine definition ist in
library/lists.pl
InformationsquelleAutor Kaarel
Ähnlich andersoj, aber mit einem Schnitt statt Doppel-Vergleich:
InformationsquelleAutor Adam Stelmaszczyk
danke für die Antworten. nützlich gewesen. Ich experimentierte auch furthur und entwickelt diese Antwort:
Nicht sicher, wie Sie zu beurteilen, wie gut eine Antwort dies ist algorithmisch noch nicht, aber es funktioniert! würde schätzen jedes feedback dennoch. danke!
InformationsquelleAutor Roy
Tätig werden sollte.
InformationsquelleAutor Js Lim
Das funktioniert und scheint halbwegs effizient.
?- min_in_list([1,2,3],2).
gelingt—sollte es scheitern!InformationsquelleAutor Neil H
% finden mindestens in einer Liste
% so whattaya denken!
?- min([1,1,1,1], Min).
, das ergibt 8 Lösungen. Oder probieren Sie?- numlist(1, 1000, Ls), min(Ls, Min).
in SWI-Prolog ein, und drücken Sie PLATZ für weitere Lösungen nachdem Sie strahltMin = 1
und bereit sein, zu warten. Auch, es ist nicht tail-rekursiv, und somit weniger geeignet für lange Listen: Versuchen Sie es zum Beispiel?- numlist(1, 10_000_000, Ls), min(Ls, Min).
, das ergibt einen lokalen stack-überlauf während andere Versionen, die hier gepostet nicht.InformationsquelleAutor MZee