在Prolog中获得许多可能的解决方案之一

在Prolog中获得许多可能的解决方案之一,prolog,clpfd,cryptarithmetic-puzzle,Prolog,Clpfd,Cryptarithmetic Puzzle,我正在努力学习序言。我看了这个脚本: :- 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*1

我正在努力学习序言。我看了这个脚本:

:- 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.
资料来源:

我这样运行它并获得一些输出:

$ 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.

看起来这给了我每个字母一个可能的值范围。但是,如果每个字母都被指定给一个可能的值,我怎么能得到一个单一的解决方案呢?这似乎是一个非常基本的问题,但我想不出来。

好的,看起来这与其说是一个序言问题,不如说是一个clpfd问题

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

在这里找到了我的答案:

s(X)
用于找出答案并链接到文档!你在互联网上找到的许多例子,包括你链接到的例子,都是从CLP(FD)文档中剽窃出来的,但缺乏适当的上下文,使用了错误的做法。首先阅读文档,然后使用官方信息查找其他文本中的缺陷@mat,您似乎将CLP(FD)(clpfd标签的一个理论概念和主题)和称为clpfd的实现(其中,令人困惑的是,有两个完全不同的实现,SICStus Prolog和SWI/?-Prolog)。send more money示例摘自Pascal Van Hentenryck 1989年出版的《逻辑编程中的约束满足》(Constraint Satification in Logic Programming)一书,此后在CLP(FD)的每一篇文本中都出现了一些语法上的小调整。如果它是从任何地方剽窃的,那么从那里……是的,这个例子也在其他地方使用。链接到其他更好的文档也一样好。在这个具体的例子中,请查看用于查看示例从何处复制的具体语法。