質問

最初に助けてくれてありがとう。私は、義理のすべてのバージョンを含む家族関係を説明するプロログプログラムを書いています。ロジックはすべてそこにあります。私が助けを必要とするのは、私がそれをあまり経験していないので、いくつかのプロログの問題です。セミコロンを使用して、各ルールの複数の可能性を設定しようとしています。

私が義理の扱いをする方法は、義理の兄弟も私の兄弟であるようにすることです。そのため、どちらが真実かを確認するには複数のチェックが必要です。 Prologが真実であることを望んでいます。ただし、もちろんオプションの1つは常に虚偽になり、もう1つは常に真であるため、可能なオプションとして真実とfalseを返します。彼らは私の兄弟であるか、私の自然な兄弟です。 Prologを真実に戻すことができず、別の答えとしてFalseのオプションがありません。誰かがアドバイスを持っているなら、それは素晴らしいことです。関連するコードを以下に示します。したがって、「兄弟(赤ちゃん、お父さん)」と入力した場合。私が望むのが偽りであるとき、私は可能な限りの答えを真実と偽りにします。しかし、「兄弟(お父さん、赤ちゃん)」。 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))).
役に立ちましたか?

解決

これらの複数の回答は、メタプレジケートを使用して防止できます once/1:

?- once(brother(baby,dad)).
true.

?-

他のヒント

読んでくれてありがとう。私はそれが最も簡単に理解するのではないことを知っています。子供はあなたが見る一連の事実の上にあります。親を得るためのテストのために子供が2倍になります。したがって、私が兄弟(赤ちゃん、お父さん)を渡すと、プログラムは子供(赤ちゃん、x)=子供(お父さん、x)を呼び出します。子供の機能は子供に与えられているので、親を返します。次に、両親が同じかどうかを確認します。それは、2人が兄弟であることを意味するためです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top