Prolog-将数字合并为数字

Prolog-将数字合并为数字,prolog,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。你现在得到的是:10*1+10*2+333。问题是递归子句不知道数字的“位置” 如果代码的结构不同,并使用累加器,则可以简化问题。

我想将数字列表合并为数字

[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
。你现在得到的是:
10*1+10*2+3
33。问题是递归子句不知道数字的“位置”

如果代码的结构不同,并使用累加器,则可以简化问题。此外,通过使用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).
可能的副本。