删除指定索引处的列表中的元素

时间:2013-04-27 09:53:25

标签: list indexing prolog element

我需要你的帮助!你能帮我解决这个问题:删除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). 

2 个答案:

答案 0 :(得分:4)

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

nth1(Index, List, _, Remainder)

提供IndexList,因为您不需要已删除的元素,您可以忽略它,然后结果列表将位于Remainder

这是来自SWI-Prolog中nth1库的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 :(得分:1)

有些过时了,但还是(特别是如果您想要一个更优雅的解决方案):

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