Насколько я понимаю, предикаты setof / 3 и bagof / 3 могут использоваться для генерации списка решений проблемы. (ссылка на руководство по gprolog) .
Как и ожидалось, решения для следующего запроса - это a, b и c.
?- nth(_, [a,b,c], X).
X = a ? ;
X = b ? ;
X = c ? ;
yes
А теперь я попробую это:
?- setof(X, nth(_, [a,b,c], X), ListOfSolutions).
ListOfSolutions = [a] ? ;
ListOfSolutions = [b] ? ;
ListOfSolutions = [c]
yes
По моему мнению, решение должно было быть [a, b, c]. Что я делаю не так?
Я использую gprolog 1.4.0 для Mac OS.
Редактировать: Решение
Что мне действительно нужно, так это оператор (^) / 2, но приведенный здесь ответ был полностью правильным, большое спасибо за помощь Если у кого-то есть подобная проблема, вот мой текущий код для выбора ячеек из трехмерной сетки.
% selectFLR(?Grid, ?ClassId, ?TDayIdD, ?HourId, -ListOfFLR)
% ---------------------------------------------------------
selectFLR(Grid, ClassId, DayId, HourId, ListOfFLR) :-
bagof(FLR, ClassId^DayId^HourId^selectSingleFLR(Grid, ClassId, DayId, HourId, FLR), ListOfFLR).
selectSingleFLR(Grid, ClassId, DayId, HourId, FLR) :-
nth(ClassId, Grid, Class),
nth(DayId, Class, Day),
nth(HourId, Day, FLR).