Prolog 密码算术运算

Prolog 密码算术运算,prolog,clpfd,prolog-toplevel,cryptarithmetic-puzzle,Prolog,Clpfd,Prolog Toplevel,Cryptarithmetic Puzzle,我试图为“发送模式货币”编写Prolog代码。到目前为止,我得到了以下信息: :- 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

我试图为“发送模式货币”编写Prolog代码。到目前为止,我得到了以下信息:

:- 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,
   label([S,E,N,D,M,O,R,Y]),
   format('~s ~w ~s ~w ~s ~w ~s ~w ~s ~s ~s ~w ~s ~w ~s ~w ~s ~w ~s ~s ~s ~w ~s ~w ~s ~w ~s ~w ~s ~w ~s ~s',
        [ "[", S, ",", E, ",", N, ",", D, "]",
         "+", "[", M, ",", O, ",", R, ",", E, "]",
         "=", "[", M, ",", O, ",", N,  ",", E, ",", Y, "]", ";" ]).
结果如下:

?- puzzle([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]).

[ 9 , 5 , 6 , 7 ] + [ 1 , 0 , 8 , 5 ] = [ 1 , 0 , 6 , 5 , 2 ] ;
S = 9,
E = 5,
N = 6,
D = 7,
M = 1,
O = 0,
R = 8,
Y = 2.
但是我想在末尾而不是开头打印列表我怎么做

我需要得到的输出是:

?- puzzle([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]).
S = 9,
E = 5,
N = 6,
D = 7,
M = 1,
O = 0,
R = 8,
Y = 2.
[ 9 , 5 , 6 , 7 ] + [ 1 , 0 , 8 , 5 ] = [ 1 , 0 , 6 , 5 , 2 ] ;

谢谢。

如果您想要与Prolog提供的答案不同的格式化输出,我建议您将实际关系与输出清楚地分开。因此,让我们从谓词谜题/1中删除最后一个目标:

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,
   label([S,E,N,D,M,O,R,Y]).
output([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]) :-
   format('?- puzzle([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]).~n'),
   format('S = ~d,~nE = ~d,~nN = ~d,~nD = ~d,~nM = ~d,~nO = ~d,~nR = ~d,~nY = ~d.~n',[S,E,N,D,M,O,R,Y]),
   format('~s ~w ~s ~w ~s ~w ~s ~w ~s ~s ~s ~w ~s ~w ~s ~w ~s ~w ~s ~s ~s ~w ~s ~w ~s ~w ~s ~w ~s ~w ~s ~s',[ "[", S, ",", E, ",", N, ",", D, "]",  "+", "[", M, ",", O, ",", R, ",", E, "]", "=", "[", M, ",", O, ",", N,  ",", E, ",", Y, "]", ";" ]).
编写一个处理输出的谓词。下面是您所需输出的示例,可能类似于输出查询,后面是变量替换,每行一个,最后是用数字替换字母的输入方程,用于解决谜题(这正是您版本的谜题/1的最后一个目标):

然后您有一个不带参数的调用谓词,因此只生成所需的输出:

puzzleout :-
   puzzle(X),
   output(X).
这样,您就有了一个谓词,它可以解决难题,而不做其他事情:

?- puzzle([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]).
S = 9,
E = 5,
N = 6,
D = 7,
M = 1,
O = 0,
R = 8,
Y = 2 ;
false.
还有一个谓词可以生成所需的输出:

?- puzzleout.
?- puzzle([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]).
S = 9,
E = 5,
N = 6,
D = 7,
M = 1,
O = 0,
R = 8,
Y = 2.
[ 9 , 5 , 6 , 7 ] + [ 1 , 0 , 8 , 5 ] = [ 1 , 0 , 6 , 5 , 2 ] ;
true ;
false.

请注意,第二行不是您输入的查询,而是由output/1的第一个目标作为输出生成的。

但是打印此列表是该子句的一部分,printint变量不是。我只是想以这种方式显示输出,我该如何做,只需看看
?-谜题(谜题)的漂亮答案。
!嘿,我能通过使用findall函数得到所有可能的结果吗?@Pramod:这个谜题只有一个答案,那么使用findall/3有什么意义呢?如果您想要列表中的单个解决方案,您最好查询
?-puzzle(P),Bag=[P]。
,因为它为
Bag
提供与
?-findall(P,puzzle(P),Bag)相同的解决方案。