List 在Prolog中正确建立列表

List 在Prolog中正确建立列表,list,recursion,prolog,List,Recursion,Prolog,我正试图编写一个谓词来从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],

我正试图编写一个谓词来从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中递归地建立一个列表吗?

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

以下是您的节目:

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,这一事实将是真实的”。注意,我们不谈论“返回值”之类的东西

第一行表示,空列表是一个没有空列表副本的列表。很明显,对吧

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

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


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

首先,它不是功能。 这是谓词,他们只说,什么是真的,什么不是,在什么条件下

以下是您的节目:

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,这一事实将是真实的”。注意,我们不谈论“返回值”之类的东西

第一行表示,空列表是一个没有空列表副本的列表。很明显,对吧

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

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


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

如果您使用
dif/2
而不是
(\=)/2
,您将得到一个更通用的程序,该程序也可以用于正确处理诸如
?-rdup([X,Y,Z],Ls)之类的查询。
。如果您使用
dif/2
而不是
(\=)/2
,则,您可以得到一个更通用的程序,该程序也可以用于正确地执行WSER查询,如
?-rdup([X,Y,Z],Ls)。