Prolog-Programm Um Zu Überprüfen, Ob Eine Zahl Eine Primzahl Ist
Schrieb ich das folgende Programm basiert auf der Logik, dass eine Primzahl ist nur teilbar durch 1 und sich selbst. Also ich gehe einfach durch den Prozess der Teilung, um alle zahlen, die größer als eins und kleiner als es selbst, aber ich glaube, ich habe ein problem, seit dem bekomme ich alle eingegebenen zahlen als wahr. Hier ist mein code...
divisible(X,Y) :-
Y < X,
X mod Y is 0,
Y1 is Y+1,
divisible(X,Y1).
isprime(X) :-
integer(X),
X > 1,
\+ divisible(X,2).
Vielen Dank im Voraus 🙂
Ich bin wirklich froh, dass es Menschen gibt wie dich, die nehmen würde aus Ihrer Zeit zur überprüfung der Frage, die Antworten und Sie zu verstehen und zu leisten. Es ist wirklich etwas, dass ich hoffe, dass ich das tun kann. Ein dickes Lob für Euch
Ich glaube, alle, die meine Zeit auf stackoverflow war, die Hilfe erhalten, und nicht, anderen zu helfen und das macht mich traurig.
Sie sind das meiste willkommen, (obwohl ich persönlich nicht viel hier); ich bin sicher, dass Sie ' ll pay it forward, wenn es möglich ist für Sie.
Ich glaube, alle, die meine Zeit auf stackoverflow war, die Hilfe erhalten, und nicht, anderen zu helfen und das macht mich traurig.
Sie sind das meiste willkommen, (obwohl ich persönlich nicht viel hier); ich bin sicher, dass Sie ' ll pay it forward, wenn es möglich ist für Sie.
InformationsquelleAutor user3490561 | 2014-04-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin ein Anfänger in Prolog, aber Sie schaffte es, Ihr problem zu lösen.
Zentrales Thema war die Aussage
X mod Y is 0
. Prädikatis
hat zwei (Links und rechts) - Argumente, aber das linke argument eine Konstante oder eine variable, die bereits unified im moment, dass das Prädikat ausgeführt wird. Ich habe gerade vertauscht diese Werte. Der rest des Codes ist für die Prüfung Nummer 2 (prime) und Zahl, die kleiner als 2 sind keine Primzahlen)Ich vergaß zu erwähnen, dass der Vergleich
Y < X
buggy ist, weil Sie testen möchten, die für alle zahlen zwischen 2 und X-1, der Vergleich beinhaltet X.Kein problem. Froh zu helfen.
InformationsquelleAutor rareyesdev
Diese Antwort ist ein follow-up zu @lefunction die Vorherige Antwort.
isPrime2/1
ist so nah wie möglich anisPrime1/1
mit ein paar entscheidenden änderungen (unten hervorgehoben):Let ' s Abfrage!
Wie etwa die Parallelisierung auf multi-cores?
auf meinem Rechner die Zeit nicht registrieren.
Im Sinne von Gustavson ' s law: Wählen Sie eine größere Größe problem.
InformationsquelleAutor repeat
X mod Y is 0
schlägt immer fehl, weil keine Ausdrücke erlaubt, auf der linken Seite deris
.Änderung
0 is X mod Y
oder, besser, zuX mod Y =:= 0
InformationsquelleAutor Sergey Dymchenko
agarwaen die akzeptierte Antwort nicht gut auf große zahlen. Dies ist, weil es ist nicht tail-rekursiv (glaube ich). Auch können Sie die Geschwindigkeit alles mit ein paar Fakten über Primzahlen.
1) 2 ist der nur noch Primzahl
2) Jede Zahl, die größer als die Hälfte der ursprünglichen nicht gleichmäßig aufzuteilen
1 ?- time(isPrime1(999983)).
% 1,249,983 inferences, 0.031 CPU in 0.039 seconds (80% CPU, 39999456 Lips)
true.
EDIT1
Ist es möglich, es zu nehmen ein Schritt weiter?
isPrime_/3
ist effizienter alsisPrime2/1
, weil es vergleicht nur die bisher bekannten Primzahlen. Das problem jedoch ist die Generierung dieser Liste.InformationsquelleAutor lefunction
Ich Sache ist die elegante Art und Weise:
1 IST KEINE PRIMZAHL, aber wenn Sie nicht denken, also einfach löschen nicht(1).
InformationsquelleAutor Morticia A. Addams