1

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

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

为什么这样做?是因为下划线吗?如何在不按two和的情况下生成一个集合?我不知道如何找到答案,因为我无法将这个问题转化为产生搜索结果的问题four;

4

2 回答 2

3

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

于 2016-10-12T17:21:21.947 回答
2

除了@coder 的答案,您还可以使用以下方式编写library(lambda)

?- setof(X, X+\otherFact(one,X,_,_), List).
于 2016-10-12T17:34:25.033 回答