gpt4 book ai didi

list - 如何从Prolog中的列表中删除最后一个元素?

转载 作者:行者123 更新时间:2023-12-04 13:01:16 25 4
gpt4 key购买 nike

我处于以下情况:我有一个列表,我只想从中删除最后一个元素。

我已经实现了以下规则(效果不佳):

deleteLastElement([Only],WithoutLast) :-
!,
delete([Only],Only,WithoutLast).
deleteLastElement([_|Tail],WithoutLast) :-
!,
deleteLastElement(Tail,WithoutLast).

问题是当我调用它时,列表中的所有元素都被删除了,实际上如果我执行以下语句我得到:
[debug]  ?- deleteLastElement([a,b,c], List).
List = [].

查看跟踪我认为很清楚导致此问题的原因:
[trace]  ?- deleteLastElement([a,b], List).
Call: (7) deleteLastElement([a, b], _G396) ? creep
Call: (8) deleteLastElement([b], _G396) ? creep
Call: (9) lists:delete([b], b, _G396) ? creep
Exit: (9) lists:delete([b], b, []) ? creep
Exit: (8) deleteLastElement([b], []) ? creep
Exit: (7) deleteLastElement([a, b], []) ? creep
List = [].

当达到基本情况时, 没有最后 名单与 统一空列表 [] 并且当执行回溯时 没有最后 仍然是空列表。

这是不好的。

我正在考虑通过以下操作来实现它:
  • 在调用删除最后一个元素的谓词之前计算列表中元素的数量。
  • 递归迭代,每次递减元素个数的值
  • 如果元素数为 0,则表示这是最后一个元素,因此我将其从原始列表中删除

  • 但这在我看来不太清楚,也不太好,我会知道是否有针对此问题的声明式良好解决方案。

    最佳答案

    我觉得你的分析有点过于复杂。让我们从基本情况开始:

    without_last([_], []).

    当您到达最后一个元素时,结果应该是空列表。

    因此,归纳情况必须是我们不在最后一个元素的情况。在我将某个元素附加到任意长列表的情况下,没有最后一个元素的列表只是列表的尾部,没有最后一个元素,当前元素在前面。或者:
    without_last([X|Xs], [X|WithoutLast]) :- 
    without_last(Xs, WithoutLast).

    这适用于各个方向。
    ?- without_last([1,2,3,4], X).
    X = [1, 2, 3] ;
    false.

    ?- without_last([1,2], X).
    X = [1] .

    ?- without_last([1], X).
    X = [] ;
    false.

    ?- without_last([], X).
    false.

    ?- without_last(X, [1,2,3]).
    X = [1, 2, 3, _G294].

    ?- without_last([1,2,3,4], [1,2,3]).
    true.

    ?- without_last([1,2,3,X], [1,2,3]).
    true.

    关于list - 如何从Prolog中的列表中删除最后一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16174681/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com