Вам нужно написать функцию, которая обходит список списков и генерирует один список, содержащий в качестве индексов результат. Результат в вашем примере будет выглядеть примерно так: [[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).
Я не пробовал код, поэтому вам, возможно, потребуется внести несколько небольших исправлений, но он должен дать вам общее представление о том, как может выглядеть реализация.