在prolog中找到一个没有兄弟姐妹的人

时间:2018-01-12 08:27:15

标签: prolog

我正在尝试编写Prolog代码来计算人类的财富如何根据伊斯兰继承规则在他的家庭成员之间划分。 其中一个案例是,如果女儿没有父亲的兄弟姐妹,她有权获得一半的财产。 所以我的问题是如何制定一条规则来测试女儿是否没有父亲的兄弟姐妹。

half(X,Y) :-
    father(Y,X),
    female(X),
    sibling(What to do here?),
    read(N),F is N*0.5, write(F).


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(Y,X)).
sister(X,Y):-female(X), (sibling(X,Y); sibling(Y,X)).
half(X,Y):-father(Y,X),female(X),sibling(X,_),read(N),F is N*0.5, write(F).

1 个答案:

答案 0 :(得分:-1)

就个人而言,我会添加一些规则以使意图更清晰 - 例如:

daughter(D,P) :- parent(P,D), female(D).

你可以创建一个规则,专门检查某人是否有兄弟姐妹:

has_sibling(X) :- sibling(X,_).

然后,您可以编写一个名为eligible_half\2的规则来检查是否符合资格 -

eligible_half(D,F) :- father(F,D), daughter(D,F), \+ has_sibling(D).

看起来你已经在代码底部的half/2定义中完成了相反的 - 你的定义要求女儿做< / em>有一个兄弟姐妹。

无论如何,这意味着您可以编写half\2的定义,该定义本身并不定义任何逻辑规则,只是检查eligible_half\2是否成立并执行某些I / O:

half(D,F):-
  eligible_half(D,F),
  read(N), number(N), HalfN is N*0.5, write(HalfN).

正如@lurker所说,您不需要在sibling\2brother\2的定义中对sister\2进行对称调用。希望这是有用的。