【问题标题】:Using Prolog: Given a list check if the first element of the list equals the last element使用 Prolog:给定一个列表,检查列表的第一个元素是否等于最后一个元素
【发布时间】:2013-07-19 19:22:20
【问题描述】:

使用 prolog,我必须创建一个规则,当给定一个列表时,该规则确定列表的第一个元素是否等于列表的最后一个元素。以下是我的想法。

The Base Cases:
1) If The Parameter Is Not A List: Return False
2) If The Parameter Is A List But Empty: Return False 
3) If The Parameter Is A List But Has One Element: Return False

The Recursive Step:
Recursively Going Through The List Getting The 
First Element And TheLast Element Then Compare

fela() :- false.                             <-- Base Case One
fela([]):-false.                             <-- Base Case Two
fela([H]):-false.                            <-- Base Case Three
fela([H|T]):- H1 is H, H1 == T, fela(T,H1).  <-- Recursive Step

Bellow 是 First、Last、Member 的函数

first(F, [F|_]).
last(L, [H|T]) :- last(L, T).

member(X, [X|_]).
member(X, [_|T]) :- member(X, T).

我的递归步骤有问题,我不确定如何存储第一个元素,并遍历列表并获取最后一个元素,然后比较结果以获得真/假答案。谁能帮帮我

谢谢,

埃里克:)

【问题讨论】:

  • 因此,您应该接受对您最有帮助的答案之一。 :)

标签: list recursion prolog


【解决方案1】:

这是一个简单的:

fela(L) :- first(E, L), last(E, L).

凝视一分钟,让它真正沉入其中。

实际上,这是正确的,但您的last/2 不是,只是简单地遍历列表而没有成功的基本情况。正确的last/2 如下所示:

last(L, [L]).
last(E, [_|L]) :- last(E, L).

我在您的案例分析中看到了很多令人困惑的想法。一方面,在 Prolog 中,您没有明确返回 true 和 false。您只需匹配您匹配的内容,剩下的就是失败。在处理列表时,您会自动继承空列表的基本情况和元素的归纳情况以及列表的其余部分。这不足以从头开始实现fela/1,因为您无法记住您的第一个元素是什么。因此,如果您想从头开始构建它,您将需要一个辅助谓词,以便您可以继续传递第一个元素。它看起来像这样:

fela([H|T]) :- fela(H, T).

fela(First, [First]).
fela(First, [_|Xs]) :- fela(First, Xs).

请注意,我们保留了对一种基本情况的分析,一种用于处理列表的归纳情况。这是处理递归数据结构时的常见情况。 first/2 是您不遵守规则的一个很好的例子,因为您对其中一种情况不感兴趣。从first/2last/2 构建谓词可以让您完全摆脱案例分析问题,并且(在我看来)在实践中更经常发生这种情况。

现在我想在这里挑出你的一些想法,以供进一步评论。首先,H1 is H 绝对不是你想要的。 is/2 专门用于减少算术表达式。您将始终在左侧有一个变量,在右侧有一个表达式,否则它没有意义。您正在尝试在这里进行某种赋值,但即使 H1 = H 在这里也无济于事,因为 Prolog 有变量,it does not have assignables

H1 is H, H1 == T 难以置信地说,H 既是列表的头部,又相当于尾部。这永远不可能,因为尾部是一个列表,头部是一个元素。即使你可以创造一个真实的情况,这个谓词肯定不会有趣。你这里的递归步骤真的很奇怪。

您的案例分析的另一个问题,案例#3 应该是正确的。对于[X]X 既是列表的第一个元素也是最后一个元素,因此fela/1 对于所有单元素列表都应该是微不足道的。

我会提倡额外的研究。我认为你有一些奇怪的想法,多读一些可能会纠正。

【讨论】:

  • 非常感谢您的帮助,我对 prolog 有点不放心,这是我第一次使用该语言。你让我明白了很多事情。再次感谢您的帮助。
  • @ErikSmiley 很高兴。赞成/接受? :) 我想你会没事的,坚持下去。
  • OP 还不能投票给你,Daniel。 :)(他们需要 15 个代表)。感谢 Robert Harper 博客的链接。
  • @WillNess 时间太久我不记得解除限制的顺序了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 2021-08-24
  • 2017-03-15
相关资源
最近更新 更多