一些隐含约束

时间:2017-12-11 01:55:59

标签: prolog cryptarithmetic-puzzle

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

正如你在下面所看到的那样,它总是说D1 = D2,但是没有这样明确的约束,也没有任何模式匹配强制这一点。

或者在其他方面,D1D2之间存在一些引用,以便每当D1初始化时,D2都会自动初始化。我无法看到这是怎么回事。有人可以解释我,我试着用调试器解决它,但它没有帮助。

这是一个谜题" GERALD + DONALD = ROBERT",最初三个列表包含这些变量。 enter image description here

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

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] ).

1 个答案:

答案 0 :(得分:1)

当它显示D1 = D2时,您应该看到D1D2都有相同的变量列表,List是一个仿函数,一个变量在整个仿函数中可见。

你应该看到,当递归结束时,你有D'sGERALD的{​​{1}}(最后一个元素),因为这个D在整个仿函数中可见,{{1 }和DONALD都引用相同的变量。