Documente Academic
Documente Profesional
Documente Cultură
Universidade Federal do Rio de Janeiro Departamento da Cincia da Computao Lgica em Programao Dezembro de 2000
problema e no descrevendo um algoritmo. Para o computador, isto significa que o programa informa o que verdadeiro e o que precisa ser feito ao invs de como faz -lo. Prolog a melhor linguagem para ser utilizada em sistemas especialistas, uma vez que construda com semntica declarativa e possui poderosos mecanismos de unificao e busca embutidos. Prolog permite fcil programao quando envolvida com aplicaes em inteligncia artificial, uma vez quep ossui habilidade de separar o conhecimento das informaes do controle. Sendo baseada em lgica, Prolog permite uma representao do conhecimento de forma rica, como necessria, e as relaes lgicas entre os dados. Prolog tem uma base de dados embutida o que a torna mais poderosa do que implementar outros tipos de aplicaes de base de dados. Prolog tem um provador de teoremas interno que ajuda o sistema a decidir quais regras selecionar em determinada situao. Prolog usa inferncia atravs de backward chaining, at que os fatos na base de dados sejam encontrados. Prolog geralmente utiliza pequena frao de espao em disco como programas similares em linguagens procedurais. A linguagem fcil de ler e manter.
apenas sabe os dados e regras programados nele, no podendo inferir novas regras ou originar novos dados, apenas utilizar a informao existente. Finalmente, problemas pequenos podem ser verificados, mas h poucas chances de se realmente saber se a soluo para problemas muito grandes funciona sem realmente aplic-la. As reas mais favorveis para anlise de sistemas especialistas possuem algumas ou todas as caractersticas abaixo: O conhecimento necessrio para tomada de decises razoavelmente bem delimitado. Pessoas especialistas na rea podem achar solues precisas muito mais rapidamente do que pessoas que no so especialistas. H valor considervel em se atingir solues precisas rapidamente, para justificar o esforo de automao do processo de deciso. Os dados necessrios como consulta para a deciso podem ser descritos objetivamente.
Os principais benefcios para o usurio final, associados ao uso de sistemas especialistas podem ser identificados como: Aumento da rapidez do trabalho humano profissional Em empresas, reduo de custos internos, como resultado de melhoria de qualidade pela introduo da tecnologia de sistemas especialistas. Aumento da qualidade da tomada de decises. Preservao do conhecimento especialista, de indivduos que se aposentam ou deixam a empresa ou para manter o know-how para que possa ser aplicado em outros lugares. Introduo de novos produtos.
Para construir um sistema especialista que resolve problemas em um determinado domnio, o engenheiro do conhecimento deve comear atravs da su a familiarizao com os aspectos e a terminologia do domnio. A partir disto, ele pode iniciar exaustiva comunicao com os reais especialistas para adquirir e consolidar seu conhecimento. Finalmente, o engenheiro pode organizar os resultados das entrevistas e traduzi-las em um software que um computador possa usar. Um usurio apresenta ao sistema problemas especficos ao domnio. O sistema, ento, aplica seu conhecimento armazenado para resolver o problema.
Figura 1 - Estrutura do Sistema Especialista (Bratko) Uma ferramenta para sistemas especialistas um ambiente de desenvolvimento que contm os componentes bsicos de um sistema especialista. Associado ao shell, h o mtodo para construir aplicaes, configurando e instanciando esses componentes. Os componentes so ilustrados abaixo. Base de conhecimento - Armazenamento de fatos e heursticas do conhecimento. A ferramenta proporciona um ou mais esquemas de representao de conhecimento para expressar o conhecimento sobre o domnio de aplicao. Algumas usam frames e regras de produo. Em Prolog, o conhecimento representado atravs de declaraes lgicas. Mquina de inferncia - Mecanismos de inferncia para manipular a informao simblica e o conhecimento da base para formar uma linha de raciocnio para resolver um problema. O mecanismo de inferncia pode variar desde simples modus ponens backward chaining de regras de produo at raciocnio mais complexos. Subsistema de aquisio de conhecimento - Auxilia na construo da base de conhecimento, coletando conhecimento necessrio para resolver problemas. um dos principais entraves para construo de sistemas especialistas. Subsistema de explicao Explica as aes do sistema. A explicao pode variar desde como a soluo final ou intermedirias foram alcanadas at justificar a necessidade de dados adicionais. Interface com usurio Significa meios de comunicao com o usurio.
A base de conhecimento representa o conhecimento que especfico do domnio de aplicao, atravs de fatos e regras que descrevem as relaes e fenmenos que ocorrem naquele domnio, alm de formas possveis para soluo de problemas (heursticas, mtodos, idias). A mquina de inferncia e a interface com o usurio formam o shell do si stema, que independe do domnio sendo caracterizado. A mquina de inferncia o instrumento que sabe como usar o conhecimento contido na base, enquanto a interface com o usurio proporciona a comunicao entre o usurio e o sistema, permitindo o acompanhamento do processo de soluo de problema sendo realizado pela mquina de inferncia. Uma forma simples de desenvolver sistemas especialistas ter um shell que atue universalmente, associando-o a diversas bases de conhecimento de aplicaes distintas, que devem concordar com o protocolo estabelecido por ele. As bases de conhecimento
podem ser representadas por diversas tcnicas, como as baseadas em regras (regras de produo if-then, por exemplo), redes semnticas ou frames. H numerosos shells comerciai s para sistemas especialistas, cada um apropriado para um conjunto diferente de problemas. O trabalho com sistemas especialistas inclui tanto escrever shells de sistemas especialistas como tambm escrever sistemas usando shells. Esta ltima opo geralmente reduz o custo e o tempo de desenvolvimento, se comparada com a opo de desenvolver todo o sistema a partir do zero. As ferramentas auxiliam o engenheiro a detectar inconsistncias, redundncias e incompletudes do conjunto de regras, alm de permitir sua edio e depurao, e rastrear a cadeia de inferncia. Alguns dos shells mais conhecidos para uso de sistemas especialistas esto ilustrados abaixo: EMYCIN (Empty Mycin) ART (Automated Reasoning Tool) OPS5 (Primeiro bom shell amplamente usado, faz forward chaining) CLIPS (Verso menor e mais barata do ART, sintaxe mais limpa do que OPS5) OPS83 (Extenso do OPS5, mais construes tradicionais de programao - loops) KEE (Knowledge Engineering Environment) Knowledge Craft.
A primeira e tapa para se projetar um sistema especialistas a escolha do problema. A necessidade da soluo deve justificar os custos envolvidos no desenvolvimento. Conhecimento especialista humano no est disponvel em todas as situaes quando necessrio, pois se o conhecimento amplamente avalivel, no justifica o desenvolvimento de um sistema especialista. O problema pode ser resolvido utilizando-se tcnicas de raciocnio simblico, sem precisar de habilidade ou destreza fsica. O problema bem estruturado e no requer muito conhecimento comum no formal. O problema no pode ser facilmente resolvido usando-se mtodos computacionais tradicionais. Se existe uma soluo algortmica boa, no ser usado um sistema especialista. Existem especialistas cooperativos e articulados, disponveis para ajudar na aquisio do conhecimento do domnio. Os problemas so de tamanho e escopo apropriados, que requerem conhecimento altamente especializado, mas levaria tempo razovel para um humano resolver.
Tendo reconhecido que o problema favorvel, necessrio extrair o conhecimento do especialista e represent-lo, utilizando um shell de sistemas especialistas. Este o trabalho do engenheiro de conhecimento, mas envolve forte colaborao dos especialistas do domnio e usuri os finais. Esta etapa conhecida como Engenharia do
Conhecimento. O engenheiro do conhecimento o especialista em representao e linguagem de inteligncia artificial, sendo capaz de selecionar um shell favorvel para o projeto, extrair o conhecimento do especialista e implement-lo de forma correta e eficiente em uma base de conhecimento. Para extrair conhecimento do especialista, o engenheiro deve inicialmente tornar-se familiar com o domnio do problema, atravs de textos introdutrios ou conversas, seguindo para mais sistemticas entrevistas. Tipicamente, o especialista apresenta conjuntos de exemplos de problemas e mostra seu raciocnio na soluo dos problemas. O engenheiro deve abstrair regras gerais destas explicaes e valid -las com o especialista. O ciclo bsico do desenvolvimento deve envolver rpida construo de um prottipo inicial, testes iterativos e modificaes no prottipo com especialistas e usurios finais, para verificar a validade das regras e se o sistema proporciona informaes ne cessrias para satisfazer o usurio, assim como performance. Para desenvolver o prottipo inicial, o engenheiro deve tomar decises sobre a forma apropriada de representar o conhecimento e os mtodos de inferncia (regras, regras e frames, forward ou backward chaining). Para testar essas decises bsicas de projeto, o prottipo inicial apenas resolve pequena parte do problema geral, testando se os mtodos utilizados se comportam bem. A Representao do Conhecimento formaliza e organiza o conhecimento. Uma das mais utilizadas representaes so as regras de produo, formadas por condio e ao (ifthen). A parte if lista um conjunto de condies em alguma combinao lgica.. Como consequncia, a parte then pode ser concluda, ou a ao de soluo do probl ema tomada. Sistemas especialistas cujo conhecimento representado por regras so chamados de Sistemas Baseados em Regras. Portanto, as regras de produo if-then so declaraes condicionais que definem relaes lgicas entre os conceitos do domnio. Elas so da forma: if pr-condio P then concluso C if situao S then ao A if condies C1 e C2 se aplicam then condio C no se aplica
As principais vantagens em se usar regras de produo se baseiam no fato de que elas so uma forma natural para expressar conhecimento. Alm disso, notam-se caractersticas como modularidade, incrementabilidade, modificabilidade e transparncia do sistema. Entretanto, para alguns domnios (como o de diagnsticos mdicos), necessrio algum grau de qualificao probabilstica na interpretao do conhecimento. Usar a sintaxe de Prolog para regras, tem agumas desvantagens: A sintaxe pode nao ser conveniente para um usurio no familiarizado com Prolog, por exemplo, o especialista do domnio que deveria ser capaz de ler as regras, especificar novas e modific-las. A base de conhecimento no sintaticamente distinguvel do resto do programa. Uma distino mais explcita seria mais desejvel. Redes semnticas e frames so formas de representao do conhecimento favorve is para a representao de grandes conjuntos de fatos de forma estruturada. Ambas so facilmente implementadas em Prolog, descrevendo objetos e suas relaes. Fatos podem ser verificados diretamente ou inferidos atravs de mecanismos como herana de fatos. Frames so baseados em uma viso mais passiva do conhecimento, um encapsulamento de conhecimento simblico sobre uma entidade a ser representada. Tipicamente, um frame consiste de uma lista de propriedades da entidade e os respectivos valores. Por exemplo:
[VIRUS]
[FLU]
[HIV]
Durante a sua representao, o conhecimento, entretanto, quase sempre incompleto e impreciso. Para domnios mais complicados, pode ser necessrio buscar alternativas s regras de produo (if-then), como por exemplo, lgica fuzzy ou conceitos relacionados a probabilidade. O conjunto de mtodos para usar conhecimento impreciso em combinao com dados imprecisos no processo de raciocnio, chamado de raciocnio com incerteza. Sistemas Baseados em Regras podem ser guiados por metas ou guiados por dados (backward e forward chaining), ou pode usar ambas estratgias, que representam o Modelo de soluo. A mais comum utilizar backward chaining, uma vez que o sistema especialista ir coletar informaes sobre o problema do usurio atravs de questes que so relevantes para a soluo. O raciocnio em backward chaining feito seguindo-se uma cadeia de regras partindo -se da hiptese, utilizando a base de conhecimento para verificar sua validade. Esse tipo de raciocnio o implementado em Prolog. O raciocnio em forward chaining no parte da hiptese, mas, a partir da incluso d fatos na base de e conhecimento, so geradas novas concluses. O dilema de escolher entre backward ou forward chaining no possui soluo instantnea, depende muito do problema e tambm da forma da rede de regras. Se h poucos ns de dados e muitos ns de metas, forward chaining pode ser mais apropriado. Se queremos provar que alguma hiptese verdadeira, mais natural fazer backward, iniciando-se com a hiptese. Se h muitas hipteses competindo e no h razo para comear com uma ao invs de outra, m elhor fazer forward chaining, que mais natural no monitoramento de tarefas onde os dados so adquiridos continuamente e o sistema tem que detectar se surgiu alguma anomalia. Freqentemente, haver um conjunto de possveis solues para o problema. O sistema dever considerar cada soluo hipottica e tentar provar se ou no vlida. Algumas vezes, o sistema no ser capaz de provar ou negar algo a partir dos dados iniciais, ento ele perguntar ao usurio questes adicionais para concluir qual das possveis solues a correta. Em geral, soluo de problemas usando backward chaining envolve busca de todas as possveis situaes para provar a hiptese. Uma forma comum fazer como Prolog, usando busca em profundidade com backtracking. Abaixo, um exemplo de regras para raciocnio em backward chaining. Esta forma de raciocnio freqentemente utilizada em problemas que envolvem identificao e diagnstico. IF paciente tem febre E paciente tem dor de cabea THEN prescrever medicao A OU prescrever medicao B IF paciente alrgico a medicao A THEN NO prescrever medicao A E prescrever medicao B Exemplo de regras para raciocnio em forward chaining. Todos os dados iniciais so apresentados e a mquina de inferncia os utiliza para atingir a concluso apropriada. IF and and and pode prescrever medicao A pode prescrever medicao B paciente est tomando medicao C medicao A reage com medicao C
Um interpretador simples de regras em backward chaining (Bratko): ::::op(800, op(700, op(300, op(200, fx, if). xfx, then). xfy, of). xfy, and).
is_true(P) :- fact(P). % A relevant rule whose condition is true is_true(P) :- if Condition then P, is_true(Condition). is_true(P1 and P2) :- is_true(P1), is_true(P2). is_true(P1 or P2) :- is_true(P1); is_true(P2). Um interpretador simples de regras em forward chaining (Bratko): forward :- new_derived_fact(P), !, % new fact write(Derived:), write(P), nl, assert(fact(P)), forward; % continue write(No more facts). % no facts derived new_derived_fact(Concl) :if Cond then Concl, % a rule no fact(Concl), % rules conclusion not yet a fact composed_fact(Cond). % condition true ? composed_fact(Cond) :- fact(Cond). % simple fact composed_fact(Cond1 and Cond2) :composed_fact(Cond1), composed_fact(Cond2). composed_fact(Cond1 or Cond2) :composed_fact(Cond1);composed_fact(Cond2).
Em funo dos Sistemas Especialistas lidarem com incerteza ou conhecimento de heurstica, sua credibilidade freqentemente questionada. Quando uma resposta duvidosa, necessrio saber que raciocnio foi feito. Se o raciocnio parecer plausvel, possvel acreditar na resposta. A maioria dos sistemas especialistas possuem a habilidade de responder perguntas da forma: Porque a resposta X? ou Como voc concluiu isso?. Facilidades de explicaes podem ser geradas rastreando -se a linha de raciocnio usada pela mqu ina de inferncia. Prover essa explicao envolve, no mnimo, guardar que regras foram usadas na busca da soluo, e utilizar esse armazenamento para a explicao. Entretanto, facilidades de explicao no so amplamente usadas, e quando usadas, no so vistas como aceitveis pelos usurios. Uma das razes para isto que as explicaes apenas referenciam o conhecimento superficial codificado pelas regras, ao invs do conhecimento sobre o domnio que originalmente motivou as regras (que no usualmente re presentado). Portanto, o sistema pode dizer que concluiu X devido a regra 23, mas no explica o que a regra 23 significa. Outra razo para a falha das facilidades de
explicao o fato de que se o usurio falha ao tentar entender ou aceitar a explicao, o sistema no pode explicar novamente de outra forma, como humanos fazem.
%% -----------------------------------------------------------------%% Micro Expert System. %% Alison Cawsey, Feb 1993 % OPERATOR DECLARATIONS :- op(975, fx, if). :- op(950, xfy, then). :- op(925, xfy, and). % EXPERT SYSTEM RULES (EXPERT KNOWLEDGE BASE) rule(if rule(if rule(if rule(if rule(if eats(X, Y) and living(Y) then carnivore(X)). carnivore(X) and big(X) then dangerous(X)). has_feathers(X) then bird(X)). bird(X) and small(X) then good_pet(X)). cuddly(X) then good_pet(X)).
% TEXT TEMPLATES FOR ENGLISH % qtext/2: Provides a simple template based translation into English % questions. qtext(cuddly(X), ['Is ', X, ' cuddly?']). qtext(has_feathers(X), ['Does ', X, ' have feathers?']). qtext(small(X), ['Is ', X, ' small']). % atext/2: Template based translation into recommendations. atext(good_pet(X), ['I suggest that ', X, ' would make a good pet.']). % EXAMPLE TEST CASE find_good_pet :- check_hypothesis([good_pet(lenny), good_pet(eddie), good_pet(tweety)]). % MAIN EXPERT SYSTEM SHELL CODE % % % % % % % % % % check_hypothesis(+Hypotheses) Succeeds when one of the hypotheses is proved true, or it has tried them all. Picks a hypothesis, and uses b_chain to find out if it is true. If it is true then b_chain succeeds and check_hypothesis writes out the appropriate recommendation. If false it backtracks to 'on' to find another hypothesis to try. Once it has tried all the hypotheses it will backtrack to second check_hypothesis clause and write an appropriate message. (Uses MacProlog built in predicates message/1 and on/2)
% % % %
get a member of hypotheses b_chain to check if true. get hold of appropriate text. write out the recommendation
% bchain(+Goal) % Succeeds if Goal is true, given rules + facts supplied by user as % backward chaining proceeds. bchain(G1 and G2):- !, bchain(G1), bchain(G2). b_chain(Goal) :userfact(Goal). % G1 and G1 are true if % G1 can be proved by backward chaining % and G2 can be too. % G's true if its a fact!
% % % %
Goal is true if there's a rule concluding it and its Preconditions can be proved by backward chaining
bchain(Goal):user_says_its_true(Goal). % % % %
user_says_its_true(+Goal) True if there is some text to use to ask the user about it, and when you ask the user they say yes. Uses MacProlog built in predicate yesno/1
Agora, vamos analisar um outro exemplo de shell mais completo, que permite iterao com usurio e proporciona facilidades de explicao (Bratko). % % % % % % % % Procedure explore(Goal,Trace,Answer) finds Answer to a given Goal. Trace is a chain of ancestor goals and rules. 'explore' tends to find a positive answer to a question. Answer is 'false' only when all the possibilities have been investigated and they all resulted in 'false'. op(900,xfx,:). op(800,xfx,was). op(870,fx,if). op(880,xfx,then). op(550,xfy,or). op(540,xfy,and). op(300,fx,'derived by'). op(600,xfx,from). op(600,xfx,by).
:::::::::-
% Assume only one rule about each type of goal explore(Goal, Trace, Goal is TruthValue was 'derived by' Rule from Answer) :Rule : if Condition then Goal, % rule relevant to goal explore(Condition,[Goal by Rule | Trace], Answer), truth(Answer,TruthValue). explore(Goal1 and Goal2, Trace, Answer) :!, explore(Goal1,Trace,Answer1), continue(Answer1,Goal1 and Goal2, Trace, Answer). explore(Goal1 or Goal2, Trace, Answer) :exploreyes(Goal1,Trace,Anser); exploreyes(Goal2,Trace,Answer). explore(Goal1 or Goal2,Trace, Answer1 and Answer2) :!, not exploreyes(Goal1,Trace,_), not exploreyes(Goal2,Trace,_), % no positive answer explore(Goal1,Trace,Answer1), % answer 1 must be negative explore(Goal2,Trace,Answer2). % answer 2 must be negative explore(Goal,Trace, Goal is Answer was told) :useranswer(Goal,Trace,Answer). % user supplied answer exploreyes(Goal,Trace,Answer) :explore(Goal,Trace,Answer), positive(Answer). continue(Answer1,Goal1 and Goal2, Trace, Answer) :positive(Answer1), explore(Goal2,Trace,Answer2), (positive(Answer2), answer =Answer1 and Answer2; negative(Answer2),answer = Answer2). continue(Answer1,Goal1 and Goal2,_,Answer1) :negative(Answer1). truth(Question is TruthValue was Found, TruthValue) :- !. truth(Answer1 and Answer2, TruthValue) :truth(Answer1,true), truth(Answer2,true), !, TruthValue = true; TruthValue = false. positive(Answer) :- truth(Answer,true). negative(Answer) :- truth(Answer,false).
% % % % %
Procedure useranswer(Goal,Trace,Answer) generates, through backtracking, user-supplied solutions to Goal. Trace is a chain of ancestor goals and rules used for why explanation.
useranswer(Goal,Trace,Answer) :askable(Goal,_), % may be asked of the user freshcopy(Goal,Copy), % variables in goal renamed useranswer(Goal,Copy,Trace,Answer,1). % Do not ask again about an instatiated goal useranswer(Goal,_,_,_,N) :N >1, instantiated(Goal), !, fail.
% Is Goal impled true or false for all instantiations? useranswer(Goal,Copy,_,Answer,_) :wastold(Copy,Answer,_), instance_of(Copy,Goal), !. % answer to Goal implied % Retrieve known solutions, indexed from B on, for Goal useranswer(Goal,_,_,true,N) :wastold(Goal,true,M), M >= N. % Has everything already been said abaout Goal? useranswer(Goal,Copy,_,Answer,_) :end_answers(Copy), instance_of(Copy,Goal), !, % Everything was said about Goal fail. % Ask the user for (more) solutions useranswer(Goal,_,Trace,Answer,N) :askuser(Goal,Trace,Answer,N). askuser(Goal,Trace,Answer,N) :askable(Goal,ExternFormat), format(Goal,ExternFormat,Question,[],Variables), % get format ask(Goal,Question,Variables,Trace,Answer,N). ask(Goal,Question,Variables,Trace,Answer,N) :nl, (Variables = [], !, write('Is it true: '); write('Any more solution to: ')), write(Question), write('?'), getreply(Reply), !, % Reply = yes/no/why process(Reply,goal,Question,Variables,Trace,Answer,N). process(why,Goal,Question,Variables,Answer,N) :showtrace(Trace), ask(Goal,Question,Variables,Trace,Answer,N). process(yes,Goal,_,Variables,Trace,true,N) :nextindex(Next), % get new free index to wastold Next1 is Next+1, (askvars(Variables),
assertz(wastold(Goal,true,Next)); % record solution freshcopy(Goal,Copy), % copy of goals useranswer(Goal,Copy,Trace,Answer,Next1)). % more answers ? process(no,Goal,_,_,_,false,N) :freshcopy(Goal,Copy), wastold(Copy,true,_), !, % 'no' means no more solutions assertz(end_answers(Goal)), % mark end of answers fail; nextindex(Next), % next free index to wastold assertz(wastold(Goal,false,Next)). % 'no' means no solution format(Var,Name,Name,Vars,[Var/Name | Vars]) :- var(Var), !. format(Atom,Name,Atom,Vars,Vars) :atomic(Atom), !, atomic(Name). format(Goal,Form,Question,Vars0,Vars) :Goal =..[Functor|Args1], Form = ..[Functor|forms], formatall(Args1,Forms,Args2,Vars0,Vars), Question = ..[Functor|Args2]. formatall([],[],[],Var,Vars). askvars([]). askvars([Variable/Name | Variables]) :nl, write(Name), write('='), read(Variable), askvars(Variables). showtrace([]) :- nl, write('This was your question'), nl. showtrace([Goal by Rule | Trace]) :nl, write('To investigate, by '), write(Rule), write(','), write(Goal), showtrace(Trace). instantiated(Term) :- numbervars(Term,0,0). % instance_of(T1,T2) : instance of T1 is T1; that is % term T1 is more general than T1 or equally general as T2 instance_of(Term,Term1) :freshcopy(Term1,Term2), numbervars(Term2,0,_), Term = Term2. freshcopy(Term,FreshTerm) :asserta(copy(Term)), rectrac(copy(FreshTerm)), !.
lastindex(0). nextindext(Next) :retract(lastindex(Last)),!, Next is Last+1, asssert(lastindex(Next)). getreply(Reply) :read(Answer), means(Answer,Reply),!; nl, write('Answer unknown, try again please'),nl, getreply(Reply). means(yes,yes). means(y,yes). means(no,no). means(n,no). means(why,why). means(w,why). numbervars(Term,N,NPlus1) :var(Term),!, Term = var/N, NPlus1 IS N+1. numbervars(Term,N,M) :Term = ..[Functor|Args], numberargs(Args,N,M). numberargs([],N,N) :- !. numberargs([X|L],N,M) :numbervars(X,N,N1), numberargs(L,N1,M1). present(Answer) :nl,showconclusion(Answer), nl, write('Would you like to see how?'), getreply(Reply), (Reply=yes,!,show(Answer);true)). showconclusion(Answer1 and Answer2) :!, showconclusion(Answer1), write('and'), showconclusion(Answer2). showconclusion(Conclusion was Found) - write(Conclusion). % show displays a complete solution tree show(Solution) :- nl, show(Solution,0),!. show(Answer1 and Answer2,H) :!, show(Answer1,H), tab(H), write(and), nl, show(Answer2,H).
show(Answer was Found,H) :tab(H), writeans(Answer), nl,tab(H), write('was'), show1(Found,H). show1(Derived from Answer,H) :!, write(Derived),write('from'), nl, H1 is H+4, show(Answer,H1). show1(Found,_) :- write(Found),nl. writeans(Goal is true) :- !, write(Goal). wirteans(Answer) :- write(Answer). expert :getquestion(Question), (answeryes(Question); answerno(Question)).
% input user's question % try to find positive answer % if no positive then find negative
answeryes(Question) :% look for positive answers to question markstatus(negative), % no positive answser yet expore(Question,[],Answer), % trace is empty positive(Answer), % look for positive answers markstatus(positive), % positive answer found present(Answer),nl, write('More Solutions?'), getreply(Reply), % read user's reply Reply = no. % otherwise, backtrack to explore answerno(Question) :retract(no_positive_answer_yet),!, explore(Question,[],Answer), negative(Answer), present(Answer),nl, write('More negative solutions?'), getreply(Reply), Reply=no. markstatus(negative) :- assert(no_positive_answer_yet). markstatus(positive) :- retract(no_positive_answer_yet),!; true. getquestion(Question) :nl, write('Question please'), nl, read(Question). A seguir uma Base de Conhecimento pequena para identifica o de animais. :- op(100, xfx, [has,gives, does not , eats, lays, isa]). :- op(100, xf, [swims, flies]). rule1 : if Animal has hair or Animal gives milk then Animal isa mammal rule2: if Animal has feathres or Animal flies and Animal lays eggs then Animal is a bird
rule3: if Ani mal isa mammal and (Animal eats meat or Animal has pointed teeth and Animal has claws and Animal has forward pointing eyes) then Animal isa carnivore rule4: if Animal isa carnivore and Animal has tawny colour and Animal has dark spots then Animal isa cheetah. rule5: if Animal isa carnivore and Animal has tawny colour and Animal has black stripes then Animal isa tiger rule6: if Animal isa bird and Animal does not fly and Animal swims then Animal is a penguin rule7: if Animal is a bird and Animal isa good flyer then Animal is a albatross fact: X isa animal :- member(X, [cheeta, tiger, penguin, albatross]). askable ( _ gives _ , Animal gives What ). askable ( _ flies, Animal flies). askable ( _ lay eggs, Animal lays eggs). askable ( _ eats _, Animal eats What). askable ( _ has _ , Animal has Something). askable ( _ does not , Animal does not DoSomething ). askable ( _ swims, Animal swims). askable ( _ isa good flier, Animal isa good flier).
REFERNCIAS
Bratko, Ivan. Prolog - Programming for Artificial Intelligence. Second Edition. Addison-Wesley Publishing Company. Pginas 331-397. Japanese Technology Evaluation Center - KNOWLEDGE-BASED SYSTEMS IN JAPAN. http://itri.loyola.edu/kb/toc.htm CLIPS - A Tool for building expert systems http://www.ghg.net/clips/CLIPS.html Artificial Intelligence http://www.cis.njit.edu/~rju3268/index.html Journal of IS Education - Expert Systems A Quick Tutorial http://gise.org/JISE/Vol1-5/EXPERTSY.htm Expert Systems in Medicine http://www.dsclab.ece.ntua.gr/~kblekas/medicine.html American Association of Artificial Intelligence - Expert Systems http://www.aaai.org/Pathfinder/html/expert.html Expert Systems Prolog vs Lisp http://userpages.umbc.edu/~schmitt/331F96/bjaran1/paper.html Databases and Artificial Intelligence http://www.cee.hw.ac.uk/~alison/ai3notes/all.html The Beginnings of Prolog http://www.practical-applications.co.uk/Prolog/history.html Knowledge-based Systems Demos http://www.emsl.pnl.gov:2080/proj/neuron/kbs/demos.html PC AI Expert Systems http://www.pcai.com/pcai/New_Home_Page/ai_info/expert_systems.html StudyWeb Expert Systems http://www.studyweb.com/links/287.html What are Expert Systems http://www.ghgcorp.com/clips/ExpertSystems.html