我想将数字列表合并为数字。
[1,2,3] - > 123
我的谓词:
merge([X], X).
merge([H|T], X) :-
merge(T, X1),
X is X1 + H * 10.
但现在我得到: [1,2,3] - > 33
答案 0 :(得分:3)
数学已关闭。您的规则是说您必须将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]
...
?-
答案 1 :(得分: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).