Recursion 超过堆栈限制(0.2Gb)…可能无限递归(循环):

Recursion 超过堆栈限制(0.2Gb)…可能无限递归(循环):,recursion,stack,limit,infinite-loop,swi-prolog,Recursion,Stack,Limit,Infinite Loop,Swi Prolog,对Prolog来说很陌生,但我正在尝试实现一个上下文无关的语法,并且我在通过一个测试用例时遇到了一个问题 我试图改变规则的顺序,使其看起来在逻辑上更加正确,但我似乎无法获得一致的正确输出,并且继续得到相同的堆栈错误。我认为这与vp-->vp,np.是递归的有关,但如果是这样,为什么np-->np,pp.不也给我一个错误?我的代码如下: :- use_module(library(tabling)). :- table s/2. s --> np, vp. np --> det, n

对Prolog来说很陌生,但我正在尝试实现一个上下文无关的语法,并且我在通过一个测试用例时遇到了一个问题

我试图改变规则的顺序,使其看起来在逻辑上更加正确,但我似乎无法获得一致的正确输出,并且继续得到相同的堆栈错误。我认为这与
vp-->vp,np.
是递归的有关,但如果是这样,为什么
np-->np,pp.
不也给我一个错误?我的代码如下:

:- use_module(library(tabling)).
:- table s/2.

s --> np, vp.
np --> det, n.
np --> np, pp.
vp --> vp, pp.
vp --> v, np.
pp --> p, np.

det --> [the].
n --> [cop].
n --> [criminal].
n --> [street].
v --> [chased].

p --> [in].
p --> [by].
理想情况下,向查询询问此问题应返回true

$- s([the,cop,chased,the,criminal], []).
$- s([the, cop, the, criminal, chased], []).
问这个问题应该返回false

$- s([the,cop,chased,the,criminal], []).
$- s([the, cop, the, criminal, chased], []).
我两次都试过了,但他们都给了我同样的错误:

Stack limit (0.2Gb) exceeded
  Stack sizes: local: 0.2Gb, global: 22Kb, trail: 5Kb
  Stack depth: 1,561,893, last-call: 0%, Choice points: 1,561,869
  Probable infinite recursion (cycle):
    [1,561,893] vp([length:3], _1424)
    [1,561,892] vp([length:3], _1456)

任何反馈都将不胜感激

问题是您已经构建了一个。事实上,如果我们看看您定义的规则,我们会发现:

:- use_module(library(tabling)).
:- table s/2.

s --> np, vp.
np --> det, n.
np --> np, pp.
vp --> vp, pp.
vp --> v, np.
pp --> p, np.

det --> [the].
n --> [cop].
n --> [criminal].
n --> [street].
v --> [chased].

p --> [in].
p --> [by].
这样,我们确实可以获得预期的结果:

?- s([the,cop,chased,the,criminal], []).
true.

?- s([the, cop, the, criminal, chased], []).
false.

您使用的是
np-->np,pp
vp-->vp,pp
,因此您的语法是递归的(),这是一个问题。@anon请不要在有人回答问题30分钟后立即删除您的问题。这是一个很好的问题,保留它可以让回答者因为帮助你回答问题而获得信任。