2016-04-07 7 views
1

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

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

+0

Что означает 'Solution = length (List, L)' и 'Solution = 1..9'? – lurker

+0

Рассмотрите только соединение двух целей: «Решение = длина (список, L)» и «решение = 1..9», которые ** оба ** встречаются в вашей программе. Очевидно, что этот контур уже будет ** терпеть неудачу **, потому что '1..9' и' length (List, L) 'не объединяются. – mat

+0

@ lurker, извините, что должно было быть решением 1..9, что означает, что сгенерированные решения должны быть между 1 и 9. Решение = длина (список, L) Я думал, что сделает пустой список длины L, но набрав это, на самом деле, похоже, не то, что я хочу делать для достижения своей цели. – AgarAgar

ответ

0

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

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

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. 

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

Удачи вам!