如果错误的话,任何人都可以更正我的prolog答案吗?

时间:2015-06-11 09:21:03

标签: prolog

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).

2 个答案:

答案 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)运行以查看它是否成功。