Как уже указывалось, ваш код завершается ошибкой, поскольку ограничение alldifferent(Digits)
слишком ограничительно.Цифры должны появляться от 1 до 2 раз.В eclipse-clp вы можете использовать такие ограничения, как atleast / 3 , максимум / 3 , вхождений / 3 или gcc / 2 , чтобы выразить это.
Немного не по теме: поскольку вы используете ECLiPSe ic-solver (который может обрабатывать непрерывные домены), вы можете использовать модель гораздоближе к исходной спецификации , без большого количества умножений:
:- lib(ic).
:- lib(ic_global).
fractions4(Digits) :-
Digits = [A,B,C,D,E,F,G,H,I,J,K,L],
Digits #:: 1..9,
A/(10*B+C) + D/(10*E+F) + G/(10*H+I) + J/(10*K+L) $= 1,
( for(I,1,9), param(Digits) do
occurrences(I, Digits, NOcc), NOcc #:: 1..2
),
lex_le([A,B,C], [D,E,F]), % lex-ordering to eliminate symmetry
lex_le([D,E,F], [G,H,I]),
lex_le([G,H,I], [J,K,L]),
labeling(Digits).
Помимо основного ограничения равенства (используется $=
вместо #=
, потому что мы не хотимздесь требуется целостность), я использовал вхождений / 3 для ограничений вхождений и лексикографического порядка ограничений в качестве более стандартного способа устранения симметрии.Результат:
?- findall(Ds, fractions4(Ds), Dss), length(Dss, NSol).
Dss = [[1, 2, 4, 3, 5, 6, 8, 1, 4, 9, 2, 7], [1, 2, 6, 5, 3, 9, 7, 1, 4, 8, 2, 4], [1, 2, 6, 5, 3, 9, 7, 8, 4, 9, 1, 2], [1, 2, 6, 7, 3, 9, 8, 1, 3, 9, 5, 4], [1, 2, 6, 8, 7, 8, 9, 1, 3, 9, 5, 4], [1, 3, 4, 5, 4, 6, 8, 1, 7, 9, 2, 3], [1, 3, 4, 7, 5, 6, 8, 1, 7, 9, 2, 4], [1, 3, 4, 8, 1, 7, 8, 5, 2, 9, 2, ...], [1, 3, 5, 6, 2, 8, 7, 1, 4, 9, ...], [1, 3, 6, 5, 2, 4, 7, 1, 8, ...], [1, 3, 6, 5, 3, 6, 7, 8, ...], [1, 3, 6, 5, 4, 5, 8, ...], [1, 3, 6, 5, 6, 3, ...], [1, 3, 6, 6, 5, ...], [1, 3, 6, 7, ...], [1, 3, 9, ...], [1, 3, ...], [1, ...], [...], ...]
NSol = 1384
Yes (82.66s cpu)
Дополнительным преимуществом этой модели является то, что ее можно довольно легко превратить в универсальную модель для произвольного N .