2016-03-22 14 views
0

Dies ist ein Programm, das eine Liste von Koordinaten erhält: [e (1,2,3), e (4,5,6)]. Machen Sie die Dynamik, teilen und erobern, trennt die Liste in zwei Hälften
und halb rekursiv, Wenn Sie eine haben, transformiert die Koordinaten in einem Tupel von Werten. Das Problem ist, dass es in einer Endlosschleife ist.Prolog Endlosschleife unbekannt

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). 

Beispiel:

% 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)] 

Dank

+2

Hier passiert viel, was nicht sichtbar ist ('dividIzq/3'?' DivideDer/3'? 'ResuelveSkyline/2'?). Haben Sie versucht, eine "Trace" zu machen, um zu sehen, wie es sich wiederholt? – lurker

+1

[MCVE] (http://stackoverflow.com/help/mcve), bitte. – false

+0

Wo ist die Rekursion? – false

Antwort

0

Ready!

Das Problem ist in der ersten Zeile:

resuelve([X],D):-tuples([X],D) , !. 

ist notwendig Schnitt der Baum.

Danke für die Hilfe!