私はプロローグ初心者で、「兄弟」関係を作りたいと思っています。
兄弟 (alin, alex)が true である場合、兄弟 (alex, alin)も同様である必要があるように、関係は対称である必要があります。
また、brother(alin, alex)とbrother(alex, claudiu)が true である場合、brother(alin, claudu ) も true である場合のように、推移的である必要があります。
to プロパティを組み合わせると、brother(alex, alin)とbrother(alex, claudiu)が true の場合、brother(alin, claudu)も true になるはずです。
これが私のコードです:
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は可能な答えであってはならず、他の答えは 1 回だけ現れるべきです。