Почему существует разница в выводе 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).
Другие вопросы по тегам