Решатель Prolog kenken 4 на 4

поэтому я пытаюсь решить kenken с помощью пролога, но с самого начала столкнулся с несколькими проблемами, прежде всего скажем, я запускаю его как kenken ([X1, X2, X3,..... X16]). и я хочу решить для этого x с правилами, которые я определил ранее. Итак, скажем, первая ячейка имеет 3 значения X1, X2 и X3, и я хочу получить 2, используя умножение, означающее, что X1 * X2 * X3 = 2, теперь как я могу настроить правило, чтобы увидеть все возможные решения, если бы у меня было что-то подобное. также, как бы я сказал своим x использовать только диапазон значений 1-4. я пытался сделать что-то вроде

:- use_module(library(clpr)).
solve([X1,X2,X3]):-
    {X1*X2*X3=2}.

но это дает мне действительно странный результат.


person russiandobby    schedule 24.11.2013    source источник


Ответы (2)


Поскольку вы рассуждаете над целыми числами, а не над числами с плавающей запятой, рассмотрите возможность использования library(clpfd) вместо CLP(R). В SICStus, SWI и YAP вы можете ограничить переменную конечной области X целочисленным диапазоном 1-4 с помощью:

X in 1..4

Вы можете использовать встроенный предикат label/1 для поиска конкретных решений. Пример с SWI-Prolog:

?- Vars = [A,B,C], A*B*C #= 2, Vars ins 1..4, label(Vars).

уступая:

Vars = [1, 1, 2], A = B, B = 1, C = 2 ;
Vars = [1, 2, 1], A = C, C = 1, B = 2 ;
Vars = [2, 1, 1], A = 2, B = C, C = 1.
person mat    schedule 24.11.2013

Вам нужен оператор is для выполнения арифметических действий:

2 is X1*X2*X3

Обратите внимание, что это не будет работать, если все X не связаны с числами.

person Scott Hunter    schedule 24.11.2013
comment
Современные системы Prolog предоставляют ограничения как более декларативную альтернативу is/2. OP уже использует CLP(R), который не требует is/2, а также допускает использование переменных в арифметических выражениях. - person mat; 25.11.2013