Syntax Prolog删除所有重复项函数

Syntax Prolog删除所有重复项函数,syntax,prolog,Syntax,Prolog,我有一个在理论上应该有效的代码,但是它没有。我有一个remove函数,它可以删除所有出现的列表并返回新列表。我在每一步调用它并传递新列表,同时添加头部。这是我的代码,返回false remv(a, [], []). remv(a, [H|T], X) :- H=a, remv(a, T, X). remv(a, [H|T],[H|X]):- remv(a, T, X). %4 remvdub([],[]). remvdub([H|T],[H|X]) :- remvdub(remv(H,T,A)

我有一个在理论上应该有效的代码,但是它没有。我有一个remove函数,它可以删除所有出现的列表并返回新列表。我在每一步调用它并传递新列表,同时添加头部。这是我的代码,返回false

remv(a, [], []).
remv(a, [H|T], X) :- H=a, remv(a, T, X).
remv(a, [H|T],[H|X]):- remv(a, T, X).

%4
remvdub([],[]).
remvdub([H|T],[H|X]) :- remvdub(remv(H,T,A),X).

有人能解释一下问题是什么吗?

您将
rev
视为一个函数,希望它“返回”一个已删除的列表。事实上,它将
A
绑定到这样一个列表,因此
remvdub
的第一个参数应该是这个。即:

remvdub([H|T],[H|X]) :- remv(H,T,A), remvdub(A,X).

好吧,我想我还是很困惑。那么,如果我通过a,我将如何使用头部和尾部?感谢您对btwProlog使用谓词而不是函数的响应。谓词表示关系,并且总是true或false。您假设
remv/3
返回一个列表,但事实并非如此。您应该尝试修改第二条规则:
remvdub([H | T],[H | X]):-remv(H,T,T2),remvdub(T2,X)。
。规则具有以下含义:对于列表
[H | T]
,如果列表
T2
T
而没有出现
H
X
是列表
T2
而没有任何双精度,则列表
[H | X]
是没有双精度的初始列表。该行仍然没有返回正确答案。我知道你做了些什么,但它还是回来了。由于某些原因,它不起作用。您还有其他问题:您正在使用atom
a
而不是第一个谓词中的变量:
remv/3
。并且您应该在
H=a
之后的第一个规则中使用切割运算符(
),这样您就不会得到错误的解决方案。