Prolog SWI没有显示结果

时间:2015-11-19 22:43:15

标签: prolog

我有这个代码,当我尝试使用SWI运行它时,没有显示任何内容。也许是无限循环。我不会解释我对此做了什么,因为我不得不说很多东西。只是想知道它有什么问题。我以这种方式运行它:

mesmaLinhaEste_58((0,4),(4,4),[(1,3),(1,2),(0,0),(2,0),(3,2),(3,3),(4,0)],[]).

mesmaLinhaEste_58((X,_),(Xx,_),[],Lista):-
    N is Xx - X,
    length(Lista,Nn),
    Nn =:= N.

mesmaLinhaEste_58(Atual,Objetivo,[P|R],Lista):-
    estaEste58(Atual,P),
    append([P],Lista,NList),
    mesmaLinhaEste_58(Atual,Objetivo,R,NList).

mesmaLinhaEste_58(Atual,Objetivo,[P|R],Lista):-
     \+estaEste58(Atual,P),
     mesmaLinhaEste_58(Atual,Objetivo,[R],Lista).

estaEste58((X,Y),(Xx,Yy)):-
    Xx > X,
    Yy =:= Y.

1 个答案:

答案 0 :(得分:1)

\+estaEste58(Atual,P)时,mesmaLinhaEste_58 / 4的第四个子句继续构建嵌套尾部结构,如[[[[... R ...]]]]。

这是一种过度的左递归...... 我认为你应该重写像

这样的递归调用
...
mesmaLinhaEste_58(Atual,Objetivo,R,Lista).

我还会合并第三和第四个条款,因为重复测试estaEste58(Atual,P)是没有意义的,并且会“反对”。 P到Lista没有调用追加:

mesmaLinhaEste_58(Atual,Objetivo,[P|R],Lista):-
    (  estaEste58(Atual,P)
    -> mesmaLinhaEste_58(Atual,Objetivo,R,[P|Lista])
    ;  mesmaLinhaEste_58(Atual,Objetivo,R,Lista)
    ).