【问题标题】:prolog family tree locating cousinsprolog家谱定位表亲
【发布时间】:2021-10-18 22:10:14
【问题描述】:

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=that被向上或向下删除第 n 次。

【问题讨论】:

  • 我有一个建议:由于 Stackoverflow 确实不是解决此类问题的最佳场所,请尝试使用邮件列表。例如 comp.lang.prolog 或 swi-prolog.discourse.group。您在这里有非常有效的问题,只是不适合这个地方。
  • @TA_intern 虽然可以在swi-prolog.discourse.group 向初学者提问,但他们可能不会得到回答,因为我们不在那里教授介绍性 Prolog。见:Welcome page。 IMO 正确的选择是给Needs more foucus 投票。
  • 广告1:你是不是要承认每个人都是selfsame的堂兄,有祖父母?
  • @TA_intern:为什么不能在 SO 上回答这个问题?
  • @false 是的,如果他们有一个祖父母,每个人都是堂兄弟。其他关系(例如两次删除的第二个表亲)变得更加复杂,这就是为什么我不认为我的实现是最好的方法。

标签: prolog relationship


【解决方案1】:

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

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.

Retrived from this repository

【讨论】:

  • 我的问题更多是关于您建议制定的规则。我说的更复杂。
  • @GavontiShawnPatton 在序言中,为了让生活更轻松,有必要制定解决小问题的小规则,同时通过将它们连接在一起来解决更大的问题。我在答案中展示的示例是如何实现它。
  • 这是我的建议
  • 谢谢我使用孩子事实从参考人上升到祖父母,然后回到第一表亲,然后我实施并调用兄弟规则来验证参考孩子的父母第一个堂兄是兄弟姐妹,证明他们是堂兄弟。这和你的意思一样吗?
猜你喜欢
  • 2016-03-17
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多