鉴于英国王室, 仅使用男性(X),女性(X)和父母(X,Y),其中X的父亲为Y,如何创建继承行(X,Y),其中Y是序言中X的后继者
我已经定义了所有男性,女性和父母
我也试过这个:
son(X,Y) :- parent(X,Y), male(Y).
daughter(X,Y) :- parent(X,Y), female(Y).
successor(X,Y):- (son(X,Z);daughter(X,Z)) , (Y=Z;successor(Z,Y)).
显然它只能在安妮之前工作
路易斯之后,应该去安妮而不是彼得......
我根据他们在父母(X,Y)的出生安排事实。 事实:
male(charles).
male(william).
male(peter).
male(henry).
male(andrew).
male(edward).
male(viscount).
male(savanna).
female(elizabeth).
female(anne).
female(zara).
female(beatrice).
female(eugenie).
female(louise).
female(isla).
parent(elizabeth,charles).
parent(elizabeth,anne).
parent(elizabeth,andrew).
parent(elizabeth,edward).
parent(anne,peter).
parent(anne,zara).
parent(charles,william).
parent(charles,henry).
parent(andrew,beatrice).
parent(andrew,eugenie).
parent(edward,louise).
parent(edward,viscount).
parent(peter,savanna).
parent(peter,isla).
查询后继者(X,Y)时到目前为止的结果。
X = elizabeth,
Y = charles ;
X = elizabeth,
Y = william ;
X = elizabeth,
Y = henry ;
X = elizabeth,
Y = andrew ;
X = elizabeth,
Y = beatrice ;
X = elizabeth,
Y = eugenie ;
X = elizabeth,
Y = edward ;
X = elizabeth,
Y = viscount ;
X = elizabeth,
Y = louise ;
在此之后,当我试图去安妮家时,它出错了。
X = anne,
Y = peter ;
X = anne,
Y = savanna ;
X = anne,
Y = isla ;
X = charles,
Y = william ;
X = charles,
Y = henry ;
X = edward,
Y = viscount ;
X = peter,
Y = savanna ;
X = elizabeth,
Y = anne ;
X = elizabeth,
Y = peter ;
X = elizabeth,
Y = savanna ;
X = elizabeth,
Y = isla ;
X = elizabeth,
Y = zara ;
X = anne,
Y = zara ;
X = andrew,
Y = beatrice ;
X = andrew,
Y = eugenie ;
X = edward,
Y = louise ;
X = peter,
Y = isla ;
去我想要的安妮树时所需的输出是
X = elizabeth,
Y = anne;
X = anne,
Y = peter ;
X = anne,
Y = savanna ;
X = anne,
Y = isla ;
我一直在尝试各种各样的组合,这是我到目前为止最接近的 X是父级,而Y是父级(X,Y)中的子级。
尝试了后继者的组合:
successor(X,Y):- (son(X,Z);daughter(X,Z)) , (Y=Z;successor(Z,Y)).
successor(X,Y):- parent(X,Z), (Y=Z ; successor(Z,Y)).
successor(X,Y):- (male(Z);female(Z)) , (Y=Z;successor(Z,Y)).
successor(X,Y):- (parent(X,Z),(male(Z);female(Z)), (Y=Z;successor(Z,Y)).
他们都没有工作。
显示旧的继承线的实际结果是查尔斯的家庭,安德鲁的家庭,爱德华的家庭以及最后安妮的家庭。
答案 0 :(得分:2)
您的问题是您使用的条件比需要的更复杂,并且数据库不完整。
具体来说,查尔斯和彼得错过了性别,正如此代码所示
?- forall(((parent(P,_) ; parent(P,_)), \+(male(P);female(P))), writeln(P)).
charles
charles
peter
peter
charles
charles
peter
peter
true.
儿子和女儿依赖性别,使你的情况失败。您可以更正您的数据库,或坚持更简单的事情:
successor(X,Y) :- parent(X,Z), (Y=Z ; successor(Z,Y)).