1.Whale有骨干。
whale(X):-backbone(X).
2.Whale和母亲的奶一起长大。
whale(X):-grows(X,Y),milk(Y,mother).
OR
grows(X):-whale(X),drinks(X,mother's_milk).
答案 0 :(得分:3)
这实际上取决于您希望如何组织数据库。例如,你也可以说:
脊椎动物(有骨干)是鲸鱼,狗或蛇。
vertebrate(whale). vertebrate(god). vertebrate(snake).
鲸鱼是脊椎动物吗?
?- vertebrate(whale). true.
类似地,
哺乳动物(以母乳喂养)是鲸鱼或狗。
mammal(whale). mammal(dog).
这里的信息是,因为你需要以某种形式积极地提供数据库,并且因为“脊椎”和“脊椎动物”是相同的,所以你可以明确列出所有哺乳动物。
或者你在考虑一些用例,其中whale/1
的参数是程序创建的对象,而骨干需要以某种特定的方式查看它(例如查看属性的值,例如成功还是失败?
这样想:
鲸鱼有骨干
has(whale, backbone).
但是,你可以写,
vertebrate(X) :-
has_backbone(X).
has_backbone(X) :-
has(X, backbone).
在那一点上你应该明白为什么这确实没有必要。只需写下:
vertebrate(whale). % :- has_backbone(whalte) :- has(whale, backbone).
并以同样的方式:
鲸鱼长在母乳上
grows_on(whale, 'mother\'s milk'). has(X, 'mammary glands') :- grows_on(X, 'mother\'s milk'). mammal(X) :- has(X, 'mammary glands').
与上述相同,您最终得到:
mammal(whale).
答案 1 :(得分:2)
正如Boris所说,这取决于您希望如何组织数据。具体来说,您需要在详细程度上定义您的事实。如果您了解较低级别的事实,您可以查看哺乳动物的定义,例如(OED):
哺乳动物:一种温血动物的脊椎动物 通过拥有头发或毛皮来区分牛奶的分泌 由女性为年轻人的营养,以及(通常)出生 活着的年轻人。
所以在这里,假设上述定义中给出的条件不仅是必要的,而且是充分的,你可以详细定义哺乳动物:
mammal(X) :-
vertebrate(X),
warm_blooded(X),
(has_fur(X) ; has_hair(X)),
feeds_by_milk(X),
gives_live_birth(X).
然后,您需要为要查询的任何野兽/事物定义所有这些类型的事实。 (而且,是的,鲸鱼有头发,虽然很少。)声明:
鲸鱼和母亲的奶一起长大。
这是一个事实,不是基于规则,因为没有基本的事实,这样的规则将来自。事实上,使用我上面介绍的术语,将是:
feeds_by_milk(whale).
如果您不想拥有所有这些详细数据,那么您可以像Boris所展示的那样建立最低级别的事实哺乳动物:
mammal(whale).
mammal(dog).
在Prolog中,重要的是仔细考虑事实的定义以及它们在语义上的真正含义。在您的初始示例中,您看起来有一个名为milk
的事实,它有两个参数。您有一个示例用法milk(Y, mother)
,但它并没有直接表达Y
以它的母乳为食的事实。它引入了mother
作为参数,但不必要地因为你不太可能还有像milk(Y, father)
这样的东西。在这种情况下,feeds_by_milk(Y)
甚至feeds_on_mothers_milk(Y)
更好地表达了这一事实。同样,whale(X)
没有明确的语义。在这种情况下,X
是什么?鲸鱼是否有个人姓名,如whale(shamu)
?也许。上面的讨论是明确地处理鲸鱼。也就是说,在这个讨论中,鲸鱼是一个原子实体,所以更可能是你事实中的论据,而不是事实名称中的一个。如果你想单独处理它们(例如,回答问题,是Shamu是鲸吗?)那么你需要一个使用事实来识别whale(X)
的规则和最终导致用户问题的规则,例如,是shamu温暖的血腥?,然后在断言这些问题的答案后,查询whale(shamu)
运行以查看它是否成功。