Este documento apresenta um resumo sobre representação e operações com listas no Prolog. As listas são representadas internamente de forma recursiva com cabeça e corpo. Várias operações são descritas como concatenação, inversão, remoção de elementos e testes para validar a representação. Listas dinâmicas também são abordadas para permitir que listas sejam modificadas durante a execução de um programa.
1. 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
Listas em Prolog
Grupo: Delano Oliveira
Izabela Vanessa
Natã Venâncio
Savyo Igor
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].
2
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.
3
4. Representação e Construção
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].
4
5. Representação e Construção
n Em Prolog, Listas são na realidade árvores.
Veja na figura abaixo, como ficaria a árvore
da lista do Exemplo 2.
5
6. Representação e Construção
gerar
n functor . confusões
n Notação simplificada: sequência de
itens separados por vírgulas e incluídos
entre colchetes.
6
7. Representação e Construção
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]).
7
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 14
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:
21
22. Operações sobre listas
l Algoritmo para encontrar o enésimo elemento
de uma lista.
Exemplos no SWI-Prolog:
22
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:
23
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)
25
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?
27
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([])).
28
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.
29
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).
31
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.
32
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
34