Trabalho de Prolog

download Trabalho de Prolog

of 24

Transcript of Trabalho de Prolog

Universidade Catlica de Pernambuco Ncleo de Cincias e tecnologia Paradigmas das Linguagens de Programao

PARADIGMA DECLARATIVOS: A PROGRAMAO EM LGICA

Jefferson Oliveira Jernimo Vasconcelos Rodrigo Sales

Recife 2009

Lgica e Programao de computadores A lgica a Cincia do pensamento correto. Mas isso no afirma que ela cincia da verdade

Termos Utilizados Inferncia: uma conexo indireta entre assuntos. uma ilao ou deduo. Em lgica, inferncia a passagem, atravs de regras vlidas, do antecedente ao conseqente de um argumento. Deduo: Deduo toda inferncia que parte do universal para o particular. Ex.: Carlos humano. Todo humano mamfero. Logo, Carlos mamfero. Refutao: Em lgica informal, uma refutao ou objeo, uma razo que vai contra uma premissa, lema ou concluso. Contradio: H contradio quando se afirma e se nega simultaneamente algo sobre a mesma coisa. O princpio da contradio informa que duas proposies contraditrias no podem ser ambas falsas ou ambas verdadeiras ao mesmo tempo

As Razes Teorias, Matemticos e Pesquisadores "lgebra de Boole Boole (1815-1864) e De Morgan (1806-1871) "Begriffsschrift" - Clculo de Predicados do Matemtico alemo Gttlob Frege "Principia Mathematica" O relacionamento entre lgica e matemtica De Alfred North Whitehead e Bertrand Russel (1910) A Teorema da incompleteza dos sistemas de formalizao da aritmtica Gdel - (1931) Primeira teoria semntica formal do clculo de predicados Alfred Tarski- (1934) O final da Segunda Guerra Mundial No incio da Segunda Guerra Mundial (1939) toda a fundamentao terica bsica da lgica computacional estava pronta. A Guerra deslocou os recursos para as tcnicas de assassinato em massa. Faltavam meios pra a computao de Provas Somente a partir da metade dos anos 50 que o desenvolvimento da ento novssima tecnologia dos computadores conseguiu oferecer aos pesquisadores o potencial computacional necessrio para a realizao de experincias mais significativas com o clculo de predicados. A expresso Programao em Lgica" devido a Robert Kowalski (1974) e designa o uso da lgica como linguagem de programao de computadores. Identificou procedimentos de prova de teoremas, um procedimento computacional, permitindo uma interpretao procedimental da lgica e estabelecendo as condies que nos permitem entend-la como uma linguagem de programao de uso geral. O primeiro Interpretador experimental Foi desenvolvido por um grupo de pesquisadores liderados por Alain Colmerauer na Universidade de Aix-Marseille (1972). Implementaes mais "praticas" foram desenvolvidas por: Battani e Meloni (1973); Bruynooghe (1976) ; David H. D. Warren, Lus Moniz Pereira; Deve-se tambm a Warren a especificao da WAM (Warren Abstract Machine) Um modelo formal empregado na pesquisa de arquiteturas computacionais orientadas programao em lgica.

A Quinta Gerao de Computadores A computao da quinta gerao, deve o seu nome a um projeto gigantesco de pesquisa governamental e industrial no Japo durante a dcada 80. Predecessores Primeira gerao Segunda gerao Terceira gerao Quarta gerao Vlvula Diodos e Transistores Circuito integrado Microprocessador

Quinta gerao Visto que a quarta gerao se tinha focado no aumento do nmero de elementos lgicos em um nico CPU, acreditava-se que a quinta gerao iria virar-se para a utilizao de quantidades enormes de CPU para um desempenho maior. O Principal objetivo foi a criao de um computador desempenho semelhante a um supercomputador e capacidade prtica de inteligncia artificial. Sistemas Computacionais de Quinta Gerao, desenvolvimento, no espao de uma dcada, de hardware e software de alto desempenho, caracterizando uma nova gerao de computadores. O termo quinta gerao tencionava convencionar o novo sistema como sendo um salto para alm das mquinas j existentes. Os novos equipamentos Linguagens-ncleo (kernel languages) Processamento lgico paralelo derivados do Prolog Denominados mquinas PSI (Personal Sequential Inference machines) Primeiros passos do projeto Consistiu em definir uma linguagem de programao em lgica que ao mesmo tempo fosse adequada ao paralelismo do hardware e aos requisitos sofisticados especificados para o software. Baseada no Parlog e no Cuncurrent Prolog , utilizou o GHC (Guarded Horn Clauses) com a primeira linguagem, que em seguida evolui para o KL0 (Kernel Language Zero) que por usa vez evolui para a KL1 (Todo o projeto do FGCS foi revisto em prol dessa linguagem) O Sistema Operacional A partir, da linguagem KL1 e desenvolveram o sistema operacional PIMOS (Parallel Inference Machine Operating System) Os primeiros prottipos Parallel Inference Machines (PIMs).Arquitetura massivamente paralela Velocidade de processamento calculada em MLIPS

A Realidade Prolog no oferecia suporte para concorrncias. Desenvolvimento de uma linguagem prpria para atingir objetivos reais com multi-processadores. A performance das CPUs levaram o projeto para junto das barreiras existentes nos anos 80, e o valor da computao paralela rapidamente caiu para o ponto onde, na poca, era usada apenas em situaes muito particulares e restritas Estaes de trabalho com capacidades superiores tenham sido idealizadas e construdas ao longo do projeto. Mas, quando comparadas com equipamentos de menor gama entretanto colocados disposio no mercado, se davam conta de que estas ficavam obsoletas. Concorrentes introduziram a GUI (Interface Grfica do Utilizador). A Internet fez com que as bases de dados armazenadas localmente se tornassem obsoletas. O projeto chegou concluso de que as promessas baseadas na programao lgica eram uma iluso e rapidamente chegaram ao mesmo tipo de limitaes que os pesquisadores de IA. Inevitavelmente, o projeto falhou. No final do perodo de dez anos haviam sido gastos mais de 50 bilhes de ienes e o programa terminou sem ter atingido as suas metas. As estaes de trabalho no tinham procura comercial num mercado onde os sistemas de um nico CPU facilmente lhes ultrapassavam em performance, os sistemas de software nunca funcionaram e o conceito geral ficou completamente obsoleto com a exploso e amadurecimento da internet. Princpios da Programao em Lgica Uma das principais idias da programao em lgica de que um algoritmo constitudo por dois elementos disjuntos: Lgico Corresponde definio do que deve ser solucionado Controle Estabelece como a soluo pode ser obtida

Um programa em lgica a representao de determinado problema ou situao expressa atravs de um conjunto finito de clusulas. Clausulas so um tipo especial de sentenas lgicas Um programa em lgica no a descrio de um procedimento para se obter a soluo de um problema.

No processamento de programas em lgica o sistema responsvel pelo procedimento a ser adotado na sua execuo Um programa em lgica pode tambm ser visto alternativamente como uma base de dados. Base de Dados Convencionais Base de dados de Prolog

"Oscar um avestruz

"Todo avestruz um pssaro

As principais diferenas entre programao convencional e programao em lgica. Programas Convencionais Processamento Numrico Solues Algortmicas Estruturas de Controle e Conhecimento Integradas Difcil Modificao Somente Respostas Totalmente Corretas Somente a Melhor Soluo Possvel Programas em Lgica Processamento Simblico Solues Heursticas Estruturas de Controle e Conhecimento Separadas Fcil Modificao Incluem Respostas Parcialmente Corretas Incluem Todas as Solues Possveis

Paradigma Declarativa O ponto focal da programao em lgica consiste em: Identificar a noo de computao com a noo de deduo. Mais precisamente, os sistemas de programao em lgica reduzem a execuo de programas pesquisa da refutao das sentenas do programa em conjunto com a negao da sentena que expressa a consulta, seguindo essa regra: uma refutao a deduo de uma contradio . Pode-se ento expressar conhecimento (programas e/ou dados) em Prolog por meio de clusulas de dois tipos: Fato Denota uma verdade incondicional Regras Definem as condies que devem ser satisfeitas para que uma certa declarao seja considerada verdadeira. Os termos "programao em lgica" e "programao Prolog" tendem a ser empregados indistintamente. Deve-se destacar que a linguagem Prolog apenas uma particular abordagem da programao em lgica. As caractersticas mais marcantes dos sistemas de programao em lgica em Geral e da linguagem Prolog em particular so as seguintes: Especificaes so Programas Capacidade Dedutiva No-determinismo Reversibilidade das Relaes Trplice Interpretao dos Programas em Lgica Recurso

Especificaes so Programas: A linguagem de especificao entendida pela mquina e , por si s, uma linguagem de programao. O refinamento de especificaes mais efetivo do que o refinamento de programas. Um nmero ilimitado de clusulas diferentes pode ser usado e predicados (procedimentos) com qualquer nmero de argumentos so possveis. No h distino entre o

programa e os dados. As clusulas podem ser usadas com grande vantagem sobre as construes convencionais para a representao de tipos abstratos de dados. A adequao da lgica para a representao simultnea de programas e suas especificaes a torna um instrumento especialmente til para o desenvolvimento de ambientes e prottipos. Capacidade Dedutiva: O conceito de computao confunde-se com o de (passo de) Inferncia. A execuo de um programa a prova do teorema representado pela consulta formulada, com base nos axiomas representados pelas clusulas (fatos e regras) do programa. No-determinismo: Os procedimentos podem apresentar mltiplas respostas, da mesma forma que podem solucionar mltiplas e aleatoriamente variveis condies de entrada. Atravs de um mecanismo especial, denominado "backtracking", uma seqncia de resultados alternativos pode ser obtida. Reversibilidade das Relaes: (Ou "computao bidirecional"). Os argumentos de um procedimento podem alternativamente, em diferentes chamadas representar ora parmetros de entrada, ora de sada. Os procedimentos podem assim ser projetados para atender a mltiplos propsitos. A execuo pode ocorrer em qualquer sentido, dependendo do contexto. Por exemplo, o mesmo procedimento para inserir um elemento no topo de uma pilha qualquer pode ser usado, em sentido contrrio, para remover o elemento que se encontrar no topo desta pilha. Trplice Interpretao dos Programas em Lgica: Um programa em lgica pode ser semanticamente interpretado de trs modos distintos: (1) por meio da semntica declarativa, inerente lgica, (2) por meio da semntica procedimental, onde as clusulas dos programas so vistas como entrada para um mtodo de prova e, (3) por meio da semntica operacional, onde as clusulas so vistas como comandos para um procedimento particular de prova por refutao. Essas trs interpretaes so intercambiveis segundo a particular abordagem que se mostrar mais vantajosa ao problema que se tenta solucionar. Recurso: A recurso, em Prolog, a forma natural de ver e representar dados e programas. Entretanto, na sintaxe da linguagem no h laos do tipo "for" ou "while" (apesar de poderem ser facilmente programados), simplesmente porque eles so absolutamente desnecessrios. Tambm so dispensados comandos de atribuio e, evidentemente, o "goto". Uma estrutura de dados contendo variveis livres pode ser retornada como a sada de um procedimento. Essas variveis livres podem ser posteriormente instanciadas por outros procedimentos produzindo o efeito de atribuies implcitas a estruturas de dados. Onde for necessrio, variveis livres so automaticamente agrupadas por meio de referncias transparentes ao programador. Assim, as variveis lgicas um potencial de representao significativamente maior do que oferecido por operaes de atribuio e referncia nas linguagens convencionais.

A premissa bsica da programao em lgica portanto que : Computao inferncia controlada". Tal viso da computao tem se mostrado extremamente produtiva, na medida em que conduz idia de que computadores podem ser projetados com a arquitetura de mquinas de inferncia. Grande parte da pesquisa sobre computao paralela, conduzida hoje nos EUA, Europa e Japo, emprega a programao em lgica como instrumento bsico para a especificao de novas arquiteturas de hardware e o desenvolvimento de mquinas abstratas no-convencionais.

Aplicaes Um dos primeiros usos da programao em lgica foi a representao e anlise de subconjuntos da linguagem natural. Esta foi inclusive a aplicao que motivou Alain Colmerauer a desenvolver a primeira implementao da linguagem Prolog. Logo em seguida, outros pesquisadores da rea da inteligncia artificial propuseram diversas novas aplicaes para o novo instrumento. Alguns dos primeiros trabalhos com Prolog envolviam a formulao de planos e a escrita de compiladores. Um conjunto das principais reas investigadas com o concurso da programao em lgica. Sistemas Baseados em Conhecimento (SBCs): Sistemas de Bases de Dados (BDs): Sistemas Especialistas (SEs): Processamento da Linguagem Natural (PLN): Educao: Arquiteturas No-Convencionais:

Sistemas Baseados em Conhecimento (SBCs): Ou knowledge-based systems, so sistemas que aplicam mecanismos automatizados de raciocnio para a representao e inferncia de conhecimento. Tais sistemas costumam ser identificados como simplesmente "de inteligncia artificial aplicada" e representam uma abrangente classe de aplicaes da qual todas as demais seriam aproximadamente subclasses. A tecnologia dos SBCs foi identificada na Inglaterra pelo Relatrio Alvey (1982) como uma das quatro tecnologias necessrias completa explorao dos computadores de quinta gerao. As outras seriam: interface homem-mquina (MMI), integrao de circuitos em ultragrande escala (ULSI) e engenharia de software (SE). O relacionamento entre SBCs e a nova gerao de computadores , na verdade, altamente simbitica, cada uma dessas reas necessria para a realizao do completo potencial da outra. Sistemas de Bases de Dados (BDs): Uma particularmente bem definida aplicao dos SBCs so bases de dados. BDs convencionais tradicionalmente manipulam dados como colees de relaes armazenadas de modo extensional sob a forma de tabelas. O modelo relacional serviu de base implementao de diversos sistemas fundamentados na lgebra relacional, que oferece operadores tais como juno e projeo. O processador de consultas de uma BD convencional deriva, a partir de uma consulta fornecida como entrada, alguma conjuno especfica de tais operaes algbricas que um programa gerenciador ento aplica s tabelas visando a recuperao de conjuntos de dados (n-tuplas) apropriados, se existirem. O potencial da programao em lgica para a representao e consulta BDs foi simultaneamente investigado, em 1978, por van Emden, Kowalski e Trnlund. As trs pesquisas estabeleceram

que a recuperao de dados - um problema bsico em BDs convencionais - intrnseca ao mecanismo de inferncia dos interpretadores lgicos. Desde ento diversos sistemas tem sido propostos para a representao de BDs por meio de programas em lgica Sistemas Especialistas (SEs): Um sistema especialista uma forma de SBC especialmente projetado para emular a especializao humana em algum domnio especfico. Tipicamente um SE ir possuir uma base de conhecimento (BC) formada de fatos, regras e heursticas sobre o domnio, juntamente com a capacidade de entabular comunicao interativa com seus usurios, de modo muito prximo ao que um especialista humano faria. Alm disso os SEs devem ser capazes de oferecer sugestes e conselhos aos usurios e, tambm, melhorar o prprio desempenho a partir da experincia, isto , adquirir novos conhecimentos e heursticas com essa interao. Diversos sistemas especialistas foram construdos com base na programao em lgica, como por exemplo o sistema ORBI, para a anlise de recursos ambientais desenvolvido por Pereira et al. na Universidade Nova de Lisboa Processamento da Linguagem Natural (PLN): O PLN da maior importncia para o desenvolvimento de ferramentas para a comunicao homem-mquina em geral e para a construo de interfaces de SBCs em particular. A implementao de sistemas de PLN em computadores requer no somente a formalizao sinttica, como tambm - o grande problema - a formalizao semntica, isto , o correto significado das palavras, sentenas, frases, expresses, etc. que povoam a comunicao natural humana. O uso da lgica das clusulas de Horn3 para este propsito foi inicialmente investigado por Colmerauer, o prprio criador do Prolog (1973), e posteriormente por Kowalski (1974). Ambos mostraram (1) que as clusulas de Horn eram adequadas representao de qualquer gramtica livre-de-contexto (GLC), (2) permitiam que questes sobre a estrutura de sentenas em linguagem natural fossem formuladas como objetivos ao sistema, e (3) que diferentes procedimentos de prova aplicados a representaes lgicas da linguagem natural correspondiam a diferentes estratgias de anlise. Educao: A programao em lgica poder vir a oferecer no futuro uma contribuio bastante significativa ao uso educacional de computadores. Esta proposta foi testada em 1978 quando Kowalski introduziu a programao em lgica na Park House Middle School em Wimbledon, na Inglaterra, usando acesso on-line aos computadores do Imperial College. O sucesso do empreendimento conduziu a um projeto mais abrangente denominado "Lgica como Linguagem de Programao para Crianas", inaugurado em 1980 na Inglaterra com recursos do Conselho de Pesquisa Cientfica daquele pas. Os resultados obtidos desde ento tem mostrado que a programao em lgica no somente assimilada mais facilmente do que as linguagens convencionais, como tambm pode ser introduzida at mesmo a crianas na faixa dos 10 a 12 anos, as quais ainda se beneficiam do desenvolvimento do pensamento lgicoformal que o uso de linguagens como o Prolog induz. Arquiteturas No-Convencionais: Esta rea vem se tornando cada vez mais um campo extremamente frtil para o uso da programao em lgica especialmente na especificao e implementao de mquinas abstratas de processamento paralelo. O paralelismo pode ser modelado pela programao em lgica em variados graus de atividade se implementado em conjunto com o mecanismo de unificao. Duas implementaes iniciais nesse sentido foram o Parlog, desenvolvido em 1984 por Clark e Gregory, e o Concurrent Prolog (CP), por Shapiro em 1983. O projeto da Quinta Gerao, introduzido na prxima seo, foi fortemente orientado ao uso da programao em lgica em sistemas de processamento paralelo.

Aplicaes Muitas outras aplicaes poderiam ainda ser citadas, principalmente na rea da inteligncia artificial, que tem no Prolog e no Lisp as suas duas linguagens mais importantes. Novas tecnologias de hardware e software tais como sistemas massivamente paralelos, redes de computadores, assistentes inteligentes, bases de dados semnticas, etc., tornam o uso do Prolog (e de outras linguagens baseadas em lgica) cada vez mais atraentes Porque estudar Prolog? A programao Prolog uma excelente porta de entrada para a informtica do futuro, tendo em vista, entre outras vantagens: De aprendizado fcil e natural do que as linguagens convencionais, podendo inclusive ser ministrada a estudantes com grande aproveitamento; Implementa com preciso os modelos surgidos nos ltimos anos, inclusive redes neurais, algoritmos genticos, sociedades de agentes inteligentes, sistemas concorrentes e paralelos; Permite a implementao de extenses, inclusive em nvel meta, e a definio precisa de sistemas reflexivos (essenciais, por exemplo, robtica); Libera o programador dos problemas associados ao controle de suas rotinas, permitindo-lhe concentrar-se nos aspectos lgicos da situao a representar. A expressividade herdada da lgica torna a linguagem Prolog um instrumento especialmente poderoso, adequado para a descrio do mundo real com todos os seus contornos, nuances e sutilezas. Nos poucos casos em que a representao se torna mais difcil - na representao temporal, por exemplo - a flexibilidade do Prolog em aceitar o desenvolvimento de extenses semanticamente precisas e incorpor-las ao seu mecanismo de produo de inferncias, remove qualquer impedimento para o seu emprego em virtualmente qualquer rea do conhecimento.

Linguagem PROLOG Quando foi Desenvolvida a Liguagem PROLOG PROLOG uma linguagem de programao baseada em um pequeno conjunto de conceitos, incluindo casamento de padres, estruturao em forma de rvore e backtracking automtico. Este pequeno conjunto forma um ambiente de programao poderoso. PROLOG especialmente adequada para problemas envolvendo objetos e suas relaes. PROLOG uma linguagem de programao que se enquadra no paradigma de Programao em Lgica Matemtica. uma linguagem de uso geral que especialmente associada com a inteligncia artificial e lingstica computacional. A primeira implementao da linguagem PROLOG foi realizada por Alain Colmerauer e sua equipe, na Universidade de Aix-Marseille em 1972. A formalizao semntica da programao com clusulas de Horn devida a Kowalski (1974) e designa o uso da lgica como linguagem de programao de computadores, j a especificao do primeiro "standard" o PROLOG de Edimburgo - foi realizada por Warren e Pereira em 1977; Elementos bsicos do PROLOG Termos PROLOG representa PROgramming in LOGic (Programao em Lgica), uma idia nascida no incio dos anos 1970 para usar lgica como linguagem de programao. O interesse inicial no projeto do PROLOG foi a construo de uma linguagem de programao destinada ao processamento de linguagem natural. Entretanto, rapidamente seu uso se difundiu e hoje ela largamente utilizada nas mais diversas reas que vo desde a qumica e biologia at administrao e negcios, passando por automao de processos industriais, simulaes, controle, dentre inmeras outras aplicaes. Certamente, esta popularidade se deve facilidade com que se pode descrever os problemas nesta linguagem. Os conhecimentos relacionados a estes domnios so facilmente descritos por meio de fatos e regras e so diretamente traduzidos para a linguagem. Algumas das principais caractersticas da linguagem PROLOG so: uma linguagem orientada ao processamento simblico; Representa uma implementao da lgica como linguagem de programao; Apresenta uma semntica declarativa inerente lgica; Permite a definio de programas reversveis, isto , programas que no distinguem entre os argumentos de entrada e os de sada; Permite a obteno de respostas alternativas; Suporta cdigo recursivo e iterativo para a descrio de processos e problemas, dispensando os mecanismos tradicionais de controle, tais como while, repeat, etc; Permite associar o processo de especificao ao processo de codificao de programas; Representa programas e dados atravs do mesmo formalismo; Mquinas PROLOG Em 1983, David H. D. Warren projetou uma mquina abstrata para a execuo de PROLOG. A mquina era formada por uma arquitetura baseada em uma memria e um conjunto de instrues. Esse projeto conhecido como Warren Abstract Machine (WAM) e se tornou o padro de facto para a implementao de compiladores PROLOG.

Um exemplo de mquina PROLOG a Mquina ICOT PSI, a Mquina Pessoal Seqencial de Inferncia (PSI) um computador pessoal projetado para servir como uma ferramenta de desenvolvimento para o projeto de Sistemas de Computadores de Quinta Gerao. O PSI tem sido desenvolvido pelo Instituto de Tecnologia de Computadores de Nova Gerao(ICOT) com o objetivo principal de prover um ambiente especializado para a programao em lgica. Apesar do longo tempo de desenvolvimento, PROLOG ainda no uma linguagem portvel, j que cada implementao usa rotinas completamente diferentes e incompatveis entre si. Por exemplo, um programa trivial que faz um loop de ler uma linha da console e escreve a mesma linha, terminando quando for entrada uma linha vazia, impossvel de ser escrito de forma que qualquer interpretador consiga rodar. Instrues relativas a Fatos Os fatos so os elementos fundamentais da programao em PROLOG, pois determinam as relaes que existem entre os objetos conhecidos. Exemplo:

PROLOG no emprega tipos de dados do mesmo modo que as linguagens de programao mais comuns normalmente fazem. Todos os dados so tratados como sendo de um nico tipo, Termo, cuja natureza depende da forma como esse termo foi declarado. Ou seja, os elementos lxicos utilizados na sua declarao determinam se esse termo ser um nmero, um texto, uma varivel, uma estrutura complexa e assim por diante. tomos As constantes de texto so introduzidas por meio de tomos. Um tomo uma seqncia constituda de letras, nmeros e underscore, mas iniciando com uma letra minscula. Um tomo pode ser definido das seguintes maneiras: comeando com letra minscula: pedro henrique_iv como uma sequncia de caracteres entre aspas simples: 'quem voc?' 'eu no sei'. Nmeros Um nmero uma seqncia de dgitos, permitindo tambm os sinais de . (para nmeros reais), - (nmero negativo) e e (notao cientfica). Algumas implementaes do PROLOG no fazem distino entre inteiros e nmeros reais. exemplos: 321 3.21 Variveis Variveis so declaradas da mesma forma que tomos, porm iniciando com uma letra maiscula ou underscore. No ambiente PROLOG uma varivel no um continer cujo valor

pode ser atribudo (como ocorre nas linguagens imperativas). Uma varivel PROLOG como uma incgnita, cujo valor desconhecido a princpio mas, aps descoberto, no sofre mais mudanas. Um tipo especial de varivel, a varivel annima (explicada mais adiante), uma expresso que significa 'qualquer varivel', e escrita como um nico subtrao (_). exemplos: X Nome Rei_da_Espanha Strings Strings so normalmente escritas como uma seqncia de caracteres entre aspas. comum serem representadas internamente como listas de cdigos de caracteres, em geral utilizando a codificao local ou Unicode, se o sistema d suporte a Unicode. O ISO PROLOG tambm permite que strings sejam representadas por uma lista de tomos com um nico caractere. Considere a rvore genealgica mostrada na Figura 1. possvel definir, entre os objetos (indivduos) mostrados, uma relao denominada progenitor que associa um indivduo a um dos seus progenitores.

Figura 1 Por exemplo, o fato de que Joo um dos progenitores de Jos pode ser denotado por: progenitor(joo, jos). Onde progenitor o nome da relao e joo e jos so os seus argumentos. Por razes que se tornaro claras mais tarde, escreve-se aqui nomes de pessoas (como Joo) iniciando com letra minscula. Se o programa for submetido a um sistema PROLOG, este ser capaz de responder algumas questes sobre a relao ali representada. Por exemplo: "Jos o progenitor de ris?". Uma consulta como essa deve ser formulada ao sistema precedida por um "?-". Esta combinao de sinais denota que se est formulando uma pergunta. Como h um fato no programa declarando explicitamente que Jos o progenitor de ris, o sistema responde "sim".

?-progenitor(jos, ris). sim Uma outra questo poderia ser: "Ana um dos progenitores de Jorge?". Nesse caso o sistema responde "no", porque no h nenhuma clusula no programa que permita deduzir tal fato. ?-progenitor(ana, jorge). no A questo "Lus progenitor de Maria?" tambm obteria a resposta "no", porque o programa nem sequer conhece algum com o nome Lus. ?-progenitor(lus, maria). no Perguntas mais interessantes podem tambm ser formuladas, por exemplo: "Quem progenitor de ris?". Para fazer isso introduz-se uma varivel, por exemplo "X" na posio do argumento correspondente ao progenitor de ris. Desta forma o sistema no se limitar a responder "sim" ou "no", mas ir procurar (e informar caso for encontrado) um valor de X que torne a assertiva "X progenitor de ris" verdadeira. ?-progenitor(X, ris). X=jos Da mesma forma a questo "Quem so os filhos de Jos?" pode ser formulada com a introduo de uma varivel na posio do argumento correspondente ao filhos de Jos. Note que, neste caso, mais de uma resposta verdadeira pode ser encontrada. O sistema ir fornecer a primeira que encontrar e aguardar manifestao por parte do usurio. Se este desejar outras solues deve digitar um ponto-evrgula (;), do contrrio digita um ponto (.), o que informa ao sistema que a soluo fornecida suficiente. ?-progenitor(jos, X). X=jlia; X=ris; no Aqui a ltima resposta obtida foi "no" significando que todas as solues vlidas j foram fornecidas. Uma questo mais geral para o programa seria: "Quem progenitor de quem?" ou, com outra formulao: "Encontre X e Y tal que X progenitor de Y". O sistema, em resposta, ir fornecer (enquanto se desejar, digitando ";") todos os pares progenitor-filho at que estes se esgotem (quando ento responde "no") ou at que se resolva encerrar a apresentao de novas solues (digitando "."). No exemplo a seguir iremos nos satisfazer com as trs primeiras solues encontradas. ?-progenitor(X, Y). X=maria Y=jos; X=joo Y=jos; X=joo Y=ana. Pode-se formular questes ainda mais complicadas ao programa, como "Quem so os avs de Jorge?". Como nosso programa no possui diretamente a relao av, esta consulta precisa ser dividida em duas etapas: (1) Quem progenitor de Jorge? (Por exemplo, Y) (2) Quem progenitor de Y? (Por exemplo, X)

Esta consulta em PROLOG escrita como uma seqncia de duas consultas simples, cuja leitura pode ser: "Encontre X e Y tais que X progenitor de Y e Y progenitor de Jorge". ?-progenitor(X, Y), progenitor(Y, jorge). X=jos Y=ris Observe que se mudarmos a ordem das consultas na composio, o significado lgico permanece o mesmo, apesar do resultado ser informado na ordem inversa: ?-progenitor(Y, jorge), progenitor(X, Y). Y=ris X=jos De modo similar podemos perguntar: "Quem neto de Joo?": ?-progenitor(joo, X), progenitor(X, Y). X=jos Y=jlia; X=jos Y=ris. Ainda uma outra pergunta poderia ser: "Jos e Ana possuem algum progenitor em comum?". Novamente necessrio decompor a questo em duas etapas, formulando-a alternativamente como: "Encontre um X tal que X seja simultaneamente progenitor de Jos e Ana". ?-progenitor(X, jos), progenitor(X, ana). X=joo Alguns predicados so pre-definidos na prpria linguagem, permitindo que os programas PROLOG desempenhem atividades rotineiras (como entrada/sada, uso de grficos e outros tipos de comunicao com o sistema operacional). Por exemplo, o predicado write pode ser usado para sada na tela. Exemplo: write('Ol'). vai exibir a palavra 'Ol' na tela. Instrues relativas a Regras O segundo tipo de predicado no PROLOG a regra, tambm chamada de "clusula". As regras so utilizadas para construir relaes entre fatos, explicitando as dependncias entre eles. Ao contrrio dos fatos, que so incondicionais, as regras especificam coisas que podem ser verdadeiras se algumas condies forem satisfeitas. As regras possuem duas partes: o corpo, que define as condies e se encontra na parte direita da regra, e a cabea, que define a concluso, e se encontra na parte esquerda da regra. A cabea e o corpo so separados pelo smbolo ":-", que lido como "se". Uma regra sempre terminada com um ponto final. Exemplo : gosta (joo, X) :- gosta (X, vinho). gosta (joo, X) :- gosta (X, vinho), gosta (X, comida). filho (X, Y) :- homem (X), genitor(Y, X). Nas regras tambm ocorre o retrocesso: caso um sub-goal no seja satisfeito, o PROLOG tenta modificar o valor das variveis instanciadas para procurar uma resposta vlida.

Instrues relativas a Metas Metas so clusulas de Horn sem cabea que devem ser avaliadas pelo sistema de inferncia do PROLOG Usando constante mulher(ana). % Resposta do sistema: yes ou no Usando varivel pais(manuel, ana, Filho). % Quem (so) filho(s) de Manuel e Ana? pais(Pai,Mae, pedro). % Qual o pai e a me de Pedro?

O Processo de Inferncia do PROLOG O processo de inferncia em PROLOG inicia com uma consulta, essa consulta particionada em suas submetas e ento o fluxo de execuo tenta encontrar o encademamento de regras e/ou fatos que ligam a meta aos fatos na base de conhecimentos. Essa forma de resoluo capaz de resolver problemas em domnios finitos. Dois mtodos de resoluo: Bottom-up ou encadeamento progressivo - parte dos fatos na base de conhecimentos e chega a meta. Encadeamento retrgrado - parte da meta e chega nos fatos da base de conhecimentos. Uso de backtracking para avaliao de submetas: Busca Primeiramente pela Profundidade Localiza todas as proposies de uma submeta antes de trabalhar nas outras (depth-first) Busca Primeiramente pela Largura Trabalha todas as submetas de uma determinada meta de maneira paralela (breadth-first) O PROLOG usa Busca por Profundidade Projetistas procuraram poupar memria da mquina Mecanismo de Backtracing Estrutura nativa do PROLOG que permite retrocesso na meta para reconsiderao de uma submeta provada anteriormente Ex.: homem(X), pais(X, pedro). % Qual o homem que o pai de Pedro? Aritmtica Simples Suporta variveis de nmeros inteiros e seus respectivos clculos. Originalmente seus operadores eram functores. Ex.: +(7, X). % Soma de 7 com a varivel X. Atualmente pode ser utilizado o operador is ou o smbolo semelhante ao de atribuio = Ex.: A is B / 17 + C. % ou A = B / 17 + C. A is A + 1. (ILEGAL!)

Estruturas de Listas

A forma mais adequada para estruturao de dados em PROLOG so as listas. Como o nome diz, so estruturas dinmicas de armazenamento de dados. Elas so utilizadas na construo de vetores e matrizes dinmicos de caracteres, nmeros, e quais quer outros dados utilizados. Apresentam-se na forma: pred([elem,...],[],[elem[elem,..],...],arg,...). onde elem pode ser qualquer tipo sinttico. Um conceito importante para a utilizao das listas o cabea-corpo ( | ). Ele usado para isolar membros de uma lista. Por exemplo, dada uma lista na forma: lista([a,b,c,d,e]). Aplicando-se a questo: ?- lista([X | Y]). X=a Y=[b,c,d,e] Como podemos observar, o operador | permite a separao da cabea da lista de seu corpo. Isso permite o isolamento dos membros da lista, facilitando sua anlise. As listas so o principal tipo de estrutura de dados em PROLOG, com as quais possvel a construo de vetores e matrizes, com a vantagem de ser uma estrutura de memria dinmica. Programa-exemplo 1: Verifica se uma palavra palndroma. Exemplo de utilizao: inicio(madam). % entrada e saida de dados inicio(X) :- ler(X), (X = para; teste(X), inicio(Y)). teste(X) :- nome(X,N), palindromo(N), write(X), write(` e' palindroma'),nl, !. teste(X) :- write(X), write(` nao e' palindroma'), nl. % inversao e teste palindromo(X) :- inverte2(X,X). inverte2(L1,L) :- invconc(L1,[ ],L). invconc([H|L],L,M) :- invconc(T,[H|L],M). invconc([ ], L, L). Deficincias do PROLOG Controle da ordem de Resoluo Dependendo do problema, a interveno do programador muito importante para o programa ficar mais eficiente devido ao modo de inferncia. A ordem como as clusulas so escritas podem levar a laos infinitos. Ex: f(X, Y) :- f(Z, Y), g(X, Z). /* Semelhante ao problema que um analisador descendente recursivo tem com regras gramaticais recursivas esquerda */ Uso do comando cut, especificado por ! para limitar o backtracking, em prol da eficincia. Ex1.: a, b, !, c, d. /* Se a e b forem true e c falhar, ento a meta inteira falhar */ Ex2.: membro(Elemento, [Elemento | _ ] ) :- !. membro(Elemento, [ _ | Lista]) :- membro(Elemento, Lista). % _ indica varivel livre ou annima

Pressuposio de Mundo fechado O PROLOG funciona em um sistema de verdadeiro/falha e no verdadeiro/falso. PROLOG pode provar que algo verdadeiro, mas no que falso. Ele apenas pressupe que falso. Tipicamente, uma consulta avaliada como falsa no caso de no estar presente nenhuma regra positiva ou fato que d suporte ao termo proposto. O Problema da Negao Como a linguagem utilizada para verificar se algo verdadeiro, algumas proposies podem ocasionar falsos retornos. O caso seria implementar regras para montar todos os casos de negao, o que normalmente torna o banco de conhecimento bem maior. Saber se a pessoa faz aniversrio em determinada data necessria uma regra. Saber se a pessoa no faz aniversrio em determinada data So necessrias 364 regras. Pode ser avaliada somente pela busca exaustiva de todas as coisas que so ilegais e comparando elas com X, e se nenhum fato ilegal for descoberto ser o mesmo que X, X legal. Isso chamado negao por falha. Ele normalmente escrito como not(p), onde p um tomo cujas variveis foram normalmente instanciadas no momento que not(p) invocado. Uma sintaxe mais complexa (mas padro) \+ p . Literais de negao por falha podem ocorrer como condies not(Bi) no corpo das clusulas do programa. Ainda que incompleta, a regra de negao como falha uma slida regra de inferncia (sob certas restries) respeitando a concluso de um programa. Em outras palavras, assume-se que tudo o que importante saber est na base de dados, de modo que no existe um mundo exterior que pode possuir evidncias desconhecidas. Ou seja, se um fato no conhecido ser verdadeiro (ou falso), assume-se que ele falso. Uma regra como legal(X) :- \+ ilegal(X).

Limitaes Intrsecas PROLOG uma boa ferramenta na representao de fatos do mundo real que seriam dificilmente ou at mesmo impossveis de serem modelados em linguagens imperativas. Apesar da linguagem PROLOG ser uma das mais conhecidas, as arquiteturas voltadas para ter essa linguagem como nativa no tiveram o mesmo xito. PROLOG ineficiente para resoluo de problemas de caractersticas iterativas ou procedimentais. Cairia no problema de ter que especificar os detalhes de como resolver o problema (linguagens imperativas ou funcionais) e no simplesmente especificar a forma da resposta do problema (linguagens declarativas).

Exemplos de programas em Prolog Parentesco Famlia Simpsons Programa em prolog com o conhecimento de toda a familia dos simpsons % Fatos. homer. marge. bart. lisa. maggie. mona. jacqueline. patty. abraham. clancy. hugo. louise. herb. mulher(marge). mulher(maggie). mulher(lisa). mulher(mona). mulher(jacqueline). mulher(selma). mulher(patty). mulher(louise). homem(homer). homem(bart). homem(abraham). homem(clancy). homem(hugo). homem(herb). progenitor(homer,lisa). progenitor(homer,bart). progenitor(homer,maggie). progenitor(marge,bart). progenitor(marge,lisa). progenitor(marge,maggie). progenitor(abraham, homer).

progenitor(mona, homer). progenitor(clancy, marge). progenitor(clancy, patty). progenitor(clancy, selma). progenitor(jacqueline, marge). progenitor(jacqueline, patty). progenitor(jacqueline, selma). progenitor(abraham, herb). progenitor(herb, hugo). progenitor(louise, hugo). % Regras pai(A,B) :- homem(A), progenitor(A,B). me(A,B) :- mulher(A), progenitor(A,B). _pai(A) :- pai(A,_). _me(A) :- me(A,_). filho(A,B):- homem(A), progenitor(B,A). filha(A,B):- mulher(A), progenitor(B,A). irmaos(X,Y) :progenitor(Z,X), progenitor(Z,Y), X\=Y. irmao_completos(A,B) :pai(P,A), pai(P,B), me(M,A), me(M,B), A\=B. tio(T,A) :homem(T), irmaos(T,X), progenitor(X,A). tia(T,A) :mulher(T), irmaos(T,X), progenitor(X,A). primo(A,B) :homem(A), progenitor(X,A),

progenitor(Y,B), irmaos(X,Y). prima(A,B) :mulher(A), progenitor(X,A), progenitor(Y,B), irmaos(X,Y). av(A,B) :- pai(A,X), (pai(X,B);me(X,B)). av(A,B) :- me(A,X), (pai(X,B);me(X,B)).

Hanoi hanoi(X):mover(X,esquerda,direita,centro). mover(1,X,Y,_) :write('Tire o disco do topo da '), write(X), write(' para a '), write(Y), nl. mover(N,X,Y,Z) :write('Passou aqui'), nl, N>1, M is N-1, mover(M,X,Z,_), mover(1,X,Y,Z), mover(M,Z,Y,X).

Compiladores e IDEs PA Prolog (http://www.lpa.co.uk/) Open Prolog (http://www.cs.tcd.ie/open-prolog/) Ciao Prolog (http://www.clip.dia.fi.upm.es/Software/Ciao) GNU Prolog (http://gnu-prolog.inria.fr) YAP Prolog (http://www.ncc.up.pt/~vsc/Yap) SWI Prolog (http://www.swi-prolog.org) Strawberry Prolog (http://www.dobrev.com/) SICStus Prolog (http://www.sics.se/sicstus/) Amzi! Prolog (http://www.amzi.com/) B-Prolog (http://www.probp.com/) tuProlog (http://tuprolog.sourceforge.net/) - Cdigo Aberto integrvel ao Java XSB (http://xsb.sourceforge.net/) Trinc Prolog (http://www.trinc-prolog.com) hProlog ( http://www.cs.kuleuven.ac.be/~bmd/hProlog/ ) ilProlog ( http://www.pharmadm.com/dmax.asp ) CxProlog ( http://ctp.di.fct.unl.pt/~amd/cxprolog/ ) NanoProlog ( http://ctp.di.fct.unl.pt/~amd/cxprolog/ ) Visual Prolog ( http://visual-prolog.com/ )

Bibliografia http://pt.wikipedia.org/wiki/PROLOG http://pucrs.campus2.br/~annes/PROLOG2.html Sebesta, R. W. Conceitos de Linguagens de Programao. Bookman, 1999.