我的任务是在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).
有了这个,我的代码在使用像姐妹(玛丽,蒂姆)(等于真)或姐妹(父亲,蒂姆)(等于假)之类的东西进行测试时工作得很好但我现在遇到的问题是定义姐姐(妈妈) ,蒂姆)是真实的。虽然这可能是我们这个世界上某个地方的真实陈述,但鉴于我正在进行的任务,我觉得这不是正确的。
答案 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)
表示(从左到右阅读):X
是Y
的父级。
我们现在可以测试一下:
?- 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
是女性且他们是兄弟姐妹。就这些。请注意,这些变量名称比X
和Y
提供更多信息!
让我们测试一下:
?- sister_of(Sister, Sibling).
Sister = mary,
Sibling = tim ;
Sister = Sibling, Sibling = mary.
只有玛丽是任何人的妹妹,这就是我们想要的。她也是她自己的妹妹,我们不想要,但这与siblings/2
定义中的上述问题相同。