Professional Documents
Culture Documents
PROLOG partes 1, 2 e 3
PROLOG (I)
Foi criada em meados de 1972 por Alain Colmerauer e Philippe Roussel, na Universidade de Marselha. O nome PROLOG foi escolhido por Philippe Roussel como uma abreviao de PROgrammation en LOGique. Propsito da criao: criar programas para traduo de linguagens faladas, como portugus ou ingls.
PROLOG (II)
Fundamentada na lgica simblica;
uma linguagem declarativa: em vez de o programa estipular a maneira de chegar soluo, passo a passo, limita-se a fornecer uma descrio do problema que se pretende computar.
Usa uma coleo de fatos e de relaes lgicas (regras) que exprimem o domnio relacional do problema.
PROLOG(III)
Outro fato que o difere das outras linguagens o fato de no possuir estruturas de controle (if-else, dowhile, for, switch). Para isso utilizamos mtodos lgicos para declarar como o programa dever atingir o seu objetivo. Um programa em PROLOG pode rodar em um modo interativo: o usurio poder formular queries utilizando fatos e regras para produzir a soluo atravs do mecanismo de unificao.
Fato (I)
Determina uma relao existente entre objetos conhecidos. Expressa uma verdade sobre um relacionamento: homem(jose). pai(jose,carina). homem / pai Predicado ou Relao. jose / jose,carina Argumento do Predicado ou Objeto
Fato (II)
Os nomes dos predicados e dos objetos devem comear com letra minscula. Os objetos so escritos dentro de parnteses. Todo fato terminado com um ponto final. A ordem dos objetos importante: pai (jose, carina). pai (carina, jose).
Fato (III)
Com fatos, podemos montar uma base de conhecimento:
Regra (I)
Expressa um relacionamento entre fatos. Um relacionamento em uma regra verdadeiro se os outros relacionamentos nessa regra tambm o so: luz(acesa) :- interruptor(ligado). O ":-" significa "se"; ou seja, essa regra significa que luz(acesa) verdadeiro se interruptor(ligado) verdadeiro.
Regra (II)
Regras podem tambm fazer uso de variveis: avo(X,Z) :- pai(X,Y), pai(Y,Z). Isso significa "se X pai de Y e Y pai de uma Z, ento X av de Z. X, Y e Z so variveis. No PROLOG,uma varivel no um continer cujo valor pode ser atribudo. Seu comportamento como de uma incgnita, cujo valor desconhecido a princpio e, aps descoberto, no sofre mais mudanas. Escritas sempre em Maisculo.
Consulta (I)
Quando de uma consulta, a mquina PROLOG pesquisa a base de dados procurando clusulas que se unifiquem com a consulta:
? pai(moacyr, rafael).
Responder true se localizar um fato que se unifique com a consulta; se o fato consultado no existir na base de dados, responder fail.
Consulta (II)
Quando uma consulta contm variveis, realizada uma pesquisa em todas as clusulas, localizado os objetos que essas representam: ?- avo(alfredo,N). N = eduardo ; N = rafael ; N = vinicius ; N = cezar ; N = alfredinho.
Regras Recursivas
Um predicado definido por uma regra recursiva deve ter, no mnimo uma definio no recursiva. Se isto no acontecer, a definio logicamente malformada e o programa ficaria em lao infinito.
ancestral(X,Y) :- mae(X,Y). ancestral(X,Y) :- pai(X,Y). ancestral(X,Y) :- mae(X,Z),ancestral(Z,Y). ancestral(X,Y) :- pai(X,Z),ancestral(Z,Y).
Prtica 1
Crie a rvore genealgica da sua famlia, utilizando os predicados pai e mae, e verifique o que retorna cada consulta:
ancestral(fulano,ciclano). ancestral(X,ciclano). /*clique n a cada valor*/ ancestral(fulado,Y). /*clique n a cada valor*/ ancestral(fulado,_). /*clique n a cada valor*/ mae(X,_). /*clique n a cada valor*/ ancestral(X,_),pai(X,Y),pai(Y,_)
Prtica 1 - exemplo
mae(zilda,moacyr). mae(zilda,romeu). mae(maria,eduardo). mae(maria,rafael). mae(maria,vinicius). mae(norma,cezar). mae(norma,alfredinho). pai(alfredo,moacyr). pai(alfredo,romeu). pai(moacyr,rafael). pai(moacyr,eduardo). pai(moacyr,vinicius). pai(romeu,cezar). pai(romeu,alfredinho).
Aridade: usado para a quantidade de objetos que o argumento de um predicado possui. gosta (maria, jos). /* aridade = 2 */
bebe (penlope, pinga, vodka, rum). /*4*/
Prtica 2
A partir da rvore genealgica da sua famlia, crie as funes para:
Aplicaes (I)
Lgica matemtica, prova de teoremas e semntica; Soluo de equaes simblicas; Bancos de dados relacionais; Linguagem Natural;
Sistemas Especialistas;
Aplicaes (II)
Planejamento Automtico de Atividades; Aplicaes de General Problem Solving, como jogos (Xadrez, Damas, Jogo da Velha, etc.); Compiladores; Anlise Bioqumica e projetos de novas drogas.
Operadores de Controle
O Prolog utiliza de alguns operadores de controle para tratamento da recursividade: Backtracking; Cut; Fail.
Backtracking (I)
Backtracking (ou retrocesso): mecanismo usado pelo Prolog para encontrar fatos ou regras adicionais que satisfaam um objetivo; Quando a questo possui muitas sub-metas, a falha em uma busca pode acontecer. Neste momento, o Prolog precisa de uma maneira para lembrar os pontos de onde pode tentar procurar a soluo, para encontrar uma resposta certa.
Backtracking (II)
Considere a seguinte Base de Conhecimento: gosta (maria, pizza). gosta (maria, vinho). gosta (joo, vinho). gosta (joo, maria). realizada a questo: ? - gosta (maria, X), gosta (joo, X).
Backtracking (III)
? - gosta (maria, X) X = pizza ? - gosta (joao, comida) fail.. Neste ponto, o Prolog precisa ignorar esse valor para X e procurar de onde ele havia parado anteriormente: ? - gosta (maria, X). X = vinho. ? - gosta (joao, vinho) true
Cut (I)
O corte (cut) um usado para evitar o backtracking. O corte pode tornar um programa mais rpido, pois evita que o Prolog explore alternativas que, sabe-se de antemo, no iro contribuir para a soluo do problema, e ainda permite a economia de memria.
Cut (II)
f(X,0) :- X < 3. f(X,2) :- X >= 3, X < 6. f(X,4) :- X >= 6. Se infomar um valor > 3 -> retorna 0 Se informar um valor entre 3 e 6 -> retorna 2 Se informar um valor > ou igual a 6 ->retorna 4 Perguntamos: ? - f(1,Y).
Cut (II)
O Prolog usando backtracking trata 2 regras que sabemos que iro falhar... As 3 regras so mutuamente exclusivas: no momento em que uma funciona, no faz sentido tratar as outras 2. Para isso usamos o Cut (!): f(X,0) :- X < 3, !. f(X,2) :- X >= 3, X < 6, !. f(X,4) :- X >= 6.
Prtica 3
Utilizando o Cut (!), escreva uma regra para validar se algum tem um irmo, sem ter pesquisar toda a rvore: tem_irmao(X) :- ???
Prtica 3 - Resposta
Utilizando o Cut (!), escreva uma regra para validar se algum tem um irmo, sem ter pesquisar toda a rvore: tem_irmao(X) :- irmao(X,_), !.
Fail (I)
Inversamente ao comando cut, o predicado prdefinido fail sempre falha. O operador de corte (!) pode ser combinado com o predicado fail para produzir uma falha forada: gosta(maria,X) :- rato(X), !, fail. gosta(maria,X) :- animal(X).
Prtica 4
Podemos escrever a regra diferente de diversas formas: diferente1(X,Y) :- \+ X = Y. diferente2(X,Y) :- X\== Y. Escreva utilizando o cut (!) e fail:
Prtica 4 - Resposta
Podemos escrever a regra diferente de diversas formas: diferente1(X,Y) :- \+ X = Y. diferente2(X,Y) :- X\== Y. Escreva utilizando o cut (!) e fail: diferente1(X,X) :- !, fail. diferente1(X,Y).
Comando Is (I)
Avalia a expresso e unifica o resultado. Exemplos: ? X is 5 + 7 X = 12 ? 12.5 is 5 * 2.5. true
Comando Is (II)
Tambm pode ser usada para criar funes matemticas: divisao(X,Y,Z) :- Z is X / Y. ? divisao (10, 3, N). N = 3.33333
Fatorial
Fatorial usando comando is: fatorial (0,1). fatorial (N,F) :- N1 is N - 1, fatorial(N1,F1), F is N * F1.
3 * F1
--------------------------------------------------------fatorial(0,1). fail PILHA fatorial (3,F) => N=3, N1 =1; fatorial (2,F) => N=2, N1 =1;
F F 2 * F1 3 * F1
--------------------------------------------------------fatorial(0,1). fail PILHA fatorial (3,F) => N=3, N1 =1; F 1 * F1 fatorial (2,F) => N=2, N1 =1; F 2 * F1 fatorial (1,F) => N=1, N1 =0;
F 3 * F1
--------------------------------------------------------fatorial(0,1). true PILHA fatorial (3,F) => N=3, N1 =1; F 1 fatorial (2,F) => N=2, N1 =1; F 1 * F1 F 2 * F1 fatorial (1,F) => N=1, N1 =0; F 3 * F1 fatorial(0,F) => F = 1
--------------------------------------------------------fatorial (3,F) => N=3, N1 =1; PILHA fatorial (2,F) => N=2, N1 =1; fatorial (1,1) => N=1, N1 =0; F=1 1*1
F F 2 * F1 3 * F1
--------------------------------------------------------fatorial (3,F) => N=3, N1 =1; PILHA fatorial (2,2) => N=2, N1 =1;
F=2 F 2*1 3 * F1
F=6
3*2
Prtica 5
Teste o fatorial para outros nmeros:
fatorial (0,1). fatorial (N,F) :- N1 is N 1, fatorial(N1,F1), F is N * F1.
Resposta - Prtica 5
E se mudarmos a seqncia das regras? fatorial (N,F) :- N1 is N 1, fatorial(N1,F1), F is N * F1. fatorial (0,1). ERROR: Unhandled exception: Out of local stack O Prolog entrou em loop e estourou a pilha (stack). Isso porque ele sempre executa as regras na ordem em que so colocadas.
Prtica 6
1. Implemente: max(X, Y, Max) /*use max(4,5,Max) para testar*/ 2. A seguinte relao classifica nmeros em trs classes: positivo, nulo ou negativo. Defina este procedimento de forma mais eficiente usando cuts: classe(N, positivo) :- N > 0. classe(0, nulo). classe(N, negativo) :- N < 0.
Prtica 6 - Respostas
Implemente: max(X, Y, Max) max(X, Y, X) :- X >= Y. max(X, Y, Y) :- X < Y. max(X, Y, X) :- X >= Y, !. max(X, Y, Y).
Prtica 6 - Respostas
classe(N, positivo) :- N > 0, !. classe(N, negativo) :- N < 0, !. classe(0, nulo).
Diretivas (I)
Exemplo de diretiva: :- op (500, xfx, tem). Onde: 500 indica a prioridade do operador; xfx indica que o operador (f) deve ser colocado entre dois argumentos (x); tem indica o nome do operador.
Diretivas (II)
Tendo a diretiva, criamos a base de conhecimento: pedro tem carro. joana tem dinheiro. joao tem problemas. joao tem dvidas. E fizemos as consultas: ?- Quem tem carro. Quem = pedro.
Diretivas (III)
Curiosidade: os comandos que usamos no Prolog, so diretivas pr-definidas na sua implementao: :- op (1200, xfx, :-); :- op (1200, fx *:-, ?-]). :- op (1100, xfx, ;) :- op (1000, xfx, ,) /* etc...*/ Note que alguns operadores (ex.: :-), possuem definio infixa (xfx) e prefixa (fx).
Prtica 7
1. Crie duas diretivas novas com operador infixo, e uma base de conhecimento usando estas diretivas. 2. Em seguida crie consultas que se assemelhem a linguagem humana. Exemplos: ? - fulado conhece Quem. ? - ciclano mora Onde.
Operadores de Comparao
Lista completa dos operadores de comparao:
OPERADOR > PRIORIDADE 700 TIPO xfx SIGNIFICADO maior que
menor que maior ou igual a menor ou igual a valores iguais valores diferentes
Prtica 8
Crie um banco de dados que contenhas as seguintes informaes: Nome do Professor e disciplina que leciona; Disciplina e horrio (dia da semana, aula: primeiro ou segundo horrio); Construa as consultas para responder:
1. Qual o horrio do professor X (disciplina, dia e aula)? 2. Quais professores lecionam na tera-feira? 3. Quais matrias o professor X leciona no primeiro horrio?
Prtica 8 - resposta
1. horario_prof(P,D,S,A) :- leciona(P,D), horario(D,S,A). ? - horario_prof(rafael,Disc,DiaSemana,Aula) . 2. ?- leciona(X,Disciplina) , horario(Disciplina,3,Aula). 3. ?- leciona(eduardo,Disc), horario(Disc,_,aula1).*/
Base de dados: leciona(rafael,ia). leciona(eduardo,redes). horario(ia,2,aula1). horario(ia,5,aula1). horario(redes,3,aula1). horario(redes,4,aula2).
Listas
Listas podem ser definidas e transformadas em Prolog de diversas maneiras diferentes. Listas so representadas por []: [a,e,i,o,u]; [1,2,3,5,7,11];
Composio de Lista
Listas so compostas por uma cabea e uma cauda: [H,T]; Na lista [1,2,3,5,7], podemos dizer que: 1 a cabea da lista [2,3,5,7] a cauda da lista; De maneira similar, 2 e [3,5,7] so respectivamente a cabea e a cauda da sub-lista [2,3,5,7] ;
Prtica 9
Dada a variante de implementao da regra membro: membro2(X, [H | T]) :- X == H. membro2(X, [H | T]) :- membro2(X, T).
1. Habilite o Debug grfico (menu Debug -> Graphical Debugger). Use o comando trace. Em seguida, execute membro(d,[a,b,c,d]) e veja passo a passo. 2. Execute membro(X,[a,b,c]) e membro2 (X,[a,b,c]). Qual das funes funciona? Por que?
onde L1 e L2 so duas listas e L3 a concatenao resultante. Por exemplo: ? - conc([a, b], [c, d], L3) L3 = [a, b, c, d].
Prtica 10
1) Utilize a regra conc/3 no sentido inverso ao que foi originalmente projetado, para decompor uma lista [a,b,c] em duas partes. 2) Podemos tambm usar o programa para procurar por um determinado padro em uma lista. Encontre os meses antes e depois de um determinado ms: ? - M=[jan, fev, mar, abr, mai, jun, jul, ago, set, out, nov, dez], <clusula usando conc/3>. Antes=[jan,fev,mar,abr] Depois=[jun,jul,ago,set,out,nov, dez]
Prtica 11
1) Utilize a regra remove/3 no sentido inverso, para inserir um novo item em qualquer lugar da lista. 2) Crie uma nova clusula para membro, utilizando a regra remover/3.
bagOf (I)
bagof(X, P, L) Ir produzir uma lista L de todos os objetos X que satisfazem ao objetivo P. Exemplo - dada a base de conhecimento abaixo: classe(a, vog). classe(b, con). classe(c, con). /* continua d, e, f */
bagOf (II)
Podemos obter a lista de todas as consoantes nessa especificao atravs do objetivo: ?-bagof(Letra, classe(Letra, con), Consoantes). Consoantes=[b, c, d, ..., z]
bagOf (III)
Se a classe das letras no estivesse especificada, iramos obter por meio de backtracking, duas listas, uma correspondendo s vogais e outra s consoantes: ?-bagof(Letra, classe(Letra, Classe), Letras). Classe=vog Letras=[a, e, i, o, u]; Classe=con Letras=[b, c, d, f, ..., z].
setOf (I)
setof(X, P, L) Ir novamente produzir uma lista L dos objetos X que satisfazem a P, s que desta vez a lista L estar ordenada e itens duplicados, se houver, sero eliminados.
setOf (II)
Exemplo: ?- setof(Disc,eh_lecionada(Disc,Prof),Disciplinas). Prof = rafael Disciplinas = [ia, progII] Prof = eduardo Disciplinas = [progI, redes]
setOf (III)
No h restrio quanto ao tipo de objeto a ser coletado. Assim podemos, por exemplo, construir uma lista de pares da forma Classe/Letra de forma que as constantes apaream em primeiro lugar na lista ("con" antecede alfabeticamente "vog"): ?-setof(Classe/Letra, classe(Letra, Classe), Letras). Letras=[con/b, con/c, ..., con/z, vog/a, ..., vog/u]
findall (I)
Teste no Prolog e descubra o que faz o findall/3
What is next?
Apostila completa: aluno@net Prxima aula - DIA 14/04 AVALIAO EM DUPLAS
Referncias
http://pt.wikipedia.org/wiki/Prolog
http://pt.wikipedia.org/wiki/Alain_Colmerauer http://www.linhadecodigo.com.br/Artigo.aspx?id=1697 http://en.wikipedia.org/wiki/Prolog http://ccc.inaoep.mx/~emorales/Cursos/ProgSimb/node32.html www.fei.edu.br/eletrica/rbianchi/ia/Apostila-Prolog.doc http://www.swi-prolog.org/ http://www.sics.se/isl/sicstuswww/site/index.html http://gersonc.anahy.org/graduacao/paradigmas/prologsan.pdf http://ia.ucpel.tche.br/~lpalazzo/Aulas/PDEC/ http://gollem.science.uva.nl/SWI-Prolog/apps/view.html http://www.fdi.ucm.es/profesor/fernan/des/