Prolog: Filtern einer Liste?
Derzeit arbeite ich an einem sehr kurzen Projekt auf den Prolog, und nur steckengeblieben versucht, einen "filter" die ich erstellt habe, auf eine Liste. Ich habe das, was man nennen könnte den filter bereit, aber ich kann Sie nicht anwenden. Es wäre besser, wenn ich verdeutlichen:
filter(A, B)
...gibt 'wahr', wenn bestimmte Bedingungen erfüllt sind.
filterList(A, [X, Y, Z])
...gibt eine Liste, die enthält alle Elemente aus der zweiten argument, dass der filter Ausgang false. (Also, wenn der filter(A, X) wahr ist, wird der Ausgang [Y, Z] ).
Habe ich den "filter" - Funktion bereit, aber jetzt muss ich es anwenden, um eine Liste wie auf dem zweiten Beispiel, ohne alle Elemente, für die der filter true zurück, wenn angewendet mit dem ersten argument.
So, wenn der filter ist eine einfache A == B, die Funktion soll erhalten [A,B,A,C,D,A] und output [B,C,D], nachdem entfernt alle Elemente, für die der filter anwendbar ist, offensichtlich.
Ich habe Probleme mit der grundlegenden Struktur von der Funktion, so, wenn jemand liefern könnte, einen grundlegenden überblick für eine Funktion wie diese, es wäre eine große Hilfe. Habe ich vereinfachte meine situation so viel wie möglich, damit ich Sie ergreifen können, was Sie möglicherweise in der Lage zu liefern, und ändern Sie es für meine Bedürfnisse.
Vielen Dank im Voraus!
InformationsquelleAutor der Frage Sergio Morales | 2008-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie sind auf der Suche für höherwertige Funktionen in Prolog, sollten Sie auf jeden Fall konsultieren Naish (1995)eine sehr gute Ressource, auf dieser.
Seine definition von
filter/3
ist die folgende (er verwendet-Differenz-Liste-notation, also entweicht zu definierenfilter/4
):Ich Sie haben Fragen zu diesem Prädikat, Fragen Sie mich bitte in den Kommentar. Zeitung Lesen ist auch sehr zu empfehlen, auch beeinflusst
map
foldr
undcompose
! Beachten Sie, dass viele der Einschränkungen, die er erwähnt (wie zum Beispiel eine fehlendecall/3
oder einer höherenapply
nicht mehr anwenden. SWI-Prolog hat die=..
Betreiber, die Adressen all seine sorgen und macht beliebige n-order logic möglich.InformationsquelleAutor der Antwort Aleksandar Dimitrov
SWI-Prolog bietet
exclude/3
und andere meta-Prädikate. Deinem ursprünglichen problem kann codiert werden, wie diese:Beispiel:
InformationsquelleAutor der Antwort Kaarel
Gibt es eine inhärente problem mit filter-Funktionen, die den Erfolg oder das scheitern eines Prädikats als Kriterium für die Filterung: Das entstehende Programm ist nicht mehr eine Reine monotone Programm. Es verliert dadurch alle seine deklarative Eigenschaften — die einzige Bedeutung ist, die bleibt, ist eine Verfahrens-Schritt-für-Schritt-interpretation. Hier ist eine Reine, vergegenständlicht version filtern mit
if_/3
:Das erste argument ist also eine Schließung/Fortführung, erhalten zwei weitere Argumente: Das element und die resultierende Wahrheitswert.
Nun, die Ergebnisse präzise bleiben:
Gibt es vier Möglichkeiten, wie eine Liste mit zwei Elementen können gefiltert werden, indem das Kriterium der gleich
X
. Jedes element kann gleich oder unterschiedlich sein kann.Der Nachteil dieses Ansatzes ist, dass man zu bieten hat vergegenständlicht Versionen aller Kriterien.
InformationsquelleAutor der Antwort false
Gut, was würden Sie wissen, habe ich gerade herausgefunden. So, hier ist mir der Einreichung eine Antwort auf meine Frage, wie erwartet, eine sehr kurze Funktion hat die Aufgabe:
InformationsquelleAutor der Antwort Sergio Morales
Bekomme ich die Erwachsenen, die in einem Land //Obtengo los adultos de un pais, Land = Pais, Personen = Personas, Person = una sola Persona
Dies ist ein filter in prolog //Asi es-un-filter en prolog
InformationsquelleAutor der Antwort Jesus Ledesma