Я использую пролог, чтобы попытаться решить головоломку какуро. У меня есть список таких правил, где R и C представляют строку и начальную точку каждого блока, L представляет длину, а S - сумму чисел в строке,
% across(R, C, L, S)
across(2,4,2,4).
across(2,10,2,4).
across(3,4,4,12).
across(3,10,2,6).
across(4,3,2,6).
Насколько я могу судить, чтобы решить загадку с использованием ограничений, для каждого элемента L мне пришлось бы найти различные числа от 1 до 9, которые при сложении равны S. Я действительно изо всех сил пытаюсь решить это, код, который у меня есть, таков:
solveAcross(Solution) :-
findall([R,C,L,S], across(R,C,L,S), List),
Solution = length(List, L),
Solution ins 1..9,
all_distinct(Solution),
labeling([], Solution).
Но все это возвращает false.
Любая помощь будет оценена.
Solution = length(List, L)
иSolution = 1..9
? - person lurker   schedule 07.04.2016Solution = length(List, L)
иSolution = 1..9
, которые обе встречаются в вашей программе. Очевидно, что это соединение само по себе уже не удастся, потому что1..9
иlength(List, L)
не объединяются. - person mat   schedule 07.04.2016Solution = length(List, L)
объединяет терминlength(List, L)
с переменнойSolution
. В прологе вы не назначаете результаты предиката с помощью=
, как в других языках. Если вам нужен список длинойL
и имя списка должно бытьSolution
, тогда вам просто нужно,length(Solution, L)
. Если вы хотите, чтобы длинаSolution
была такой же, как уList
, сделайтеlength(List, Len), length(Solution, Len)
. - person lurker   schedule 07.04.2016