Пролог. рекурсивная функция, возвращающая несколько значений - PullRequest
0 голосов
/ 30 мая 2010

Я новичок в Прологе. Мне нужно объявить функцию, которая смотрит на список как [[1, 0, 0], [1, 0, 0], [1, 0, 0]] и если значение равно 0, возвращает его адрес (рассматривая его как двойной массив).

Я написал функцию в основном в формате: функция (..., X): - функция (вызывается другими значениями).

Как я могу написать функцию, которая возвращает значение при каждом вызове (рекурсивно). Могу ли я получить их (в приведенном выше вопросе) в качестве альтернативы Х ???

1 Ответ

1 голос
/ 30 мая 2010

Вам нужно написать функцию, которая обходит список списков и генерирует один список, содержащий в качестве индексов результат. Результат в вашем примере будет выглядеть примерно так: [[0, 0], [0, 1], ...].

Чтобы сделать это, вам нужно разделить функцию на две операции: одну, которая проходит одну строку (вложенный список), и другую, которая обрабатывает внешний список (содержащий списки в виде строк). Вложенная функция для обработки [1, 0, 0] будет выглядеть следующим образом (обратите внимание, что ей нужно взять индекс строки из внешней функции, чтобы она могла генерировать координаты x, y):

% Processes single row of the data. Parameters:
%   row (in), row index (in), current element index (in), result (out)
processRow([], _, _, []).
processRow([1|Xs], R, N, Rest) :- processRow(Xs, R, N+1, Rest)
processRow([0|Xs], R, N, [[R, N]|Rest]) :- processRow(Xs, R, N+1, Rest)

Вторая функция будет выглядеть примерно так:

% Parameters:
%   list of lists (input), current index (input), collected indices (output)
processOuter([], _, []).
processOuter([Row|Rows], N, [Res|Remaining]) :-
  processRow(Row, N, 0, Res),
  processOuter(Rows, N+1, Remaining).

Я не пробовал код, поэтому вам, возможно, потребуется внести несколько небольших исправлений, но он должен дать вам общее представление о том, как может выглядеть реализация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...