消除列表中的X元素

时间:2014-09-30 01:10:55

标签: prolog

我有以下知识库

eliminate(X,[X|T],T).
eliminate(X,[H|T],[H|T2]) :- eliminate(X,T,T2).

我必须自己编写一个示例的运行过程,而不需要解释器(如树)。

例如,如果我发布查询:eliminate(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必须与[]统一。

现在使用第二条规则的主体条款:eliminate(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???

1 个答案:

答案 0 :(得分:0)

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

在您的示例中,运行查询eliminate(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学习源的复习章节。此外,要了解如何在实践中看到此执行情况以查看正在发生的情况,您可以使用trace."命令"或其他调试等效项,有关调试程序的swi-pl详细信息,请参阅this link