Всякий раз, когда вы рассматриваете проблему программирования на Прологе, вам необходимо уточнить аспекты, которые важны для вас.
Подумайте о порядке двух элементов в списке. Они в таком порядке, потому что они в алфавитном порядке возрастания, или это просто удача?
Что вы ожидаете для all_baskets('Nemo', L)
? Если это не удастся, или, скорее, ответ L = []
?
Что вы ожидаете для all_baskets(P, [])
?
Если вы скажете 1 алфавит,2 терпят неудачу, а 3 терпят неудачу, тогда setof/3
- путь.
has_basket('Sarah', bigBasket, apple, grape).
has_basket('Sarah', bigBasket, orange, berry).
has_basket('Bernie', bigBasket, orange, apple). % another fact
all_baskets(P, L) :-
setof([A, B, C], has_basket(P, A, B, C), L).
?- all_baskets(P, []).
false.
?- all_baskets('Nemo', L).
false.
?- all_baskets(P, L).
P = 'Bernie',
L = [[bigBasket, orange, apple]]
;
P = 'Sarah',
L = [[bigBasket, apple, grape], [bigBasket, orange, berry]].