problem:4x4magicSquare in prolog



:-dynamic zerlegung/5.
%Zerlegung(C,N1,N2,N3,N4).
:-dynamic counter/1.
%counter(_C).
return.

init:-asserta(counter(0)),zerlegen(1,2).
zerlegen(17,_N).
zerlegen(N1,N2):-
N1=16,N2=16->
return;
not(N1=17),%wenn N1=17,dann endet
N2=17->
_N1 is N1+1,zerlegen(_N1,1);%wenn N2=17,dann
++N1,weite
N1 = N2->
_N2 is
N2+1,zerlegen(N1,_N2);%第一二个数不能相等
17 is N1+N2->
zerlegen_besonder(N1,N2);%wenn N1+N2=17,muss besonder
handeln
zerlegen_ander(N1,N2,1).

zerlegen_ander(N1,N2,N3):-
(N3=N1;N3=N2)-> %N3 和前两位不等
_N3 is N3+1,zerlegen_ander(N1,N2,_N3);
_N4 is 34-N1-N2-N3,
(_N4=N1;_N4=N2)-> %N4 和前两位不等
_N3 is N3+1,zerlegen_ander(N1,N2,_N3);
_N4 is 34-N1-N2-N3,
N3 >= _N4->
%N3大于等于N4,则寻找下一个N2
_N2 is N2+1,
zerlegen(N1,_N2);
_N4 is 34-N1-N2-N3,
_N4 >=1,_N4 =< 16-> %N4在1和16之间
erzeugen(N1,N2,N3,_N4),
_N3 is N3+1,zerlegen_ander(N1,N2,_N3);
_N3 is N3+1,zerlegen_ander(N1,N2,_N3).



zerlegen_besonder(N1,N2):-
(N1=1;N2=1)->
gleichhandel(N1,N2,2);
gleichhandel(N1,N2,1).

gleichhandel(N1,N2,8):-
(N1=8;N2=8)->
_N2 is N2+1,zerlegen(N1,_N2);
erzeugen(N1,N2,8,9),_N2 is
N2+1,zerlegen(N1,_N2).%如果此处不做处理,会导致循环.
gleichhandel(N1,N2,17):-_N2 is N2+1,zerlegen(N1,_N2).
%gleichhandel(1,16,16):-zerlegen(2,1).
gleichhandel(N1,N2,N3):-% N1+N2=17 ,und N1 oder N2 ist nicht gleich 1
not(N3=17),
not(N3=8),
(N3=N1;N3=N2)->
%如果N3等于前两位中的一位,则加1,进行下一个.
_N3 is N3+1,
gleichhandel(N1,N2,_N3);
_N3 is N3+1, %
果N3不等于前两位中的任何一位,则加一个zerlegung,进行下一个
_N4 is 17-N3,
erzeugen(N1,N2,N3,_N4),
gleichhandel(N1,N2,_N3).


erzeugen(N1,N2,N3,N4):-%产生以N1,N2开头的满足和为34的排列
counter(_C),
retract(counter(_)),
_Count is _C+2,
asserta(counter(_Count)),
_C1 is _C+1,
assertz(zerlegung(_C1,N1,N2,N3,N4)),

%nl,write('erzeugen'),write(_C1),write(':'),write(N1),tab(3),write(N2),tab(3),write(N3),tab(3),write(N4),
_C2 is _C+2,

%nl,write('erzeugen'),write(_C2),write(':'),write(N1),tab(3),write(N2),tab(3),write(N4),tab(3),write(N3),

assertz(zerlegung(_C2,N1,N2,N4,N3)).%nl,write('erzeugen2').

test_zerlegen:-retractall(zerlegung(_,_,_,_,_)),init,counter(_C),write('counter
='),write(_C).



/*---------------------------------------------------------------------------------------------
zu konstruktieren die Matrix
-----------------------------------------------------------------------------------------------*/

:-dynamic casenummber/1.
casenummber(0).


test_matrix:-
zerlegung(_,A11,A12,A13,A14),%line1
zerlegung(_,A21,A22,A23,A24),
not(member(A21,[A11,A12,A13,A14])), %line2
not(member(A22,[A11,A12,A13,A14])),
not(member(A23,[A11,A12,A13,A14])),
not(member(A24,[A11,A12,A13,A14])),
zerlegung(_,A31,A32,A33,A34), %line3
not(member(A31,[A11,A12,A13,A14,A21,A22,A23,A24])),
not(member(A32,[A11,A12,A13,A14,A21,A22,A23,A24])),
not(member(A33,[A11,A12,A13,A14,A21,A22,A23,A24])),
not(member(A34,[A11,A12,A13,A14,A21,A22,A23,A24])),
A41 is 34-A11-A21-A31,%line 4
A42 is 34-A12-A22-A32,
A43 is 34-A13-A23-A33,
A44 is 34-A14-A24-A34,

not(member(A41,[A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34])),

not(member(A42,[A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34])),

not(member(A43,[A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34])),

not(member(A44,[A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34])),
A41>0,A41<17, A41\==A42,A41\==A43,A41\==A44,
A42>0,A42<17, A42\==A43,A42\==A44,
A43>0,A43<17, A43\==A44,
A44>0,A44<17,
34 is A41+A42+A43+A44,
34 is A11+A22+A33+A44,
34 is A14+A23+A32+A41,
nl,write('['),

write(A11),write(','),write(A12),write(','),write(A13),write(','),write(A14),write(','),

write(A21),write(','),write(A22),write(','),write(A23),write(','),write(A24),write(','),

write(A31),write(','),write(A32),write(','),write(A33),write(','),write(A34),write(','),

write(A41),write(','),write(A42),write(','),write(A43),write(','),write(A44),
write(']'),
/* nl,nl,

write(A11),tab(3),write(A12),tab(3),write(A13),tab(3),write(A14),nl,nl,

write(A21),tab(3),write(A22),tab(3),write(A23),tab(3),write(A24),nl,nl,

write(A31),tab(3),write(A32),tab(3),write(A33),tab(3),write(A34),nl,nl,

write(A41),tab(3),write(A42),tab(3),write(A43),tab(3),write(A44),nl,nl,
nl, */
casenummber(_X),
_Num is _X+1,
retract(casenummber(_)),asserta(casenummber(_Num)),
fail.

what`s the problem with it?it `s running so slowly?

.