Почему существует разница в выводе setof между фактами с разным количеством элементов?
В Прологе дана база знаний по фактам:
someFact(one).
someFact(two).
otherFact(one, two, 123, 456).
otherFact(one, four, 789, 123).
Запрос setof(X, someFact(X), List).
дает такой результат:
List = [one, two]
Тем не менее, запрос setof(X, otherFact(one, X,_,_), List
производит это:
List = [two]
Пока я ожидал, что это произведет [two,four]
, Используя этот источник, я обнаружил, что набор текста ;
при возврате первого списка будут показаны все остальные параметры:
List = [two] ;
List = [four] .
Почему это делает это? Это из-за подчеркивания? Как мне сделать набор, где оба two
а также four
дается без нажатия ;
? Я не знал, как найти ответ на этот вопрос, так как мне трудно сформулировать эту проблему в вопросе, который приводит к результатам поиска.
2 ответа
Вы могли бы написать:setof(X, B^A^otherFact(one, X,A,B), List)
,
Запросы:
?- setof(X, B^A^otherFact(one, X,A,B), List).
List = [four, two].
Это потому, что даже если вы поместите '_' в setof(X, B^A^otherFact(one, X,_,_)
, setof / 3 предназначен для поиска всех свободных переменных. Поместив B^A^
впереди вы решаете не связывать ни A, ни B, а искать только другие переменные.
В дополнение к ответу @ кодера вы можете написать, используя library(lambda)
:
?- setof(X, X+\otherFact(one,X,_,_), List).