从列表中删除前N个素数(Prolog)
基本上,我想从列表中删除第一个从列表中删除前N个素数(Prolog),prolog,primes,Prolog,Primes,基本上,我想从列表中删除第一个N数字,检查数字是否为素数的函数似乎工作正常,但程序本身不工作 例如,对于输入[2,4,5,7,6,9,11]和N=3我应该得到[4,6,9,11],但我只得到[4,6,9] divisible(X,Y) :- 0 is X mod Y, !. divisible(X,Y) :- X > Y+1, divisible(X, Y+1). %isPrime function check whether or not the argu
N
数字,检查数字是否为素数的函数似乎工作正常,但程序本身不工作
例如,对于输入[2,4,5,7,6,9,11]
和N=3
我应该得到[4,6,9,11]
,但我只得到[4,6,9]
divisible(X,Y) :-
0 is X mod Y, !.
divisible(X,Y) :-
X > Y+1,
divisible(X, Y+1).
%isPrime function check whether or not the argument is a prime number
isPrime(2) :- true,!.
isPrime(X) :- X < 2,!,false.
isPrime(X) :- not(divisible(X, 2)).
%delFunction (input_list, N, output_list)
delFunction([],_,_).
delFunction(_,0,_).
delFunction([H|T], N, [H|Res]):-
not(isPrime(H)), !,
delFunction(T, N, Res).
delFunction([_|T], N, Res):-
N1 is N-1,
delFunction(T,N1,Res).
可除(X,Y):-
0是X模Y!。
可除(X,Y):-
X>Y+1,
可除的(X,Y+1)。
%isPrime函数检查参数是否为素数
iPrime(2):-正确,!。
iPrime(X):-X<2,!,错。
isPrime(X):-not(可除(X,2))。
%delFunction(输入列表,N,输出列表)
delFunction([],u,u)。
delFunction(0,0,0)。
delFunction([H | T],N[H | Res]):-
不是(iPrime(H))!,
delFunction(T,N,Res)。
delFunction([u124; T],N,Res):-
N1是N-1,
delFunction(T,N1,Res)。
delFunction([2,4,5,7,6,9,11],3,X)
->[4,6,9]
(这不是正确的答案)
老实说,我不知道我哪里出错了,实现的想法似乎非常简单和直接,代码也是如此
此外,当我运行它时,它会在[4]
处停止,并且我必须继续单击next(下一步)以使我到达执行的末尾(因此是结果)。知道怎么修吗?我在想也许我需要一些削减,但不确定在哪里
附言:我宁愿不使用内置函数(如果有任何函数在这种情况下有帮助的话)首先,而不是
delFunction([],_,_).
你应该写
delFunction([],_,[]).
因为当输入列表(左一个)为空时,您必须为输出列表构建基础:一个空列表;使用delFunction([],u,u)
时,您不会将输出列表与空列表统一起来,因此结果以一个不统一的变量结束
第二。而不是
delFunction(_,0,_).
你应该写
delFunction(L,0,L).
问题是一样的:当数字为零时,您可以“复制”输出中的输入;也就是说,你可以统一他们;这就是delFunction(L,0,L)
。使用delFunction(0,0,0)
时不统一,结果以不统一的变量结束
第三,。在is素子句中
delFunction([_|T], N, Res):-
N1 is N-1,
delFunction(T,N1,Res).
您应该检查N
是否大于零
delFunction([_|T], N, Res):-
N > 0,
N1 is N-1,
delFunction(T,N1,Res).
或者,如果愿意,您应该在zero子句中添加一个cut(!
)
delFunction(L,0,L) :- !.
只是为了避免序言,通过回溯,可以给出多个不想要的答案
---编辑---
作为盖伊编码员,我像瘟疫一样避免割伤;因此,我提出以下解决方案,以避免不必要的重复
delFunction([], _, []).
delFunction([H | T], 0, [H | T]).
delFunction([H | T], N, [H | Res]) :-
N > 0,
not(isPrime(H)),
delFunction(T, N, Res).
delFunction([H | T], N, Res):-
N > 0,
isPrime(H),
N1 is N-1,
delFunction(T, N1, Res).
是的,那是我的问题。最终的输出是不正确的,它给了我多个答案(显然,当它应该只给出一个答案时)。仍然认为这是一种滥用!某处…@GuyCoder-和wich通话?使用
delFunction([2,4,5,7,6,9,11],3,X)
?谢谢你,真的帮了大忙,它现在可以工作了,只给出一个答案。@GuiCoder-使用swi prolog我只得到一个答案,而使用gprolog我得到3个。在not(isPrime())
@GuyCoder,Hansewl-修改我的答案之前添加N>0
che;希望更清楚。