我希望我使用了一个可以理解的标题。我想要实现的是序言来确定关系,即使它没有明确说明。
brother(anders, jason).
sister(anders, madonna).
siblings(X,Y) :- sister(X,Y).
siblings(X,Y) :- brother(X,Y).
siblings(X,Y) :- siblings(X,Z), siblings(Z,Y).
这是我正在努力解决的兄弟姐妹规则。很明显杰森是安德斯的弟弟,麦当娜是安德斯的妹妹。杰森和麦当娜因此是安德斯的兄弟姐妹。即使没有明确说明,他们也是兄弟姐妹。如何通过检查兄弟姐妹的兄弟姐妹来使 prolog 确定这一点?这是我的最后一条规则,它会导致堆栈溢出 \o/ 这真的不是那么令人惊讶。这是否可以以递归方式实现,还是我需要编写更多规则,例如:
siblings(X,Y) :- sister(X,Z), brother(Z,Y).
siblings(X,Y) :- sister(X,Z), sister(Z,Y).
siblings(X,Y) :- brother(X,Z), sister(Z,Y).
siblings(X,Y) :- brother(X,Z), brother(Z,Y).
如果我们有一个非常大的家庭并且在我们的兄弟/姐妹事实中存在更大的差距,上述方法将不起作用,这可能意味着我必须检查一个人是否是我兄弟姐妹的兄弟姐妹等等。
这可能不是一个很好的现实世界的例子,但我正在寻找处理这些情况的概念,而不是解决特定问题的方法。