Получить одно из многих возможных решений в Прологе

Я пытаюсь выучить пролог. Я посмотрел на этот скрипт:

:- use_module(library(clpfd)).
puzzle([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]) :-
   Vars = [S,E,N,D,M,O,R,Y],
   Vars ins 0..9,
   all_different(Vars),
   S*1000 + E*100 + N*10 + D + M*1000 + O*100 + R*10 + E #= M*10000 + O*1000 + N*100 + E*10 + Y,
   M #\= 0,
   S #\= 0.

Источник: https://github.com/Anniepoo/prolog-examples/blob/master/sendmoremoney.pl

Я запускаю это так и получаю вывод:

$ swipl -q -s sendmoremoney.pl
?- puzzle(X).
X = ([9, _G2009, _G2012, _G2015]+[1, 0, _G2024, _G2009]=[1, 0, _G2012, _G2009, _G2042]),
_G2009 in 4..7,
all_different([9, _G2009, _G2012, _G2015, 1, 0, _G2024, _G2042]),
91*_G2009+_G2015+10*_G2024#=90*_G2012+_G2042,
_G2012 in 5..8,
_G2015 in 2..8,
_G2024 in 2..8,
_G2042 in 2..8.

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

1 ответ

Решение

Хорошо, похоже, это был не столько вопрос Пролога, сколько вопрос clpfd.

?- puzzle(As + Bs = Cs), label(As).
As = [9, 5, 6, 7],
Bs = [1, 0, 8, 5],
Cs = [1, 0, 6, 5, 2] ;
false.

Нашел мой ответ здесь: http://www.swi-prolog.org/man/clpfd.html

Другие вопросы по тегам