首先感谢您的帮助。我正在写一个描述家庭关系的序言,包括所有版本的姻亲。逻辑就在那里,我需要帮助的是一些prolog问题,因为我对它不是很有经验。我试图通过使用分号为每个规则设置多种可能性。
我治疗姻亲的方式是让我的兄弟也是我的兄弟,所以我需要多次检查才能看出哪些是真的。我希望prolog能够返回true,并且只有在任何选项都是真的情况下才是真的。但是,它返回true和false作为可能的选项,因为当然其中一个选项总是为假而另一个总是为真。要么他们是我的兄弟,要么是我的天生兄弟。我不能让prolog只返回true,而不能选择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))).
答案 0 :(得分:1)
使用元谓词once/1
:
?- once(brother(baby,dad)).
true.
?-
答案 1 :(得分:0)
感谢阅读。我知道这不是最容易理解的。在你看到的事实中,孩子在上面。孩子为了得到父母而进行双打测试。因此,当我传入兄弟(婴儿,爸爸)时,该程序然后调用child(baby,X)= child(dad,X)子函数被赋予子项,因此它返回父项。然后我检查父母是否相同,因为这意味着两个人是兄弟。