継承を利用したルールを作りたい。たとえば、多くのプロローグ本で使用されている、継承を説明する有名な例を次に示します。
(出典: unak.is )
これらの関係の事実は次のとおりです。
%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(penguin, X, Y) のようなステートメントをクエリすると、1 つの結果しか取得できませんでした (これはカット演算子によるものだとわかっています)。私が欲しいのは、次のような結果です:
?- hasproperty(penguin, X, Y).
X = travel,
Y = walk.
X = color,
Y = brown.
X = covering,
Y = feathers.
この結果では、下位レベルのクラスのプロパティである移動とカバーが、上位レベルのクラスのプロパティをオーバーライドします。しかし、私はこれらのオーバーライドを扱う考えがありません。これに関する解決策がありましたら、お知らせください。