我正在尝试编写一个谓词来从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中递归建立一个列表?
答案 0 :(得分: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并不像它看起来那么难。祝你好运!