2


0

ルールセットに対する2つの答えの「true; false」セットの取得

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

私の義理の扱い方は、義理の兄弟も私の兄弟であるため、どちらが真実かを確認するために複数のチェックが必要です。 prologが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))).

2 回答


1


これらの複数の答えは、メタ述語 `once / 1`で防ぐことができます:

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

?-


0


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