Мне нужно проверить этот код на арифметику крипты для два + два = четыре, но он дает мне ложь, что неверно. Мне нужно знать, почему это происходит. Это работает для Дональда+Роберта=Джеральда или это+я=я. Я понял, как работает рекурсия, но, поскольку я не могу ее отладить, я понятия не имею, что не так.
sum(N1,N2,N) :-
sum1(N1,N2,N,0,0,[0,1,2,3,4,5,6,7,8,9], _).
sum1([], [], [], C,C,D,D).
sum1([D1|N1], [D2|N2], [D|N], CR, C, Digs1, Digs) :-
sum1(N1,N2,N, CR, CLN, Digs1, Digs2),
digsum(D1,D2, CLN, D, C, Digs2, Digs).
digsum(D1,D2, C1, D, C, Digs1, Digs) :-
del_var(D1, Digs1, Digs2),
del_var(D2, Digs2, Digs3),
del_var(D, Digs3, Digs),
S is D1+D2+C1,
D is S mod 10,
C is S // 10.
del_var(A,L,L) :-
nonvar(A), !.
del_var(A, [A|L], L).
del_var(A, [B|L], [B|L1]) :-
del_var(A,L,L1).
trace.
, чтобы включить трассировку в командной строке, если вам нужно что-то отладить. - person jgriego   schedule 10.05.2014trace
, как предлагает @qu4ntumcpa, (2) используйтеdebug(predicate_name)
для отладки/отслеживания определенного предиката, (3) запросите определенный предикат из приглашения Prolog, чтобы проверить этот предикат (например, введитеdel_var(...)
, чтобы проверить, чтоdel_var
делает то, что, по вашему мнению, должно) и/или (4) используйте некоторые операторыwrite/1
для пользовательской трассировки. Если вам нужна дополнительная помощь, вы можете указать, какой именно запрос вы вводите для таких выражений, какdonald+robert=gerald
. - person lurker   schedule 10.05.2014