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

我对待公婆的方式是使我的兄弟也是我的兄弟,所以我需要多次检查才能查看哪个是真的。我希望Prolog返回True,并且只有在任何选项为真时才返回。但是,它可以作为可能的选项返回真实和错误,因为当然,其中一个选项始终将是错误的,而另一个选项始终将是真实的。他们要么是我的兄弟,要么是我的自然兄弟。我不能让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))).
有帮助吗?

解决方案

这些多个答案可以阻止使用元隐形 once/1:

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

?-

其他提示

谢谢阅读。我知道这不是最容易理解的。孩子在您看到的一系列事实中。孩子双打考试以招收父母。因此,当我经过兄弟(宝贝,爸爸)时,该程序随后打电话给孩子(baby,x)=孩子(爸爸,x)给孩子的功能得到给孩子,所以它返回了父母。然后,我检查父母是否相同,因为这意味着两个是兄弟。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top