Recursion 为什么我的函数在Prolog崩溃之前一直循环

Recursion 为什么我的函数在Prolog崩溃之前一直循环,recursion,prolog,Recursion,Prolog,在Prolog崩溃之前,我似乎无法理解为什么我的函数会循环: isTerminalRow(u,u,u,Count,10):- 计数>4。 isTerminalRow(B、A、索引、计数、移动):- 校验值(B,索引,A,V), C2是V+计数, I2是指数+1, Move1是Move+1, isTerminalRow(B、A、I2、C2、Move1)。 校验值(B、索引、A、V):- getE(索引,B,值), 值=A,V为1 ; V是0。 getE(1[H | | uh],H)。%获取第n个元

在Prolog崩溃之前,我似乎无法理解为什么我的函数会循环:

isTerminalRow(u,u,u,Count,10):-
计数>4。
isTerminalRow(B、A、索引、计数、移动):-
校验值(B,索引,A,V),
C2是V+计数,
I2是指数+1,
Move1是Move+1,
isTerminalRow(B、A、I2、C2、Move1)。
校验值(B、索引、A、V):-
getE(索引,B,值),
值=A,V为1
; V是0。
getE(1[H | | uh],H)。%获取第n个元素
getE(I,[u124; T],L):-
I1是I-1,
getE(I1,T,L)。
电话是

?-  isTerminalRow([w,w,w,w,w,e,e,e,e,e],w,1,0,10).

从您的
is
使用中,当您调用
isTerminalRow
时,
Move
Count
将被接地。要激发第一个子句,当
Count
大于4时,
Move
必须为10

如果没有,则第一条不点火;它甚至没有机会考虑<代码>计数< /COD>的值,并且继续执行第二个子句,它只循环(如果<代码>校验值/ 4 < /代码>不会失败,即)。 你的终止条件太具体了。很有可能,他们从未见过面


更新:根据您的注释,
Move
在您的查询中已经是10,并且
Count
是0,因此第一个子句失败。在这之后,
Move
总是大于10,因为你用
Move1是Move+1
来增加它,而且
Count>4
永远都不可能被测试。

([list],'charachter',列表中charachter occurrence的计数器,限制移动)至于chechvalue,如果列表中的字符数等于字符数A,则返回V处的数字1,如果不等于,则返回0。对不起,这是我第一次在这个网站上询问这是一个示例isTerminalRow([w,w,w,w,w,w,r,r,r,r,r,r],1,0,1)。请显示
checkValue/4
的定义。它影响了计数器的值:<代码> istrmin行/ 5 < /代码>用作终止的标准。@ Lurkor如果<代码>移动< /COD>不是10,它甚至没有机会考虑终止。@ Welys Stase在1开始,在每次递归调用时增加到1,到<代码> istrmin行/5 < /C>。9次迭代后,它不会达到10次吗?当然,当计数超过4时,它必须这样做。如果它这样做的更快,那么它将循环。prolog不曾尝试匹配任何时间吗?我采取行动增加每一个时间?我犯了一个错误,这是函数isTerminalRow([w,w,w,w,w,e,e,e,e],w,1,0,10)的更好的表示形式。正如您所看到的,我想知道w是否发生了5次或更长时间,我们不知道您的checkValue在做什么。但是当Move达到10,并且Count不大于4时,执行将继续,此后Move将不再是10,因此它将永远不会终止。。。。因为在尝试将计数与4进行比较之前,Move将匹配等于10。checkValue(B,Index,A,V):-getE(Index,B,Value),Value=A,V是1;V是0。这就是check value的作用,对于函数getE,它看起来像这个getE(1,[H |,H)。%获取第n个元素getE(I,[| T],L):-I1是I-1,getE(I1,T,L)。@潜伏者在我之前的评论中指出,
Move
在最初的调用中已经是10了!