这段代码是我正在编写的程序的一部分,用于解决 prolog 中的一个密码谜题。我正在使用 CLPFD (SICStus Prolog) 解决这个问题。使用内置整数除法运算符“//”时出现错误(有关详细信息,请参见下文)。我无法解决这个问题所以我编写了自己的整数除法函数。
我想知道的是为什么“//”失败了。其他算术运算符(如 +、-、/)没有这样的问题
前:
solve1([],[],[H],H).
solve([H1],[H2],[H3,H4],C) :- H1 #\= 0, H2 #\= 0,
H3 #= (C+H1+H2)mod 10,
H4 #=(C+H1+H2)//10.
solve([H1|T1] , [H2|T2] , [H3|T3],C) :- H3 #= (C+H1+H2)mod 10,
C1 #=(C+H1+H2)//10 ,
solve(T1,T2,T3,C1).
这是我得到的错误
错误:域错误:clpfd_expression' expected, found
(0+_G1592+_G1586)//10' 异常:(12) throw(error(domain_error(clpfd_expression, (0+_G3994{0..9}+_G3991{0..9})// 10),_G3976))?
后:
integer_div(N,M) :- M #= N/10 , integer(M).
integer_div(N,M) :- N1 #= N mod 10 , N2 #= N-N1 , M #= N2/10.
solve1([],[],[H],H).
solve([H1],[H2],[H3,H4],C) :- H1 #\= 0, H2 #\= 0,
H3 #= (C+H1+H2)mod 10,
integer_div((C+H1+H2),H4).
solve([H1|T1] , [H2|T2] , [H3|T3],C) :- H3 #= (C+H1+H2)mod 10,
integer_div((C+H1+H2),C1) ,
solve(T1,T2,T3,C1).
这完美地工作我所做的只是用我自己的整数除法版本替换“//”