【问题标题】:Loop through a list deleting the last element and adding the remaining list to another list遍历一个列表,删除最后一个元素并将剩余的列表添加到另一个列表
【发布时间】:2013-10-16 21:08:34
【问题描述】:

这就是我所得到的,它只删除列表的最后一个元素。

delete([_], []).
delete([X|Xs], [X|Last]) :- delete(Xs, Last).

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

有点类似于子集。

【问题讨论】:

    标签: list prolog logic


    【解决方案1】:

    您可以改进您的定义,避免不必要的选择点,方法是将其重写为:

    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] ? 
    ...
    

    【讨论】:

      【解决方案2】:

      可能是:

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

      【讨论】:

      • 漂亮而紧凑,但与 OP 代码有相同的问题:在 (+,-) 模式下调用时会留下虚假的选择点。
      猜你喜欢
      • 1970-01-01
      • 2015-04-24
      • 2012-06-13
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 2016-02-26
      相关资源
      最近更新 更多