【问题标题】:Delete an element in a list at a specified index删除列表中指定索引处的元素
【发布时间】:2013-04-27 09:53:24
【问题描述】:

我需要你的帮助!你能帮我解决这个问题吗:删除 Prolog 中指定索引处的列表中的一个元素。

例如:

    delete(List,Index,NewList).   
    ?-L=[1,5,7,4],delete(L,2,L2),write(L2).
    L2 = [1,7,4]

我不知道该怎么做。

解决了!

   away([G|H],1,H):-!.
   away([G|H],N,[G|L]):- N > 1, Nn is N - 1,!,away(H,Nn,L).
   ?-away([1,2,3,4,5],3,X), write(X). 

【问题讨论】:

    标签: list indexing prolog element


    【解决方案1】:

    使用内置函数 nth0/4(使用基于 0 的索引)或 nth1/4(使用基于 0 的索引)来执行此操作。在您的情况下,由于您使用基于 1 的索引,因此应使用 nth1

    nth1(Index, List, _, Remainder)
    

    提供IndexList,因为你不需要删除的元素,你可以忽略它,那么结果列表将在Remainder中。

    这是nth1的源代码,取自SWI-Prolog中的lists.pl库,重写以去除依赖:

    % Case 1: Index not specified
    nth1(Index, In, Element, Rest) :-
        var(Index), !,
        generate_nth(1, Index, In, Element, Rest).
    % Case 2: Index is specified
    nth1(Index, In, Element, Rest) :-
        integer(Index), Index > 0,
        find_nth1(Index, In, Element, Rest).
    
    generate_nth(I, I, [Head|Rest], Head, Rest).
    generate_nth(I, IN, [H|List], El, [H|Rest]) :-
        I1 is I+1,
        generate_nth(I1, IN, List, El, Rest).
    
    find_nth1(1, [Head|Rest], Head, Rest) :- !.
    find_nth1(N, [Head|Rest0], Elem, [Head|Rest]) :-
        M is N-1,
        find_nth1(M, Rest0, Elem, Rest).
    

    【讨论】:

    • +1。 nth1/4 还具有 OP 请求的基于 1 的索引。
    • @mat:我认为你的回答也很有帮助——因为它展示了在没有库的情况下实现它的方法。
    • 谢谢,但我需要在 Strawberry Prolog 或至少在 Turbo Prolog 中完成。并且没有内置函数
    • @Tanya:已编辑以包含来自 SWI-Prolog 的 lists.pl 的源代码。我对其进行了一些修改,以删除一些在 Strawberry Prolog 中不可用但尚未测试的功能。
    • @nhahtdh 我刚刚尝试过自己并得到了这个: away([G|H],1,H):-!。 away([G|H],N,[G|L]):- Nn=N-1,!,away(H,Nn,L)。 ?-远([1,2,3,4,5],3,X),写(X)。但是第 2 行有一个错误:第 3 行没有意义,在第 1 条之后。
    【解决方案2】:

    有点过时,但仍然(特别是如果您想要更优雅的解决方案):

    del([X|XS], CNT, [X|RES]) :- NEXT is CNT - 1,
                                 del(XS, NEXT, RES).
    del([_|XS], 1, XS).
    

    【讨论】:

    • 目标del(Xs,1,Ys) 循环。它应该普遍终止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2020-01-02
    相关资源
    最近更新 更多