Я хочу создать правило, которое использует наследование. Например, вот известный пример, который используется во многих книгах пролога, описывающих наследование.Как я могу переопределить свойство в отношениях Наследование в PROLOG?
и вот факты для этих отношений:
%Bird
%animal's childs
isa(bird, animal).
isa(fish, animal).
%bird's childs
isa(ostrich, bird).
isa(penguin, bird).
isa(canary, bird).
isa(robin, bird).
%penguin's childs
isa(opus, penguin).
%canary's childs
isa(tweety, canary).
%animal's property
hasprop(animal, covering, skin).
%bird's property
hasprop(bird, travel, fly).
hasprop(bird, covering, feathers).
%fish's property
hasprop(fish, travel, swim).
%ostrich's property
hasprop(ostrich, travel, walk).
%penguin's property
hasprop(penguin, travel, walk).
hasprop(penguin, color, brown).
%canary's property
hasprop(canary, color, yellow).
hasprop(canary, sound, sing).
%robin's property
hasprop(robin, color, red).
hasprop(robin, sound, sing).
%tweety's property
hasprop(tweety, color, white).
%rules
hasproperty(Object, Property, Value) :- hasprop(Object, Property, Value),!.
hasproperty(Object, Property, Value) :- isa(Object, Parent),
hasproperty(Parent, Property, Value).
В этой сети, когда я запрашиваю заявление как HasProperty (пингвин, X, Y), я мог бы только получить один результат (и я знаю, что это из-за оператора cut.). То, что я хочу, это результат, который нравится:
?- hasproperty(penguin, X, Y).
X = travel,
Y = walk.
X = color,
Y = brown.
X = covering,
Y = feathers.
В результате классов ниже уровня свойство, путешествие и покрытие переопределяют классы верхнего уровня. Но я не имею ни малейшего представления об этих проблемах. Если у вас есть какое-либо решение по этому поводу, сообщите мне.
О, я понял, и это работает без проблем. действительно оценил :) –