【问题标题】:cryptarithmetic prolog test fails recursion idea密码算术序言测试失败递归想法
【发布时间】:2023-12-30 17:32:01
【问题描述】:

我需要测试这段代码的二 + 二 = 四的加密算法,但它给了我错误,这是错误的。我需要知道为什么会这样。它适用于 donald+robert=gerald 或 it+is=me。我知道递归是如何工作的,但由于我无法调试它,我不知道出了什么问题。

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. 在提示符处打开跟踪。
  • 一些调试想法:(1) 按照@qu4ntumcpa 的建议使用trace,(2) 使用debug(predicate_name) 调试/跟踪特定谓词,(3) 从Prolog 提示符查询特定谓词测试该谓词(例如,输入del_var(...) 以测试del_var 是否符合您的要求)和/或(4)使用一些write/1 语句进行自定义跟踪。如果您需要更多帮助,您可能需要准确指明您为 donald+robert=gerald 等表达式输入的查询。

标签: prolog cryptarithmetic-puzzle


【解决方案1】:

您的代码没有任何问题,只是它仅适用于相同长度的列表。这就是为什么它适用于 IT + IS = ME(长度为 2 的列表)和 DONALD + ROBERT = GERALD(长度为 6 的列表)。实际上,很容易找到解决方法:例如,您可以用前导零填充较短的列表。因此,您必须执行 sum([0,T,W,O], [0,T,W,O], [F,O,U,R]) 之类的操作,而不是 sum([T,W,O], [T,W,O], [F,O,U,R]),它会起作用。

【讨论】:

  • 相反,你能告诉我如何比较列表的长度并在代码中附加零,而不是输入零
最近更新 更多