2

Prologで継承チェック述語を定義しようとしていますis_a/2が、これまでのところすべての試行が失敗しました。

YがXのスーパークラスである場合は常に、is_a(X, Y)述語はtrueを返す必要があります。次に例を示します。

object(bare).
object(mammal).
object(animal).
object(bird).
is_a(bare, mammal).
is_a(mammal, animal).
is_a(bird, animal).
is_a(X, Y):- <definition goes here>.

定義は、次のクエリがtrueを返すようにする必要があります。

?- is_a(bare, animal).
true.

私はそれを明白な方法で定義しようとしましたが、無限ループで立ち往生しました:

is_a(X, Y):- X\==Y, object(X), object(Y), object(Z), is_a(X, Z), is_a(Z, Y).

助言がありますか?

4

2 に答える 2

4

無限ループを回避する1つの方法は、「直接」継承(推移的ではない)を示す述語を追加することdirect/2です。次に、次のように書くことができます。

object(bare).
object(mammal).
object(animal).
object(bird).

direct(bare, mammal).
direct(mammal, animal).
direct(bird, animal).

isa(X, Y) :- object(X), object(Y), direct(X, Y).
isa(X, Y) :- object(X), object(Y), object(Z), direct(X, Z), isa(Z, Y).

次に、次のようになります。

?- findall(X, isa(X, animal), L).
   L = [mammal,bird,bare] ? ;
   no

しかし、これがまさにあなたが求めているものかどうかはわかりません。

于 2010-01-15T21:02:32.220 に答える
1

何かのようなもの

is_a(X, X).
is_a(X, Y) :- X \== Y, is_a_1(X, Z), is_a(Z, Y).
is_a_1(bear, mammal).
is_a_1(mammal, animal).
is_a_1(bird, animal).

編集:元のコードのようにそれを維持するために一生懸命努力したelectrologos3の答えと同じ考え。

于 2010-01-15T21:02:38.500 に答える