|
|
pl:prolog:pllib:animals [2019/06/27 15:50] |
pl:prolog:pllib:animals [2019/06/27 15:50] (aktualna) |
| ====== Animals ====== |
| {{tag>rules interactive}} |
| ===== Description ===== |
| The program uses its identification rules to determine the animal that you have chosen. |
| |
| **Source**: PrologTutorial (on-line tutorial) |
| ===== Download ===== |
| Program source code: {{animals.pl}} |
| ===== Listing ===== |
| <code prolog> |
| /* prolog tutorial 2.17 Animal identification game. |
| |
| start with ?- go. */ |
| |
| go :- hypothesize(Animal), |
| write('I guess that the animal is: '), |
| write(Animal), |
| nl, |
| undo. |
| |
| /* hypotheses to be tested */ |
| hypothesize(cheetah) :- cheetah, !. |
| hypothesize(tiger) :- tiger, !. |
| hypothesize(giraffe) :- giraffe, !. |
| hypothesize(zebra) :- zebra, !. |
| hypothesize(ostrich) :- ostrich, !. |
| hypothesize(penguin) :- penguin, !. |
| hypothesize(albatross) :- albatross, !. |
| hypothesize(unknown). /* no diagnosis */ |
| |
| /* animal identification rules */ |
| cheetah :- mammal, |
| carnivore, |
| verify(has_tawny_color), |
| verify(has_dark_spots). |
| tiger :- mammal, |
| carnivore, |
| verify(has_tawny_color), |
| verify(has_black_stripes). |
| giraffe :- ungulate, |
| verify(has_long_neck), |
| verify(has_long_legs). |
| zebra :- ungulate, |
| verify(has_black_stripes). |
| |
| ostrich :- bird, |
| verify(does_not_fly), |
| verify(has_long_neck). |
| penguin :- bird, |
| verify(does_not_fly), |
| verify(swims), |
| verify(is_black_and_white). |
| albatross :- bird, |
| verify(appears_in_story_Ancient_Mariner), |
| verify(flys_well). |
| |
| /* classification rules */ |
| mammal :- verify(has_hair), !. |
| mammal :- verify(gives_milk). |
| bird :- verify(has_feathers), !. |
| bird :- verify(flys), |
| verify(lays_eggs). |
| carnivore :- verify(eats_meat), !. |
| carnivore :- verify(has_pointed_teeth), |
| verify(has_claws), |
| verify(has_forward_eyes). |
| ungulate :- mammal, |
| verify(has_hooves), !. |
| ungulate :- mammal, |
| verify(chews_cud). |
| |
| /* how to ask questions */ |
| ask(Question) :- |
| write('Does the animal have the following attribute: '), |
| write(Question), |
| write('? '), |
| read(Response), |
| nl, |
| ( (Response == yes ; Response == y) |
| -> |
| assert(yes(Question)) ; |
| assert(no(Question)), fail). |
| |
| :- dynamic yes/1,no/1. |
| |
| /* How to verify something */ |
| verify(S) :- |
| (yes(S) |
| -> |
| true ; |
| (no(S) |
| -> |
| fail ; |
| ask(S))). |
| |
| /* undo all yes/no assertions */ |
| undo :- retract(yes(_)),fail. |
| undo :- retract(no(_)),fail. |
| undo. |
| |
| </code> |
| ===== Comments ===== |
| |