首先感谢您的帮助。我正在编写一个描述家庭关系的序言程序,包括所有版本的姻亲。逻辑就在那里,我需要帮助的是一些序言问题,因为我对它不是很有经验。我试图通过使用分号为每个规则设置多种可能性。
我对待公婆的方式是让我的姐夫也是我的兄弟,所以我需要多次检查才能确定哪个是真的。如果任何选项为真,我希望 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))).