2012-11-22 13 views
15

Ich arbeite an einem Prolog, bei dem ich neu bin.Prolog "oder" -Operator, Abfrage

Ich bin für einen "oder" Operator

registered(X, Y), Y=ct101, Y=ct102, Y=ct103. 

Hier ist meine Abfrage suchen. Was ich schreiben möchte ist Code, der Wille:

„return X, da Y auf den Wert Z gleich OR Wert Q OR Wert P“

ich bin gefragt X zurück, wenn Y gleich alle 3 obwohl. Was ist der Operator hier? Ist dort eines?

Antwort

9

Sie können ‚aufrufen‘ alternative Bindungen auf Y auf diese Weise:

...registered(X, Y), (Y=ct101; Y=ct102; Y=ct103). 

Beachten Sie die Klammern erforderlich sind, um die korrekte Ausführung Steuerfluss zu halten. Der ;/2 ist der allgemeine Operator or. Für Ihre eingeschränkte Nutzung könnten Sie auch Wahl der mehr idiomatische

...registered(X, Y), member(Y, [ct101,ct102,ct103]). 

dass auf Rückzieher Y jedes Mitglied der Liste bindet.

bearbeiten Ich verstand mit einer Verzögerung Ihre letzte Anforderung. Wenn Sie möchten, dass Y Spiel alle 3 Werte des oder unangemessen ist, verwenden Sie stattdessen

...registered(X, ct101), registered(X, ct102), registered(X, ct103). 

oder kompaktere

...findall(Y, registered(X, Y), L), sort(L, [ct101,ct102,ct103]). 

findall/3 baut die Liste in der gleichen Reihenfolge, die registriert/2 gelingt. Dann verwende ich sort, um die Übereinstimmung zu gewährleisten.

...setof(Y, registered(X, Y), [ct101,ct102,ct103]). 

SETOF/3 sortiert auch die Ergebnisliste

+0

Dank, half dies eine Tonne. Ich war mir nicht sicher, wie ich das anstellen sollte, aber ich werde mich über Bindings und Backtracking informieren. Geschätzt! – Eogcloud

23

Ein weiterer Gesichtspunkt.

registered(X, Y) :- 
    X = ct101; X = ct102; X = ct103. 

Für eine ausführlichere Erklärung: ein "oder" in Prolog Beachtung kann auch mit dem "disjunct" Operator oder Semikolon erfolgen

Predicate control in Prolog