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

Prolog中第二代堂亲(second cousin)规则咨询及唐老鸭家族树实现需求

定义Prolog中的第二代堂亲规则(针对唐老鸭家族树)

首先得明确亲属关系的核心定义,这样我们的Prolog规则才符合实际的亲属称谓逻辑:

  • 第一代堂亲(First Cousin):两人的父母是亲兄弟姐妹(共享同一对祖父母)
  • 第二代堂亲(Second Cousin):两人的父母是第一代堂亲(共享同一对曾祖父母)

第一步:补充基础亲属谓词

你现有的uncle和father规则太局限了,先完善核心亲属关系的谓词,这样后续的堂亲规则才能更通用:

% 基础父/母谓词(假设你已经有father/2和mother/2的事实)
parent(X, Y) :- father(X, Y).
parent(X, Y) :- mother(X, Y).

% 兄弟姐妹(同父同母,可根据需求扩展到同父异母/同母异父)
sibling(X, Y) :-
    parent(P, X),
    parent(P, Y),
    X \= Y.  % 排除自己和自己的情况

% 叔叔/舅舅:父母的兄弟
uncle(Unc, Person) :-
    sibling(Unc, Parent),
    parent(Parent, Person).

% 姑姑/姨妈:父母的姐妹(可选,用于更完整的堂亲覆盖)
aunt(Aunt, Person) :-
    sibling(Aunt, Parent),
    parent(Parent, Person).

第二步:修正第一代堂亲规则

你原来的cousin/2规则只覆盖了叔叔的儿子,现在我们扩展成通用的第一代堂亲规则:

% 第一代堂亲:父母是兄弟姐妹,且两人不是同一个人
first_cousin(X, Y) :-
    parent(PX, X),
    parent(PY, Y),
    sibling(PX, PY),
    X \= Y.

第三步:定义第二代堂亲规则

基于第一代堂亲的规则,直接推导第二代堂亲——两人的父母是第一代堂亲:

% 第二代堂亲:父母是第一代堂亲,且两人不是同一个人
second_cousin(X, Y) :-
    parent(PX, X),
    parent(PY, Y),
    first_cousin(PX, PY),
    X \= Y.

另一种祖辈视角的定义(可选)

如果你想直接从曾祖父母的角度定义,也可以这样写(逻辑和上面等价,但更直观体现"共享曾祖父母"的关系):

second_cousin(X, Y) :-
    % X的祖父母和Y的祖父母是兄弟姐妹
    parent(PX, X), parent(GPX, PX),
    parent(PY, Y), parent(GPY, PY),
    sibling(GPX, GPY),
    X \= Y,
    \+ sibling(PX, PY).  % 排除父母是兄弟姐妹的情况(避免和亲兄弟姐妹/第一代堂亲混淆)

唐老鸭家族树的示例

假设唐老鸭的父亲Quackmore Duck和史高治的父亲Fergus McDuck是兄弟,那么:

  • donald和scrooge是first_cousin
  • 如果唐老鸭有孩子huey,史高治有孩子(假设)duckling,那么huey和duckling就是second_cousin

内容的提问来源于stack exchange,提问作者Alien Imran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:27:37