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




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

                                           9
Operações sobre listas
n    Ocorrência de elementos numa lista
      member(X, L)




                          True
                                    True
                            False



                                           10
Operações sobre listas
n    Ocorrência de elementos numa lista




                         Usando variáveis anônimas




                                                     11
Operações sobre listas
n    Concatenação de listas




                               True




                                      12
Operações sobre listas
    n    Concatenação de listas



Exemplos no SWI-Prolog:




                                   13
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
Operações sobre listas
n    Remoção de elementos de uma lista
      select(termo, lista, lista1)




                                          15
Operações sobre listas
  n    Remoção de elementos de uma lista




Exemplos no SWI-Prolog:




                                            16
Operações sobre listas
n    Inversão de listas
 reverse(List1, List2)




                           17
Operações sobre listas
n     Inversão de listas

                            Mais tradicional




      Mais eficiente




                                               18
Operações sobre listas
n    Sublistas
        sublist(List1, List2)



                            True




                            False




                                    19
Operações sobre listas
n    Sublistas




                         20
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
Operações sobre listas
l    Algoritmo para encontrar o enésimo elemento
      de uma lista.




Exemplos no SWI-Prolog:




                                                22
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
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)
                                      24
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
Bubble Sort




              26
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
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
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
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).
                                     30
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
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
Dúvidas?




           33
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

Listas em Prolog

  • 1.
    Universidade Federal deCampina 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
  • 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]. 8
  • 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). 9
  • 10.
    Operações sobre listas n  Ocorrência de elementos numa lista member(X, L) True True False 10
  • 11.
    Operações sobre listas n  Ocorrência de elementos numa lista Usando variáveis anônimas 11
  • 12.
    Operações sobre listas n  Concatenação de listas True 12
  • 13.
    Operações sobre listas n  Concatenação de listas Exemplos no SWI-Prolog: 13
  • 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
  • 15.
    Operações sobre listas n  Remoção de elementos de uma lista select(termo, lista, lista1) 15
  • 16.
    Operações sobre listas n  Remoção de elementos de uma lista Exemplos no SWI-Prolog: 16
  • 17.
    Operações sobre listas n  Inversão de listas reverse(List1, List2) 17
  • 18.
    Operações sobre listas n  Inversão de listas Mais tradicional Mais eficiente 18
  • 19.
    Operações sobre listas n  Sublistas sublist(List1, List2) True False 19
  • 20.
  • 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
  • 24.
    Predicados built-in deProlog 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) 24
  • 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
  • 26.
  • 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 ListasDinâmicas n  Os testes a seguir, servem para você observar o comportamento das regras de manipulação das listas dinâmicas. 29
  • 30.
    Testes para ListasDinâ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). 30
  • 31.
    Testes para oSistema 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 oSistema 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
  • 33.
  • 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