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

时间:2017-05-12 17:36:26

标签: recursion prolog

我无法理解为什么我的函数在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).

1 个答案:

答案 0 :(得分:1)

当您致电is时,Move次使用CountisTerminalRow就会被取消。对于您要触发的第一个条款,当Count大于4时,Move必须为10.

如果没有,第一个条款不会触发;它甚至没有机会考虑Count的值,并且继续执行第二个子句,它只是循环(如果checkValue/4没有失败,那就是)

您的终止条件过于具体。机会是,它们永远不会被满足。

您的评论中的

更新:,您的查询中Move已经是10,Count为0,因此第一个条款失败。在此之后,Move始终大于10,因为您使用Move1 is Move + 1递增它,并且Count > 4甚至无法对其进行测试。