在Prolog中为密码算术难题重新分配变量

在Prolog中为密码算术难题重新分配变量,prolog,cryptarithmetic-puzzle,Prolog,Cryptarithmetic Puzzle,我在用Prolog解决家庭作业中的算术难题。我将在SEND+MORE=MONEY的上下文中讨论这一点 教授给我的部分代码将3个输入列表,即[S,e,N,D],[M,O,R,e],[M,O,N,e,Y],缩减为唯一的变量列表,即[S,e,N,D,M,O,R,Y]。我已经得到了一个点,在这个点上,我递归地为缩减列表中的每个变量分配一个0到9之间的唯一值 我的问题是,如何将缩减列表中的值重新分配给3个输入列表中的每个值?我的代码如下: solve_expression(L1,L2,L3) :-

我在用Prolog解决家庭作业中的算术难题。我将在
SEND+MORE=MONEY
的上下文中讨论这一点

教授给我的部分代码将3个输入列表,即
[S,e,N,D]
[M,O,R,e]
[M,O,N,e,Y]
,缩减为唯一的变量列表,即
[S,e,N,D,M,O,R,Y]
。我已经得到了一个点,在这个点上,我递归地为缩减列表中的每个变量分配一个0到9之间的唯一值

我的问题是,如何将缩减列表中的值重新分配给3个输入列表中的每个值?我的代码如下:

solve_expression(L1,L2,L3) :-
    variables(L1,L2,L3,L),
    bind(L).

bind(L) :-
    assign_members(L,[0,1,2,3,4,5,6,7,8,9]),
    is_unique(L).

assign_members([],L) :-
    is_unique(L).
assign_members([H|T],L) :-
    member(H,L),
    assign_members(T,L).

is_unique([H|T]) :-
    unique(H,T),
    is_unique(T).
is_unique([]).

/** professor's code below */
unique(_,[]).
unique(X,[Y|Z]) :- 
    X \== Y,
    unique(X,Z).

merge([],L,L).
merge([X|Y],Z,[X|L]) :-
    unique(X,Z),
    !,
    merge(Y,Z,L).
merge([_|Y],Z,L) :- 
    merge(Y,Z,L).

variables(A,B,C,V) :-
    merge(A,B,W),
    merge(C,W,V).
请记住,这是一个家庭作业,所以我不是在寻找答案,只是一个提示,我可以如何完成这项任务。另外,我只使用了Prolog大约一个星期


谢谢大家!

只要做一个简单的统一规则。例如,
convered(A,B,[A,B])。
将统一A和B。例如,
A=1,B=2,转换后的(A,B,L)
产生
L=[1,2]
“重新分配值”由统一执行。你什么都不需要。