2017-06-09 1 views
2

数字のリストを数字にマージしたい。Prolog - 数字を数字にマージ

[1,2,3] - > 123

マイ述語:

merge([X], X). 
merge([H|T], X) :- 
    merge(T, X1), 
    X is X1 + H * 10. 

しかし、今私が手: [1,2,3] - > 33

+2

[プロローグに小数にリストの整数変換素子]の可能な重複(https://stackoverflow.com/questions/23815929/converting-integer-elements-of-list-to-a-decimal- in-prolog) – lurker

+2

[関連](https://stackoverflow.com/q/4192063/772868)。 – false

答えて

3

数学オフです。あなたは、H10を掛けなければならないというルールがあります。しかし、実際には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] 
... 

?- 
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). 
関連する問題