% **************************
% Four-by-four Sudoku

solution(A, B, C, D,
         E, F, G, H,
         I, J, K, L,
         M, N, O, P) :-
    % row constraints
    permutation([1, 2, 3, 4], [A, B, C, D]),
    permutation([1, 2, 3, 4], [E, F, G, H]),
    permutation([1, 2, 3, 4], [I, J, K, L]),
    permutation([1, 2, 3, 4], [M, N, O, P]),

    % column constraints
    permutation([1, 2, 3, 4], [A, E, I, M]),
    permutation([1, 2, 3, 4], [B, F, J, N]),
    permutation([1, 2, 3, 4], [C, G, K, O]),
    permutation([1, 2, 3, 4], [D, H, L, P]),

    % sub-square constraints
    permutation([1, 2, 3, 4], [A, B, E, F]),  % upper left
    permutation([1, 2, 3, 4], [C, D, G, H]),  % upper right
    permutation([1, 2, 3, 4], [I, J, M, N]),  % lower left
    permutation([1, 2, 3, 4], [K, L, O, P]).  % lower right

sudoku(A, B, C, D,
       E, F, G, H,
       I, J, K, L,
       M, N, O, P) :-
    solution(A, B, C, D,
             E, F, G, H,
             I, J, K, L,
             M, N, O, P).

sudoku4234(N,M) :-
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  % *******************
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  % *******************
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  % *******************
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  findall(_,sudoku(_, _, _, _,_, _, _, N,_, _, _, _,_, _, _, _),_),
  % *******************
  write(M).

countSdk4(S) :-
   open('log.txt',write,Log),
   findall(_,
     (findnsols(S,Y, between(1, 100, Y), L1),
      get_time(Ti),
      concurrent_maplist(sudoku4234(4),L1),
      get_time(Tf),
      T is Tf - Ti,
      write(Log,T),
      write(Log,'\n')
     ),
     _
   ),
   close(Log).

