如何在prolog中实现一种类型的sumator

时间:2012-03-11 16:59:31

标签: prolog

我正在尝试实现谓词,该谓词将在模式下工作,所有变量都不会被替换 sum(X,Y,Z)将生成填充该条件X + Y = Z的所有数字。 实际上,我可以通过这种方式生成下一个数字的列表。

lisst([_]).
lisst([_|Y]) :- lisst(Y).
fill([]).
fill([0|Xs]) :- fill(Xs).
fill([1|Xs]) :- fill(Xs).
fill([2|Xs]) :- fill(Xs).
fill([3|Xs]) :- fill(Xs).
fill([4|Xs]) :- fill(Xs).
fill([5|Xs]) :- fill(Xs).
fill([6|Xs]) :- fill(Xs).
fill([7|Xs]) :- fill(Xs).
fill([8|Xs]) :- fill(Xs).
fill([9|Xs]) :- fill(Xs).



concat_number(D,N) :- concat_number(D,N,0).
concat_number([],M,M).
concat_number([H|T],N,M) :- M1 is M*10+H, concat_number(T,N,M1).

    sum2(X,Y,Z) :-lisst(X),fill(X),lisst(Y),fill(Y),concat_number(X,X1), concat_number(Y,Y1), Z is X1 + Y1.

我对prolog的要求是? - sum2(X,Y,Z)。但只有Y数正在改变,它才能正常工作。

1 个答案:

答案 0 :(得分:3)

您遇到的行为是由于Prolog的深度优先搜索控制算法:因为Y具有无限数量的值,Prolog永远不会超出其选择点。您应该实现iterative deepening search算法,例如

length(XY, _),       % backtrack over lists in order of length
X=[_|_],             % constrain X and Y to be non-empty
Y=[_|_],
append(X, Y, XY),    % break XY into X and Y
fill(XY),            % fill X and Y in one go
concat_number(X,I),
concat_number(Y,J),
Z is I+J.