从列表中删除所有N个元素

时间:2016-11-25 20:26:37

标签: prolog

我想编写一个程序,从列表中删除每个第N个元素而不使用最后一个元素。我的程序已经正常工作并给我正确的结果,但是当我要求另一个结果时,prolog会出现错误“> / 2:参数没有充分实例化”。这是我到目前为止的代码:

delete_elements([],0,[]).
delete_elements([],_,[_|_]).
delete_elements(L,N,R) :-
    length(L,LL),
    LL > N,
    nth1(N,L,_,RZ),
    NZ is N + 1,
    delete_elements(RZ,NZ,RR),
    R = RR.
delete_elements(L,N,R) :-
    length(L,LL),
    LL =< N,
    delete_elements([],_,R),
    L = R.

我认为递归的取消条件有问题。如何解决这个问题?

提前致谢!

1 个答案:

答案 0 :(得分:1)

问题在于条款:

delete_elements(L,N,R) :-
    length(L,LL),
    LL =< N,
    delete_elements([],_,R),
    L = R.

你已经完成了你的工作,但你仍然使用匿名变量而不是N来调用你的谓词。你可以写:

delete_elements(L,N,L) :-
    length(L,LL),
    LL =< N.

示例:

?- delete_elements([1,2,3,4,5,6,7,8,9,1,2,3],3,L).
L = [1, 2, 4, 6, 8, 1, 3] ;
false.

对于您在评论中提出的问题,我的实施将是:

 delete_elements(L,N,R) :- delete_elements(L,1,N,R).

delete_elements([],_,_,[]).
delete_elements([X],N,N,[X]).
delete_elements([X|Xs],N,N,Rs):- length([X|Xs],Y),Y>1,delete_elements(Xs,1,N,Rs).
delete_elements([X|Xs],P,N,[X|Rs]):- P < N,P1 is  P+1,delete_elements(Xs,P1,N,Rs).