Upload
luiz-gustavo-borja-lopes
View
214
Download
0
Embed Size (px)
Citation preview
SISTEMAS DE INFORMAÇÃO
Inteligência Artificial
2011/01
UNIPAC - FACAE Faculdade de Ciências Administrativas e Exatas
Araguari - MG
Inteligência Artificial Inteligência Artificial
Programação LógicaProgramação Lógica
Aula 10Aula 10
Paradigma Lógico
Programação Lógica
A linguagem Prolog está vastamente documentada na Internet. Um endereço da World-Wide-Web com diversos recursos interessantes - interpretadores Prolog e tutoriais sobre a linguagem - está disponível em: http://burks.bton.ac.uk/burks/language/prolog/
Paradigma Lógico
Descreve, através de declarações, o problema e deixa que o interpretador gere a solução.
As linguagens que utilizam o paradigma de programação lógico são classificados como linguagens DECLARATIVAS.
Paradigma Lógico
Fatos:X é aluno da disciplina Y;W é aluno da disciplina Y;X estudou;T ministra a disciplina Y;
RegrasT é professor de X, se ministra alguma disciplina
que X é aluno.Todo aluno que estuda tira boas notas.
Linguagens Declarativas
Descrevem o problema e não a solução.Descrevem O QUE deve ser feito e não COMO deve ser feito.
Uma declaração do mundo é feita, ou seja, uma descrição dele é fornecida.
Define os fatos e as regras que regem este mundo, que define o que pode ser inferido.
Não se define estruturas algorítmicas para permitir resolver os problemas.
Linguagens DeclarativasConceito de Mundo Fechado:
Descreve o problema através de FATOS e REGRAS. Após, realiza-se CONSULTAS que são ser respondidas pelo interpretador avaliando-se os fatos e regras descritos. Tudo o que o interpretador não souber terá uma resposta negativa.
Programação LógicaA principal linguagem de programação que representa o paradigma de programação lógico é o PROLOG.
Prolog, como segue o paradigma de programação lógico, é uma linguagem DECLARATIVA.
Mostra O QUE deve ser feito e não COMO deve ser feito.
Expresso declarativamente, através de FATOS, REGRAS E CONSULTAS.
Prolog Principal área de atuação: IA (Inteligência
Artificial). Sistemas baseados em conhecimento. Sistema de consultas à bases de Dados. Sistemas especialistas. Hoje em dia, Prolog não é mais usado
exclusivamente por Inteligência Artificial, mas também em várias áreas incluindo finanças, defesa, telecomunicações, medicina, direito, agricultura, engenharia e educação.
Conceito
A Prolog é baseada em FATOS, REGRAS e CONSULTAS
Fatos: Em Prolog, fatos são entendidos como relações entre objetos. Estas relações constituem-se de afirmações que são feitas a Prolog.
São verdades nas quais a Prolog irá basear-se para responder as consultas solicitadas.
Conceito
Ex.: Árvore Genealógica Fato: João é um dos
progenitores de José progenitor(João, José).
Conceito
Regras: Especificação de algo que pode ser verdadeiro se algumas condições forem satisfeitas.
É composta de duas partes: Conclusão (esquerda) e condição (direita)
Exemplo: Descobrir a relação Filho.filho(X,Y) :- progenitor(Y,X).
Conceito
Consultas: questionamentos que serão respondidos avaliando-se os fatos e regras.
João é filho de José?? filho(João, José).Conceito de “Mundo Fechado”, tudo o que o
interpretador não souber responder (não haver nem regras nem fatos relacionados)
responderá: Não.
Exemplo: Vamos passar as
informações (através de fatos e regras) à Prolog para após podermos realizar consultas.
O primeiro passo a ser feito é submeter à Prolog a informação da árvore genealógica.
Faremos isto através de 6 cláusulas (fatos).
Cada cláusula denota um fato acerca da relação progenitor.
Exemplo:
Fatos:Progenitor(Maria, José).Progenitor(João, José).Progenitor(João, Ana).Progenitor(José, Júlia).Progenitor(José, Iris).Progenitor(Iris, Jorge).
Exemplo:Consultas:
José é progenitor de Íris??- progenitor(josé,íris). --> Yes.
Ana é progenitor de Jorge??- progenitor(ana, jorge). --> No.
Quem é o progenitor de Íris??- progenitor(X,íris). --> X = José. (X é uma variável).
Quem são os filhos de João??-progenitor(joão,X) --> X = josé; X = ana.
Quem é o progenitor de Maria??- progenitor(X,Maria) --> No. (Conceito de “Mundo Fechado”)
Exemplo:
Consultas:Quem é progenitor de quem?
?- progenitor(X,Y).X = maria Y = josé;X = joão Y = josé;
X = joão Y = ana;X = josé Y = júlia;X = josé Y = íris;X = íris Y = jorge.
Exemplo:
Consultas:Quem são os avós de jorge? (Não possui uma relação direta). Quem é o progenitor de jorge? X.
Quem é o progenitor de X? Y (Y é o avô de Jorge).?- progenitor(X,jorge),progenitor(Y,X),write(Y). --> josé.
Quem é o neto de João?Quem são os filhos de João? XQuem são os filhos dos filhos de João? Y (Y são os netos de João)?- progenitor(joão,X), progenitor(X,Y), write(Y). --> júlia e íris.
José e Ana possuem algum progenitor em comum??- progenitor(X,josé),progenitor(X,ana), write(X). --> joão.
Exemplo:Regras:
Vamos agora melhorar a fonte de conhecimento da aplicação inserindo algumas regras:
Em primeiro lugar vamos definir a relação “filho”.filho(X,Y) :- progenitor(Y,X).
Com isto, podemos fazer as seguintes consultas:Ana é filha de João?
?-filho(ana,joão). --> Yes.Quem são os filhos de josé?
?-filho(X,josé). --> júlia e íris.De quem josé é filho?
?-filho(josé,X). -->Maria e João.
Exemplo:Novos Fatos:
Podemos também definir a relação “pai” e “mãe”. Para isto precisamos adicionar a informação sobre o sexo das pessoas representadas na árvore.
feminino(maria).feminino(ana).feminino(júlia).feminino(íris).masculino(joão).masculino(josé).masculino(jorge).
Exemplo:
Novas Consultas:Quem são as mulheres?
?-feminino(X). --> X=maria; X = ana; X = júlia; X = íris.
João é homem??-masculino(joão). --> Yes.
Exemplo:Novas Regras:
Vamos definir agora a relação “mãe”.Para Todo X e YX é mãe de Y seX é progenitor de Y eX é feminino.
mae(X,Y) :- progenitor(X,Y), feminino(X). Utilizaremos a mesma lógica para definir a relação “pai”.
Para Todo X e YX é pai de Y seX é progenitor de Y eX é masculino.
pai(X,Y) :- progenior(X,Y), masculino(X).
Exemplo:
Novas Consultas:João é o pai de josé?
?- pai(joão,josé). --> Yes.Quem é a mãe de jorge?
?- mae(X,jorge). --> X = íris.
Exemplo:
Outras Relações (Regras)avôavóirmãoprimo
Arquivo: base.pl
progenitor(maria, jose).progenitor(joao, jose).progenitor(joao, ana).progenitor(jose, julia).progenitor(jose, iris).progenitor(iris, jorge).
feminino(maria). feminino(ana). feminino(julia). feminino(iris).
Arquivo: base.pl
masculino(joao). masculino(jose). masculino(jorge).
filho(X,Y) :- progenitor(Y,X). mae(X,Y) :- progenitor(X,Y), feminino(X). pai(X,Y) :- progenitor(X,Y), masculino(X).
PROLOG(programming in logic)
Prolog apresenta-se com sintaxes distintas e suportando variadas facilidades,
incluindo mecanismos extra-lógicos. Os exemplos e texto a seguir baseiam-se no
Arity Prolog desenvolvido pela Universidade de Edimburgo.
Um programa Prolog é composto por sentenças denominadas cláusulas, construídas a partir de termos. Termos representam constantes, variáveis ou estruturas. Constantes são representadas em letras minusculas e variáveis são representadas por nomes que iniciam por uma letra maiúscula. Estruturas são usadas para representar as cláusulas e possuem a seguinte forma geral:
funtor(lista de parâmetros).sendo funtor: predicado (identificador)
lista de parâmetros: constantes, variáveis ou estruturas.
Sintaticamente, o texto de um programa Prolog é composto por fatos e regras não seqüencializados representados por uma lista de cláusulas, as quais podem ser de um dos seguintes tipos:
A. - fatoExemplo: cidade(brasilia).
A :- B1, B2, . . ., Bm. - regraExemplo: capital(X,Y) :- pais(X), cidade(Y), capital_pais(X,Y).
:- B1, B2, . . ., Bm. - consultaExemplo: ? cidade(C).
Fatos podem ser agrupados em conjuntos, denominados de base de dados. do programa, como em:
Fato 1: Brasilia, Curitiba, Porto Alegre, Santa Maria e Montevideo são
cidades.cidade(portoalegre).cidade(brasilia).cidade(montevideo).cidade(curitiba).cidade(santamaria).
Fato 2: Brasil e Uruguai são países.
pais(brasil).pais(uruguai).
Fato 3: Rio Grande do Sul e Paraná são estados do Brasil, ou seja, existe um relacionamento entre um estado e seu país.estado(brasil, pr).estado(brasil, rgs).
Fato 4: Porto Alegre é capital do Rio Grande do Sul e Curitiba é capital
do Paraná, ou seja, existe um relacionamento entre uma cidade e seu estado.capital_estado(rgs, portoalegre).capital_estado( pr, curitiba).
Fato 5: Brasilia é capital do Brasil e Montevideo é a capital do Uruguai.capital_pais(brasil,brasilia).capital_pais(uruguai,montevideo).
As regras estabelecem relações simples ou complexas entre objetos. Regra 1: Uma cidade pode ser a capital de um estado ou de um pais.
capital(X,Y) :- capital_estado(X,Y) ; capital_pais(X,Y). Regra 2: Uma cidade Y é uma das capitais do pais X, se Y é capital do
estado Z, Z é um estado do pais X.uma_capital(X,Y) :- capital_estado(Z,Y), estado(X,Z).
Nas regras acima, as condições são separadas por vírgula, com o significado lógico 'and'; o significado lógico 'or' é representado pelo
separador ponto-e-vírgula.
Executar um programa em lógica é sinônimo de provar um objetivo, formulado por consultas.Por exemplo, possíveis consultas ao programa acima podem ser:
Objetivo 1 - Saber se Brasilia é uma cidade
consulta: cidade(brasilia).resposta: yes.
Objetivo 2: Saber os nomes das capitais do Brasil
consulta: uma_capital(brasil,C).resposta: C= portoalegre;
C= curitiba.
Uma consulta simples a este programa, como o objetivo 1, é resolvida por substituições diretas, buscando uma unificação, isto é, uma cláusula idêntica à consulta formulada..Já o objetivo 2 exige mais de uma unificacão e resolução, como detalhado abaixo:
Unificação: substituição X por brasil, na regra 2 e Y por C.
uma_capital(brasil,C) :- capital_estado(Z,C), estado(brasil,Z). Resolução: condição 1: capital_estado(Z, C).Unificação: capital_estado(rgs,portoalegre). Resolução: condição 2: estado(brasil, Z).Unificação: substituição Z=rgs.uma_capital(brasil,portoalegre) :- capital_estado(rgs,portoalegre),
estado(brasil,rgs). Resolução: condição 2: estado(brasil,,rgs).
Na busca de uma resposta, a máquina de inferência pode percorrer um caminho de tentativas e erros, como pode ser visto no exemplo abaixo:
Supondo a seguinte regra de determinação da capital de um país:
capital(X,Y) :- pais(X), cidade(Y), capital_pais(X,Y).e a consulta: ? capital(brasil,C).
Sendo a cláusula: cidade(portoalegre) a primeira da base de dados, resultaria uma unificacão como:
cidade(brasil, portoalegre):-pais(brasil) , cidade(portoalegre), capital_pais(brasil,portoalegre).
Na resolução da condição 'capital_pais(brasil,portoalegre)', haverá um insucesso no processo dedutivo. Neste caso, ocorre um retorno à substituição anterior (de C=portoalegre), e uma nova tentativa de dedução, com outra unificação (de C=brasilia). Este mecanismo é denominado de 'backtracking' e permitirá sucesso com a seguinte substituição:
capital(brasil,brasilia) :- pais(brasil), cidade(brasilia),
capital_pais(brasil,brasilia).
O processo de execução de cada consulta pode ser representado por uma árvore de objetivos, onde a raiz é a consulta ou objetivo original, os nodos são objetivos intermediários derivados das resoluções e as folhas são ou cláusulas nulas ou insucessos. O insucesso determina o retorno ao ramo anterior.
Listas são estruturas compostas por constantes, variáveis ou quaisquer outros termos, incluindo outras listas.
Exemplos de representação de listas:
[ morango, nata, chocolate] lista com três elementos
[ ] lista vazia
[ X | Y ] lista com header X e tail Y
[gosta( ana, pedro), gosta (pedro, ana)] lista de claúsulas
Uma lista pode ser criada através de uma cláusula representada por uma estrutura simples como:lista([10,20,30]).lista([[o, gato], bebeu, [o, leite]]).lista([canario,bentevi,periquito]).lista([uni]).lista([]).cores([azul,preto,branco,amarelo]).
As cláusulas acima não criam diversas listas associadas ao mesmo nome 'lista'; são usadas para registrar dados na base de dados do programa. Uma possível consulta poderia ser:
? lista[ X ]. /* quer-se a relação das listas existentes na base de dados do programa */
Para o tratamento de listas, algumas operações básicas devem ser definidas, tais como:
adicionar e retirar elementos de uma lista, determinar se um elemento pertence a uma lista, somar elementos de uma lista, entre outras. Estas operações são definidas por
cláusulas recursivas, uma vez que programas em lógica não incluem a determinação de estruturas de controle, como a repetição.
Recursividade
Inciando com o exemplo clássico de recursividade, que é a implementação de fatorial, a seguir:fatorial (0, 1).fatorial (N, X) :- N1 is N -1, fatorial (N1, X1), X is N * X1.
Pode-se observar que a cláusula 'fatorial(0,1)' é sempre verdadeira, pois está expressa como um fato. Esta cláusula é usada para determinar o final da recursão, iniciada pela cláusula seguinte.
O predicado is é muito útil em programas que lidam com computações numéricas, mas esta conveniência tem seu preço: a propriedade de reversibilidade de programas lógicos deixa de existir. O predicado is espera como argumento à direita uma expressão para ser avaliada, isto é, que todas as variáveis já estejam amarradas.