我有这个代码,当我尝试使用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.
答案 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)
).