|
A=B A==B A\==B A=:=B A=\=B A<B A=<B A>B A>=B |
A wird gleichgesetzt mit B A gleich B in allen Eigenschaften A ungleich B Zahlenwerte von A und B gleich Zahlenwerte von A und B verschieden A kleiner als B A kleiner oder gleich B A größer B A größer oder gleich B |
Vergleiche sind wie andere Prädikate zu verwenden.
|
unprim(X,T):- T > 1, 0 is X mod T. unprim(X,T):- T > 1, Z is T-1, unprim(X,Z). prim(X):- X > 1, Y is X - 1, not(unprim(X,Y)), write(X), write(',').
allprim(X):- prim(X), fail. |
Test, ob X durch T ohne Rest teilbar ist; wenn ja oder T=1, Schleifenende Rekursive Schleife, bei der T um 1 verringert wird, dann Aufruf der 1.Klausel unprim Test, ob unprim(X,X-1) falsch ist (not!); wenn ja Ausgabe von X als Primzahl
Test, ob X Primzahl ist, Klausel immer falsch, daher Anwenden der 2.Klausel allprim |
Für allprim bedeutet das, dass zunächst die erste Klausel allprim(X):-prim(X),fail getestet wird. Ist prim falsch, bricht der Test ab. Ist hingegen prim(X) wahr, so geht der Rechner zu fail, was dann immer falsch ist. Die erste Klausel ist damit immer falsch, und es wird die zweite Klausel allprim(X) getestet. Diese Klausel ist immer richtig, bis X den Wert 1 hat. Man erhält so eine Schleife.
Für das Prädikat unprim ist es komplizierter: Ist die erste Klausel unprim(X,T):-T>1,0 is X mod T. richtig, also 0 der Divisionsrest X mod T, so wird die zweite Klausel nicht mehr durchlaufen, und unprim ist wahr. Ist die erste Klausel falsch, so wird die zweite Klausel getestet, die mit einem neuen T ein weiteres Mal unprim aufruft. Es entsteht eine Schleife, bis ein Teiler von X gefunden wurde.
Aufgabe: Man schreibe ein Programm, das zu einer vorgegebenen Zahl N alle Teiler findet (Divisionsreste also 0).