我是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).
但它变成了无限循环。我不知道如何编写基本案例。
关系是带循环的图形。无论如何以传递方式递归地找到朋友的朋友?
答案 0 :(得分:1)
visible(X,Y):- friends(X,YS), member(Y,YS).
visible(X,Y):- friends(X,XF), friends(Y,YF), member(Z,XF), member(Z,YF).
第一行检查两个人是否是直接朋友(Y
在X
的朋友列表中。第二行检查两个peolpe是否是朋友的朋友(元素Z
都在X
和Y
的朋友列表中。如果您还想知道这位朋友是谁常见的是你可以添加write(Z)
)。例如,在这种情况下,joe
是john
的朋友,但没有反之亦然。如果您还想要此属性,则应添加
visible(X,Y):- friends(Y,XS), member(X,XS).
查询:
?-visible(john,serena).
true.
?-visible(joe,john).
true.
?-visible(john,joe).
true. (only if you add the third line of code).