通用prolog密码算法程序

通用prolog密码算法程序,prolog,cryptarithmetic-puzzle,Prolog,Cryptarithmetic Puzzle,我正试图写一个程序来解决一般的密码算术难题,比如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),

我正试图写一个程序来解决一般的密码算术难题,比如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)

我弄不明白这个错误是什么。有人能帮我一下吗?

您报告的错误可能是由于输入错误:
[H1,T1]
,出现在几个地方。由于这个输入错误,
H2
get无意中被实例化为一个列表,导致summation语句出现问题。以下内容再现了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).

这还不能解决这个难题。。。但是,由于它解决了您提到的错误以及其他一些问题,因此您应该能够从这里开始处理它。

您显示的代码没有给出该错误消息。它给出了“
”。/2:。。。[\u Gxxxx]
,而不是
是/2:…[2,\u Gxxxx]
,这可能意味着出现了格式错误的列表构造(实际的列表谓词是
,因此
[H | T]
在Prolog中确实是
。(H,T)
。我确实收到了与usb相同的错误消息(使用SWI7)。@false您是正确的,我应该在提出声明之前对此进行适当的测试:我的坏消息。既然潜伏者没有得到这个错误,你知道这在不同的开场白中是如何表现的吗?SICStus,GNU,B,YAP。