一些隐式约束
Some implicit constraint
当我执行这段代码(如下所示)时,它总是设置隐式约束。
正如您在下面看到的,它总是说 D1 = D2
但没有这样的明确约束,也没有任何强制这样做的模式匹配。
或者换句话说,D1
和 D2
之间存在一些引用,这样每当 D1
被初始化时, D2
就会自动初始化。我看不出这是怎么回事。有人可以解释一下吗,我试过用调试器解决这个问题,但没有帮助。
这是一个难题"GERALD + DONALD = ROBERT",最初三个列表包含这些变量。
如果有人想测试,我在下面添加代码:
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
都具有列表中的相同变量,并且 List 是一个函子,并且一个变量在整个函子中可见。
你应该看到,当递归结束时,你有 GERALD
和 DONALD
中的 D's
(最后一个元素),因为这个 D 在整个函子中可见,D1
和 D2
都引用同一个变量。
当我执行这段代码(如下所示)时,它总是设置隐式约束。
正如您在下面看到的,它总是说 D1 = D2
但没有这样的明确约束,也没有任何强制这样做的模式匹配。
或者换句话说,D1
和 D2
之间存在一些引用,这样每当 D1
被初始化时, D2
就会自动初始化。我看不出这是怎么回事。有人可以解释一下吗,我试过用调试器解决这个问题,但没有帮助。
这是一个难题"GERALD + DONALD = ROBERT",最初三个列表包含这些变量。
如果有人想测试,我在下面添加代码:
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
都具有列表中的相同变量,并且 List 是一个函子,并且一个变量在整个函子中可见。
你应该看到,当递归结束时,你有 GERALD
和 DONALD
中的 D's
(最后一个元素),因为这个 D 在整个函子中可见,D1
和 D2
都引用同一个变量。