0

我正在尝试编写一个谓词来从 Prolog 中的有序列表中删除元素。这是家庭作业的一部分,我对 Prolog 的语义一般如何工作感到非常困惑。

当我尝试以下功能时,rdup([1,2], L).我得到了false. 我已经追踪了目标,看起来我不应该像我通过递归调用 rdup 来构建结果列表那样构建结果列表。我不确定我应该如何建立结果列表。这是功能:

rdup([],M).
rdup([X],[X]).
rdup([H1,H2|T], M) :- H1 \= H2, rdup(T, [M,H1,H2]).
rdup([H1,_|T], M) :- rdup(T, [M,H1]).

谁能告诉我我的推理哪里错了,或者应该如何在 Prolog 中递归地建立一个列表?

4

1 回答 1

3

首先,它不是函数。它是谓词,他们只说,什么是真的,什么不是,以及在什么条件下。

这是你的程序:

rdup([],[]).
rdup([X],[X]).
rdup([H,H|T], M) :- rdup([H|T], M).
rdup([H1,H2|T], [H1|M]) :- H1 \= H2, rdup([H2|T], M).

现在稍微解释一下。

首先,“rdup(X,Y)”是什么意思?它不是说“在 X 中获取有序列表,并在 Y 中放置不重复的列表 X”,而是说“如果 Y 是没有重复的列表 X,假设 X 是有序列表,这个事实将是正确的”。请注意,我们不谈论“返回值”或类似的东西。

第一行说,空列表是一个没有空列表重复项的列表。很明显,对吧?

下一行基本相同,但只有一个元素。

第三行说,如果我们有一个列表,它由两个相同的元素 H 和尾 T 组成,那么这个列表的有序列表 ([H,H|T]) 是相同的,因为它只有一个元素 H . 这就是为什么我们在两个谓词中都有未修饰的“M”。

我希望你自己分析最后一个谓词,Prolog 并不像看起来那么难。祝你好运!

于 2013-06-02T00:40:21.213 回答