% Facts about animals
animal(dog).
animal(cat).
animal(elephant).
animal(lion).
animal(tiger).
animal(snake).  
animal(crocodile).
animal(bird).
animal(fish).

% Facts about characteristics
has_fur(dog).
has_fur(cat).
has_fur(lion).
has_stripes(tiger).
has_trunk(elephant).
has_scales(snake).
has_scales(crocodile).
can_fly(bird).
lives_in_water(fish).

% Rules for classification
mammal(X) :- animal(X), has_fur(X).
mammal(X) :- animal(X), has_stripes(X).
mammal(X) :- animal(X), has_trunk(X).

reptile(X) :- animal(X), has_scales(X).

bird(X) :- animal(X), can_fly(X).

fish(X) :- animal(X), lives_in_water(X).

% Classification predicate
classify(X) :- mammal(X), write(X), write(' is a mammal.'), nl.
classify(X) :- reptile(X), write(X), write(' is a reptile.'), nl.
classify(X) :- bird(X), write(X), write(' is a bird.'), nl.
classify(X) :- fish(X), write(X), write(' is a fish.'), nl.
classify(X) :- write(X), write(' is an unknown animal.'), nl.

% Initialization goal
:- initialization(main).

% Main goal
main :- classify(elephant),
        classify(snake),
        classify(fish),
        classify(unicorn),
        halt.