【发布时间】:2012-12-14 00:35:08
【问题描述】:
我必须编写一个 Prolog 程序来解决密码难题。
我需要编写一个函数solve([A, M, P, D, Y]) 将变量[A, M, P, D, Y] 分配给0到9的值,以便满足方程上午 + 下午 = 天。每个变量赋值不同,A、P、D不能等于0。
我开始编写这个函数,但是在运行我的程序时遇到了问题。我将 A、P 和 D 的限制设置为不为零。当我浏览算法时,我意识到 D 必须为 1,所以我在程序的开头定义了它。我为 M 定义了两个不同的变量(M1 和 M2)并将它们设置为彼此相等,因为拼图中的不同 M 应该分配给相同的值。我将位置分配给不同的变量,并根据谜题将它们相加。我解释了任何变量携带进位变量。我的程序编译了,但是函数没有执行。
solve([A, M1, M2, P, D, Y]):- D is 1,
A/=0,
P/=0,
D/=0,
M1 = M2,
select(M1, [0,2,3,4,5,6,7,8,9], R1),
select(M2, R1, R2),
Y is (M1+M2) mod 10,
C1 is (M1+M2) // 10,
select(Y, R2, R3),
select(A, R3, R4),
select(P, R4, R5),
select(D, R5, R6),
A is (A+P+C1) mod 10,
D is (A+P+C1)// 10.
我做错了什么?我的变量定义有问题吗?我需要定义两个不同的 M 变量,还是一个就足够了?
【问题讨论】:
-
你为什么在开始时检查 A,P,D ?您需要为 A、P、D 赋值,然后检查它们是否不同于零。
标签: prolog clpfd cryptarithmetic-puzzle