Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- :- use_module(library(yall)).
- :- use_module(library(clpfd)).
- create_mat(0, _, []).
- create_mat(N0, N, [Zeile|Matrix]) :-
- N0 > 0,
- N1 is N0 - 1,
- length(Zeile, N),
- create_mat(N1, N, Matrix).
- sum_row([], _).
- sum_row([Row|Matrix], SumDim) :-
- sum(Row, #=, SumDim),
- sum_row(Matrix, SumDim).
- diag1([], _, _, []).
- diag1([Row|Matrix], Idx, P, [X|ListeDiag]) :-
- nth1(Idx, Row, X),
- Idx1 is Idx+P,
- diag1(Matrix, Idx1, P, ListeDiag).
- magic_square(N, Matrix) :-
- Nmax is N * N,
- SumDim is N * (N * N + 1) / 2,
- create_mat(N, N, Matrix),
- flatten(Matrix, Vars),
- Vars ins 1..Nmax,
- all_different(Vars),
- sum_row(Matrix, SumDim),
- transpose(Matrix, TransMat),
- sum_row(TransMat, SumDim),
- diag1(Matrix, N, -1, D1),
- sum(D1, #=, SumDim),
- diag1(Matrix, 1, +1, D2),
- sum(D2, #=, SumDim).
- solve(N,M) :-
- magic_square(N,M),
- flatten(M,V),
- labeling([ff],V).
- findpos(N,L,Bag):-
- create_mat(N,N,M),
- flatten(M,V),
- length(L,Z),
- findall([P,Count],(
- length(P,Z),
- maplist({V}/[X,Y]>>nth1(X,V,Y),P,L),
- aggregate_all(count, solve(N,M), Count),
- Count \= 0
- ),
- Bag).
Advertisement
Add Comment
Please, Sign In to add comment