Prolog 获得;是的;假;一组规则的两个答案集

Prolog 获得;是的;假;一组规则的两个答案集,prolog,prolog-toplevel,Prolog,Prolog Toplevel,首先谢谢你的帮助。我正在写一个prolog程序来描述家庭关系,包括所有版本的姻亲关系。逻辑就在那里,我需要帮助的是一些prolog问题,因为我对它不是很有经验。我试图通过使用分号为每个规则设置多种可能性 我对待姻亲的方式是,我的姐夫也是我的兄弟,所以我需要多次检查,看看哪个是真的。我希望prolog返回true,并且只有在任何选项为true时才返回true。但是,它返回true和false作为可能的选项,因为其中一个选项总是false,另一个总是true。他们要么是我的姐夫,要么是我的亲生兄弟。

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

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

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

谢谢你的阅读。我知道这不是最容易理解的。孩子在你所看到的一系列事实中处于上风。孩子参加双倍考试以得到父母。因此,当我传入brother(baby,dad)时,程序调用child(baby,X)=child(dad,X),子函数被赋予了child,因此它返回父函数。然后我检查父母是否相同,因为这意味着他们是兄弟

这些多重答案可以通过元谓词
once/1
来阻止:

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

?-

child(S1,P)=child(S2,P2)
应该做什么?(为什么不允许私生子,你还没学会否定吗?)(我正在做的项目比这更具体一点。我知道它的逻辑是奇怪的和具体的。我不确定否定在这里能帮我什么忙,尽管我对它不是很熟悉。我知道你想做什么,但这不是Prolog的工作方式
child(S1,P)=child(S2,P2)
尝试统一两个结构,这意味着S1和S2应该相等。ahhh是的。因此,为了达到我在本例中的目的,我真的想在使用每个函数之后测试P=P2。这将测试父对象是否相同。但是,当我从上一个指针进一步研究否定时,我认为这意味着我可以使用否定来创建函数brother(),这样,如果目标在任何时候被证明为真,它将返回真?基本上,就是我想要的结果。谢谢拉斯曼,我只是想对其他人说,这确实奏效了。我想我把事情复杂化了。对于任何感兴趣的人来说,我认为我的程序返回true作为第一个答案,然后当我询问任何其他可能的答案时,它返回false作为可能的答案。事实上,我现在认为它告诉我答案是真的,当我要求更多可能的答案时,它没有找到更多的答案,因此返回了假。据我所知,这个元谓词只通过搜索一次就解决了这个问题。谢谢