从列表中删除前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;希望更清楚。