【问题标题】:determine the old line of succession prolog确定旧的继承序言
【发布时间】:2013-04-18 14:30:21
【问题描述】:

鉴于英国王室, 仅使用男性(X),女性(X)和父母(X,Y),其中X的父母是Y,如何创建继承线(X,Y),其中Y是prolog中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)).

显然它只在 anne 之前有效 在路易丝之后,它应该是安妮而不是彼得......

我已经根据父母(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).

查询successor(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 是 parent(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)).

他们都没有工作。

显示老继承人的实际结果是查尔斯家族,安德鲁家族,爱德华家族,最后是安妮家族。

【问题讨论】:

  • parent(X,Y) 的通常读法是“XY 的父级”。它还与给定的代码和数据库相对应(我想elizabeth 不能有四个父母)。

标签: prolog family-tree


【解决方案1】:

您的问题是您使用的条件比需要的复杂,并且数据库不完整。

具体来说,charles 和 peter 错过了性别,如这段代码所示

?- 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)).

【讨论】:

  • 这个,我已经试过了。它按顺序给出了 charles,anne,andrew,edward 家族,并重复了其他父子句。较旧的继承顺序是 charles,andrew,edward,anne 家族,因为 anne 是女性,所以她的家族分支会排在最后。
猜你喜欢
  • 2017-01-15
  • 2020-05-29
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2011-07-13
  • 1970-01-01
相关资源
最近更新 更多