You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:51:43