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

Prolog 为什么元素数量不同的事实之间的setof输出会有差异?,prolog,prolog-setof,Prolog,Prolog Setof,在序言中,给出了事实的知识库: someFact(one). someFact(two). otherFact(one, two, 123, 456). otherFact(one, four, 789, 123). 查询setofX,someFactX,List。产生以下结果: List = [one, two] 但是,查询setofX,otherFactone,X,,,列表会产生以下结果: List = [two] 而我期望它能产生[二,四]。使用源代码,我发现打字;返回第一个列表时,

在序言中,给出了事实的知识库:

someFact(one).
someFact(two).
otherFact(one, two, 123, 456).
otherFact(one, four, 789, 123).
查询setofX,someFactX,List。产生以下结果:

List = [one, two]
但是,查询setofX,otherFactone,X,,,列表会产生以下结果:

List = [two]
而我期望它能产生[二,四]。使用源代码,我发现打字;返回第一个列表时,将显示所有其他选项:

List = [two] ;
List = [four] .
为什么会这样?是因为下划线吗?我如何在不按键的情况下生成一个给定了2和4的集合;? 我不知道如何找到这个问题的答案,因为我很难将这个问题转化为一个生成搜索结果的问题

你可以这样写: 集合X,B^A^otherFactone,X,A,B,List

查询:

?- setof(X, B^A^otherFact(one, X,A,B), List).
List = [four, two].
这是因为即使你把“u”放在setofX,B^A^otherFactone,X,u,u中,setof/3也是用来搜索所有自由变量的。通过将B^A^放在前面,您可以选择不绑定A或B,而只搜索其他变量

你可以写: 集合X,B^A^otherFactone,X,A,B,List

查询:

?- setof(X, B^A^otherFact(one, X,A,B), List).
List = [four, two].

这是因为即使你把“u”放在setofX,B^A^otherFactone,X,u,u中,setof/3也是用来搜索所有自由变量的。通过将B^A^放在前面,您可以选择不绑定A或B,而只搜索其他变量

除了@coder的答案,您还可以使用librarylambda编写:


除了@coder的答案,您还可以使用librarylambda编写:

经验法则:u和setof/3不会聚集在一起。经验法则:u和setof/3不会聚集在一起。