Решение головоломки в прологе - создание решения с ограничениями?

Я использую пролог, чтобы попытаться решить головоломку какуро. У меня есть список таких правил, где 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.

Любая помощь будет оценена.


person AgarAgar    schedule 07.04.2016    source источник
comment
Что означают Solution = length(List, L) и Solution = 1..9?   -  person lurker    schedule 07.04.2016
comment
Рассмотрим только сочетание двух целей Solution = length(List, L) и Solution = 1..9, которые обе встречаются в вашей программе. Очевидно, что это соединение само по себе уже не удастся, потому что 1..9 и length(List, L) не объединяются.   -  person mat    schedule 07.04.2016
comment
@lurker, извините, это должно было быть Решение ins 1..9, что означает, что сгенерированные решения должны быть от 1 до 9. Решение = length (List, L) Я думал, что создаст пустой список длиной L, но напечатав это , в любом случае, похоже, это не то, чем я хочу заниматься для достижения своей цели.   -  person AgarAgar    schedule 07.04.2016
comment
Solution = 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


Ответы (1)


Итак, сначала вам нужно создать свою матрицу, которая в конечном итоге станет сеткой вашей головоломки какуро. Это определенно первый шаг - извиняюсь, если вы уже сделали это.

Затем вы хотите создать несколько правил для сквозных ограничений:

acrossConstraints(Matrix) :- getAcross(List), applyAcross(Matrix,List).
%this is the overall thing to call, containing two predicates you need to make
getAcross :- findall([R,C,L,S],across(R,C,L,S),List).
%creates a list of the across facts
applyAcross(Matrix,[[R,C,L,S]|T]) :- acrossConstraints(R,C,L,S,M), applyAcross(Matrix,T). 
%call another rule and recurse over the list.

черезConstraints - это сложный момент: здесь вы хотите взять нужный квадрат и затем составить список, начиная с этой точки. Подсказка: используйте добавление и подсказку.

Удачи!

person eponini    schedule 07.04.2016