Криптарифметический пролог-тест не соответствует идее рекурсии

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

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

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]) и это будет работать.

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