通用prolog密码算法程序
我正试图写一个程序来解决一般的密码算术难题,比如AM+PM=DAY,SEND+MORE=MONEY 我写的程序是:通用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),
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
中的几个括号是多余的。if/then操作符周围的间距也可以改进bsolve/5
- 使用
和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。