Uma Breve Introdução á programação lógica Inteligência Artificial Wladimir Araújo Tavares

Preview:

Citation preview

Uma Breve Introdução á Uma Breve Introdução á programação lógicaprogramação lógica

Inteligência ArtificialInteligência Artificial

Wladimir Araújo TavaresWladimir Araújo Tavares

PrologProlog

É uma linguagem simples baseada É uma linguagem simples baseada na lógica simbólicana lógica simbólica

Prolog é uma linguagem interativa Prolog é uma linguagem interativa projetada para manipulação de projetada para manipulação de dados simbólicosdados simbólicos

Prolog é baseado em um provador de Prolog é baseado em um provador de teoremas para cláusulas Horn.teoremas para cláusulas Horn.

ExemplosExemplos

Sócrates é homem.Sócrates é homem. Todo homem é mortal.Todo homem é mortal.

ProgramaPrograma

homem(socrates)homem(socrates)

mortal(X) :- homem(X)mortal(X) :- homem(X)

?- mortal(socrates).?- mortal(socrates).

yesyes

Objetos manipulados pelo Objetos manipulados pelo PrologProlog

Os objetos manipulados pelo prolog Os objetos manipulados pelo prolog são os termos.são os termos.

Os termos podem ser átomos ou Os termos podem ser átomos ou estruturas.estruturas.

Os átomos podem ser constantes ou Os átomos podem ser constantes ou variáveis.variáveis.

VariáveisVariáveis

Nas linguagem convencionais as variáveis Nas linguagem convencionais as variáveis representa um célula de memória.representa um célula de memória.

Em PROLOG uma variável é associada a um objeto.

A vantagem da ligação sobre a atribuição estáno fato de que qualquer tipo de objetopode ser ligado a uma mesma variável; não setem restrições às ligações, pois uma variável nãopossui estrutura interna.

EstruturaEstrutura

Uma estrutura é um objeto que possui organização interna.

Em PROLOG estruturas são representadas por símbolo funcional(lista de argumentos)onde símbolo funcional é um identificador elista de argumentos é uma lista de termos

quepode ser vazia; isto é, um átomo é um casoparticular de estrutura.

Exemplo EstruturaExemplo Estrutura

livro(gabriela,autor(amado,jorge))cidade(sao-paulo, pais(brasil))

Programa PrologPrograma Prolog

mae(antonio, maria). /* fato1 */mae(pedro, maria). /* fato2 */mae(jose, ana). /* fato 3 */pai(antonio,carlos). /* fato 4 */pai(pedro,jose). /* fato5 */pai(paulo,jose). /* fato6 */irmao(X,Y):-pai(X,Z), pai(Y,Z), X\==Y. /*

regra1 */irmao(X,Y):-mae(X,Z), mae(Y,Z), X\==Y. /*

regra2 */

?-irmao(antonio,I)irmao(antonio,I):-pai(antonio,Z),

pai(I,Z), antonio \== I.irmao(antonio,I):-

pai(antonio,carlos),pai(I,carlos),antonio\==I.

irmao(antonio,I):-pai(antonio,carlos),pai(antonio,carlos),antonio\==antonio.

irmao(antonio,I):-mae(antonio,Z),mae(I,Z),antonio\==I.

amigo(antonio,andre). amigo(andre,juliana). amigo(antonio,maria). amigo(juliana,jose). amigo(X,Y):-amigo(Y,X). ?- amigo(X,Y) X=antonio Y=andre

Recursividade á esquerdaRecursividade á esquerda

amigo(X,Y):-amigo(Y,X). amigo(antonio,andre). amigo(andre,juliana). amigo(antonio,maria). amigo(juliana,jose). ?-?-?-amigo(X,Y)

fat(0,1). fat(N,F) :- N1 is N-1, fat(N1,F1), F is

N*F1.

ListaLista

Uma lista é um termo estruturado que éoperado como um conjunto ordenado

deelementos. Os elementos podem ser

átomosou termos estruturados, inclusive listas.

Uma operação comum sobre uma lista é

dividi-la em sua cabeça e cauda. Há uma

notação especial para representar “a lista

com cabeça X e cauda Y”: X|Y.

membro(X,[X|_]). membro(X,[_|Y]):-membro(X,Y).

add_to_set(X,[],[X]). add_to_set(X,Y,Y) :- member(X,Y). add_to_set(X,Y,[X|Y]).

escreve_lista([]). escreve_lista([X|Y]) :-

write(':'),write(X),escreve_lista(Y).

binario(1) :- write('1').binario(1) :- write('1').

binario(X) :- Z is X // 2,binario(Z),N binario(X) :- Z is X // 2,binario(Z),N is X mod 2,write(N).is X mod 2,write(N).

Processamento de linguagem Processamento de linguagem NaturalNatural

frase :- sujeito predicado sujeito :- artigo substantivo predicado :- verbo artigo substantivo artigo :- o substantivo :- gato j rato verbo :- caçou

frase(L1,L3) :-frase(L1,L3) :- sintagma_nominal(L1,L2), sintagma_nominal(L1,L2),

sintagma_verbal(L2,L3).sintagma_verbal(L2,L3). sintagma_nominal(L1,L3) :-sintagma_nominal(L1,L3) :- determinante(L1,L2), nome(L2,L3).determinante(L1,L2), nome(L2,L3). sintagma_verbal(L1,L3) :-sintagma_verbal(L1,L3) :- verbo(L1,L2), sintagma_nominal(L2,L3).verbo(L1,L2), sintagma_nominal(L2,L3). determinante([o|R],R).determinante([o|R],R). nome([homem|R],R).nome([homem|R],R). nome([disco|R],R).nome([disco|R],R). verbo([vira|R],R).verbo([vira|R],R).

frase --> sujeito, predicado. sujeito --> artigo(G), substantivo(G). predicado --> verbo, artigo(G),

substantivo(G). artigo(m) --> [o]. artigo(f) --> [a]. substantivo(m) --> [gato] | [rato]. substantivo(f) --> [gata] | [rata]. verbo --> [caçou].

frase(L1,L3) :-frase(L1,L3) :- sintagma_nominal(L1,L2), sintagma_nominal(L1,L2),

sintagma_verbal(L2,L3).sintagma_verbal(L2,L3). sintagma_nominal(L1,L3) :-sintagma_nominal(L1,L3) :- artigo_masculino(L1,L2), nome_masculino(L2,L3).artigo_masculino(L1,L2), nome_masculino(L2,L3). sintagma_nominal(L1,L3) :-sintagma_nominal(L1,L3) :- artigo_feminino(L1,L2), nome_feminino(L2,L3).artigo_feminino(L1,L2), nome_feminino(L2,L3). sintagma_verbal(L1,L3) :-sintagma_verbal(L1,L3) :- verbo(L1,L2), sintagma_nominal(L2,L3).verbo(L1,L2), sintagma_nominal(L2,L3). artigo_masculino([o|R],R).artigo_masculino([o|R],R). artigo_feminino([a|R],R).artigo_feminino([a|R],R). nome_masculino([homem|R],R).nome_masculino([homem|R],R). nome_feminino([mulher|R],R).nome_feminino([mulher|R],R). nome([disco|R],R).nome([disco|R],R). verbo([vira|R],R).verbo([vira|R],R).