数独を解く on 7つの言語7つの世界

ここで、テキストに記載されているfd_domainって組み込みの述語が、
SWI-Prologには存在しないので、GNU Prologに切り替え。

| ?- listing.

sudoku(A, B) :-
 B = A.

(16 ms) yes
| ?- sudoku([1,2,3,4], Sol).

Sol = [1,2,3,4]

yes
| ?- 
| ?- listing.

sudoku(A, B) :-
 B = A,
 A = [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _],
 fd_domain(A, 1, 4).

yes
| ?- sudoku([1,2,3], Sol).

no
| ?- sudoku([1,2,3,4, 1,2,3,4, 1,2,3,4, 1,2,3,4], Sol).

Sol = [1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4]

(15 ms) yes
| ?- 
| ?- listing.

sudoku(A, B) :-
 B = A,
 A = [C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R],
 fd_domain(B, 1, 4),
 S = [C, D, E, F],
 T = [G, H, I, J],
 U = [K, L, M, N],
 V = [O, P, Q, R],
 W = [C, G, K, O],
 X = [D, H, L, P],
 Y = [E, I, M, Q],
 Z = [F, J, N, R],
 A1 = [C, D, G, H],
 B1 = [E, F, I, J],
 C1 = [K, L, O, P],
 D1 = [M, N, Q, R],
 valid([S, T, U, V, W, X, Y, Z, A1, B1, C1, D1]).

valid([]).
valid([A|B]) :-
 fd_all_different(A),
 valid(B).

(32 ms) yes
| ?- 
| ?- sudoku([_, _, 2, 3,
             _, _, _, _,
             _, _, _, _,
             3, 4, _, _], Sol).

Sol = [4,1,2,3,2,3,4,1,1,2,3,4,3,4,1,2]

yes
| ?-