prolog无限循环未知

prolog无限循环未知,prolog,infinite-loop,Prolog,Infinite Loop,这是一个接收坐标列表的程序,例如:[e(1,2,3),e(4,5,6)]。制定动态,分而治之,将列表一分为二 半递归地, 当你有一个转换值元组中的坐标。 问题是它处于一个无限循环中 resuelve([X],D):-tuples([X],D). resuelve(Xs,D):- length(Xs,L), %length of the list divideIzq(Xs,L,Xa), %divide the left half divideDer(Xs,L,X

这是一个接收坐标列表的程序,例如:[e(1,2,3),e(4,5,6)]。制定动态,分而治之,将列表一分为二
半递归地, 当你有一个转换值元组中的坐标。 问题是它处于一个无限循环中

resuelve([X],D):-tuples([X],D).   
resuelve(Xs,D):-
     length(Xs,L), %length of the list
     divideIzq(Xs,L,Xa), %divide the left half
     divideDer(Xs,L,Xb), %divide the rigth half
     resuelve(Xa,D1), %left recursively
     resuelve(Xb,D2), %rigth recursively
     append_(D1,D2,D).    %concatenate tuples result

%function that transforms the coordinates
tuples([e(X,Y,Z)],D) :-  D = [c(X,Z),c(Y,0)].

divideIzq(Xs,L1,D):-
    L is div(L1, 2),
    take(L,Xs,D).


divideDer(Xs,L1,D):-  
    L is div(L1, 2),
    drop(L,Xs,D).

drop(0,LastElements,LastElements) :- !.
drop(N,[_|Tail],LastElements) :-
  N > 0,
  N1 is N  - 1,
  drop(N1,Tail,LastElements).


take(0, _, []) :- !.
take(N, [H|TA], [H|TB]) :-
  N > 0,
  N2 is N - 1,
  take(N2, TA, TB).

append_([], Cs, Cs).
append_([A|As],Bs,[A|Cs]):-
          append_(As, Bs, Cs).
例如:

% resuelve([e(3,6,5),e(4,9,3),e(8,11,2),e(10,12,4)], D).
% D = [c(3, 5), c(6, 0), c(4, 3), c(9, 0), c(8, 2), c(11, 0), c(10, 4), c(12, 0)] 
谢谢

准备好了

问题在第一行:

resuelve([X],D):-tuples([X],D) , !. 
有必要砍树


谢谢你的帮助

这里发生了很多不可见的事情(
divideIzq/3
divideDer/3
resuelskyline/2
)。你试过做
trace
来看看它是如何循环的吗?递归在哪里?如何定义
take/3
drop/3
?您使用的是什么Prolog解释器?如果您对该目标进行跟踪,然后按“U”(向上)以获得第一个答案,然后尝试重做,您可以看到
divideIzq([e(10,12,4)],_G1234)
中存在一个问题,似乎该子句不能正确处理列表中的一个元素。。。?