Prolog继承混乱

时间:2014-02-04 21:42:25

标签: inheritance recursion prolog artificial-intelligence frame

对这个prolog脚本有点困惑..

  /*frame representation */

   frame(name(bird), isa(animal), hasproperty([fly, feathers, sing])).
   frame(name(canary),isa(bird), hasproperty([yellow, nervous, easily_frightened])).
   frame(name(tweety), isa(canary), hasproperty([baby, my_pet])).
   frame(name(barn_owl), isa(bird), hasproperty([nocturnal,large_eyes])).
   frame(name(barny), isa(barn_owl), hasproperty([sick,forward_facing])).

   /* inheritance -using recursion*/

   inherit(Concept, Prop):- frame(name(Concept), _, hasproperty(Prop)).

   inherit(Concept, Prop):-
       frame(name(Concept), isa(Parent), _),
       write(Parent), nl,
       frame(name(Parent), _, hasproperty(PP)),
       write(PP), nl, 
       inherit(Parent, NewProp).

我理解第一个规则,它检查概念是否具有某个属性,但是我没有完全得到第二个规则..我知道如果它继承的框架具有某种属性,它应该可以解决但是我不确定它是如何检查这一点的,特别是当属性名称从PP变为NewProp时。如果有两个具有相同名称的规则,prolog如何知道在此脚本中执行哪个规则?欢呼任何帮助!

1 个答案:

答案 0 :(得分:1)

我认为你想要做的事情,在inherit的第二个子句中,找到你的概念的父,然后马上调用inherit。现在,你正在做一半的工作。

inherit(Concept, Prop):- frame(name(Concept), _, hasproperty(Prop)).

inherit(Concept, Prop):-
   frame(name(Concept), isa(Parent), _),
   write(Parent), nl,
   inherit(Parent, Prop).