遍历一个列表,删除最后一个元素,并将其余列表添加到另一个列表中。

3
这是我得到的代码,它只删除列表中的最后一个元素。
delete([_], []).
delete([X|Xs], [X|Last]) :- delete(Xs, Last).

循环应该一直运行,直到原始列表为空并返回新列表。

这与子集有些相似。

2个回答

3
您可以将定义重写为以下形式,以改进它并避免不必要的选择点:
delete([Head| Tail], List) :-
    delete(Tail, Head, List).

delete([], _, []).
delete([Next| Tail], Previous, [Previous| List]) :-
    delete(Tail, Next, List).

一些示例调用:
?- delete([1,2,3], L).
L = [1, 2].

?- delete([], L).
false.

?- delete([1], L).
L = [].

?- delete(L, [1,2,3]).
L = [1, 2, 3, _].

 ?- delete(L1, L2).
L1 = [_A],
L2 = [] ? ;
L1 = [_A,_B],
L2 = [_A] ? ;
L1 = [_A,_B,_C],
L2 = [_A,_B] ? ;
L1 = [_A,_B,_C,_D],
L2 = [_A,_B,_C] ? 
...

3

可能是:

delete_last(In, Out) :-
    append(Out, [_], In).

1
虽然简洁紧凑,但与原始代码有相同的问题:在以(+,-)模式调用时会留下一个错误的选择点。 - Paulo Moura

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接