Prolog 删除列表中的X元素

Prolog 删除列表中的X元素,prolog,Prolog,我有以下知识库 eliminate(X,[X|T],T). eliminate(X,[H|T],[H|T2]) :- eliminate(X,T,T2). 我必须自己做一个例子的运行过程,没有解释器(像一棵树) 例如,如果我发布查询:消除(3[1,2,3,4,5],Y) 首先使用第一个事实,我们统一了X=3,第二个元素是一个列表([1,2,3,4,5]),我们试图用X统一1,但是我们不能,因为X现在是3,所以它失败了,我们尝试使用第二个规则 eliminate(3,[1,2,3,4,5],Y)

我有以下知识库

eliminate(X,[X|T],T).
eliminate(X,[H|T],[H|T2]) :- eliminate(X,T,T2).
我必须自己做一个例子的运行过程,没有解释器(像一棵树)

例如,如果我发布查询:
消除(3[1,2,3,4,5],Y)

首先使用第一个事实,我们统一了X=3,第二个元素是一个列表([1,2,3,4,5]),我们试图用X统一1,但是我们不能,因为X现在是3,所以它失败了,我们尝试使用第二个规则

eliminate(3,[1,2,3,4,5],Y).
x = 3, H = 1, T = [2,3,4,5], H = Y , T2 = []
这是我不确定是否正确的部分。我不知道为什么
T2
必须与
[]
统一

现在使用第二条规则的body子句:
消除(X,T,T2)
,我有:

eliminate(3,[2,3,4,5],[])
x = 3, (here it fails again, so i have to use the second rule)
eliminate(3,[2,3,4,5],[])
x = 3, H = 2, T = [3,4,5], H = Y, T2 =[] ??? is T2 null again???

T2在第一次应用第二条规则时不与
[]
统一。解析知道它是一个列表(因为它位于
[X | Y]
构造的右侧),但还不知道它的值。为了找到它的值,它将首先计算规则,该规则将为T2找到一个值,然后将该值与您在查询中运行的
Y
相统一

在您的示例中,运行查询
消除(3[1,2,3,4,5],Y)。
将执行以下操作:

Call eliminate(3, [1, 2, 3, 4, 5], Y)
2nd rule: X=3, H=1, T=[2,3,4,5], T2=?, Y=[H|?]
Call eliminate(3, [2, 3, 4, 5], ?)
2nd rule: X=3, H=2, T=[3,4,5], T2=??, Y=[H|??]
Call eliminate(3, [3, 4, 5], ??)
1st rule: ??=[4, 5]

Go back one step, using Y=[H|??], H=2 ??=[4,5]: Y = [2|[4,5]] = [2, 4, 5] = ?
Go back another step, using Y=[H|?], H=1, ?=[2, 4, 5]: Y = [1|[2, 4, 5]] = [1, 2, 4, 5]

我建议花些时间阅读Prolog学习资料中的重现章节。此外,要了解如何在实践中查看此执行以查看发生的情况,可以使用
跟踪。
“命令”或其他等效调试,请参阅有关调试程序的swi pl详细信息。

您需要在递归规则中添加目标
dif(X,H)
。它被称为“统一”,而不是“统一”@Merphy最后一个问题,关于这一步:第二条规则:X=3,H=1,T=[2,3,4,5],Y不应该是Y=[1,??@user3105533是的,但那是因为我们知道
H=1
。我只是没有在
Y
上执行统一,因为最初,
Y=[H |?]
,但你是对的,最终它将是
1