Prologue Programme Pour Vérifier Si Un Nombre Est Premier
J'ai écrit le programme suivant basée sur la logique qu'un nombre premier n'est divisible que par 1 et lui-même. Je viens donc de passer par le processus de division à tous les nombres supérieurs à un an et moins de lui-même, mais je semble avoir un problème car j'ai tous les numéros saisis comme vrai. Voici mon 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).
Merci d'avance 🙂
Je suis vraiment heureux que il ya des gens comme vous qui prennent de leur temps pour examiner la question, les réponses et de les comprendre et de contribuer. C'est vraiment quelque chose qui, je l'espère, je peux le faire. Bravo pour vous les gars
Je pense que tout mon temps sur stackoverflow a recevoir de l'aide et de ne pas aider les autres et cela me rend triste.
vous êtes la plupart de bienvenue (même si personnellement, je n'ai pas fait beaucoup ici); je suis sûr que vous aurez à payer de l'avant chaque fois que c'est possible pour vous.
Je pense que tout mon temps sur stackoverflow a recevoir de l'aide et de ne pas aider les autres et cela me rend triste.
vous êtes la plupart de bienvenue (même si personnellement, je n'ai pas fait beaucoup ici); je suis sûr que vous aurez à payer de l'avant chaque fois que c'est possible pour vous.
OriginalL'auteur user3490561 | 2014-04-25
Vous devez vous connecter pour publier un commentaire.
Je suis débutant dans le Prologue, mais a réussi à résoudre votre problème.
Le principal problème était la déclaration
X mod Y is 0
. Prédicatis
a deux (gauche et droite) des arguments, mais la gauche argument doit être une constante ou une variable qui est déjà unifiée au moment où le prédicat est en cours d'exécution. J'ai juste échangé ces valeurs. Le reste du code est pour vérifier le numéro 2 (qui est le premier) et le nombre de moins de 2 (qui ne sont pas des nombres premiers)J'ai oublié de mentionner que la comparaison
Y < X
est buggé, parce que vous voulez tester tous les nombres entre 2 et X-1, cette comparaison inclut X.Pas de problème. Ravi de vous aider.
OriginalL'auteur rareyesdev
Cette réponse est un suivi de @lefunction de la réponse précédente.
isPrime2/1
est aussi proche que possible deisPrime1/1
avec quelques changements cruciaux (mis en évidence ci-dessous):Nous allons requête!
Comment sur la parallélisation multi-cœurs?
sur ma machine le temps de ne pas s'inscrire.
Dans le sens de Gustavson de la loi: Choisissez une plus grande taille de problème.
OriginalL'auteur repeat
X mod Y is 0
échoue toujours, parce que pas d'expressions sur la gauche deis
.Changement de
0 is X mod Y
, ou, mieux, àX mod Y =:= 0
OriginalL'auteur Sergey Dymchenko
agarwaen accepté de répondre à n'est pas bien sur des grands nombres. C'est parce qu'il n'est pas de queue récursive (je pense). Aussi, vous pouvez accélérer le tout avec quelques faits à propos des nombres premiers.
1) 2 est le seul nombre premier pair
2) Tout nombre supérieur à la moitié de la première de ne pas répartir uniformément
1 ?- time(isPrime1(999983)).
% 1,249,983 inferences, 0.031 CPU in 0.039 seconds (80% CPU, 39999456 Lips)
true.
EDIT1
Est-il possible d'aller un pas plus loin?
isPrime_/3
est plus efficace queisPrime2/1
parce qu'il compare uniquement précédemment sur les nombres premiers connus. Cependant, le problème est la création de cette liste.OriginalL'auteur lefunction
J'chose qui est élégant:
1 n'EST PAS PREMIER NUMÉRO, mais si vous ne le pense pas il suffit de supprimer pas(Une est 1).
OriginalL'auteur Morticia A. Addams