我有一个定义为的用户事实列表:
user(@michael).
user(@ana).
user(@bob).
user(@george).
user(@john).
等等。此外,我有一组事实:
follows(@michael,@ana).
follows(@ana,@bob).
follows(@bob,@michael).
我正在尝试编写一个间接(user1,user1)关系,它将告诉我user1是否间接跟随user2。但是,我无法消除周期性关系。
就像在给定的示例中一样,michael-> ana-> bob-> michael将导致循环。
从indirect(user1,user2)的结果中消除这些周期的最佳方法是什么?
您可以制定一条规则,以传递到目前为止您已经“看到”的用户的额外列表,并忽略源自这些用户的以下信息:follows(A, B, Seen)
。
为此,定义一个“遵循传递”规则,该规则将实际规则包装起来,如下所示:
follows_tx(A, B) :- follows(A, B, []).
现在,您可以通过follows/3
以下方式定义规则:
follows(A, B, Seen) :-
not_member(B, Seen),
follows(A, B).
follows(A, B, Seen) :-
follows(A, X),
not_member(X, Seen),
follows(X, B, [A|Seen]).
基本子句说,如果存在有关A
跟随B
的事实,只要我们B
之前从未见过,我们就认为该谓词已被证明。
否则,我们将找到一个关注者A
,通过选中来检查我们是否尚未看到该用户not_member/2
,最后查看该用户是否B
直接或间接关注了该用户。
最后,这是定义的方式not_member
:
not_member(_, []).
not_member(X, [H|T]) :- dif(X, H), not_member(X, T).
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句