我无法理解为什么我的函数在Prolog崩溃之前循环:
isTerminalRow(_,_,_,Count,10):-
Count > 4.
isTerminalRow(B,A,Index,Count,Move):-
checkValue(B,Index,A,V),
C2 is V + Count,
I2 is Index + 1,
Move1 is Move + 1,
isTerminalRow(B,A,I2,C2,Move1).
checkValue(B,Index,A,V):-
getE(Index,B,Value),
Value = A, V is 1
; V is 0.
getE(1,[H|_],H). % get nth element
getE(I,[_|T],L):-
I1 is I - 1,
getE(I1,T,L).
电话是
?- isTerminalRow([w,w,w,w,w,e,e,e,e,e],w,1,0,10).
答案 0 :(得分:1)
当您致电is
时,Move
次使用Count
和isTerminalRow
就会被取消。对于您要触发的第一个条款,当Count
大于4时,Move
必须为10.
如果没有,第一个条款不会触发;它甚至没有机会考虑Count
的值,并且继续执行第二个子句,它只是循环(如果checkValue/4
没有失败,那就是)
您的终止条件过于具体。机会是,它们永远不会被满足。
您的评论中的 更新:,您的查询中Move
已经是10,Count
为0,因此第一个条款失败。在此之后,Move
始终大于10,因为您使用Move1 is Move + 1
递增它,并且Count > 4
甚至无法对其进行测试。