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

如何用Prolog实现伊斯兰继承法中独女获半数遗产的判断规则

完善伊斯兰遗产继承中“无同父姐妹的女儿获半数遗产”的Prolog规则

看起来你已经搭建了基础的亲属关系框架,现在需要完善判断女儿是否无同父兄弟姐妹的逻辑,并且把遗产计算的逻辑和输入输出解耦(原代码里把read/1和write/1直接写在规则里,会让逻辑变得混乱,也不利于复用)。

第一步:定义同父兄弟姐妹的规则

首先我们需要明确同父兄弟姐妹的定义:和目标女儿拥有同一个父亲的兄弟姐妹(无论母亲是否相同)。先写这个规则:

% 同父兄弟姐妹:X和Y有同一个父亲,且X≠Y
same_father_sibling(X, Y) :-
    father(F, X),
    father(F, Y),
    X \= Y.

第二步:判断女儿是否无同父兄弟姐妹

接下来,我们写一个规则来检查某个女儿是否没有任何同父兄弟姐妹:

% 检查女儿X是否无同父兄弟姐妹
no_same_father_siblings(X) :-
    female(X),  % 确保X是女儿
    \+ (same_father_sibling(X, _)).  % 不存在任何和X同父的兄弟姐妹

这里的\+是Prolog的否定操作符,表示“不存在满足括号内条件的情况”。

第三步:重构遗产计算规则

原代码的half/1规则把逻辑和IO绑定在一起,我们把它拆成两部分:一个负责判断资格并计算份额,另一个负责处理输入输出:

% 计算符合条件的女儿应得的遗产份额
eligible_for_half_share(X, Total, Share) :-
    no_same_father_siblings(X),
    Share is Total * 0.5.

% 处理用户输入并输出结果的顶层规则
calculate_half_share :-
    write('请输入父亲的遗产总额:'),
    read(Total),
    write('请输入女儿的名字:'),
    read(Daughter),
    (eligible_for_half_share(Daughter, Total, Share) ->
        write(Daughter), write(' 有权获得的遗产份额为:'), write(Share)
    ;
        write(Daughter), write(' 不符合获得半数遗产的条件(存在同父兄弟姐妹)')
    ).

完整代码整合

把所有规则整合到一起,完整代码如下:

male(ahmed).
male(adel).
male(hamza).
male(marwan).
female(sara).
female(lobna).
female(ghada).
female(aisha).
female(noor).

parent(aisha,sara).
parent(aisha,hamza).
parent(aisha,ghada).
parent(adel,sara).
parent(adel,hamza).
parent(adel,ghada).
parent(adel,lobna).
parent(marwan,noor).

sibling(X,Y):-parent(Z,X), parent(Z,Y), X\=Y.
father(X,Y):-male(X), parent(X,Y).
mother(X,Y):-female(X), parent(X,Y).
brother(X,Y):-male(X), sibling(X,Y).  % 简化原规则,sibling本身是对称的,无需重复判断
sister(X,Y):-female(X), sibling(X,Y).  % 同理,无需额外对称判断

% 新增的同父兄弟姐妹规则
same_father_sibling(X, Y) :-
    father(F, X),
    father(F, Y),
    X \= Y.

% 判断女儿无同父兄弟姐妹
no_same_father_siblings(X) :-
    female(X),
    \+ (same_father_sibling(X, _)).

% 计算符合条件的份额
eligible_for_half_share(X, Total, Share) :-
    no_same_father_siblings(X),
    Share is Total * 0.5.

% 顶层交互规则
calculate_half_share :-
    write('请输入父亲的遗产总额:'),
    read(Total),
    write('请输入女儿的名字:'),
    read(Daughter),
    (eligible_for_half_share(Daughter, Total, Share) ->
        format('~w 有权获得的遗产份额为:~w~n', [Daughter, Share])
    ;
        format('~w 不符合获得半数遗产的条件(存在同父兄弟姐妹)~n', [Daughter])
    ).

测试例子

比如测试noor:她的父亲是marwan,没有其他同父兄弟姐妹,所以应该符合条件:

?- calculate_half_share.
请输入父亲的遗产总额:1000.
请输入女儿的名字:noor.
noor 有权获得的遗产份额为:500.0
true.

测试sara:她的父亲是adel,有同父的hamza、ghada、lobna,所以不符合条件:

?- calculate_half_share.
请输入父亲的遗产总额:1000.
请输入女儿的名字:sara.
sara 不符合获得半数遗产的条件(存在同父兄弟姐妹)
true.

补充说明

  1. 原代码中的brother/2和sister/2规则里的(sibling(X,Y);sibling(Y,X))是多余的,因为sibling/2本身就是对称的(如果X是Y的兄弟姐妹,Y自然也是X的兄弟姐妹),所以可以简化。
  2. 把逻辑和IO分离后,eligible_for_half_share/3可以单独被其他规则调用,扩展性更好,比如后续添加其他继承规则时可以复用这个判断逻辑。

内容的提问来源于stack exchange,提问作者Hamza Yussif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:01:24