【问题标题】:Delete all N elements from list从列表中删除所有 N 个元素
【发布时间】:2025-12-07 08:40:01
【问题描述】:

我想编写一个程序,从列表中删除每个第 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.

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

提前致谢!

【问题讨论】:

    标签: prolog


    【解决方案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).
    

    【讨论】:

    • 谢谢!你知道为什么这个程序只适用于 N = 2 吗?如何使程序适用于每个 N(1,3 等)?
    • 例如当我要求 delete_elements([1,2,3,4,5,6,7,8,9],3,R) 输出应该是 R=[1,2 ,4,5,7,8,9],因为最后一个元素 (9) 应该在列表中。
    • 编辑了答案,你的答案有很多错误,我不认为它可以工作......我给了我的实现......
    • 编辑了没有';'的答案和 '->' 现在可以正常工作了。请删除另一个帖子,问重复的问题是不对的......
    • 是的,因为两个子句适合相同的输入(这不是错误的答案),我将编辑我的答案...