Listas em Prolog

34
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

Transcript of Listas em Prolog

Page 1: Listas em Prolog

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

Page 2: Listas em Prolog

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].

Page 3: Listas em Prolog

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.

Page 4: Listas em Prolog

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

Page 5: Listas em Prolog

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

Page 6: Listas em Prolog

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

Page 7: Listas em Prolog

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

Page 8: Listas em Prolog

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].

Page 9: Listas em Prolog

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).

Page 10: Listas em Prolog

10

Operações sobre listas

True True

False

n  Ocorrência de elementos numa lista member(X, L)

Page 11: Listas em Prolog

11

Operações sobre listas

n  Ocorrência de elementos numa lista

Usando variáveis anônimas

Page 12: Listas em Prolog

12

Operações sobre listas

n  Concatenação de listas

True

Page 13: Listas em Prolog

13

Operações sobre listas

n  Concatenação de listas

Exemplos no SWI-Prolog:

Page 14: Listas em 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

Page 15: Listas em Prolog

15

Operações sobre listas

n  Remoção de elementos de uma lista select(termo, lista, lista1)

Page 16: Listas em Prolog

16

Operações sobre listas

n  Remoção de elementos de uma lista

Exemplos no SWI-Prolog:

Page 17: Listas em Prolog

17

Operações sobre listas

n  Inversão de listas reverse(List1, List2)

Page 18: Listas em Prolog

18

Operações sobre listas

n  Inversão de listas

Mais tradicional

Mais eficiente

Page 19: Listas em Prolog

19

Operações sobre listas

n  Sublistas

True

False

sublist(List1, List2)

Page 20: Listas em Prolog

20

Operações sobre listas

n  Sublistas

Page 21: Listas em Prolog

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:

Page 22: Listas em Prolog

22

Operações sobre listas

l  Algoritmo para encontrar o enésimo elemento de uma lista.

Exemplos no SWI-Prolog:

Page 23: Listas em 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:

Page 24: Listas em 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)

Page 25: Listas em Prolog

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)

Page 26: Listas em Prolog

26

Bubble Sort

Page 27: Listas em Prolog

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?

Page 28: Listas em Prolog

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([])).

Page 29: Listas em Prolog

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.

Page 30: Listas em Prolog

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).

Page 31: Listas em Prolog

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).

Page 32: Listas em Prolog

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.

Page 33: Listas em Prolog

33

Dúvidas?

Page 34: Listas em Prolog

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