【发布时间】:2010-10-25 01:01:44
【问题描述】:
所以,我仍然不完全理解 prolog 中的列表和递归是如何工作的,这可能是我遇到问题的原因,但我什至不知道如何开始这个问题。
有一个朋友列表。
f(a,b).
f(a,c).
f(a,d).
f(b,c).
f(b,e).
f(b,f).
f(c,e).
f(c,g).
f(g,e).
etc..
我必须通过最多两个朋友的朋友来确定某人是否是朋友。
如果我这样做的例子
fof(a,e, List).
那我应该得到
List = [a, b, e];
List = [a, c, e];
List = [a, c, g, e]; <-- anything past this point won't work
所以基本上你检查自己,然后看看你的朋友是否是 person2 的朋友,然后看看他们的朋友是否是 person2 的朋友,如果他们被添加到列表中。
虽然不完全确定如何执行此操作。
好的,所以我得到了与我需要的相似的东西。
fb(X,X,_).
fb(X,Y,List) :-
friend(X,Y),
X \== Y,
List = [X,Y].
fb(X,Y,List) :-
friend(X,Z),friend(Z,Y),
X \== Y, X \== Z, Z \== Y,
List = [X,Z,Y].
fb(X,Y,List) :-
friend(X,Z),friend(Z,Q),friend(Q,Y),
X \== Y,X \== Z, X \== Q, Z \== Q, Z \== Y, Q \== Y,
List = [X,Z,Q,Y].
这似乎可行,但似乎我可以用递归来压缩它,只是不确定如何。
【问题讨论】: