1

継承を利用したルールを作りたい。たとえば、多くのプロローグ本で使用されている、継承を説明する有名な例を次に示します。

忙しい猫
(出典: 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.

この結果では、下位レベルのクラスのプロパティである移動とカバーが、上位レベルのクラスのプロパティをオーバーライドします。しかし、私はこれらのオーバーライドを扱う考えがありません。これに関する解決策がありましたら、お知らせください。

4

2 に答える 2

2

hasproperty/3考えられるアプローチは、2 番目の句で即時オブジェクト プロパティを確認することです。

hasproperty(Object, Property, Value) :-
    hasprop(Object, Property, Value).

hasproperty(Object, Property, Value) :-
   isa(Object, Parent),
   hasproperty(Parent, Property, Value),
   \+ hasprop(Object, Property, _).  % Let object property override
于 2013-11-10T20:07:59.397 に答える