数字のリストを数字にマージしたい。Prolog - 数字を数字にマージ
[1,2,3] - > 123
マイ述語:
merge([X], X).
merge([H|T], X) :-
merge(T, X1),
X is X1 + H * 10.
しかし、今私が手: [1,2,3] - > 33
数字のリストを数字にマージしたい。Prolog - 数字を数字にマージ
[1,2,3] - > 123
マイ述語:
merge([X], X).
merge([H|T], X) :-
merge(T, X1),
X is X1 + H * 10.
しかし、今私が手: [1,2,3] - > 33
数学オフです。あなたは、H
に10
を掛けなければならないというルールがあります。しかし、実際にはH
は、リスト内の位置に相当する10のべき乗で乗算する必要があります。それは1のため* 100
だろう、とあなたは今、何を得るための2 * 10
は、次のとおりです。33.問題である10*1 + 10*2 + 3
は、あなたの再帰的な句は数字が入っている数値のものを「場所」を知っていないということです
別の方法でコードを構成し、アキュムレータを使用すると、問題を簡素化できます。また、CLP(FD)を使用して数字にいくつかの制約を適用することで、より一般的な解決策を得ることができます。
:- use_module(library(clpfd)).
digits_number(Digits, X) :-
digits_number(Digits, 0, X).
digits_number([], S, S).
digits_number([D|Ds], S, X) :-
D in 0..9,
S1 #= S*10 + D,
digits_number(Ds, S1, X).
?- digits_number([1,2,3], X).
X = 123
?- digits_number(L, 123).
L = [1, 2, 3] ;
L = [0, 1, 2, 3] ;
L = [0, 0, 1, 2, 3] ;
L = [0, 0, 0, 1, 2, 3] ;
L = [0, 0, 0, 0, 1, 2, 3]
...
?-
これまでに10回処理したものを乗算する方法もありますが、アキュムレータ値が必要です。
merge(Digits, Result) :- merge(Digits, 0, Result).
merge([X|Xs], Prefix, Result) :-
Prefix1 is Prefix * 10 + X,
merge(Xs, Prefix1, Result).
merge([], Result, Result).
[プロローグに小数にリストの整数変換素子]の可能な重複(https://stackoverflow.com/questions/23815929/converting-integer-elements-of-list-to-a-decimal- in-prolog) – lurker
[関連](https://stackoverflow.com/q/4192063/772868)。 – false