【问题标题】:Generic prolog cryptarithmetic program通用 prolog 密码程序
【发布时间】:2014-10-23 00:49:55
【问题描述】:

我正在尝试编写一个程序来解决一般的密码难题,例如 AM+PM=DAY、SEND+MORE=MONEY..

我写的程序是:

gsolve([H1,T1],[H2|T2],[H3|T3]):-
    gsolvehelper([H1,T1],[H2|T2],[H3|T3],[0,1,2,3,4,5,6,7,8,9],0).

gsolvehelper([H1,T1],[H2|T2],[H3|T3],D,C):-
    (   var(H1)->select(H1,D,D1);D1=D),
    (   var(H2)->select(H2,D1,D2);D2=D1),
    (   X1 is H1+H2+C),
    (   H3 is mod(X1,10)),
    (   C1 is X1//10),
    gsolvehelper(T1,T2,T3,D2,C1).

输入的格式为:

gsolve([A,M],[P,M],[D,A,Y]).

前两个列表的头部被添加到进位中以找到第三个列表的头部和新的进位等等。

我得到的错误是:

ERROR: is/2: Type error: `[]' expected, found `[2,_G3922]' ("x" must hold one character)

我无法弄清楚这个错误是什么。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您显示的代码没有给出该错误消息。它给出了'.'/2: ... [_Gxxxx],而不是is/2: ...[2,_Gxxxx],这可能意味着您出现了格式错误的列表构造(实际的列表谓词是'.',所以[H|T] 在Prolog 中实际上是'.'(H,T))。
  • 我确实收到与 USB 相同的错误消息(使用 SWI7)。
  • @false 你是对的,我应该在提出索赔之前进行适当的测试:我的错。由于 lurker 没有收到此错误,您知道它在各种 Prolog 中的行为方式吗?
  • SICStus、GNU、B、YAP。

标签: prolog cryptarithmetic-puzzle


【解决方案1】:

您报告的错误可能是一个错字:[H1,T1],出现在多个地方。由于这个拼写错误H2 无意中被实例化为一个列表,从而导致求和语句出现问题。以下重现了 SWI7 中的错误:

?- X is 1 + [1,_] + 3.
ERROR: is/2: Type error: `[]' expected, found `[1,_G11068]' (a list) ("x" must hold one character)

还有其他方法可以改进代码:

  • 由于您只是传递 gsolve/3 的参数,因此您无需在此处使用头/尾符号 [H|T]
  • 您可以简单地将第二个谓词命名为 gsolve/5,因为它已经与 gsolve/3 不同,因为它的数量众多。
  • bsolve/5 中的几个括号是多余的。 if/then 运算符周围的间距也可以得到改善。
  • 使用mod/2///2 的组合可能会带来问题,因为///2 的四舍五入(即,通常至少...)与mod/2 不一致。请改用div/2(向负无穷舍入)。

根据上面我得到的进行修改:

gsolve(L1, L2, L3):-
  gsolve(L1, L2, L3, [0,1,2,3,4,5,6,7,8,9], 0).

gsolve([H1|T1], [H2|T2], [H3|T3], D, C):-
  (   var(H1)
  ->  select(H1, D, D1)
  ;   D1 = D
  ),
  (   var(H2)
  ->  select(H2, D1, D2)
  ;   D2=D1
  ),
  X1 is H1 + H2 + C,
  H3 is mod(X1, 10),
  C1 is div(X1, 10),
  gsolve(T1, T2, T3, D2, C1).

这还没有解决这个难题......但是,因为它解决了你提到的错误 - 以及其他一些问题 - 你应该能够从这里开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2020-01-22
    • 1970-01-01
    相关资源
    最近更新 更多