3

这是我的知识库:

a(b,c). 
a(X,Y):-a(Y,X). 

这是我的查询:a(c,b).

我正在使用 SWI-Prolog。我认为这个查询会导致程序打印“true”。但是,如果我按分号,它会打印“真”并继续打印真......直到永远。

为什么停不下来?

我的想法:首先,X 绑定到 b,Y 绑定到 c。然后,Prolog 测试 a(b,c) 并​​发现这是真的。因此,a(c,b) 也为真,SWI-Prolog 应该打印一次为真。但是,由于只要我一直按那个分号,它就会永远打印出来,这让我认为递归正在发生。这发生在哪里?帮助!

编辑:更具体地说,我的问题是为什么程序在每个“真”之后暂停并等待我按分号或另一个键而不是完成?如果我有两个谓词 human(socrates) 和 mortal(X):-humans(X),则对查询 mortal(socrates) 的响应将是一个“真”。(对不起,如果我没有在上面说清楚。)

4

1 回答 1

2

Prolog 首先a(c,b)通过第二条规则证明,然后是第一条规则。a(c,b)然后,它通过对第二条规则和第一条规则的三次调用来证明。然后,通过对第二条规则的五次调用,等等。Prolog 的推理算法是没有封闭集的深度优先搜索,即它不跟踪它已经证明的内容,并且很乐意再次证明它。

如果您不想要这种行为,您应该将规则重写为,例如,

a_fact(b, c).
a(X, Y) :- a_fact(X, Y).
a(Y, X) :- a_fact(X, Y).

...或使用某种表格执行。不过,我不认为 SWI-Prolog 支持表格。

于 2012-05-15T21:59:31.187 回答