Re: problem:4x4magicSquare in prolog




pls just give me a hand for correcting the follwing program: 4x4
magic square, output all results. however it must be done in about
10mins im computer.

i need too long time(2-3 hours) to run my program . there must be
something wrong inside.



% Author:
% Date: 2006-1-13
:-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),
N2=17->
_N1 is N1+1,zerlegen(_N1,1);
N1 = N2->
_N2 is N2+1,zerlegen(N1,_N2);
17 is N1+N2->
zerlegen_besonder(N1,N2);
zerlegen_ander(N1,N2,1).

zerlegen_ander(N1,N2,N3):-
(N3=N1;N3=N2)->
_N3 is N3+1,zerlegen_ander(N1,N2,_N3);
_N4 is 34-N1-N2-N3,
(_N4=N1;_N4=N2)->
_N3 is N3+1,zerlegen_ander(N1,N2,_N3);
_N4 is 34-N1-N2-N3,
N3 >= _N4->
_N2 is N2+1,
zerlegen(N1,_N2);
_N4 is 34-N1-N2-N3,
_N4 >=1,_N4 =< 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(N1,N2,N3):-
not(N3=17),
not(N3=8),
(N3=N1;N3=N2)->
_N3 is N3+1,
gleichhandel(N1,N2,_N3);
_N3 is N3+1,
_N4 is 17-N3,
erzeugen(N1,N2,N3,_N4),
gleichhandel(N1,N2,_N3).


erzeugen(N1,N2,N3,N4):-
counter(_C),
retract(counter(_)),
_Count is _C+2,
asserta(counter(_Count)),
_C1 is _C+1,
assertz(zerlegung(_C1,N1,N2,N3,N4)),
_C2 is _C+2,
assertz(zerlegung(_C2,N1,N2,N4,N3)).

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),
zerlegung(_,A21,A22,A23,A24),
not(member(A21,[A11,A12,A13,A14])),
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),
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,
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.

.