Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 带和条件的无限递归错误?_Prolog - Fatal编程技术网

Prolog 带和条件的无限递归错误?

Prolog 带和条件的无限递归错误?,prolog,Prolog,我的数据库中有以下事实和规则 above(b, a). above(c, b). above(d, c). above(X,Y):-above(X,Z),above(Z,Y). below(X,Y):- above(Y,X). 这与积极案例的预期效果一样,因此如果我质疑 C,a 返回值为True。但是,当我尝试下面的查询时,预期为False A,c 我收到了留言 Stack sizes: local: 0.2Gb, global: 16Kb, trail: 3Kb Stack dept

我的数据库中有以下事实和规则

above(b, a).
above(c, b).
above(d, c).
above(X,Y):-above(X,Z),above(Z,Y).
below(X,Y):- above(Y,X).
这与积极案例的预期效果一样,因此如果我质疑

C,a

返回值为True。但是,当我尝试下面的查询时,预期为False

A,c

我收到了留言

  Stack sizes: local: 0.2Gb, global: 16Kb, trail: 3Kb
  Stack depth: 2,839,964, last-call: 0%, Choice points: 12
  Probable infinite recursion (cycle):
    [2,839,964] above(a, _1394)
    [2,839,963] above(a, _1420)
我的理解是,由于没有与a,X关联的atom X,并且该查询确实返回False,因此我的规则的第一个条件将不满足,这将足以得出查询为False的结论。情况似乎并非如此。我如何设置规则,使其在仍按预期用于阳性案例的情况下返回False?

因为上述a,X与前三条事实不匹配,因此进入第四条,即上述X,Y:-。。。。在这之后,你要做的第一件事就是在x,Z上面,也就是说,在a,Z上面。然后尝试前三个子句,失败了,然后它又到了x,Y上面。这是无限递归的来源

解决方案是通过重命名其中一个来将规则与事实分开,例如:

is_above(b, a).
is_above(c, b).
is_above(d, c).

above(X,Y):- is_above(X,Z), above(Z,Y).
below(X,Y):- above(Y,X).

这样,您就不会有无界递归,在它递归之前,您必须在上面取得一些进展。

谢谢您的解释。你的建议奏效了,我只需确保我保留了上述事实以及上述信息。很高兴能提供帮助,希望它有意义!