Это мои правила, в которых заключается моя проблема:
get_row([H|_],1,H):-!.
get_row([_|T],I,X) :-
I1 is I-1,
get_row(T,I1,X).
get_column([],_,[]).
get_column([H|T], I, [R|X]):-
get_row(H, I, R),
get_column(T,I,X).
good_by_coulmns(Solution) :-
length(Solution, Length),
forall((between(1, Length, X),
get_column(Solution, X, Y)),
all_distinct(Y)).
createRow(Solution, Domain, Row) :-
maplist(member, Row, Domain),
all_distinct(Row),
good_by_coulmns(Solution).
%, write(Solution), nl.
tryToSolve(Domains, Solution) :-
maplist(createRow(Solution),
Domains, Solution),
length(Solution, L),
length(Domains, L),
good_by_coulmns(Solution).
Проблема в том, что последнее правило генерирует около 20 хороших ответов, но после этого оно уходит в бесконечный цикл. В первом правиле есть отладочная запись.
Он пишет такие строки (с постоянно меняющимися числами) при бесконечном цикле:
[[1, 2, 3, 4], [3, 1, 4, 2], [4, 3, 2, 1], [2, 4, 1, 3], _8544, _8550, _8556, _8562]
[[1, 2, 3, 4], [3, 4, 1, 2], _8532, _8538, _8544, _8550, _8556, _8562]
Решение, ждем, это матрица 4х4. в первой строке, если вырезать первые 4 элемента, это хорошее решение.
Количество переменных, начинающихся с _, всегда увеличивается, а первая строка матрицы ([1,2,3,4]) никогда не меняется.
У вас есть идеи, что здесь не так?
Фактический запрос:
tryToSolve([[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]], [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]], [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]], [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]], L).
library(clpfd)
! Вот откудаall_distinct/1
. - person false   schedule 13.11.2017library(clpfd)
, что опасно... Если вы используете SWI Prolog, вам, должно быть, пришлось вручную включать библиотеку. - person lurker   schedule 13.11.2017