2

首先感谢您的帮助。我正在编写一个描述家庭关系的序言程序,包括所有版本的姻亲。逻辑就在那里,我需要帮助的是一些序言问题,因为我对它不是很有经验。我试图通过使用分号为每个规则设置多种可能性。

我对待公婆的方式是让我的姐夫也是我的兄弟,所以我需要多次检查才能确定哪个是真的。如果任何选项为真,我希望 prolog 返回真,并且只有真。但是,它返回 true 和 false 作为可能的选项,因为当然其中一个选项总是为假,而另一个总是为真。他们要么是我的姐夫,要么是我的亲兄弟。我不能让 prolog 只返回 true,并且不能选择 false 作为另一个答案。如果有人有任何建议,那就太好了。相关代码如下。所以,如果我输入“兄弟(婴儿,爸爸)”。当我想要的都是假的时候,我会得到正确和错误的答案。但是,“兄弟(爸爸,宝宝)”。只返回真。但我现在在胡说八道。抱歉,如果任何代码与婴儿爸爸的东西混淆。谢谢!

/*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

谢谢阅读。我知道这不是最容易理解的。在您看到的一组事实中,孩子在上面。孩子双打考试以获得父母。因此,当我传入兄弟(婴儿,爸爸)时,程序然后调用 child(baby,X)=child(dad,X) 子函数被赋予子函数,因此它返回父函数。然后我检查父母是否相同,因为这意味着他们两个是兄弟。

于 2010-10-15T21:31:26.833 回答