Разве это не должно быть больше по этим направлениям?
friends( X , Y ) :- mates( X , Y ).
friends( X , Y ) :- mates( X , T ) , mates( T , Y ).
Если вы хотите похожих друзей (за ваш комментарий ниже), попробуйте:
friend( X , Y ) :-
mates( X , T ) ,
mates( Y , T ) ,
X \= Y .
Оператор \=
означает «не различим с», поэтому он должен исключать случаи, когда сторона А дружит с собой. Точный оператор 'not unifiable with' может варьироваться в зависимости от реализации.
Также имейте в виду, что «правильное» решение является немного более запутанным, чем может показаться, что отношения между товарищами переходные: если Андреа является партнером Билла, предположительно, Билл является партнером Андреа. Ваше решение, вероятно, должно принять это во внимание.