Я новичок в прологе и хочу создать "братские" отношения.
Отношения должны быть симметричными, как если бы брат (alin, alex) истинно, брат (alex, alin) тоже должно быть.
Оно также должно быть транзитивным, как если бы брат (алин, алекс) и брат (алекс, клаудиу) истинны, брат (алин, клаудиу) strong > Так и должно быть.
Комбинируя свойства to, если brother (alex, alin) и brother (alex, claudiu) истинны, brother (alin, claudiu) следует тоже быть правдой.
Вот мой код:
r_brother(alin, alex).
r_brother(alin, ciprian).
r_brother(alex, claudiu).
s_brother(X, Y) :- r_brother(X, Y).
s_brother(X, Y) :- r_brother(Y, X).
brother(L1, L2) :-
t_brother(L1, L2, []).
t_brother(L1, L2, _) :-
s_brother(L1, L2).
t_brother(L1, L2, IntermediateNodes) :-
s_brother(L1, L3),
\+ member(L3, IntermediateNodes),
t_brother(L3, L2, [L3 | IntermediateNodes]).
r_brother - основное отношение
s_brother - симметричное братское отношение (это хорошо работает)
t_brother - это должно быть транзитивное и симметричное отношение, я сохраняю промежуточные узлы, поэтому у меня не будет цикла
Проблема в том, что ответ на:
?- brother(X, alin).
is:
X = alex ;
X = ciprian ;
X = alin ;
X = alin ;
X = alin ;
X = alin ;
X = alex ;
X = alex ;
X = alex ;
X = alex ;
X = ciprian ;
X = ciprian ;
X = claudiu ;
X = claudiu ;
false.
Я просмотрел след и понимаю, в чем проблема, но не знаю, как ее решить.
alin не может быть возможным ответом, а остальные должны появиться один раз.