0
これは、座標ex:[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)]
おかげ
ここでは目に見えないものがたくさんあります( 'divideIzq/3'?divideDer/3'''' resuelveSkyline/2'?)。あなたはそれがどのようにループするかを見るために 'trace 'をやってみましたか? – lurker
[MCVE](http://stackoverflow.com/help/mcve)をご覧ください。 – false
再帰はどこですか? – false