【问题标题】:Need to remove last but one element in prolog需要删除序言中的最后一个元素
【发布时间】:2023-03-14 23:02:01
【问题描述】:

我一直在尝试在 prolog 中做不同的事情,并想删除最后一个元素,但我不知道如何。

这是我的代码:

without(X,[X,_],[]).
without(X,[K|Xs],[K|AlmoustLast]) :-
    without(X,Xs,AlmoustLast).

这是我在编译时收到的。

?-  without(X,[1,2,3,4,5],A).
X = 4,
A = [1, 2, 3] .

当我想要达到的答案是 A = [1,2,3,5]。

【问题讨论】:

  • without(1,[1,2],L)

标签: list prolog


【解决方案1】:

你几乎是对的

without(X,[X,_],[]).
without(X,[K|Xs],[K|AlmoustLast]) :-
    without(X,Xs,AlmoustLast).

其实如下

without(X,[X,Y],[Y]).
without(X,[K|Xs],[K|AlmostLast]) :-
    without(X,Xs,AlmostLast).

给你

?- without(X,[1,2,3,4,5],A).

A = [1,2,3,5]
X = 4

【讨论】:

  • 谢谢!事实上,当我计算最后两个数字的总和时,我使用相同的东西(sumf(X,Y,[X,Y],_)。)但我没想过在这里使用它......
【解决方案2】:

Rafalon 给出了更正的结果,我将对此进行解释。

你的基本案例规则逻辑有缺陷:

without(X,[X,_],[]).

您的意思是,如果您从[X,_] 中删除最后一个,那么您将获得元素X 并列出[],但这听起来不合逻辑,是吗? _ 怎么了?你在这里使用了一个匿名变量,这意味着你不关心它,但你真的很关心!正如 Rafalon 所指出的,这条规则应该是:

without(X, [X,Y], [Y]).

所以列表[X, Y] 中的最后一个为您提供元素X 和列表[Y]

【讨论】:

  • 没错,我可以而且我应该解释一下。 +1 供您解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 2020-02-19
相关资源
最近更新 更多