2

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

私が義理の兄弟を扱っている方法は、義理の兄弟が私の兄弟でもあるようにすることです。そのため、どちらが正しいかを確認するために複数のチェックが必要です。私はプロローグが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))).
4

2 に答える 2

1

これらの複数の回答は、 meta-predicate で防止できますonce/1

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

?-
于 2010-10-15T22:14:50.210 に答える
0

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

于 2010-10-15T21:31:26.833 に答える