Prolog 一些隐式约束

Prolog 一些隐式约束,prolog,cryptarithmetic-puzzle,Prolog,Cryptarithmetic Puzzle,当我执行这段代码(如下所示)时,它总是设置隐式的约束 正如您在下面看到的,它总是说D1=D2,但是没有这样的显式约束,也没有任何模式匹配强制这样做 或者换句话说,在D1和D2之间有一些参考,这样每当D1初始化时,D2就会自动初始化。我看不出这是怎么回事。有人能解释一下我,我试着用调试器来解决,但没用 这是一个谜“杰拉尔德+唐纳德=罗伯特”,最初有三个列表包含这些变量。 如果有人想测试它,我会在下面添加代码: sum(N1,N2,N):- sum1(N1,N2,N,0,0,[0,1,2,

当我执行这段代码(如下所示)时,它总是设置隐式的约束

正如您在下面看到的,它总是说
D1=D2
,但是没有这样的显式约束,也没有任何模式匹配强制这样做

或者换句话说,在
D1
D2
之间有一些参考,这样每当
D1
初始化时,
D2
就会自动初始化。我看不出这是怎么回事。有人能解释一下我,我试着用调试器来解决,但没用

这是一个谜“杰拉尔德+唐纳德=罗伯特”,最初有三个列表包含这些变量。

如果有人想测试它,我会在下面添加代码:

sum(N1,N2,N):-
    sum1(N1,N2,N,0,0,[0,1,2,3,4,5,6,7,8,9],_).

sum1([],[],[],0,0,Digits,Digits).    
sum1([D1|N1],[D2|N2],[D|N],C1,C,Digs1,Digs2):-
    sum1(N1,N2,N,C1,C2,Digs1,Digs2),
    digitSum(D1,D2,C2,D,C,Digs2,Digs).

digitSum(D1,D2,C1,D,C,Digs1,Digs):-
    del(D1,Digs1,Digs2),
    del(D2,Digs2,Digs3),
    del(D,Digs3,Digs),
    S is D1 + D2 + C1,
    D is S mod 10,
    C is D div 10.

del(A,L,L):-
    nonvar(A),!.
del(A,[A|L],L).
del(A,[B|L],[B|L1]):-
    del(A,L,L1).
查询:

?- sum( [D,O,N,A,L,D], [G,E,R,A,L,D], [R,O,B,E,R,T] ).

当它说
D1=D2
时,您应该看到
D1
D2
在列表中有相同的变量,列表是一个函子,在整个函子中有一个变量可见


你应该看到,当递归结束时,你有
GERALD
DONALD
中的
D
(最后一个元素),因为这个D在整个函子中可见,
D1
D2
都引用同一个变量。

你写的D是s mod 10,C是D div 10。。D是介于0和9之间的值,因此C始终为0。我想你想要的是C是S第10区。要解决您的问题,您应该看看库clpfd。使用clpfd您可以轻松解决此问题,请看。这意味着它不会找到所有解决方案?您所说的是真的!因为将自动对
D1
D2
的值进行约束,这意味着如果两个变量相同,那么这些值也必须相同。