为什么 setof 的输出在具有不同元素数量的事实之间存在差异?

Why is there a difference in the output of setof between facts with a different amount of elements?

在 Prolog 中,给定一个事实知识库:

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]。使用 this 源代码,我发现在返回第一个列表时键入 ; 将显示所有其他选项:

List = [two] ;
List = [four] .

为什么要这样做?是因为下划线吗?如何在不按 ; 的情况下生成同时给出 twofour 的集合? 我不知道如何找到这个问题的答案,因为我无法将这个问题表述为产生搜索结果的问题

你可以这样写: 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 并仅搜索其他变量。

除了@coder 的回答,您还可以使用 library(lambda):

?- setof(X, X+\otherFact(one,X,_,_), List).