Você está na página 1de 54

IA: Prolog

Prof. Msc. Ricardo Britto


DIE-UFPI
rbritto@ufpi.edu.br
Sumrio
! Introduo ao Prolog e ao SWI-Prolog
! Fatos, operadores, regras
! Questes, Variveis e operadores
relacionais
! Definies recursivas
! Unificao
Introduo
! Prolog: termo derivado da expresso
Programming in Logic e baseado em lgica de
primeira ordem.
! Desenvolvido em 1973 na Universidade de
Marseille, Frana.
! No padronizada. o livro de Clocksin e Mellish,
Programming in Prolog (1984) um padro no
oficial.
! Algumas implementaes bastante conhecidas
so o ARITY Prolog, o Borland Turbo Prolog, e o
SWI-Prolog.
! Geralmente interpretado, mas pode ser
compilado.
Prolog x Outras linguagens
! Linguagens procedimentais: especificam
como fazer alguma coisa. Exemplo: C,
Pascal, Basic.
! Linguagens orientadas a objeto: especificam
um objeto e seus mtodos. Exemplo: C++,
SmallTalk.
! Linguagens declarativas: especificam o qu
se sabe sobre um problema e o qu deve ser
feito. Mais direcionada a conhecimento, e
menos direcionada a algoritmos. No possui
estruturas de controle como do- while,
repeat-until, if-then-else, for, case, etc.
Aplicaes
! Lgica matemtica e soluo de
equaes simblicas.
! Prova automtica de teoremas.
! Processamento da linguagem natural.
! Sistemas especialistas.
! Planejamento de atividades.
! Soluo geral de problemas.
Fatos
! Nomes de constantes e predicados
iniciam com letra minscula.
! O predicado (relao unria, n-ria ou
funo) escrito primeiro e os objetos
relacionados so escritos depois entre
parnteses.
! Todo fato termina com o caracter .
! Exemplo:
! gosta(maria, jose).
Operadores Lgicos
Regras
! Regras so utilizadas para expressar
dependncia entre um fato e outro fato:
! criana(X) :- gosta(X,sorvete).
! criana(X) :- not odeia(X,sorvete).
! ou grupo de fatos:
! av(X,Z) :- (me(X,Y),me(Y,Z)); (me
(X,Y),pai(Y,Z)).
SWI-Prolog
! Desenvolvido no departamento de cincias
sociais e informtica (Sociaal
Wetenschappelijkea Informatica) da
Universidade de Amsterd (Universiteit van
Amsterdam).
! SWI-Prolog diferente do Prolog padro
assim como Turbo Pascal diferente do
Pascal e Turbo C diferente do C ANSI.
! Seu uso regido pela licena GPL (GNU
General Public License).
! Possui uma interface com C e C++ .
Principais Comandos
! ?- help(arg). - Aciona a ajuda com o
argumento. help(help) apresenta mais
opes.
! ?- apropos(arg). - Apresenta predicados,
funes e sees que contenham o
argumento em seu sumrio.
! ?- halt. - Encerra o interpretador.
! ?- consult(file). - Carrega um programa de
um arquivo.
! ?- [filename]. - Faz o mesmo que consult.
Debug e Trace
! ?- trace. - Habilita o modo trace, onde
cada ao executada mostrada.
! ?- notrace. - Desabilita o modo trace.
! ?- debug. - Habilita o modo debug, onde o
prolog para em pontos previamente
estabelecidos.
! ?- nodebug. - Desabilita o modo debug.
! ?- guitracer. - Habilita o trace em modo
grfico.
! ?- noguitracer. - Desabilita o modo guitracer.
Comandos write e read
! O comando write exibe o valor do
parmetro no dispositivo de sada
corrente.
! Tem a forma write(texto).
! Uma variante deste comando o writef,
que permite formatao do que se
deseja imprimir.
! Tem a forma writef(Formato,
Argumentos).
Comandos write e read
! Para gerar alguns caracteres deve se usar
sequencias de escape, estas so:
! \n - cria uma nova linha;
! \l - criar um separador de linha, o resultado
igual ao produzido por \n;
! \r - retorna ao incio da linha;
! \t - tabulao;
! \% - imprime o smbolo %;
! \nnn - onde n um nmero decimal, produz o
caractere ASCII com o cdigo informado.
Comandos write e read
! As opes de formatao so:
! %w - imprime o termo;
! %d - imprime o termo ignorando seu tipo, por
exemplo, \n impresso como uma string.
! %s - imprime o termo como uma string;
! %Nc - imprime o termo de modo centralizado
numa quantidade N de colunas;
! %Nl - imprime o termo alinhado esquerda
numa quantidade N de colunas;
! %Nr - imprime o termo alinhado direita numa
quantidade N de colunas;
Comandos write e read
! O comando read l um valor no
dispositivo de entrada corrente e unifica
(atribui) o valor uma varivel.
! O dispositivo de entrada padro o
teclado, assim, o comando read(X). ir ler
um valor do teclado e unificar este valor
com a varivel X.
Exemplo: Definio de Homen
! mortal(X) : homem(X) , writef(%w%w
%w, ['Sim, ', X, ' mortal ']).
! homem( socrates ).
Exemplo: Progenitores Gregos
Carregando e Visualizando a
KB
! Para se carregar a KB do exemplo
devemos executar o comando
[exercicio1].
! Para visualizar o contedo da KB
devemos executar:
! listing lista toda a KB carregada;
! listing(arg) lista todas as linhas da KB que
contenham o argumento como predicado.
Questes
! Iniciam sempre com o smbolo ? e
terminam com o smbolo .
! Exemplos:
! ?- parent(zeus, apollo).
! Yes
! ?- parent(apollo,zeus).
! No
Variveis
! Iniciam sempre com letra maiscula. Exemplos:
! ?- parent(X,zeus).
! X = chronos;
! X = rhea ;
! No
! ?- parent(X,Y).
! X = chaos
! Y = gaea ;
! X = gaea
! Y = cyclope ;
! X = gaea
! Y = chronos ; ...
Elaborando Questes
! Questo 1: Hades tem filhos?
! ?- parent(hades,X).
! Questo 2: Gaea tem um filho que
progenitor de poseidon. Quem ?
! ?- parent(gaea,X), parent(X,poseidon).
Elaborando Questes
! Questo 3: Quem so os pais de zeus?
! ?- parent(X,zeus), parent(Y,zeus), not(X=Y).
Operadores Relacionais
Exerccio
Carregando a KB
! Carregar o arquivo exercicio2.pl:
! ?- [exercicio2].
Adicionando Regras
! Adicionar na KB a relao:
! grandparent(X,Z) :- parent(X,Y),parent(Y,Z).
! Adicionar na KB a relao:
! Uma pessoa irm de outra se seu sexo
feminino e se as duas tm um progenitor
em comum
! sister(X,Y) :- female(X), parent(Z,X), parent
(Z,Y), not(X=Y).
Definies Recursivas
! Questo: definir predecessor
! Forma usual:
! predecessor(X,Z):- parent(X,Z).
! predecessor(X,Z):- parent(X,Y), parent(Y,Z).
! predecessor(X,Z):- parent(X,Y1),parent(Y1,Y2),
parent(Y2,Z).
! Forma recursiva:
! predecessor(X,Z) :- parent(X,Z).
! predecessor(X,Z) :- parent(X,Y),predecessor(Y,Z).
Definies Recursivas
! Rhea predecessora de quem?
! ?- predecessor(rhea,X).
! Quem predecessor de Zeus?
! ?- predecessor(X,zeus).
Unificao
! Seja a questo: ?- sister(X,Y).
! Aps localizada na KB a regra:
! sister(X,Y) :- female(X), parent(Z,X), parent
(Z,Y), not(X=Y).
! o PROLOG tenta satisfaz-la da esquerda
para a direita e observando a ordem em
que as clusulas aparecem na KB.
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Unificao
Consideraes
! No Prolog:
! Executa-se encadeamento para trs;
! Executa-se busca em profundidade;
! As clusulas so experimentadas na ordem
em que so escritas na KB.

Você também pode gostar