このコードは、プロローグの暗号パズルを解くために私が書いているプログラムの一部です。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).
これは完全に機能します。「//」を独自の整数除算に置き換えるだけでした