List 如何打印不大于给定正整数N的所有素数?

List 如何打印不大于给定正整数N的所有素数?,list,prolog,List,Prolog,如何打印不大于给定正整数N的所有素数 a(0). a(X) :- b(X). b(X) :- X1 is X - 2, write(X), write(' '), a(X1). output: ?- a(20). 20 18 16 14 12 10 8 6 4 2 如何像下面的例子一样 例如: ?- a(20). 2 3 5 7 11 13 17 19. 您可以定义一个谓词为素数(N),如果N为素数,则该谓词将成功。而且,你必须向上计数,而不是向下计数。:) prime_至(N

如何打印不大于给定正整数N的所有素数

a(0). 
a(X) :- b(X). b(X) :- X1 is X - 2, write(X), write(' '), a(X1). 
output:
?- a(20).
20 18 16 14 12 10 8 6 4 2
如何像下面的例子一样

例如:

?- a(20). 
   2 3 5 7 11 13 17 19. 

您可以定义一个谓词
为素数(N)
,如果
N
为素数,则该谓词将成功。而且,你必须向上计数,而不是向下计数。:)

prime_至(N):-
N>1,
写('2'),
素数直到(3,N)。
素数到(C,N):-
C>N。
素数到(C,N):-
C=写(N),写(“”)
;是的
).

我将把
is_prime(N)
的定义留作练习。

您可以定义一个谓词
is_prime(N)
,如果
N
是prime,它将成功。而且,你必须向上计数,而不是向下计数。:)

prime_至(N):-
N>1,
写('2'),
素数直到(3,N)。
素数到(C,N):-
C>N。
素数到(C,N):-
C=写(N),写(“”)
;是的
).
我将把
是素数(N)
的定义留作练习。

给你

divisible(X,Y) :- 0 is X mod Y, !.

divisible(X,Y) :- X > Y+1, divisible(X, Y+1).

isPrime(2) :- true,!.
isPrime(X) :- X < 2,!,false.
isPrime(X) :- not(divisible(X, 2)).

prime(X):- printPrimes(X,0).

printPrimes(X,Y):- X>=Y, isPrime(Y), write(Y), write(' '), Y1 is Y + 1, printPrimes(X,Y1).

printPrimes(X,Y):- X>=Y, \+isPrime(Y), Y1 is Y + 1, printPrimes(X,Y1).
给你

divisible(X,Y) :- 0 is X mod Y, !.

divisible(X,Y) :- X > Y+1, divisible(X, Y+1).

isPrime(2) :- true,!.
isPrime(X) :- X < 2,!,false.
isPrime(X) :- not(divisible(X, 2)).

prime(X):- printPrimes(X,0).

printPrimes(X,Y):- X>=Y, isPrime(Y), write(Y), write(' '), Y1 is Y + 1, printPrimes(X,Y1).

printPrimes(X,Y):- X>=Y, \+isPrime(Y), Y1 is Y + 1, printPrimes(X,Y1).

当我尝试在SWI Prolog中运行时,它是报告:
?-primes\u up\u to(20)。2错误:写入\u if\u prime/1:未定义过程:is\u prime/1异常:(9)is\u prime(20)?以前的搜索
都不是素数(20)。错误:顶级:未定义的过程:is_prime/1(DWIM无法纠正目标)
@MargieHayek它说的是
is_prime/1
不存在。正如我在回答中提到的,我将把它作为一个练习留给您编写和定义
is_prime/1
。您能给出更具体的说明吗?我试过了,但没有结果。谢谢:)@MargieHayek有几种不同的方法。您可以搜索此网站(
[prolog]is_prime
将找到几个关于质数的讨论答案)。你可以定义
是素数(2)。
(2是素数),
是素数(3)。
,你可以为任何
N
定义
是素数(N)
,如果
N
是3,
N
是奇数,
N
不能被3和小于或等于sqrt(N)的最大整数之间的任何整数整除。当我尝试在SWI Prolog中运行时,它是报告:
?-primes\u up\u to(20)。2错误:写入\u if\u prime/1:未定义过程:is\u prime/1异常:(9)is\u prime(20)?以前的搜索
都不是素数(20)。错误:顶级:未定义的过程:is_prime/1(DWIM无法纠正目标)
@MargieHayek它说的是
is_prime/1
不存在。正如我在回答中提到的,我将把它作为一个练习留给您编写和定义
is_prime/1
。您能给出更具体的说明吗?我试过了,但没有结果。谢谢:)@MargieHayek有几种不同的方法。您可以搜索此网站(
[prolog]is_prime
将找到几个关于质数的讨论答案)。你可以定义
是素数(2)。
(2是素数),
是素数(3)。
,你可以为任何
N
定义
是素数(N)
,如果
N
是3,
N
是奇数,
N
不能被3和小于或等于sqrt(N)的最大整数之间的任何整数整除.你听说过吗?@任性。谢谢你。这是我第一次知道这件事。你听说过吗?@WillNess。谢谢你。这是我第一次知道,太好了。谢谢兄弟!不客气:)太好了。谢谢兄弟!不客气:)
?- prime(20).
2 3 5 7 11 13 17 19