密码算法prolog测试失败递归思想

密码算法prolog测试失败递归思想,prolog,cryptarithmetic-puzzle,Prolog,Cryptarithmetic Puzzle,我需要测试这段代码的密码算法为2+2=4,但它给我的是false,这是错误的。我想知道为什么会这样。它适用于唐纳德+罗伯特=杰拉尔德或它+是=我。我知道递归是如何工作的,但由于我无法调试它,我不知道是什么错了 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) :-

我需要测试这段代码的密码算法为2+2=4,但它给我的是false,这是错误的。我想知道为什么会这样。它适用于唐纳德+罗伯特=杰拉尔德或它+是=我。我知道递归是如何工作的,但由于我无法调试它,我不知道是什么错了

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

您的代码没有任何错误,只是它只适用于相同长度的列表。这就是为什么它适用于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]),
它会起作用。

我不确定你的问题到底是什么,但你可以使用
跟踪。
在提示时打开跟踪,如果你需要调试一些东西。一些调试想法:(1)使用@q4ntumcpa建议的
trace
,(2)使用
debug(predicate_name)
调试/跟踪特定谓词,(3)从Prolog提示符查询特定谓词以测试该谓词(例如,输入
del_var(…)
以测试
del_var
是否做了您认为应该做的事情)和/或(4)使用一些
write/1
语句进行自定义跟踪。如果您需要更多帮助,您可能希望准确地指出您为表达式输入的查询,例如
donald+robert=gerald
。您能告诉我如何比较列表的长度并在代码中附加零,而不是用零输入吗