Professional Documents
Culture Documents
Rafael Rosario
rafael.rosario@sociesc.org.br
rafael.rosario@datasul.com.br
÷ROLOG (I)
Foi criada em meados de 1972 por Alain Colmerauer e
÷ ilippe Roussel, na Universidade de Marsel a.
omem(jose).
pai(jose,carina).
pai(alfredo,moacyr).
pai(alfredo,romeu).
pai(moacyr,eduardo).
pai(moacyr,rafael).
pai(moacyr,vinicius).
pai(romeu,cezar).
pai(romeu,alfredin o).
Regra (I)
Expressa um relacionamento entre fatos. Um
relacionamento em uma regra é verdadeiro se os
outros relacionamentos nessa regra também o são:
luz(acesa) :- interruptor(ligado).
? ʹ pai(moacyr, rafael).
Consulta (II)
Quando uma consulta contém variáveis, é realizada
uma pesquisa em todas as cláusulas, localizado os
objetos que essas representam:
?- avo(alfredo,N).
N = eduardo ;
N = rafael ;
N = vinicius ;
N = cezar ;
N = alfredin o.
Regras Recursivas
Um predicado definido por uma regra recursiva deve
ter, no mínimo uma definição não recursiva. Se isto
não acontecer, a definição é logicamente mal-
formada e o programa ficaria em laço 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).
÷rática 1
Crie a árvore genealógica da sua família, 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,_)
÷rática 1 - exemplo
mae(zilda,moacyr).
mae(zilda,romeu).
mae(maria,eduardo).
mae(maria,rafael).
mae(maria,vinicius).
mae(norma,cezar).
mae(norma,alfredin o).
pai(alfredo,moacyr).
pai(alfredo,romeu).
pai(moacyr,rafael).
pai(moacyr,eduardo).
pai(moacyr,vinicius).
pai(romeu,cezar).
pai(romeu,alfredin o).
Outros conceitos (I)
h : (͞E͟ Lógico) é feita colocando-se uma
vírgula entre os fatos:
avo(X,Z) :- pai(X,Y) pai(Y,Z).
ß irmão;
ß meio-irmão;
ß primo;
Resposta - ÷rática 2 (I)
irmao(X,Y) :- pai(÷,X), pai(÷,Y),
mae(M,X),mae(M,Y), X \== Y.
meio-irmao(X,Y) :-
pai(÷,X), pai(÷,Y), X \== Y, \+ irmao(X,Y)'
mae(M,X),mae(M,Y), X \== Y, \+ irmao(X,Y).
Resposta - ÷rática 2 (II)
genitor(X,Y) :- pai(X,Y); mae(X,Y).
ß Linguagem Natural;
ß Sistemas Especialistas;
Aplicações (II)
ß ÷lanejamento Automático de Atividades;
ß Compiladores;
ð:
gosta(rafael,cac orro).
valioso(ouro).
pai(moacyr,rafael).
Revisando ʹ 3 elementos ÷rolog (II)
:
avo(X,Z) :- pai(X,Y), pai(Y,Z).
fil o(Y,X) :- pai(X,Y), omem(Y).
aluno(X,ia) :- estuda(X,prolog).
Revisando ʹ 3 elementos ÷rolog (III)
ß Backtracking;
ß Cut;
ß Fail.
Backtracking (I)
** ( ): mecanismo usado pelo
÷rolog para encontrar fatos ou regras adicionais que
satisfaçam um objetivo;
É realizada a questão:
? - gosta (maria, X), gosta (joão, X).
Backtracking (III)
? - gosta (maria, X)
X = pizza
? - gosta (joao, comida) ʹ fail..
Neste ponto, o ÷rolog precisa ignorar esse valor para X
e procurar de onde ele avia parado anteriormente:
? - gosta (maria, X).
X = vin o.
? - gosta (joao, vin o) ʹ
Cut (I)
O corte (cut) é um usado para evitar o O
tem_irmao(X) :- +++
÷rática 3 - Resposta
Utilizando o Cut (!), escreva uma regra para
validar se alguém tem um irmão, sem ter
pesquisar toda a árvore:
! (00) %, 1 .
! (0-).
Comando ͞Is͟ (I)
Avalia a expressão e unifica o resultado. Exemplos:
+ 0 2 # 3
X = 12
+ .2 2 4 .2.
true
Comando ͞Is͟ (II)
Também pode ser usada para criar funções
matemáticas:
divisao(X,Y,Z) :- Z is X / Y.
fatorial (0,1).
fatorial (N,F) :- N1 is N - 1,
fatorial(N1,F1), F is N * F1.
fatorial(3,F) ʹ passo a passo (I)
fatorial (0,1).
fatorial (N,F) :- N1 is N ʹ 1, fatorial(N1,F1), F is N * F1.
-------------------------------------------------------
fatorial(0,1). fail
c5
F 3 * F1
fatorial(3,F) ʹ passo a passo (II)
fatorial (0,1).
fatorial (N,F) :- N1 is N ʹ 1, fatorial(N1,F1), F is N * F1.
---------------------------------------------------------
fatorial(0,1). fail
c5
F=2 2*1
F 3 * F1
fatorial(3,F) ʹ passo a passo (VII)
fatorial (0,1).
fatorial (N,F) :- N1 is N ʹ 1, fatorial(N1,F1), F is N * F1.
---------------------------------------------------------
fatorial (3,6) => N=3, N1 =1;
c5
ð & 6
F=6 3*2
÷rática 5
7%
fatorial (0,1).
fatorial (N,F) :- N1 is N ʹ 1, fatorial(N1,F1), F is N * F1.
+ (3ð). + (88ð).
fatorial(N,F) :- a < 8, N1 is N - 1,
fatorial(N1,F1), F is N * F1.
fatorial(0,1).
÷rática 6
1. Implemente:
max(X, Y, Max) /*use max(4,5,Max) para testar*/
2. A seguinte relação classifica números em três
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.
÷rática 6 - Respostas
Implemente:
max(X, Y, Max)
=(0 - 0) %, 0 <& -.
=(0 - -) %, 0 > -.
=(0 - 0) %, 0 <& - 1.
=(0 - -).
÷rática 6 - Respostas
(a ?) %, a < 8 1.
(a ?) %, a > 8 1.
(8 ).
Operadores infixos (I)
E se eu quisessemos realizar consultas utilizando
uma linguagem mais próxima da nossa?
Onde:
288 indica a prioridade do operador;
== indica que o operador (f) deve ser colocado
entre dois argumentos (x);
indica o nome do operador.
Diretivas (II)
Tendo a diretiva, criamos a base de con ecimento:
pedro tem carro.
joana tem din eiro.
joao tem problemas.
joao tem dívidas.
E fizemos as consultas:
?- Quem tem carro.
Quem = pedro.
Diretivas (III)
h!!: os ͞comandos͟ que usamos no ÷rolog,
são diretivas pré-definidas na sua implementação:
nasceu(pedroBarnack,joinville,1978).
nasceu(murilo÷ereira,itajai,1980).
nasceu(rafaelRosario,joinville,1980).
nasceu(janineBoos,joinville,1985).
nasceu(douglasSouza,curitiba, 1970).
Base de dados relacional (II)
Como perguntamos:
Nome e ano de nascimento dos curitibanos?
?- nasceu(Quem,curitiba,Ano).
Quem nasceu em joinville a partir de 1980?
?- nasceu(Quem,joinville,Ano),Ano >= 1980.
Nome e ano de nascimento de quem nasceu antes
de 1980 (sem trazer a cidade)?
?- nasceu(Quem,_,Ano), Ano < 1980.
÷rática 8
Crie um banco de dados que conten as as seguintes
informações:
ß Nome do ÷rofessor e disciplina que leciona;
ß Disciplina e orário (dia da semana, aula: primeiro
ou segundo orário);
Construa as consultas para responder:
1. Qual o orário do professor X (disciplina, dia e aula)?
2. Quais professores lecionam na terça-feira?
3. Quais matérias o professor X leciona no primeiro orário?
÷rática 8 - resposta
1. orario_prof(÷,D,S,A) :- leciona(÷,D), orario(D,S,A).
? - orario_prof(rafael,Disc,DiaSemana,Aula) .
2. ?- leciona(X,Disciplina) , orario(Disciplina,3,Aula).
3. ?- leciona(eduardo,Disc), orario(Disc,_,aula1).*/
! !!%
leciona(rafael,ia).
leciona(eduardo,redes).
orario(ia,2,aula1).
orario(ia,5,aula1).
orario(redes,3,aula1).
orario(redes,4,aula2).
÷rática 8 ʹ resposta 2 (I)
:- op(500, xfx, leciona).
:- op(450, xfx, e _lecionada_na).
:- op(400, xfx, no_ orario).
:- op(300, fx, qual_o_ orario_do_professor)
cons(X, Y, [X | Y]).
?-cons(a, b, Z).
Z=[a | b]
Ocorrência de elementos na Lista (I)
2. Ou X é membro do corpo de L.
+ , ( È!B).
Ocorrência de elementos na Lista (III)
( ?).
( ).
( ). F4 ! G 4F
bagOf (II)
÷odemos obter a lista de todas as consoantes nessa
especificação através do objetivo:
E ?- bagof(Disc,leciona(÷rof,Disc),Disciplinas).
setOf (I)
(0
)
Irá novamente produzir uma lista L dos objetos X que
satisfazem a ÷, só que desta vez a lista L estará
ordenada e itens duplicados, se ouver, serão
eliminados.
setOf (II)
Exemplo:
?- setof(Disc,e _lecionada(Disc,÷rof),Disciplinas).
÷rof = rafael
Disciplinas = [ia, progII]
÷rof = eduardo
Disciplinas = [progI, redes]
setOf (III)
Não á restrição 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 apareçam em primeiro lugar na
lista ("con" antecede alfabeticamente "vog"):
= , $c
DF8D
I
c
JK 9L $M
A
Referências
ß ttp://pt.wikipedia.org/wiki/÷rolog
ß ttp://pt.wikipedia.org/wiki/Alain_Colmerauer
ß ttp://www.lin adecodigo.com.br/Artigo.aspx?id=1697
ß ttp://en.wikipedia.org/wiki/÷rolog
ß ttp://ccc.inaoep.mx/~emorales/Cursos/÷rogSimb/node32. tml
ß www.fei.edu.br/eletrica/r N/ia/Apostila-
.doc
ß ttp://www.swi-prolog.org/
ß ttp://www.sics.se/isl/sicstuswww/site/index. tml
ß ttp://gersonc.ana y.org/graduacao/paradigmas/prologsan.pdf
ß ttp://ia.ucpel.tc e.br/~lpalazzo/Aulas/÷DEC/
ß ttp://gollem.science.uva.nl/SWI-÷rolog/apps/view. tml
ß ttp://www.fdi.ucm.es/profesor/fernan/des/