Итак, я до сих пор не до конца понимаю, как списки и рекурсия работают в прологе, возможно, поэтому у меня возникли проблемы с этим, но я даже не знаю, как начать эту проблему.
Есть список друзей.
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].
Кажется, это работает, но, кажется, я мог бы сжать это с помощью рекурсии, просто не знаю, как.