Некоторое неявное ограничение

Когда я выполняю этот код (показанный ниже), он всегда устанавливает неявные ограничения.

Как вы можете видеть ниже, это всегда говорит о том, что 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 оба ссылаются на одну и ту же переменную.

Другие вопросы по тегам