【问题标题】:Prolog, find friend of friendProlog,找朋友的朋友
【发布时间】: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


【解决方案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).

第一行检查两个人是否直接成为朋友(YX 的朋友列表中)。第二行检查两个人是否是朋友的朋友(元素Z 都在XY 的朋友列表中。如果您还想知道共同的朋友,您可以添加@987654327 @)。例如,在这种情况下,joejohn 的朋友,但反之则不然。如果你也想要这个属性,你应该添加

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).

【讨论】:

  • 当我尝试查询并得到一个真实的结果时,我必须输入一个'.'在“真”之后结束命令。你知道这是怎么发生的吗?
  • @Shiloh_C 你是什么意思?你用什么序言?
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多