【发布时间】:2015-02-08 02:27:05
【问题描述】:
我正在上一门编程课,大多数人都是 c++,我们在 Prolog 上上了几节课,导师告诉我们自己研究,这就是我一直在做的。我一直在玩家谱程序,但我在使用相同代的规则时遇到了麻烦。同一代人基本上是兄弟姐妹或堂兄弟。以我现在的方式,
如果我查询:
same_generation(jill,X).
我明白了:
false.
如果我查询:
same_generation(jack, X).
我明白了:
X=jack
X=phil
没错,但吉尔也是同一代人。
任何有关我在该规则中出错的地方的帮助将不胜感激!下面是“家谱”和我的代码。
我只是要抛开规矩,拿出大部分事实来压缩帖子……
mother(lisa,abe). ....
father(tony,abe). ....
parent(X,Y) :-mother(X,Y).
parent(X,Y) :-father(X,Y).
sibling(X,Y) :- father(P,X), father(P,Y), mother(Q,X), mother(Q,Y).
cousin(X,Y) :-parent(A,X), parent(B,Y), sibling(A,B).
same_generation(X,Y) :- sibling(Someone,P), cousin(Someone,X), cousin(P,Y).
【问题讨论】:
-
吉尔和杰克是堂兄弟。你只考虑兄弟姐妹和堂兄弟。因此它不会发现 Jack 和 Jill 是同代。
-
有向边代表什么?
-
也许您可以将
same_generation定义为“有一个共同的祖先N 级以上”。ancestor(X,Y,N)的东西,其中 X 是 Y 的祖先,他们之间有 N 人 - 所以父母为零,祖父母为 1,等等。这样,Jill 和 Jack 将来自同一代,因为 Lisa 作为 2 级的祖先. 杰克和菲尔将来自同一代人,因为他们拥有相同的父母。 -
@vmg,这可能还不够(这取决于
same_generation的含义)。例如,Rob 和 Mary 是同一代人,但他们没有共同的祖先。 -
是的,但我是按照 OP 的说法,即“同一代人本质上是兄弟姐妹或堂兄弟”,这似乎意味着只打算使用“同一家庭的同一代人”。感谢您指出这一点,希望 OP 看到这一点并考虑他是否需要考虑配偶等。