我是序言初学者,我想创建“兄弟”关系。
关系应该是对称的,如果兄弟(alin,alex)是真的,兄弟(alex,alin)也应该是。
它也应该是传递的,如果兄弟(alin, alex)和兄弟(alex, claudiu)为真,兄弟(alin, claudiu)也应该是。
结合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).
是:
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不应该是一个可能的答案,其他人应该出现一次。