如何在Prolog中定义要求所有的规则?

时间:2014-10-03 12:18:22

标签: prolog

拥有知识库:

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。

1 个答案:

答案 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,因为您不需要连接。

你打算怎么处理这个问题?