我遇到了事实问题。假设我有 3 个事实和check(X)问题。
fact(a,b).
fact(b,c).
fact(a,d).
check(X):-
//some calculation with fact()
如何使上述问题返回X所有事实给定的元素列表?例如:check(a)会给出结果b和d. 所以我以后可以使用这个常量。
check(b)会回来c的。我将不胜感激!
您需要一个额外的列表参数。所以你不能说它check/1只有一个参数,但是——让我们说—— related_to/2。
related_to(X, Ys) :-
setof(Y, fact(X, Y), Ys).
示例查询:
?- related_to(a, Xs).
Xs = [b, d].
?- related_to(b, Xs).
Xs = [c].
?- related_to(d, Xs).
false.
?- related_to(X, Xs).
X = a,
Xs = [b, d] ;
X = b,
Xs = [c].
请注意,对于上述不存在的节点,该关系将失败d。另一方面,您甚至可以提出最一般的目标,一次获得所有可能的答案。
另请注意,这种关系不是单调的:如果添加更多事实,则先前获得的结果不再成立。就像通过添加fact(a,f)目标related_to(a, [b,d])不再成立。相反related_to(a,[b,d,f])现在成立。