【发布时间】:2017-12-06 06:43:39
【问题描述】:
我是 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).
但它变成了一个无限循环。我不知道如何编写基本案例。
关系是一个带循环的图。反正有没有递归地找到朋友的朋友,传递?
【问题讨论】:
-
friend(X, Y) :- friends(X,Ys), member(Y,Ys).和visible(X, Y) :- closure(friend, X, Y).使用 this definition。 -
我收到了这个错误:错误:未定义的过程:闭包/3,异常:(9)闭包(朋友,a,b)?当我查询可见(a,b)时。
-
你需要使用上面链接中
closure/3的定义!
标签: prolog