Как реализовать вид суматора в прологе - PullRequest
1 голос
/ 11 марта 2012

Я пытаюсь реализовать предикат, который будет работать в режиме со всеми переменными без подстановки сумма (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.

, и я прошу пролог? - sum2 (X, Y, Z).но это не работает, меняется только число Y.

1 Ответ

3 голосов
/ 11 марта 2012

Поведение, с которым вы сталкиваетесь, связано с первым алгоритмом управления поиском по глубине: так как Y имеет бесконечное число значений, Prolog никогда не возвращается назад после точки выбора для него. Вам следует реализовать алгоритм итеративного углубленного поиска , например

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...