/* IDENTIFIER expert system - based on Winston chapter 6 */ /* * Top-level-goal */ goal(X, Answer) :- isa(X, Y), Answer = [ X, is, a(n), Y ]. /* * Main rules */ isa(X,cheetah) :- carnivore(X), tawny(X), dark_spots(X). isa(X,tiger) :- carnivore(X), tawny(X), black_stripes(X). isa(X,giraffe) :- ungulate(X), long_legs(X), long_neck(X), tawny(X), dark_spots(X). isa(X,zebra) :- ungulate(X), white(X), black_stripes(X). isa(X,ostrich) :- bird(X), not fly(X), long_legs(X), long_neck(X), black_and_white(X). isa(X,penguin) :- bird(X), not fly(X), swim(X), black_and_white(X). isa(X,albatross) :- bird(X), fly(X). /* * Helper rules */ mammal(X) :- hair(X), !. mammal(X) :- milk(X). bird(X) :- feathers(X), !. bird(X) :- fly(X), eggs(X). carnivore(X) :- mammal(X), meat(X), !. carnivore(X) :- mammal(X), pointed_teeth(X), claws(X), eyes_forward(X). ungulate(X) :- mammal(X), hoofs(X), !. ungulate(X) :- mammal(X), cud(X). even_toed(X) :- mammal(X), cud(X). /* * Askable properties */ hair(X) :- askYesNo([ does, X, have, hair ]). milk(X) :- askYesNo([ does, X, give, milk ]). feathers(X) :- askYesNo([ does, X, have, feathers ]). fly(X) :- askYesNo([ does, X, fly ]). eggs(X) :- askYesNo([ does, X, lay, eggs ]). meat(X) :- askYesNo([ does, X, eat, meat ]). pointed_teeth(X) :- askYesNo([ does, X, have, pointed, teeth ]). claws(X) :- askYesNo([ does, X, have, claws ]). eyes_forward(X) :- askYesNo([ does, X, have, eyes, that, point, forward ]). hoofs(X) :- askYesNo([ does, X, have, hoofs ]). cud(X) :- askYesNo([ does, X, chew, cud ]). tawny(X) :- askYesNo([ does, X, have, a, tawny, color ]). dark_spots(X) :- askYesNo([ does, X, have, dark, spots ]). black_stripes(X) :- askYesNo([ does, X, have, black, stripes ]). long_legs(X) :- askYesNo([ does, X, have, long, legs ]). long_neck(X) :- askYesNo([ does, X, have, a, long, neck ]). white(X) :- askYesNo([ does, X, have, a, white, color ]). black_and_white(X) :- askYesNo([ does, X, have, black, and, white, color ]). swim(X) :- askYesNo([ does, X, swim ]).