Upload
fabio-moura-pereira
View
370
Download
2
Embed Size (px)
Citation preview
Programação em Lógica Programação em Lógica MatemáticaMatemática
PrologProlog– 01 –– 01 –
Inteligência ArtificialInteligência ArtificialFábio M. Pereira
Baseado emAmzi! inc. – www.amzi.com
PrologProlog►Introdução►Exemplos►Jargão
Lógica e ProgramaçãoLógica e Programação►Lógica - ciência do pensamento
“correto”►Uso da lógica na representação dos
processos de raciocínio Boole (1815-1864) De Morgan (1806-1871) Frege no seu "Begriffsschrift" ("Notação de conceito", ideografia,
1879)► Programação em lógica - tem suas raízes no
cálculo de predicados, proposto por Frege em 1879
PROLOGPROLOG► PROLOG = PROgramming in LOGic► Desenvolvida a partir do teorema lógico e
originalmente usada para pesquisa em processamento de linguagem natural
► Primeira implementação - Alain Colmerauer e sua equipe, na Universidade de Aix-Marseille em 1972
► Popular na comunidade de IA Sistemas Especialistas Linguagem Natural Bancos de Dados Inteligentes
► Também é útil em aplicações convencionais
Características (1)Características (1)► Permite desenvolvimento e prototipação mais
rápido que a maioria das linguagens convencionais Semanticamente próxima à especificação lógica
de um programa► Uma das principais idéias - um algoritmo é
constituído por dois elementos disjuntos: a lógica e o controle Componente lógico - corresponde à definição do
que deve ser solucionado Componente de controle - estabelece como a
solução pode ser obtida
Características (2)Características (2)►Requer um reajuste da maneira como
pensamos um programa Relacionamentos lógicos são definidos Prolog é usada para determinar quando
uma instrução é ou não verdadeira E se uma instrução é verdadeira, quais
ligações entre as variáveis a tornam verdadeira
Estilo de programação declarativo
Características (3)Características (3)PROGRAMAS
CONVENCIONAISPROGRAMAS EM LÓGICA
Processamento Numérico Processamento SimbólicoSoluções Algorítmicas Soluções HeurísticasEstruturas de Controle e Conhecimento Integradas
Estruturas de Controle e Conhecimento Separadas
Difícil Modificação Fácil ModificaçãoSomente Respostas Totalmente Corretas
Incluem Respostas Parcialmente Corretas
Somente a Melhor Solução Possível
Incluem Todas as Soluções Possíveis
PrologProlog► Prolog dá suporte ao desenvolvimento de
programas tanto a partir da perspectiva bottom up como da perspectiva top down ou inside out
► Um programa Prolog existe como uma coleção de pequenas unidades modulares, chamadas predicados Similares a subrotinas em linguagens
convencionais, mas em menor escala Podem ser adicionados e testados separadamente
em um programa, tornando possível o desenvolvimento incremental de uma aplicação
ObjetivosObjetivos► Torná-lo familiar com
O banco de dados de fatos e regras de Prolog O provador de teoremas interno que permite a
Prolog responder questões sobre o banco de dados (busca backtracking)
Como variáveis lógicas são utilizadas►Diferente da maioria das linguagens
Unificação►Casamento de padrões interno
Características extra-lógicas►Tornam a linguagem prática
Como Prolog controla o seu comportamento de execução
ImplementaçõesImplementações► SWI Prolog (http://www.swi-prolog.org)► LPA Prolog (http://www.lpa.co.uk/)► Visual Prolog (http://visual-prolog.com/)► Strawberry Prolog (http://www.dobrev.com/)► Open Prolog (http://www.cs.tcd.ie/open-prolog/)► Ciao Prolog (http://www.clip.dia.fi.upm.es/Software/Ciao)► GNU Prolog (http://www.gprolog.org)► YAP Prolog (http://www.ncc.up.pt/~vsc/Yap)► SICStus Prolog (http://www.sics.se/sicstus/)► Amzi! Prolog (http://www.amzi.com/)► B-Prolog (http://www.probp.com/)► tuProlog (http://tuprolog.sourceforge.net/) - Código Aberto integrável 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/ )
Iniciando ...Iniciando ...
Tipos de Código ExemploTipos de Código Exemplo► Interação com o usuário
Presença do prompt (?-)► Arquivo de código fonte
mortal(X) :- pessoa(X).pessoa(socrates).
► Selecione File/New no menu do SWI-Prolog e salve o arquivo com o nome ‘mortal.pl’
► Para carregar o código fonte, selecione o arquivo ‘mortal.pl’ a partir do menu File/Consult, ou no prompt?- consult(mortal).Yes
Algumas ConsultasAlgumas Consultas► Após carregar o programa, tente as seguintes
consultas?- mortal(socrates).Yes?- mortal(X).X = socrates
► Modifique o programa e acrescente a linhapessoa(platao).
► Testando ...?- mortal(platao).Yes
► Mais um teste ...?- write(‘Hello World’).Hello WorldYes
Programação Lógica (1)Programação Lógica (1)►Olhando para o exemplo com mais detalhe:
Na lógica clássica: “Todas as pessoas são mortais”
Em Prolog: “Para todo X, X é mortal se X é uma pessoamortal(X) :- pessoa(X).
Similarmente, podemos afirmar o fato simples de que Sócrates é uma pessoapessoa(socrates).
A partir dessas afirmações lógicas, Prolog pode agora informar se Sócrates é ou não mortal?- mortal(socrates).
Programação Lógica (2)Programação Lógica (2)► Olhando para o exemplo com mais detalhe
(cont.): Prolog responde
Yes Também podemos perguntar “Quem é mortal?”
como a seguir:?- mortal(X).
E obter como respostaX = socrates
► Este estilo de programação declarativo é uma das maiores forças de Prolog Código fácil de escrever e manter
Programação Lógica (3)Programação Lógica (3)► Na maioria das vezes, o programador fica livre
de se preocupar com estruturas de controle e mecanismos de transferência de controle Isto é feito automaticamente por Prolog
► Por outro lado, entretanto, um provador de teoremas lógicos não é uma ferramenta de programação prática Um programa precisa fazer coisas que não têm nada
relacionado com lógica, como ler e escrever termos Um programador precisa manipular estruturas de
controle internas de Prolog para que o programa execute como desejado
Exemplo Ilustrativo (1)Exemplo Ilustrativo (1)► Primeiro, adicione mais alguns filósofos ao
código de ‘mortal’, para tornar o relatório mais interessante:
pessoa(zenao).pessoa(aristoteles).
► A seguir adicione o código para impressão do relatório Tenha cuidado com pontuação, caixa alta e baixa
mortal_report :-write(‘Mortais conhecidos:’),nl,mortal(X),write(X),nl,fail.
Exemplo Ilustrativo (2)Exemplo Ilustrativo (2)►Carregue o programa e teste
?- mortal_report.Mortais conhecidos:socratesplataozenaoaristoteles
No
% Esta é a sintaxe para comentários.% MORTAL – O primeiro programa Prolog
mortal(X) :- pessoa(X).
pessoa(socrates).pessoa(platao).pessoa(zenao).pessoa(aristoteles).
mortal_report :- write('Mortais conhecidos:'),nl, mortal(X), write(X),nl, fail.
Jargão (1)Jargão (1)► Como em qualquer campo de conhecimento, os
conceitos críticos são embutidos em suas definições de termos técnicos.
► Quando você entender termos como predicado, cláusula, backtracking e unificação terá uma boa compreensão de Prolog
► O jargão de Prolog é uma mistura de termos de programação, banco de dados e lógicos
► Um programa Prolog é um banco de dados Prolog
► O programa Prolog é composto de predicados (procedimentos, tipos de registros, relações)
Jargão (2)Jargão (2)►Cada predicado é composto por seu
nome e um número chamado aridade A aridade é o número fixo de argumentos
(atributos, campos) que o predicado possui Dois predicados com o mesmo nome e
aridades diferentes são considerados predicados diferentes
Jargão (3)Jargão (3)►Em nosso exemplo
pessoa/1►Se parece com múltiplos registros de dados,
cada um com um campo mortal_report/0
►Se parece com um procedimento sem argumentos
mortal/1►Uma afirmação lógica ou regra►Alguma coisa entre dado e procedimento
Jargão (4)Jargão (4)►Cada predicado em um programa é
definido pela existência de uma ou mais cláusulas no banco de dados No exemplo, o predicado pessoa/1 possui
quatro cláusulas O outro predicado possui apenas uma cláusula
►Uma cláusula pode ser um fato ou uma regra As quatro cláusulas do predicado pessoa/1 são
todos fatos As cláusulas únicas de mortal_report/0 e
mortal/1 são regras
O que vem a seguir?O que vem a seguir?
►Fatos►Consultas Simples►...