为什么 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] .
为什么要这样做?是因为下划线吗?如何在不按 ;
的情况下生成同时给出 two
和 four
的集合?
我不知道如何找到这个问题的答案,因为我无法将这个问题表述为产生搜索结果的问题
你可以这样写:
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).
在 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] .
为什么要这样做?是因为下划线吗?如何在不按 ;
的情况下生成同时给出 two
和 four
的集合?
我不知道如何找到这个问题的答案,因为我无法将这个问题表述为产生搜索结果的问题
你可以这样写:
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).