2016-11-05 6 views
0

Ich muss eine predicate/2 machen, die eine Liste von "richtigen" Zahlen als Validierung und eine Funktion, die validiert werden muss. Die Zahlen in der Funktion (dargestellt als number(X)) müssen mit den Zahlen in der Validierungsliste übereinstimmen, um "wahr" zu werden.Prolog. Kombinieren Prädikate

Ich habe kein Problem, zwei getrennte predicates/1, die die richtige Antwort geben, wenn die Liste "hart-codiert" in der Bibliothek ist, aber ich kann für den Gott von mir nicht diese kombinieren.

ich diese haben bisher:

number(X) :- member(X, [1,2,3,4,5]). 

Dies gibt das korrekte Ergebnis, wie wenn ich fragen, für zum Beispiel and(number(2),number(4)), heißt es ja, und and(number(2),number(6)) gibt keine.

Aber jetzt muss ich predicate/2 tun, die die Liste als erstes Argument nimmt. Kann mir jemand helfen/einen Hinweis geben?

predicate(ValidationList, Function) :- ???? 
+0

nicht sicher sein konnte, unserstand ... 'und (Nummer (2), Nummer (4)) "und" und (Nummer (2), Nummer (6)) " Gibt es Beispiele für zu validierende Funktionen? Oder was meinst du (kannst du einige Beispiele zeigen?) Mit "Funktion, die validiert werden muss"? Wie auch immer ... kannst du dein 'Prädikat/1' zeigen? – max66

+0

Ja, dies sind Beispiele für zu validierende Funktionen. Es geht um aussagenlogische Formeln. Wenn "und (Nummer (1), Nummer (2))" korrekt sein soll, dann muss die Validierungsliste die Nummern 1 und 2 enthalten. Deshalb "Zahl (X): - Mitglied (X, [1,2 , 3,4,5]) "funktioniert. Mein Problem ist, ein Prädikat zu definieren, so dass ich nachher zum Beispiel "Prädikat ([1,3,5,7], oder (Nummer (1), Nummer (2))) eingeben kann." Und es prüft, ob 1 und 2 Teil der Liste sind. – DaoDib

Antwort

0

können Sie verwenden call Prädikat:

and(X,Y) :- call(X), call(Y). 
or(X,Y) :- call(X); call(Y). 

predicate(List, Function) :- 
    Function =.. [P,X,Y], 
    call(P, member(X, List), member(Y, List)). 

Zum Beispiel:

?- predicate([1,2,3], and(1,3)). 
true. 

?- predicate([1,2,3], and(1,4)). 
false. 

?- predicate([1,2,3], or(1,4)). 
true. 

?- predicate([1,2,3], or(4,5)). 
false. 
+0

Ich bin mir nicht sicher, ob ich das verstehe. Wie überprüft das, ob die Formel ein Mitglied meiner Validierungsliste ist? – DaoDib

+0

Überprüfen Sie meine Antwort erneut. –

0

Eine andere Lösung

predicate(ValList, and(X, Y)) :- 
    predicate(ValList, X), 
    predicate(ValList, Y). 

predicate(ValList, or(X, Y)) :- 
     predicate(ValList, X) 
    ; predicate(ValList, Y). 

predicate(ValList, number(X)) :- 
    member(X, ValList).