我是序言初学者,我想创建“兄弟”关系。
该关系应该是对称的,就像兄弟(阿林、亚历克斯)是真的,兄弟(亚历克斯、阿林)应该也是如此。
它也应该是传递的,就像兄弟(阿林、亚历克斯) and 兄弟(亚历克斯、克劳迪乌)是真的,兄弟(阿林、克劳迪乌)应该也是如此。
结合 到 属性,如果兄弟(亚历克斯、阿林) and 兄弟(亚历克斯、克劳迪乌)是真的,兄弟(阿林、克劳迪乌)也应该如此。
这是我的代码:
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(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不应该是一个可能的答案,其他答案应该出现一次。