diff --git a/main.pl b/main.pl new file mode 100644 index 0000000..9d908fd --- /dev/null +++ b/main.pl @@ -0,0 +1,66 @@ +% Two = [[0,10,9],[11,_,_],[10,_,_]], puzzle_solution(Two). +% Three = [[0,14,10,35],[14,_,_,_],[15,_,_,_],[28,_,1,_]]. + +:- use_module(library(clpfd)). +:- use_module(library(apply)). + + +%% puzzle_solution(+Puzzle) +% +puzzle_solution(Puzzle) :- + Puzzle = [_|Rows], + % unify_diagonal(Puzzle), + maplist(valid_row, Rows), + transpose(Puzzle, TransposedPuzzle), + TransposedPuzzle = [_|Columns], + maplist(valid_row, Columns). + + +%% valid(+Row) +% +valid_row([Head|Tail]) :- + Tail ins 1..9, + all_distinct(Tail), + valid_head(Head, Tail). + + +%% valid_head(+Head, +Tail) +% +valid_head(Head, List) :- + sum(List, #=, Head) +; foldl(mul, List, 1, Head). + +%% mul +% +mul(X, Acc, New) :- + New #= Acc * X. + + +%% unify_diagonal(+Puzzle) +% +unify_diagonal(Puzzle) :- + main_diagonal(Puzzle, [_|Diag]), + all_same(Diag). + + +%% main_diagonal(+Matrix, -Diag) +% +main_diagonal(Matrix, Diag) :- + main_diagonal(Matrix, 0, Diag). + +main_diagonal([], _, []). +main_diagonal([M|Ms], I, [D|Ds]) :- + nth0(I, M, D), + I1 is I + 1, + main_diagonal(Ms, I1, Ds). + + +%% all_same(List) +% +all_same([Head|Tail]) :- + all_same(Head, Tail). + +all_same(Head, [X|Xs]) :- + Head = X, + all_same(Head, Xs). +