Тема: Пролог - Экспертная система по определению цветка.
domains            
database            
                 xpositive(symbol,symbol)
                 xnegative(symbol,symbol)
                 
predicates
            
                 do_expert_job
                 do_consulting
                 ask(symbol,symbol)
                 dog_is(symbol)
                 it_is(symbol)
                 positive(symbol,symbol)
                 negative(symbol,symbol)
                 remember(symbol,symbol,symbol)
                 clear_facts
                 
clauses
                 /* Система пользовательского интерфейса (СПИ) */
               
            do_expert_job :-
                 nl,write("* * * * * * * * * * * * * * * * * * * *"),
                 nl,write("  Экспертная система по определению цветка   "),
                 nl,write("                                       "),              
                 nl,write("Необходимо отвечать на вопросы о       "),
                 nl,write("цветах YES или NO    "),               
                 nl,nl,
                 do_consulting,
                 write("Нажмите пробел"),nl,
                 exit.
            do_consulting :-
                 dog_is(X),!,nl,
                 write("Данный цветок - это a(n)",X,"."),nl,
                 clear_facts.
            do_consulting :-
                 nl,write("Изивините, ничем не можем вам помочь"),
                 clear_facts.
                 
            ask(X,Y) :-
                write(" Вопрос :- ",X," it ",Y," ?"),
                readln(Reply),
                remember(X,Y,Reply).
                 
             /*                   МЕХАНИЗМ ВЫВОДА        */
            
            positive(X,Y) :-
                  xpositive(X,Y),!.
            positive(X,Y) :-
                  not(negative(X,Y)),!,
                  ask(X,Y).
                  
            negative(X,Y) :-
                 xnegative(X,Y),!.
                 
            remember(X,Y,yes) :-
                 asserta(xpositive(X,Y)).
            remember(X,Y,no) :-
                 asserta(xnegative(X,Y)),
                 fail.
                 
            clear_facts :-
                 retract(xpositive(_,_)),
                 fail.
            clear_facts :-
                 retract(xnegative(_,_)),
                 fail.
            
          /*  ПРОДУКЦИОННЫЕ ПРАВИЛА              */
            
            dog_is("Мак") :-
                 it_is("многолетнее"),
                 positive(has,"высота от 5 до 10 см"),
                 positive(has,"стебель ветвистый"),
                 positive(has,"крупные цветки"),
                 positive(has,"листья перистораздельные"),!.
                 
            dog_is("Ромашка") :-
                 it_is("однолетнее"),
                 positive(has,"высота от 15 до 40 см"),
                 positive(has,"стебель ветвистый"),
                 positive(has,"лекарственное"),
                 positive(has,"цветет в период май-сентябрь"),
                 positive(has,"листья перистораздельные"),!.
                 
            dog_is("Лилия") :-
                 it_is("многолетнее"),
                 positive(has,"стебель маловетвистый"),
                 positive(has,"высота от 16 до 18 см"),
                 positive(has,"листья острые"),
                 positive(has,"прорастает из луковицы"),
                 positive(has,"вес больше 100 фунтов"),!.
                 
            /* dog_is("American Foxhound") :-
                 it_is("короткая шерсть"),
                 positive(has,"рост меньше 30 дюймов"),
                 positive(has,"длинные уши"),
                 positive(has,"хороший характер"),!.
                 
             dog_is("Cocker Spaniel") :-
                 it_is("длинная шерсть"),
                 positive(has,"рост меньше 22 дюймов"),
                 positive(has,"низкопосаженный хвост"),
                 positive(has,"длинные уши"),
                 positive(has,"хороший характер"),!.
                 
             dog_is("Irish Setter") :-
                 it_is("длинная шерсть"),
                 positive(has,"рост меньше 30 дюймов"),
                 positive(has,"длинные уши"),!.
                 
            dog_is("Collie") :-
                 it_is("длинная шерсть"),
                 positive(has,"рост меньше 30 дюймов"),
                 positive(has,"низкопосаженный хвост"),
                 positive(has,"хороший характер"),!.
           
         dog_is("St. Bernard") :-
                 it_is("длинная шерсть"),
                 positive(has,"низкопосаженный хвост"),
                 positive(has,"хороший характер"),
                 positive(has,"вес больше 100 фунтов"),!.*/
                 
            it_is("многолетнее") :-
                 positive(has," многолетнее "),!.
                 
            it_is("однолетнее") :-
                 positive(has," однолетнее"),!.
                 
            goal
            
                do_expert_job.
 
					