Prolog - 将数字合并到数字

时间:2017-06-09 14:09:26

标签: 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 个答案:

答案 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).