Prolog-Listen und-Parametern und return-Werten
Ich bin neu in prolog und das kann ich einfach nicht verstehen.
Ich versuche ein einfaches Programm erstellen, erhält eine Liste von Prädikaten, sucht für ein bestimmtes Prädikat in der Liste, und wendet eine Funktion auf, die Prädikat-Parameter.
Etwas entlang diesen Linien:
?- program([pred1(a,b,p), pred2(d,b,p), pred2 (a,c,p)]).
program (list1) :-
search(pred2(X,Y,p),list1).
doSomething (X,Y) % with the X and Y returned from search function, both of them.
Grundsätzlich möchte ich alle Werte, die zurückkehren würde, von einer objektiven search(pred2(X,Y,p),list1)
und verwenden Sie Sie auf eine andere Funktion.
Okay, ich habe versucht, einige Sachen in prolog und kam zu diesem:
member(X, [X | _]).
member(X, [_ | R]) :- member(X, R).
prog(L1,Out) :- member(pred2(X,Y), L1).
?- prog ([(pred1(a,b),pred2(c,b),pred2(d,a)],Out).
Es gibt wahre 2 mal, wie es soll, aber ich wollte Out = [c,b]
und Out = [d,a]
. Wie kann ich das erreichen?
Bezüglich der Eiche ' s Antwort: ich verstehe, dass es nicht eine prozedurale Sprache, aber ich kann nicht herausfinden, wie man auf Werte zugreifen und diese in prolog. Dein Beispiel war nicht so hilfreich.
InformationsquelleAutor d0pe | 2010-06-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für den Anfang würde ich vermeiden, rufen Sie diese Dinge "Funktionen". Prolog ist nicht eine prozedurale Sprache und Regeln /Prädikate sind keine Funktionen.
Grundsätzlich, wenn Sie eine Regel verwenden Sie sind wirklich Fragen Prolog, "gib mir alle Werte, die Erfüllung dieser Regel". Die Regel ist, von sich aus, nichts zurück.
Also sagen, Sie hatte die folgenden in eine prozedurale Sprache:
Wie würden Sie tun es in Prolog? Sie würde schreiben müssen, manche Prädikat
f(X,Y)
und einige Prädikatg(X,Y)
, und dann müssten Sie die Abfragef(3,Y), g(Y,Z)
- was bedeutet, zu Fragen, Prolog finden Sie die Werte fürY
undZ
befriedigen.Z
ist, was Sie interessiert sind in.InformationsquelleAutor Oak
dem besten Weg, diesen filter & Projekt-Anforderungen prolog meiner Meinung nach ist schreiben Sie Ihre filter-Ausdruck so, dass es dauert ein argument und ist erfolgreich, wenn das input-argument übergibt der filter -
Dann schreiben die Projektion der code wie ein argument, ist die input-und die output -
Dann binden Sie zusammen -
Dann laufen diese auf jedes Element einer Liste ist, sollte man mit findall -
Dies könnte verallgemeinert werden, zu nehmen, die als Argumente der name der filter - & map Prädikate natürlich. Und es könnte komprimiert werden, bis zu einem stmt-auch in der form -
InformationsquelleAutor DaveEdelstein