我正在尝试编写一个谓词,以便在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递归地建立一个列表?
发布于 2013-06-02 08:40:21
首先,它是而不是函数。它是谓词,他们只会说,什么是真的,什么是假的,以及在什么条件下。
下面是你的程序:
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”,而是在假设X是有序列表的情况下,“如果Y是一个没有重复的列表X,那么这个事实将是真的”。注意,我们不会谈论“返回值”之类的东西。
第一行说明,空列表是一个没有重复的空列表。很明显,对吧?
下一行基本上是相同的,但只有一个元素。
第三行告诉我们,如果我们有列表,它由两个相同的元素H和尾部T组成,那么这个列表(H,H|T)的有序列表是相同的,因为它只有一个元素H。这就是为什么我们在两个谓词中都有"M“没有修改。
我希望你能自己分析最后一个谓词,Prolog并不像它看起来那么难。祝好运!
https://stackoverflow.com/questions/16878008
复制相似问题