listas em prolog
TRANSCRIPT
Listas em Prolog
Grupo: Delano Oliveira Izabela Vanessa
Natã Venâncio Savyo Igor
Universidade Federal de Campina Grande Centro de Engenharia Elétrica e Informática Departamento de Sistemas e Computação
Disciplina: Lógica Matemática – 2009.2
2
Introdução
n Representação interna recursiva n Sequência de qualquer número de itens n Aparência externa da lista:
n [brasil, uruguai, paraguai, argentina]
n Uma lista pode ser mista: n X = [1,[a,b],f(5),4,f(b),[6,t],7].
3
Representação e Construção
n Representação: n Lista vazia => apenas o átomo n Lista não-vazia => cabeça + corpo
n No exemplo: cabeça => brasil
corpo => [uruguai, paraguai, argentina]
n A cabeça de uma lista pode ser qualquer objeto de Prolog, mas o corpo obrigatoriamente deve ser uma lista.
4
n A cabeça e o corpo são combinados em uma estrutura por meio do functor “.” n Exemplo 1:
n ?- Lista = .(cabeca, corpo).
Lista = [cabeca|corpo].
n Exemplo 2: n ?- Lista = .(brasil, .(uruguai, .(argentina, .(paraguai, [])))).
Lista = [brasil, uruguai, paraguai, argentina].
Representação e Construção
5
n Em Prolog, Listas são na realidade árvores. Veja na figura abaixo, como ficaria a árvore da lista do Exemplo 2.
Representação e Construção
6
n functor “.” confusões
n Notação simplificada: sequência de itens separados por vírgulas e incluídos entre colchetes.
gerar
Representação e Construção
7
n Exemplo1: n ?- Lista = [cabeca, corpo]. Lista = [cabeca, corpo].
n Exemplo2: n ?- Lista = [brasil, uruguai, paraguai, argentina]. Lista = [brasil, uruguai, paraguai, argentina].
n Num programa em Prolog, podemos escrever o seguinte fato para criar uma lista: n const(X,Y,[X|Y]).
Representação e Construção
8
Testes
n No SWI-Prolog teste os seguintes casos: n ?- [X|Y] = [a,b,c,d]. n ?- [X|[Y|Z]] = [a,b,c,d]. n ?- [X,Y,Z] = [a,b,c,d]. n ?- [X,Y|Z] = [a,b,c,d]. n ?- [X,Y,Z|_] = [1,3,5,7,9,11,13].
9
Testes
n No SWI-Prolog faça: n ?- assert(const(X,Y,[X|Y])).
n Agora, teste os seguintes casos: n const(a,b,Z). n const(a, [b,c], Z). n const(a, [], Z). n const(a, X, [a,b,c]). n const([a,b,c], [b,c], Z).
10
Operações sobre listas
True True
False
n Ocorrência de elementos numa lista member(X, L)
11
Operações sobre listas
n Ocorrência de elementos numa lista
Usando variáveis anônimas
12
Operações sobre listas
n Concatenação de listas
True
13
Operações sobre listas
n Concatenação de listas
Exemplos no SWI-Prolog:
14
Operações sobre listas
n Concatenação de listas
Outras aplicações:
Sucessor e antecessor de um item na lista
Apagar os elementos a partir do item na lista
15
Operações sobre listas
n Remoção de elementos de uma lista select(termo, lista, lista1)
16
Operações sobre listas
n Remoção de elementos de uma lista
Exemplos no SWI-Prolog:
17
Operações sobre listas
n Inversão de listas reverse(List1, List2)
18
Operações sobre listas
n Inversão de listas
Mais tradicional
Mais eficiente
19
Operações sobre listas
n Sublistas
True
False
sublist(List1, List2)
20
Operações sobre listas
n Sublistas
21
Operações sobre listas
l Tamanho de uma Lista l length([1, a, b], X). l Algoritmo para encontrar o tamanho de uma
lista.
Exemplos no SWI-Prolog:
22
Operações sobre listas
l Algoritmo para encontrar o enésimo elemento de uma lista.
Exemplos no SWI-Prolog:
23
Operações sobre listas
l Lista para a teoria dos conjuntos. l Algoritmo que faz a interseção de duas listas.
Exemplos no SWI-Prolog:
24
Predicados built-in de Prolog n append(List1, List2, List12) n member(Element, List) n reverse(List1, List2) n delete(List1, Element, List2) n select(Element, List1, List2) n permutation(List1, List2) n prefix(Prefix, List) n suffix(Suffix, List) n sublist(List1, List2) n last(List, Element) n length(List, Length) n nth(N, List, Element) n min_list(List, Min) n max_list(List, Max) n sum_list(List, Sum) n sort(List1, List2)
25
Ordem Alfanumérica
n A ordem alfanumérica é usada para ordenar números e cadeias de caracteres.
n Existem alguns predicados pra ordenar listas: n sort(Lista1, Lista2)
26
Bubble Sort
27
Listas Dinâmicas
n E se durante a execução precisarmos que o programa armazene listas? n Exemplo: Num sistema de eleição
precisamos armazenar os candidatos numa lista enquanto ocorre a votação. No final da execução do programa, precisamos que ele retorne o vencedor da votação. Como fazemos para, no decorrer da execução, o programa salvar essa lista?
28
Listas Dinâmicas
n Para resolver o problema anterior utilizamos Listas Dinâmicas.
n Para construir listas dinâmicas em PROLOG, temos que criar um fato que armazene uma lista. n Exemplo: lista([]).
n No arquivo “ListasDinamicas.pl” mostramos uma regra para construir a lista dinâmica. n criaLista :- retractall(listaDeProfessores(_)), assert(listaDeProfessores([])).
29
Testes para Listas Dinâmicas
n Os testes a seguir, servem para você observar o comportamento das regras de manipulação das listas dinâmicas.
30
Testes para Listas Dinâmicas
n ?- criaLista. ?- retornaLista(X). ?- insereElemento(nata, S). ?- insereElemento(delano,S). ?- retornaLista(X). ?- imprimirElementos. ?- retireElemento(savyo,S). ?- retireElemento(nata,S). ?- retornaLista(X). ?- zereLista. ?- retornaLista(X).
31
Testes para o Sistema
n Para rodar o sistema faça: n ?- menu.
n Passos: n Peça para o menu imprimir todos os professores. n Peça para adicionar um elemento. n Peça para o menu imprimir todos os professores. n Peça para adicionar outro elemento. n Peça para o menu imprimir todos os professores. n Peça para remover um elemento que está na lista. n Peça para o menu imprimir todos os professores. n Peça para remover um elemento que não está na lista. n Peça para o menu imprimir todos os professores. n Peça para sair. n Quando sair digite o que esta abaixo e observe que a lista foi zerada:
n ?- retornaLista(X).
32
Testes para o Sistema
n Para confirmar que a lista que criamos é dinâmica, vá até o arquivo “ListasDinamicas.pl” e troque: n saiaDoSistema :- zereLista, write('Saindo do Sistema...'). n saiaDoSistema :- write('Saindo do Sistema...').
n Execute o teste anterior e veja que quando paramos a consulta da regra menu/0, a lista de candidatos permanece armazenado dinamicamente no banco de dados.
33
Dúvidas?
34
Referências
n FAVERO, Eloi L. Programação em Prolog: Uma abordagem prática. Departamento de Informática CCEN –UFPA. Versão 2006.
n PALAZZO, Luiz A. M. Introdução à Programação: PROLOG. Editora da Universidade Católica de Pelotas. Pelotas, 1997
n Listas Dinâmicas => Projeto de Lógica Matemática 2009.1 do grupo: Arthur Marques, Fernando Alves, Luiz Machado e Ramon Lopes