Prolog SWI没有显示结果

Prolog SWI doesn't show result

我有这段代码,当我尝试使用SWI运行它时,什么也没显示。无限循环,也许。我不会解释我的处理方式,因为我不得不说很多话。只想知道这是怎么回事。我以这种方式运行它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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.


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

这是一种不必要的左递归...
我认为您应该像

这样重写递归调用

1
2
...
mesmaLinhaEste_58(Atual,Objetivo,R,Lista).

我还将合并第三和第四子句,因为重复测试estaEste58(Atual,P)没有意义,并且可以将P限制在Lista而不调用append:

1
2
3
4
5
mesmaLinhaEste_58(Atual,Objetivo,[P|R],Lista):-
    (  estaEste58(Atual,P)
    -> mesmaLinhaEste_58(Atual,Objetivo,R,[P|Lista])
    ;  mesmaLinhaEste_58(Atual,Objetivo,R,Lista)
    ).