entrada e saí - facomrecuperação eficiente • em grandes bases de dados, devemos ter cuidado:...

44
Entrada e Saída Prof. Elaine Faria e Hiran Nonato Programação Lógica UFU - 2012

Upload: others

Post on 03-Aug-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Entrada e Saída

Prof. Elaine Faria e Hiran NonatoProgramação Lógica

UFU ­ 2012

Page 2: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Arquivo de Entrada

• Exemplo do uso do see...see(arq1).le_do_arquivo(Informacao).see(user)....

Page 3: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Arquivos de Saída

• A fonte de saída corrente pode ser mudada – tell(novoArqSai).

• Exemplo do uso do tell...tell(arq3).grava_no_arquivo(Informacao).tell(user)....

Page 4: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Arquivos de Dados

• Dois outros predicados devem ser utilizados para fechar os arquivos correntes de entrada e saída respectivamente– seen/0 e told/0

Page 5: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Abertura de um arquivo

• Pode­se também abrir um fluxo (stream)

…open(‘arquivo.txt‘, write, Fluxo),...close(Fluxo),…

Page 6: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Abertura de um arquivo

• Para estender um arquivo existente, temos que abrir um fluxo em modo append

…open(‘arquivo.txt‘, append, Fluxo),....close(Fluxo),...

Page 7: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Exemplo 5principal:­    open('casas.txt',read,F),    leiaCasas(F,Casas),    close(F),    write(Casas), nl.

leiaCasas(F,[]):­      at_end_of_stream(F).

leiaCasas(F,[X|L]):­      \+ at_end_of_stream(F),     read(F,X),      leiaCasas(F, L).

Page 8: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Leitura de programas

• A forma mais simples de dizer ao Prolog para ler as definições de predicados armazenadas em um arquivo é usar os colchetes

?­ [meuArq].{consulting(meuArq.pl)…}{meuArq.pl consulted, 233 bytes}true?­

Page 9: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Leitura de programas

• Você também pode consultar mais de um arquivo por vez

?­ [meuArq1, meuArq2, meuArq3].{consulting meuArq1.pl…}{consulting meuArq2.pl…}{consulting meuArq3.pl…}

Page 10: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Usando módulos• Predicado pré­construído module: 

– module/1 e module/2– Para criar um módulo/biblioteca

• Predicado pré­construído use_module: – use_module/1 e use_module/2– Para importar predicados de uma biblioteca

• Argumentos– O primeiro argumento é o nome do módulo– O segundo e opcional argumento é uma lista dos predicados 

exportados

Page 11: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Importando bibliotecas

• Ao especificar o nome de uma biblioteca que você quer usar, você pode informar que este módulo é uma biblioteca

• Prolog procurará no lugar certo, ou seja, em um diretório onde todas as bibliotecas estão guardadas

:­ use_module(library(lists)). 

Page 12: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Predicados extra­lógicos

Prof. Elaine Faria e Hiran NonatoProgramação Lógica

UFU ­ 2012

Page 13: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Tipos de termos

Luis, A. M. Palazzo,  Introdução à Programação Prolog, Educat, 1997.

Page 14: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Tipos de termos 

Page 15: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Construção e decomposição de termos

• Há  três  predicados  pré­definidos  para  a decomposição  de  termos  e  construção  de  novos termos: – functor/3 – arg/3 – =../2

Page 16: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Construção e decomposição de termos

• =../2  "univ“ (operador infixo)– O objetivo Termo =.. L é bem­sucedido se L é uma lista contendo 

como  primeiro  elemento  o  functor  principal  de  Termo,  seguido pelos seus argumentos. 

?­f(a, b) =.. L.L=[f, a, b]

?­T =.. [retângulo, 3, 5].T=retângulo(3, 5)

?­Z =.. [p, X, f(X, Y)].Z=p(X, f(X, Y))

Page 17: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Construção e decomposição de termos

• functor/3functor(Termo, Functor, Aridade)

é verdadeiro se Functor é o functor principal de Termo e Aridade é o seu número de argumentos

• arg/3arg(N, Termo, Argumento)

é verdadeiro se Argumento é o N­ésimo argumento em Termo

Page 18: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Construção e decomposição de termos

• Exemplos?­functor(teste(f(X), X, t), Functor, Aridade).

Functor=teste Aridade=3

?­arg(2, teste(X, t(a), t(b)), Argumento).Argumento=t(a)

?­functor(D, data, 3), arg(1, D, 5), arg(2, D, abril), arg(3, D, 1994).D=data(5, abril, 1994)

Page 19: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Programas ou Bases de Dados• Modelo relacional

– uma base de dados é a especificação de um conjunto de relações

• Um programa Prolog pode ser visto como uma base de dados – A especificação das relações é parcialmente implícita (regras) e 

parcialmente explícita (fatos). 

Page 20: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

• Prolog possui cinco comandos básicos para a manipulação da base de dados:

– assert/1– asserta/1– assertz/1

– retract/1– retractall/1

Adicionar informação

Remover informação

Manipulação da base de dados

Page 21: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Recursos para o controle de programas

• call(P) – dispara um objetivo P. Será bem­sucedido se e 

somente se P também o for• repeat 

– objetivo que sempre é bem­sucedido. Sua principal propriedade é ser não determinístico

• toda vez que é alcançado por backtracking ele gera um caminho alternativo para a execução

repeat.      repeat :­ repeat.

Page 22: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Recursos para o controle de programas

• Exemplos do uso do repeatquadrado :­

repeat, read(X),(X=fim, !; Y is X*X, write(Y), fail).

executa :­repeat, menu(X),(X=fim, !; exec(X), fail).

Page 23: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Bagof, Setof e Findall

• Pode­se gerar, através de backtracking, todos os objetos, um a um, que satisfazem algum objetivo

• Cada  vez  que  uma  nova  solução  é  gerada,  a anterior desaparece e não é mais acessível

• O  que  fazer  quando  deseja­se  dispor  de  todos  os objetos gerados?

Page 24: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Bagof, Setof e Findall

bagof(X, P, L)irá produzir uma lista L de todos os objetos X que satisfazem ao objetivo P

classe(a, vog).classe(b, con).classe(c, con).classe(d, con).classe(e, vog).. . .

?­bagof(Letra, classe(Letra, con), Consoantes).Consoantes=[b, c, d, ..., z]

Page 25: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Bagof, Setof e Findall?­ bagof(Letra, classe(Letra, Classe), Letras).

Classe=vog, Letras=[a, e, i, o, u];Classe=con, Letras=[b, c, d, f, ..., z].

– Se não houver solução para P no objetivo bagof(X, P, L), então este falha

– Se algum objeto X é encontrado repetidamente, todas as suas ocorrências irão aparecer em L 

• possibilidade de existência de elementos duplicados em L

Page 26: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Bagof, Setof e Findall

setof(X, P, L)irá produzir uma lista L dos objetos X que satisfazem a P, sendo que a lista L estará ordenada e itens duplicados serão eliminados

?­setof(Classe/Letra, classe(Letra, Classe), Letras).Letras=[con/b, con/c, ..., con/z, vog/a, ..., vog/u]

Page 27: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Bagof, Setof e Findall

findall(X, P, L)produz a lista L de todos os objetos X que satisfazem P

• Diferença entre findall e o bagof – todos os objetos X são coletados sem considerar eventuais 

soluções diferentes para as variáveis em P que não são compartilhadas com X

?­findall(Letra, classe(Letra, Classe), Letras).Letras=[a, b, c, ..., z]

Page 28: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Bagof, Setof e Findallidade(pedro,7).idade(ana,5).idade(alice,8).idade(tomaz,5).

?­findall(Crianca,idade(Crianca,Idade),L).L = [pedro,ana,alice,tomaz]

?­findall(Crianca/Idade,idade(Crianca,Idade),L).L = [pedro/7, ana/5, alice/8, tomaz/5]

?­findall(Crianca/Idade, (idade(Crianca,Idade),Idade>5),L).L = [pedro/7, alice/8]

Page 29: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Bagof, Setof e Findall

• Se não há nenhum objeto X que satisfaça P, então o predicado findall(X, P, L) resulta bem­sucedido com L=[]

Page 30: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Lógica e Bases de Dados

Prof. Elaine Faria e Hiran NonatoProgramação Lógica

UFU ­ 2012

Page 31: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Bases de Dados Relacionais

• Base de dados Prolog para a tabela pessoapessoa(marcelo, m, luiz, gilda).pessoa(luiz, m, alfredo, lina).pessoa(gilda, f, miguel, ana).pessoa(lúcia, f, luiz, gilda).pessoa(paulo, m, miguel, ana).pessoa(lina, f, francisco, júlia).

Page 32: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

pessoa(marcelo, m, luiz, gilda).pessoa(luiz, m, alfredo, lina).pessoa(gilda, f, miguel, ana).pessoa(lúcia, f, luiz, gilda).pessoa(paulo, m, miguel, ana).pessoa(lina, f, francisco, júlia).

carro(abc­4590,vw, alfredo, azul).carro(xyz­1211,ford, lina,branco).carro(rtc­9004,fiat, luiz,vermelho).carro(llz­7533,gm,gilda,prata).

?­ pessoa(N, f, _, _),     carro(_, Fabr, N, _).

Recuperação de Informações

Page 33: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Recuperação Eficiente• Em grandes bases de dados, devemos ter cuidado:

– Quando há combinação de tuplas distribuídas em duas ou mais tabelas

• Sistemas Prolog devem possuir um “otimizador de consultas”

• Exemplo– Suponha que um crime tenha sido cometido e está sendo procurado um 

homem em um ford azul– A base de dados da polícia possui duas tabelas: uma com 3000 carros e 

outra com 10000 pessoas suspeitas– Uma pessoa pode possuir mais de um carro– Suponha que haja dez fords azuis e que metade das pessoas na base de 

dados sejam homens

Page 34: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Recuperação EficienteSoluções:

?­ carro(Placa, ford, X, azul), pessoa(X, m, _, _).

ou

?­ pessoa(X, m, _, _), carro(Placa, ford, X, azul).

Page 35: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Recuperação EficienteSoluções:

• No primeiro caso – 3000 tentativas de unificação na tabela de carros– Dessas, apenas 10 serão bem sucedidas (só há 10 fords azuis) – 10 acessos diretos à tabela de pessoas para verificar o sexo, num total de 

3010 unificações

• No segundo caso– 10000 tentativas de unificação na tabela de pessoas, das quais 5000 serão 

bem sucedidas – Para cada uma dessas unificações bem sucedidas, 3000 acessos deverão ser 

feitos à tabela de carros, uma vez que não se dispõe da chave, que é “placa”

Page 36: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Atualização da Base de Dados• O modelo relacional impõe a restrição de que certos campos devem ser 

campos chaves, cujo valor deve ser único em uma tabela

• Em  Prolog,  um  sistema  para  o  gerenciamento  de  bases  de  dados relacionais pode ser implementado de forma muito natural

• Operações básicas– remove(T)          % Remove a tupla T– insere(T)           % Insere a tupla T, se já não estiver lá– atualiza(VT, NT)           % Remove a velha e insere a nova tupla

Page 37: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Atualização da Base de Dados

• Exemplos?­ remove(carro(_, _, gilda, _)).

irá remover da base de dados todos os carros que pertencem a Gilda

?­ insere(carro(flt­5455, honda, gilda, cor­de­rosa)).irá introduzir o novo ­ e único ­ carro de Gilda na base de dados.

Page 38: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Atualização da Base de Dadosremove(X) :­             

  removeAux(X), fail.    remove(X).

removeAux(X) :­  retract(X).

removeAux(X).

insere(X) :­  remove(X), assert(X).

insere(X) :­  assert(X).

Page 39: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Formas Normais Relacionais

• Exemplo de uso da 1FN– Evitar repetir grupos

empregador empregado1, empregado2, ..., empregadon

– Não usar a representaçãoempregados(joão, [josé, júlia, jorge, josefina, jane]).

– Usar a representaçãoempr(josé, joão).empr(júlia, joão).empr(jorge, joão).empr(josefina, joão).empr(jane, joão).

Page 40: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Formas Normais Relacionais

• Exemplo de uso da 1FN – cont.– o benefício acontece quando um novo empregado (por exemplo, 

jonas) é contratado 

?­ insere(empr(jonas, joão)).

– O programador não necessita(1) Selecionar a lista de empregados de joão(2) Adicionar Jonas(3) Produzir uma nova lista(4) Apagar a tupla corrente, com a velha lista(5) Produzir uma nova tupla, com a nova lista

Page 41: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Formas Normais Relacionais

• Exemplo de uso da 2FN– Identificar/remover atributos não dependentes da chave primária– Regra aplicada apenas à chaves compostas

empregado nomeEmpregado     (tabela empregado)empregado projeto nomeProjeto horas   (tabela alocação)

– nomeProjeto não depende funcionalmente da chave:[empregado, projeto]

Page 42: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Formas Normais Relacionais

• Exemplo de uso da 2FN ­ cont– Identificar/remover atributos não dependentes da chave primária (nova 

tabela criada, ok)

Solução:empregado nomeEmpregado     (tabela empregado)

empregado projeto horas    (tabela alocação)projeto nomeProjeto (tabela projeto) 

– Dessa  forma,  caso  o  atributo  nomeProjeto  mude,  a  alteração  se  dará apenas na tabela ‘projeto’.

Page 43: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Formas Normais Relacionais

• Exemplo de uso da 3FN– Identificar/remover atributos não dependentes de atributos não chave

empregado empregador endereçoEmpregador   (tabela empregado)

– ‘endereçoEmpregador’ não é dependente da chave ‘empregado’

Page 44: Entrada e Saí - FACOMRecuperação Eficiente • Em grandes bases de dados, devemos ter cuidado: – Quando há combinação de tuplas distribuídas em duas ou mais tabelas • Sistemas

Formas Normais Relacionais

• Exemplo de uso da 3FN ­ cont– Identificar/remover atributos não dependentes de atributos não chave 

(nova tabela criada, ok)

Solução:empregado empregador          (tabela empregado)

empregador endereçoEmpregador      (tabela empregador)

– Assim como na 2FN, problemas de redundância e múltiplas atualização justificam a aplicação dessa normalização.