如何在Prolog家族代码中实现侄子关系查询?
解决Prolog中侄子关系(nephew/2)的问题
首先得夸夸你,son/2和sibling/2的逻辑都是对的,问题就出在nephew/2的逻辑顺序上,咱们来掰扯清楚:
侄子关系的核心逻辑
要实现nephew(X, Y)(X是Y的侄子,Y是X的姑母/叔父),得同时满足两个条件:
- X是男性,且是某个人Z的儿子(也就是
son(X, Z),Z是X的父亲或母亲) - Z和Y是兄弟姐妹(
sibling(Z, Y)——毕竟Y得是X爸妈的兄弟姐妹,才能成为X的姑母/叔父呀)
你原来写的nephew(X, Y) :- sibling(Y, Z), son(Z, X)逻辑完全搞反了,它表达的是“Z是X的儿子,且Y和Z是兄弟姐妹”,这显然不是咱们要的侄子关系~
修正后的完整代码
把nephew/2的逻辑调整过来就ok了,完整代码如下:
parent(pam,bob). parent(john,bob). parent(john,liz). parent(bob,ann). parent(bob,pat). parent(pat,jim). parent(liz,joe). parent(liz,tim). parent(joe,kim). female(pam). female(liz). female(ann). female(pat). female(zoe). female(kim). male(bob). male(john). male(jim). male(joe). male(tim). sibling(X, Y) :- parent(Z, X), parent(Z, Y), X \= Y. son(X,Y) :- parent(Y, X), male(X). % 修正后的侄子关系谓词 nephew(X, Y) :- son(X, Z), sibling(Z, Y).
测试验证
现在你可以试试这些查询:
- 输入
nephew(X, bob).,会得到X=joe和X=tim(因为joe、tim的妈妈liz是bob的姐妹,他俩自然是bob的侄子) - 输入
nephew(jim, Y).,会得到Y=ann(ann是jim妈妈pat的姐妹,所以ann是jim的姑母)
另外补充个小扩展:如果需要区分侄子(男性)和侄女(女性),可以再定义一个niece/2谓词,把son换成daughter就行啦(记得先写daughter(X,Y) :- parent(Y,X), female(X).)。
内容的提问来源于stack exchange,提问作者user11084255
相关产品推荐
相关产品推荐

