Prolog- 从事实中返回元素
Prolog- Returning elements from facts
我遇到了事实问题。假设我有 3 个事实和 check(X)
个问题。
fact(a,b).
fact(b,c).
fact(a,d).
check(X):-
//some calculation with fact()
如何根据所有事实对给定 X
的 return 元素列表提出上述问题?
例如:check(a)
将给出结果 b
和 d
。所以我可以稍后使用这个常量。
check(b)
会 return 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])
现在成立。
我遇到了事实问题。假设我有 3 个事实和 check(X)
个问题。
fact(a,b).
fact(b,c).
fact(a,d).
check(X):-
//some calculation with fact()
如何根据所有事实对给定 X
的 return 元素列表提出上述问题?
例如:check(a)
将给出结果 b
和 d
。所以我可以稍后使用这个常量。
check(b)
会 return 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])
现在成立。