最初に助けてくれてありがとう。私は、義理のすべてのバージョンを含む、家族関係を説明するプロローグプログラムを書いています。ロジックはすべてそこにあります。私が助けを必要としているのは、私があまり経験していないので、いくつかのプロローグの問題です。セミコロンを使用して、ルールごとに複数の可能性を設定しようとしています。
私が義理の兄弟を扱っている方法は、義理の兄弟が私の兄弟でもあるようにすることです。そのため、どちらが正しいかを確認するために複数のチェックが必要です。私はプロローグがtrueを返したいのですが、オプションのいずれかがtrueの場合にのみtrueを返します。ただし、もちろん、オプションの1つは常にfalseになり、もう1つは常にtrueになるため、可能なオプションとしてtrueとfalseが返されます。彼らは私の義理の兄弟か、私の生まれながらの兄弟のどちらかです。私はプロローグにtrueのみを返すようにさせることはできず、別の答えとしてfalseのオプションがありません。誰かアドバイスがあればそれは素晴らしいことです。関連するコードは以下に含まれています。だから、「brother(baby、dad)」と入力すると。私が欲しいのは偽であるとき、私は可能な答えとして真と偽を取得します。しかし、「兄弟(お父さん、赤ちゃん)」。trueのみを返します。しかし、私は今とりとめのないです。コードのいずれかが赤ちゃんのお父さんのものと混同している場合は申し訳ありません。ありがとう!
/*facts for relationships*/
female(widow).
female(redhair).
spouse(i,widow).
spouse(widow,i).
spouse(dad,redhair).
spouse(redhair,dad).
child(i,dad).
child(redhair,widow).
child(baby,i).
child(onrun,dad).
male(onrun).
male(baby).
male(dad).
male(i).
/*rules*/
daughter(D,P):-
female(D), (child(D,P);(spouse(P,S),child(D,S))).
son(D,P):-
male(D), (child(D,P);(spouse(P,S),child(D,S))).
mother(X,Y):-
female(X),
child(Y,X).
father(X,Y):-
male(X),
child(Y,X).
son_in_law(C,P):-
male(C),spouse(C,S),
(child(S,P);(spouse(P,W),child(S,W))).
daughter_in_law(C,P):-
female(C),spouse(C,S),
(child(S,P);(spouse(P,W),child(S,W))).
brother(S1,S2) :- male(S1),
(child(S1,P) = child(S2,P2));
(child(S1,P),child(S2,P2),spouse(P,P2));
((child(S1,P),son_in_law(S2,P));(child(S2,P),son_in_law(S1,P))).