криптоарифметический тест пролога не проходит идею рекурсии

Мне нужно проверить этот код на арифметику крипты для два + два = четыре, но он дает мне ложь, что неверно. Мне нужно знать, почему это происходит. Это работает для Дональда+Роберта=Джеральда или это+я=я. Я понял, как работает рекурсия, но, поскольку я не могу ее отладить, я понятия не имею, что не так.

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

person user3342812    schedule 10.05.2014    source источник
comment
Я не уверен, в чем именно заключается ваша проблема, но вы можете использовать trace., чтобы включить трассировку в командной строке, если вам нужно что-то отладить.   -  person jgriego    schedule 10.05.2014
comment
Некоторые мысли об отладке: (1) используйте trace, как предлагает @qu4ntumcpa, (2) используйте debug(predicate_name) для отладки/отслеживания определенного предиката, (3) запросите определенный предикат из приглашения Prolog, чтобы проверить этот предикат (например, введите del_var(...), чтобы проверить, что del_var делает то, что, по вашему мнению, должно) и/или (4) используйте некоторые операторы write/1 для пользовательской трассировки. Если вам нужна дополнительная помощь, вы можете указать, какой именно запрос вы вводите для таких выражений, как donald+robert=gerald.   -  person lurker    schedule 10.05.2014


Ответы (1)


В вашем коде нет ничего плохого, за исключением того, что он работает только для списков одинаковой длины. Вот почему это работает для IT + IS = ME (списки длины 2) и для DONALD + ROBERT = GERALD (списки длины 6). На самом деле найти обходной путь довольно легко: например, вы можете заполнить более короткие списки ведущими нулями. Поэтому вместо sum([T,W,O], [T,W,O], [F,O,U,R]) вам нужно сделать что-то вроде sum([0,T,W,O], [0,T,W,O], [F,O,U,R]), и это сработает.

person Grzegorz Adam Kowalski    schedule 10.05.2014
comment
Вместо этого вы можете сказать мне, как мне сравнить длину списка и добавить ноль в код, а не вводить ввод с нулем - person user3342812; 11.05.2014