Primzahlenzwillinge Definition: Primzahlenzwillinge sind zwei ungerade Primzahlen deren Abstand 2 beträgt. Prädikatfunktion: primzwillinge(P,Q) :- P > Q, primzwillinge(Q, P),!. primzwillinge(P,Q) :- prim(P), prim(Q), Q is P + 2. out_prim_zwill(Von, Bis) :- (0 is Von mod 2), Von1 is Von + 1, out_prim_zwill(Von1, Bis), !. out_prim_zwill(Von, Bis) :- Von < Bis, Q is Von + 2, Q =< Bis, primzwillinge(Von, Q), write(Von-Q),nl, out_prim_zwill(Q, Bis). out_prim_zwill(Von, Bis) :- Von < Bis, Q is Von + 2, Q =< Bis, not(primzwillinge(Von, Q)), out_prim_zwill(Q, Bis). out_prim_zwill(N) :- out_prim_zwill(3, N),!. Prädikatarbeitsweise: Zunächst wird festgelegt, wann zwei Zahlen P und Q Primzahlen sind. Dann wird Ausgabe von Primzahlenzwillingen von Von bis Bis mit out_prim_zwill(Von,Bis) realisiert. Da nur ungerade Zahlen Primzahlenzwillinge sein können, wird zunächst sichergestellt, dass Von eine ungerade Zahl ist. Dann wird falls Von und Von+2 noch im Intervall getestet und bei Erfolg ausgegeben und dann wird für die nächste ungerade Zahl (Von+2) out_prim (VonP2,Bis) aufgerufen. ggT von 3 Zahlen und kgV Arbeitsweise: Der ggT von drei Zahlen lässt sich einfach bestimmen indem man zunächst den ggT von der ersten und der zweiten Zahl. Man erhält eine Zahl n1. Der ggT aller drei Zahlen ist dann gleich dem ggT von der dritten Zahl und n1. Das kgV von zwei zahlen ergibt sich aus dem Produkt der Zahlen geteilt durch den ggT. Prädikatfunktion: gcd(M,N,O,L) :- gcd(M,N,L1), gcd(L1,O,L). kgv(M,N,L) :- GGT is gcd(M,N), L is M*N//GGT. Java-Programme: import java.util.*; public class Zahltheo { public int gcd(int M,int N) { if(N==0) return M; return gcd(N,M % N); } public boolean prim(int N) { if(N<=1) return false; double sqrtN = Math.sqrt(N); return primtest(2, sqrtN, N); } public boolean primtest(int von, double bis, int N) { if(von >= N) return true; if(von >= bis) return true; if(N % von == 0) return false; return primtest(von+1, bis, N); }; } Vergleich imperativer deklartiver Programmierung: imerativ deklartiv Beschreibung des Lösungswegs Beschreibung der Lösung Hilfmittel Variablen und deren Initialisierung, Schleifen, bedingte Anweisungen und Funktionsaufrufe Variablen, Fakten und Regeln Vergleichsbeispiel Primzahltest (nicht rekusiv, siehe unten) Primzahltest (siehe Blatt) Lösungsfindung in einer Schleife wird von Von bis Bis getestet, ob ein Teiler existiert. mittels eines Testprädikats wird festgestellt, ob in einem Bereich von Von bis Bis kein Teiler zur getesteten Zahl existiert import java.util.*; public class Zahltheo { public boolean prim(int N) { if(N<=1) return false; if(N == 2) return true; if(N % 2 == 0) return false; double sqrtN = Math.sqrt(N); for(int i=2; i <= sqrtN; i++) { if( N % i == 0) return false; } return true; } }