兄弟姐妹的关系似乎并不能涵盖所有情况

时间:2018-03-13 01:29:45

标签: prolog

我的任务是在prolog中创建姐妹关系,以及其他基本关系。问题是我的断言没有涵盖所有角度,原因是我没有得到。目前我有

female(X)).
male(X).
parent(X,Y).

sibling(X,Y) :- female(X), parent(Z,X), parent(Z,Y).

female(mom).
female(mary).

male(tim).

parent(mom,tim).
parent(mom,mary).

有了这个,我的代码在使用像姐妹(玛丽,蒂姆)(等于真)或姐妹(父亲,蒂姆)(等于假)之类的东西进行测试时工作得很好但我现在遇到的问题是定义姐姐(妈妈) ,蒂姆)是真实的。虽然这可能是我们这个世界上某个地方的真实陈述,但鉴于我正在进行的任务,我觉得这不是正确的。

1 个答案:

答案 0 :(得分:1)

使用以下内容启动您的程序:

female(X)).
male(X).
parent(X,Y).

您可能认为这些是"声明"您将使用的关系,但他们不是。他们是定义的规则说"任何人都是女性","任何人都是男性","任何对象都是任何对象的父母和任何对象#34 ;.删除这些。

然后,让我们稍微分解你的问题。姐姐是女性的兄弟姐妹。兄弟关系本身很有用,所以让我们首先定义,特别是不要担心姐妹:

siblings(X, Y) :-
    parent_of(Parent, X),
    parent_of(Parent, Y).

parent_of(mom, tim).
parent_of(mom, mary).

观察我如何将您的parent关系重命名为parent_of。这不是对称关系,对于像parent(X, Y)这样的术语,我们可能不知道哪个参数是父参数,哪个参数是子参数。将其命名为parent_of更具暗示性:parent_of(X, Y)表示(从左到右阅读):XY的父级。

我们现在可以测试一下:

?- siblings(X, Y).
X = Y, Y = tim ;
X = tim,
Y = mary ;
X = mary,
Y = tim ;
X = Y, Y = mary.

请注意,这还不正确!它说蒂姆是他自己的兄弟姐妹,玛丽是她自己的兄弟姐妹。你需要解决这个问题。我暂时继续使用它。

现在,正如我们所说,姐姐是一位女性兄弟姐妹。现在很容易表达:

sister_of(Sister, Sibling) :-
    female(Sister),
    siblings(Sister, Sibling).

female(mom).
female(mary).

male(tim).

Sister是某些Sibling的姐妹,如果Sister是女性且他们是兄弟姐妹。就这些。请注意,这些变量名称比XY提供更多信息!

让我们测试一下:

?- sister_of(Sister, Sibling).
Sister = mary,
Sibling = tim ;
Sister = Sibling, Sibling = mary.

只有玛丽是任何人的妹妹,这就是我们想要的。她也是她自己的妹妹,我们不想要,但这与siblings/2定义中的上述问题相同。