Anwendung der Systemprädikate between und findall
Prolog belegt zur Lösungsfindung Variablen mit möglichen Werten. Was ist aber, wenn die Variable
z.B. durch das Prädikat
integer(X) nur mit einer ganzen Zahl belegt werden darf? Kann
man damit rechnen, dass das Prolog-System
alle ganzen Zahlen einsetzt? Wohl kaum!
Hier zeigt sich der Wert des System-Prädikats
between(+UG,+OG,?Zahl), das alle
ganzen Zahlen zwischen zwei Grenzen liefern kann.
Beispiele
teilt(X,Y):-between(1,Y,X),Y mod X =:= 0.
teilermenge(X,M):-findall(T,teilt(T,X),M).
?- teilermenge(24,M).
M = [1, 2, 3, 4, 6, 8, 12, 24] ;
Der Operator "is"
Die Hilfe gibt an, dass
-Number is +Expr wahr wird, wenn
Number mit der Zahl,die
aus der Auswertung von
Expr entsteht, unifiziert werden kann.
Normalerweise wird
is mit einer ungebundenen Variablen auf der linken Seite benutzt.
Das heißt,
is wird gewöhnlich im Sinne eines Zuweisungsoperators (rechte Seite wird
ausgewertet und der linken Seite zugewiesen,
:= in Pascal) benutzt.
Numerische Gleichheit soll mit
=:= getestet werden.
Beispiel
teilt(X,Y) :- 0 is Y mod X.
funktioniert (leider!), ist aber schlechter Stil
teilt(X,Y) :- Y mod X =:= 0.
So ist es besser!