2

このようなものを機能させる方法を知りたいです。単純な概念のように思えますが、私は Prolog を初めて使用するので、これを正しく行う方法がわかりません。

たとえば、ここに 2 つのテーブルがあります。カテゴリに関係なく、各動物には 2 つの事実があります。

哺乳類:

トラ - ストライプ、パワフル

カバ - 大きくて危険

ゾウ - 大きくて優しい

虫:

ハエ - 黒、翼のある

毛虫 - 緑、遅い

カタツムリ - ぬるぬる、遅い

ハエとその特徴が昆虫に分類され、カバとその特徴が哺乳類に分類されるように、Prolog コードでこれらすべてのステートメントをどのように記述すればよいでしょうか?

では、このようなルールを挿入するとどうなるでしょうか。

guess(mammal, large) 

コードを調べた後、次のコマンドを書きます。

possibleanimal(mammal, X) 

そのコマンドの結論は次のようになります。

X = hippo 
X = elephant 

カバもゾウも大きな特徴を持っているからです。

もう一つの例:

guess(insect, slow) 
guess(insect, green)

相談後に尋ねたコマンド:

possibleanimal(insect, Y) 
Y= caterpillar 

カタツムリは遅いですが緑色ではないので省略できます。

できる限り私を助けてください、ありがとう!

4

1 に答える 1

1

最初の例は推移性のように見えるので、これを試してください:

% animal(Animal, Property)
animal(tiger, striped).
animal(tiger, powerful).
animal(hippo, large).
animal(hippo, dangerous).
animal(elephant, large).
animal(elephant, gentle).

% guess(Category, Property)
guess(mammal, large).

% possibleanimal(Category, Animal)
possibleanimal(C, A) :-
       guess(C, P),
   animal(A, P).

?- possibleanimal(mammal, X).
X = hippo ;
X = elephant

ここで注意が必要なのが 2 番目の例です。これは、guess/2 が複数あるためです。

そして、あなたはそれらを同時に保持してほしいと思います。したがって、一種の forall が必要です。

Forall は Prolog で次のように定義できます。

% forall(Goal,Goal)
forall(A, B) :- \+ (A, \+ B).

例を参照してください: http://www.swi-prolog.org/pldoc/man?predicate=forall%2F2

だからあなたはこれを試すことができます:

% possible(Animal)
    possible(fly).
    possible(caterpillar).
    possible(snail).

    % animal(Animal, Property)
animal(fly, black).
animal(fly, winged).
animal(caterpillar, green).
animal(caterpillar, slow).
animal(snail, slimy).
animal(snail, slow).


% guess(Category, Property)
guess(insect, green).
guess(insect, slow).

% possibleanimal(Category, Animal)
    possibleanimal(C, A) :-
        possible(A),
        forall(guess(C,P), animal(A,P)).

?- possibleanimal(insect,X).
X = caterpillar ;
No

お役に立てれば。

さよなら

于 2012-10-29T11:43:36.870 に答える