Вопрос

Насколько я понимаю, можно использовать предикаты 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).
Это было полезно?

Решение

Нет, это не должно. Nth (_, [A, B, C], X) дает 1 решение для X каждый раз. Setof (и Bagof) работают как:

setof(Things, GoalCondition, Bag)

Если вы указываете вещи как x, а x из NTH/3 - это (как вы показываете в приведенном выше примере) всего за одну переменную каждый раз, SetOF будет просто создавать список этой единственной переменной. Другие возможные объединения будут возможны, но он просто сделает сумку из 1 предмета, который находится в вещах каждый раз.

Формально: предикативные коллекции доходности BAGOF и SETOF для отдельных привязков свободных переменных в цели. SETOF дает отсортированную версию коллекции без дубликатов ... Findall действует как BAGOF со всеми свободными переменными, автоматически, существенно определенными. Кроме того, Findall возвращает пустой список [] нет удовлетворения целей, тогда как Bagof не удается.

Короче говоря: используйте Findall: P

Другие советы

Попробуйте написать так:

findall((A,B,C,D,E), coursemeetings(A,B,C,D,E),L)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top