Некоторое неявное ограничение
Когда я выполняю этот код (показанный ниже), он всегда устанавливает неявные ограничения.
Как вы можете видеть ниже, это всегда говорит о том, что 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] ).
1 ответ
Когда это говорит D1 = D2
тогда вы должны увидеть, что оба D1
а также D2
иметь ту же переменную из списка, и List является функтором, и одна переменная видна во всем функторе.
Вы должны увидеть, что когда рекурсия заканчивается, у вас есть D's
(последний элемент) из GERALD
а также DONALD
, так как этот D виден во всем функторе, D1
а также D2
оба ссылаются на одну и ту же переменную.