【发布时间】:2012-02-10 14:31:08
【问题描述】:
这是一个关于经典 SENDMORY 密码算术问题解决方案的 sn-p 使用 prolog 约束求解机制-
:- lib(ic).
sendmore(Digits) :-
Digits = [S,E,N,D,M,O,R,Y],
Digits :: [0..9],
alldifferent(Digits),
S #\= 0,
M #\= 0,
1000*S + 100*E + 10*N + D
+ 1000*M + 100*O + 10*R + E
#= 10000*M + 1000*O + 100*N + 10*E + Y,
labeling(Digits).
现在,要执行此操作,我将发送如下目标/查询:
?- sendmore(Digits).
这将返回我可能的数字解决方案。
现在,我的问题是,我不想以这种方式对变量(如 S、E、N、...)进行“硬编码”,但目标/查询会给出变量的数量。例如,如果我传递的查询是这样的:
?- sendmore(S,E,N,D,M).
然后,它应该只计算 SENDM 的值,并假设其他变量不适用,因此将 0 分配给这些变量,然后继续计算。下次查询时,我可能会在查询中传递不同数量的变量.. 例如:
?- sendmore(S,N,D,M,O,Y).
程序应该同样计算。
我想要实现的是针对上述场景的更通用的问题解决方案。对此的任何指示都非常感谢。我对 prolog 很陌生,并且正在使用 ECLIPSE 约束求解器。 谢谢。
【问题讨论】:
-
我很难掌握可用的工具,并将它们应用到非常简单的问题上,你是在概括求解器之后。祝你好运!
标签: prolog logic clpfd cryptarithmetic-puzzle