我是 Prolog 新手。我正在尝试编写一个查询来检查一个人是否是另一个人的朋友或朋友的朋友。
我有一些这样的事实:
friends(joe, [john, ann, pete, ellen,
maria, jose, bruno, ali, jing, yang]).
friends(john, [rick]).
friends(ellen, [mia, xing, jun, maria]).
friends(maria, [pete, ellen, zhang, jose, serena]).
friends(serena, [ali, rick, zhang, mia]).
friends(jose, [maria, jose, bruno, ali, jing]).
我的目标是编写这样的查询:
visible(joe, ann).
true
我做了这样的事情:
visible(X,Y) :- friends(X,[Y|T]); member(Y,T).
visible(X,Y) :- visible(X,Z), visible(Z,Y).
member(X,[X|T]).
member(X,[H|T]) :- member(X,T).
但它变成了无限循环。我不知道如何写基本情况。
该关系是一个带有循环的图。无论如何,是否可以递归地、传递性地找到朋友的朋友?