Recursion 为什么我的函数在Prolog崩溃之前一直循环
在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个元
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,它甚至没有机会考虑终止。@ WelysMove
在最初的调用中已经是10了!