拥有知识库:
must_have(user, car, blue).
must_have(user, car, yellow).
must_have(user, bike, green).
如何定义:
is_a_collector(X):-must_have(X, car, blue),
must_have(X,car,yellow),
must_have(X,bike,green).
没有说明所有条件?
我这样说是因为知识域很大,我想定义一个能够捕获许多条件的规则。
我正在使用Swi-Prolog。
答案 0 :(得分:3)
对于SWI-Prolog,您可以使用library(aggregate)
中的foreach/2
。阅读有关它究竟是什么的文档,但实际上,它会创建您需要的连接。
?- foreach(must_have(X, _, _), X = user).
true.
?- foreach(must_have(X, _, _), X = foo).
false.
或者如果要定义谓词,
is_a_collector(X) :- foreach(must_have(Y, _, _), Y = X).
然而,@ lurker是对的,你的问题有点不清楚。建议的解决方案也感觉有些奇怪。至少,如果您希望能够声明任何不返回真理的查询,那么您的数据库应该包含其他表。目前,上面的第一个查询询问:
“每个must_have/3
事实都有user
作为其第一个参数吗?”
为此,您可以直接使用forall/2
,因为您不需要连接。
你打算怎么处理这个问题?