prolog家谱定位表兄妹



The Cousin Explainer

写一个程序,当给定一个参考对象和一个学位时,程序可以告诉我这个人的所有第n个学位的表兄弟。我开始写我的事实:男性/1女性/1和儿童/2这些都是我的家庭成员的名字。然后我开始为表兄弟写规则,我想我应该为每个程度写一个不同的规则,所以只到第三个表兄弟。我遇到的问题如下:

  1. firstCousin_of(X,Y):-child(X,Z1),child(Y,Z2),child(Z1,Z),child(Z2,Z).我有这个找到第一个表兄,但第二个表兄更复杂,这让我认为必须有一种方法递归地做到这一点。
  2. 我需要规则all_cousins(Person, Degree, ListOfCousins),它在计算出所有的第n度表兄弟后编辑所有表兄弟的列表,只包括那些特定的第n度表兄弟。我已经习惯了命令式语言,我所能想到的是,我如何向规则传达人们从一个规则到另一个规则的列表中删除的内容。
  3. 最后我有一个规则,all_cousinsRemoved(Person, Degree, removed(Number, Direction), ListOfCousins),我甚至不知道从哪里开始,但我需要all_cousins规则,因为它做同样的事情,但也只包括表兄弟在编辑列表w=被删除n次向上或向下。

最好的解决方案是制定几个规则来调用其他规则,这里有一个例子

male(dicky).
male(randy).
male(mike).
male(don).
male(elmer).
female(anne).
female(rosie).
female(esther).
female(mildred).
female(greatgramma).
male(blair).
male(god).
female(god).
parent(don,randy).
parent(don,mike).
parent(don,anne).
parent(rosie,randy).
parent(rosie,mike).
parent(rosie,anne).
parent(elmer,don).
parent(mildred,don).
parent(esther,rosie).
parent(esther,dicky).
parent(greatgramma,esther).
parent(randy,blair).
male(mel).
male(teo).
parent(melsr,mel).
parent(melsr,teo).
american(anne).
american(X) :-  ancestor(X,anne).
american(X) :- ancestor(anne,X).
relation(X,Y) :- ancestor(A,X), ancestor(A,Y).
father(X,Y) :- male(X),parent(X,Y).
father(god, _) :- male(god).
mother(X,Y) :- female(X),parent(X,Y).
son(X,Y) :- male(X),parent(Y,X).
daughter(X,Y) :- female(X),parent(Y,X).
grandfather(X,Y) :- male(X),parent(X,Somebody),parent(Somebody,Y).
aunt(X,Y) :- female(X),sister(X,Mom),mother(Mom,Y).
aunt(X,Y) :- female(X),sister(X,Dad),father(Dad,Y).
sister(X,Y) :- female(X),parent(Par,X),parent(Par,Y), X = Y.
uncle(X,Y) :- brother(X,Par),parent(Par,Y).
cousin(X,Y) :- uncle(Unc , X),father(Unc,Y).
ancestor(X,Y) :- parent(X,Y).
ancestor(X,Y) :- parent(X,Somebody),ancestor(Somebody,Y).
brother(X,Y) :-  male(X),parent(Somebody,X),parent(Somebody,Y), X = Y.

从此存储库检索

最新更新