Просто немного запутался в этом сценарии пролога.
/*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. Также как пролог узнает, какое правило выполнять в этом сценарии, если есть два правила с одинаковыми именами? Спасибо за любую помощь!