2016-03-22 54 views
0

Bu, aşağıdaki gibi bir koordinat listesi alan bir programdır: [e (1,2,3), e (4,5,6)]. Dinamikleri bölmek, bölmek ve fethetmek, listeyi koordinatlarını bir değerler kümesinde dönüştürdüğünüzde, listeyi
ve yarısı yinelemeli olarak, olarak ayırır. Sorun, sonsuz bir döngüde olmasıdır.prolog sonsuz döngü bilinmiyor

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

Örnek:

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

Teşekkür

+2

Burada görünmeyen bir çok şey var ('divideIzq/3'? DivideDer/3'? ResuelveSkyline/2'?). Nasıl çalıştığını görmek için bir 'trace' yapmayı denediniz mi? – lurker

+1

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

+0

Özyineleme nerede? – false

cevap

0

Hazır!

sorun ilk satırda geçerli:

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

ağaç gerekli kesilir.

Yardımın için teşekkürler!