Ответ 1
Используйте findall
, чтобы выполнить это:
P2(ARGUMENTS, LIST) :- findall(X, P1(ARGUMENTS, X), LIST).
Это связано с функцией bagof
, упомянутой в вопросе, связанной с Андерсом Линдалем. Существует хорошее объяснение взаимосвязи между двумя функциями (и третьей функцией setof
) здесь:
Чтобы проиллюстрировать различия, небольшой пример:
listing(p). p(1,3,5). p(2,4,1). p(3,5,2). p(4,3,1). p(5,2,4).
Попробуйте выполнить следующие задачи. (Ответ дисплеи были изменены для сохранения пространство.)
?- bagof(Z,p(X,Y,Z),Bag). Z = _G182 X = 1 Y = 3 Bag = [5] ; Z = _G182 X = 2 Y = 4 Bag = [1] ; Z = _G182 X = 3 Y = 5 Bag = [2] ; Z = _G182 X = 4 Y = 3 Bag = [1] ; Z = _G182 X = 5 Y = 2 Bag = [4] ; No ?- findall(Z,p(X,Y,Z),Bag). Z = _G182 X = _G180 Y = _G181 Bag = [5, 1, 2, 1, 4] ; No ?- bagof(Z,X^Y^p(X,Y,Z),Bag). Z = _G182 X = _G180 Y = _G181 Bag = [5, 1, 2, 1, 4] ; No ?- setof(Z,X^Y^p(X,Y,Z),Bag). Z = _G182 X = _G180 Y = _G181 Bag = [1, 2, 4, 5] ; No
Предикаты
bagof
иsetof
дают коллекции для индивидуальных привязок свободные переменные в цели.setof
дает отсортированную версию сбор без дубликатов. к избегайте связывания переменных, используйте экзистенциальное кванторное выражение. Для пример целиbagof(Z,X^Y^p(X,Y,Z),Bag)
просит "СумкаZ
такая, что существует aX
и существуетY
такое, чтоp(X,Y,Z)
".findall
действует какbagof
со всеми свободными переменными автоматически экзистенциально количественно. К тому жеfindall
возвращает пустой список[]
там не является удовлетворением цели, тогда какbagof
выходит из строя.