Listas em Prolog. Listas

Documentos relacionados
Sintaxe e Semântica de Programas Prolog

INF 1771 Inteligência Artificial

INF 1771 Inteligência Artificial

Sintaxe e Semântica de Programas Prolog

Sistemas Inteligentes

Aplicações de Lógica. Lógica como Linguagem de Programação. Mario Benevides UFRJ

Prof. A. G. Silva. 24 de agosto de Prof. A. G. Silva Programação em Lógica 24 de agosto de / 1

Listas. Em PROLOG os elementos das listas não têm de ser do mesmo tipo (por exemplo, [a,2,abc,[x,1,zzz]])

Conferência Tratamento de listas no PROLOG

Inteligência Arti.icial. Introdução ao Prolog

Conferencia 6 Estruturas, pregados para o trabalho com estruturas, seletores. MSc. Angel Alberto Vazquez Sánchez

INE5416 Paradigmas de Programação. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL:

Programação Lógica PROLOG. Programação Lógica: Prolog

SCC Capítulo 5 Representação de Conhecimento através do Prolog

Linguagens de Programação Aula 14

Listas em Haskell. Listas. Linguagem Haskell. Maria Adriana Vidigal de Lima. Faculdade de Computação - UFU. Setembro

parent parent corpo, corpo 1 2 Prolog - João C. P. da Silva

03/04/2016 LÓGICA MATEMÁTICA. Prof. Esp. Fabiano Taguchi. Introdução ao Prolog

A linguagem Prolog. Sintaxe, terminologia e semântica informal: Os objectos de dados em Prolog são chamados termos.

Paradigmas de Programação

Listas: nós de cabeçalho, listas não homogêneas, listas generalizadas

Prof. A. G. Silva. 31 de agosto de Prof. A. G. Silva Programação em Lógica 31 de agosto de / 1

Recursão PROGRAMAÇÃO EM LÓGICA. Recursão. Sonho Recursivo. Recursão. Recursão. Linguagem Prolog Parte IV

Programação Funcional

Listas: nós de cabeçalho, listas não homogêneas, listas generalizadas. SCC-502 Algoritmos e Estruturas de Dados I

Aulas 10 e 11 / 18 e 20 de abril

Lógica e Programação - Folha de trabalho n. 7

Listas generalizadas. SCC-202 Algoritmos e Estruturas de Dados I

Linguagens Formais e Problemas de Decisão

6. OPERADORES E ARITMÉTICA

Algoritmos e Estrutura de Dados Aula 08 Pilhas

Pedro Vasconcelos DCC/FCUP. Programação Funcional 4 a Aula Listas

Descrição do Mundo de Wumpus. Inteligência Artificial

USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS. Bruno Maffeo Departamento de Informática PUC-Rio

5. SEQUÊNCIAS E SOMAS

Linguagens Lógicas. Aluno: Victor Rocha

Linguagens e Autômatos

Linguagens Formais e Autômatos 02/2015. LFA Aula 02. introdução 28/09/2015. Celso Olivete Júnior.

Introdução à Programação em Prolog

Alguns Exercícios de Inteligência Artificial

IBM1088 Linguagens Formais e Teoria da

INF 1771 Inteligência Artificial

Notas de aula: Cálculo e Matemática Aplicados às Notas de aula: Ciências dos Alimentos

Capítulo 1: Alfabetos, cadeias, linguagens

Linguagens Não-Regulares

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Fundamentos. Paradigma de Programação Lógico. Marco A L Barbosa

LFA. Aula 04. Sintaxe e Semântica. Conceitos Básicos Alfabeto Palavra Linguagem

Já falamos que, na Matemática, tudo se baseia em axiomas. Já estudamos os números inteiros partindo dos seus axiomas.

Variáveis o nome de uma variável pode ser qualquer sequência de caracteres alfanuméricos que começa com uma letra maiúscula ou com um underscore (_).

Recursividade e listas

Programação Funcional BCC222. Aulas 5,6. Mais sobre recursão

LINGUAGEM LIVRE DE CONTEXTO GRAMÁTICA LIVRE DE CONTEXTO

INF 1771 Inteligência Artificial

INF 1771 Inteligência Artificial

Alfabeto, Cadeias, Operações e Linguagens

Inteligência Artificial. Prolog. Aula 2 Introdução (cont.)

Conceitos Básicos. Vocabulário Cadeias Linguagens Problema

Pedro Vasconcelos DCC/FCUP. Programação Funcional 3 a Aula Definição de funções

Teoria da Computação

Textos de apoio às aulas práticas. Jaime Ramos, Francisco Miguel Dionísio

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013

Linguagem Haskell. Riocemar S. de Santana

Linguagens de Programação Programação Lógica (Prolog)

Universidade Federal de Alfenas

5. Processamento de Listas

Unidade I MATEMÁTICA. Prof. Celso Ribeiro Campos

UNIDADE ACADÊMICA: Faculdade de

Segunda Lista de Exercícios 2004/2...

Fundamentos 1. Lógica de Predicados

Programação Lógica. Controle (Bactracking, Cut, Fail) Paulo Henrique Ribeiro Gabriel

Objetos Estruturados Listas Recursão Exercícios. Inteligência Artificial

Pedro Vasconcelos DCC/FCUP. Programação Funcional 5 a Aula Definições recursivas

Capítulo 3 Lógica de Primeira Ordem

Conceitos de Linguagens de Programação

Introdução à Programação / Programação I

Pedro Vasconcelos DCC/FCUP. Programação Funcional 19 a Aula Raciocinar sobre programas

Introdução à Programação

Pedro Vasconcelos DCC/FCUP. Programação Funcional 8 a Aula Listas infinitas

Linguagens Lógicas. Alunos: Josiane Novais Cláudio Moisés

Python: Listas. Claudio Esperança

Vamos agora abordar um conjunto de aspectos complementares, incluindo:

Exercícios: Recursão

Lista de Exercício de Linguagens de Programação Prog. Funcional

Pedro Vasconcelos DCC/FCUP. Programação Funcional 2 a Aula Tipos e classes

AULA TEÓRICA RESOLUÇÃO DE PROBLEMAS 4ª

Pedro Vasconcelos DCC/FCUP. Programação Funcional 13 a Aula Definição de tipos

EXERCÍCIOS DE PROGRAMAÇÃO EM LÓGICA

Linguagens Formais e Autômatos P. Blauth Menezes

PARECER DOS RECURSOS

Lista 02: Pilhas & Filas

Símbolo Nome lê-se como Categoria = 10 significa que se se somar 4 a 6, a soma, ou resultado, é 10.

Programação Funcional Aulas 5 & 6

Algoritmos e Lógica de Programação 80 horas // 4 h/semana. Exercício... Para começar... Resolução... Para começar... Para começar...

Conceitos Básicos. Vocabulário Cadeias Linguagens Expressões Regulares Problema X Linguagem

Exercícios: Árvores. Universidade Federal de Uberlândia - UFU Faculdade de Computação - FACOM Lista de exercícios de estrutura de dados em linguagem C

Aula 19 Conjuntos disjuntos (Union-find)

Linguagens Formais e Autômatos P. Blauth Menezes

Transcrição:

Listas em Prolog Esta aula trata da estrutura de dados lista e programas Prolog para processamento de listas Inteligência Artificial 1 Listas Lista é uma das estruturas mais simples em Prolog, muito comum em programação não numérica Ela é uma seqüência ordenada de elementos Uma lista pode ter qualquer comprimento Por exemplo uma lista de elementos tais como ana, tênis, pedro pode ser escrita em Prolog como: [ana, tênis, pedro] 2 1

Listas O uso de colchetes é apenas uma melhoria da notação, pois internamente listas são representadas como árvores, assim como todos os objetos estruturados em Prolog Para entender a representação Prolog de listas, é necessário considerar dois casos A lista é vazia, escrita como [ ] em Prolog Uma lista (não vazia) consiste: no primeiro item, chamado cabeça (head) da lista na parte restante da lista, chamada cauda (tail) 3 Listas No exemplo [ana, tênis, pedro] ana é a Cabeça da lista [tênis, pedro] é a Cauda da lista A cabeça de uma lista pode ser qualquer objeto (inclusive uma lista); a cauda tem que ser uma lista A Cabeça e a Cauda são então combinadas em uma estrutura pelo functor especial..(cabeça, Cauda) Como a Cauda é uma lista, ela é vazia ou ela tem sua própria cabeça e sua cauda 4 2

Listas Assim, para representar listas de qualquer comprimento, nenhum princípio adicional é necessário O exemplo [ana, tênis, pedro] é representando como o termo:.(ana,.(tênis,.(pedro, []) ) ) ana.. O programador pode escolher ambas notações tênis. pedro [ ] 5 Listas?- Lista1 = [a,b,c], Lista2 =.(a,.(b,.(c,[]))). Lista1 = [a, b, c] Lista2 = [a, b, c]?- Hobbies1 =.(tênis,.(música,[])), Hobbies2 = [esqui, comida], L = [ana,hobbies1,pedro,hobbies2]. Hobbies1 = [tênis,música] Hobbies2 = [esqui,comida] L = [ana, [tênis,música], pedro, [esqui,comida]] 6 3

Listas Em geral, é comum tratar a cauda como um objeto simples Por exemplo, L = [a,b,c] pode ser escrito como Cauda = [b,c] L =.(a,cauda) Para expressar isso, Prolog fornece uma notação alternativa, a barra vertical, que separa a cabeça da cauda L = [a Cauda] A notação é geral por permitir que qualquer número de elementos seja seguido por e o restante da lista: [a,b,c] = [a [b,c]] = [a,b [c]] = [a,b,c [ ]] 7 Cabeça e Cauda - Exemplo 1 [maria, vicente, julia, yolanda] Cabeça: Cauda: 8 4

Cabeça e Cauda - Exemplo 1 [maria, vicente, julia, yolanda] Cabeça: Cauda: maria 9 Cabeça e Cauda - Exemplo 1 [maria, vicente, julia, yolanda] Cabeça: Cauda: maria [vicente, julia, yolanda] 10 5

Cabeça e Cauda - Exemplo 2 [[ ], dead(z), [2, [b,c]], [ ], Z, [2, [b,c]]] Cabeça: Cauda: 11 Cabeça e Cauda - Exemplo 2 [[ ], dead(z), [2, [b,c]], [ ], Z, [2, [b,c]]] Cabeça: [ ] Cauda: 12 6

Cabeça e Cauda - Exemplo 2 [[ ], dead(z), [2, [b,c]], [ ], Z, [2, [b,c]]] Cabeça: [ ] Cauda: [dead(z), [2, [b,c]], [ ], Z, [2, [b,c]]] 13 Cabeça e Cauda - Exemplo 3 [dead(z)] Cabeça: Cauda: 14 7

Cabeça e Cauda - Exemplo 3 [dead(z)] Cabeça: dead(z) Cauda: 15 Cabeça e Cauda - Exemplo 3 [dead(z)] Cabeça: dead(z) Cauda: [ ] 16 8

O operador built-in Prolog tem um built-in operador especial o qual pode ser usado para decompor uma lista em sua Cabeça e Cauda 17 O operador built-in?- [Cabeça Cauda] = [maria, vicente, julia, yolanda]. Cabeça = maria Cauda = [vicente,julia,yolanda] yes?- 18 9

O operador built-in?- [X Y] = [maria, vicente, julia, yolanda]. X = maria Y = [vicente,julia,yolanda] yes?- 19 O operador built-in?- [X Y] = [ ]. no?- 20 10

O operador built-in?- [X,Y Cauda] = [[ ], dead(z), [2, [b,c]], [], [2, [b,c]]]. X = [ ] Y = dead(z) Cauda = [[2, [b,c]], [ ], [2, [b,c]]] yes?- 21 Unificação em Listas Lista1 Lista2 Lista1 = Lista2 [mesa] [X Y] X=mesa Y=[ ] [a,b,c,d] [X,Y Z] X=a Y=b Z=[c,d] [[ana,y] Z] [[X,foi],[ao,cinema]] X=ana Y=foi Z=[[ao,cinema]] [ano,bissexto] [X,Y Z] X=ano Y=bissexto Z=[ ] [ano,bissexto] [X,Y,Z] Não unifica 22 11

Variável Anônima Suponha que estamos interessados no segundo e quarto elemento de uma lista?- [X1,X2,X3,X4 Calda] = [maria, vicente, marcelo, josy, yolanda]. X1 = maria X2 = vicente X3 = marcelo X4 = josy Cauda = [yolanda] yes?- 23 Variável Anônima Há uma maneira mais simples de obter somente a informação que queremos:?- [ _,X2, _,X4 _ ] = [maria, vicente, marcelo, josy, yolanda]. X2 = vicente X4 = josy yes?- 24 12

Operações em Listas Freqüentemente, é necessário realizar operações em listas, por exemplo, buscar um elemento que faz parte de uma lista Para isso, a recursão é o recurso mais amplamente empregado Questão: como verificar se um elemento está em uma lista? 25 Operações em Listas Freqüentemente, é necessário realizar operações em listas, por exemplo, buscar um elemento que faz parte de uma lista Para isso, a recursão é o recurso mais amplamente empregado Para verificar se um elemento está na lista, é preciso verificar se ele está na cabeça ou se ele está na cauda da lista Se o final da lista for atingido, o elemento não está na 26 lista 13

Predicado de Pertinência Inicialmente, é necessário definir o nome do predicado que verifica se um elemento pertence ou não a uma lista, por exemplo, pertence(x,y) A primeira condição especifica que um elemento X pertence à lista se ele está na cabeça dela. Isso é indicado como: pertence(x,[x Z]). A segunda condição especifica que um elemento X pertence à lista se ele pertencer à sua cauda. Isso pode ser indicado como: pertence(x,[w Z]) :- pertence(x,z). 27 Predicado de Pertinência Sempre que um procedimento recursivo é definido, deve-se procurar pelas condições limites (ou condições de parada) e pelo caso recursivo: pertence(cabeca, [Cabeca Cauda]). pertence(cabeca, [OutraCabeca Cauda]) :- pertence(cabeca,cauda). Após a definição do procedimento pertence/2, é possível interrogá-lo.?- pertence(a,[a,b,c]). yes 28 14

Predicado de Pertinência?- pertence(d,[a,b,c]). no?- pertence(x,[a,b,c]). X = a ; X = b ; X = c ; no Entretanto, se as interrogações forem:?- pertence(a,x).?- pertence(x,y). deve-se observar que cada uma delas tem infinitas respostas, pois existem infinitas listas que validam essas interrogações para o procedimento pertence/2 29 Exemplo pertence/2 pertence(x,[x T]). pertence(x,[h T]):- pertence(x,t).?- 30 15

Exemplo pertence/2 pertence(x,[x T]). pertence(x,[h T]):- pertence(x,t).?- pertence(yolanda,[yolanda,tadeu,vicente,julia]). 31 Exemplo pertence/2 pertence(x,[x T]). pertence(x,[h T]):- pertence(x,t).?- pertence(yolanda,[yolanda,tadeu,vicente,julia]). yes?- 32 16

Exemplo pertence/2 pertence(x,[x T]). pertence(x,[h T]):- pertence(x,t).?- pertence(vicente,[yolanda,tadeu,vicente,julia]). 33 Exemplo pertence/2 pertence(x,[x T]). pertence(x,[h T]):- pertence(x,t).?- pertence(vicente,[yolanda,tadeu,vicente,julia]). yes?- 34 17

Exemplo pertence/2 pertence(x,[x T]). pertence(x,[h T]):- pertence(x,t).?- pertence(zeus,[yolanda,tadeu,vicente,julia]). 35 Exemplo pertence/2 pertence(x,[x T]). pertence(x,[h T]):- pertence(x,t).?- pertence(zeus,[yolanda,tadeu,vicente,julia]). no?- 36 18

Exemplo pertence/2 pertence(x,[x T]). pertence(x,[h T]):- pertence(x,t).?- pertence(x,[yolanda,tadeu,vicente,julia]). 37 Exemplo pertence/2 pertence(x,[x T]). pertence(x,[h T]):- pertence(x,t).?- pertence(x,[yolanda,tadeu,vicente,julia]). X = yolanda; X = tadeu; X = vicente; X = julia; no 38 19

Modos de Ativação de Procedimentos Para documentar as possíveis instanciações de variáveis para as quais o procedimento é correto, utiliza-se a seguinte notação (como comentário no programa): + o argumento é de entrada (deve estar instanciado) o argumento é de saída (não deve estar instanciado)? o argumento é de entrada e saída (pode ou não estar instanciado) O procedimento pertence/2 documentado com o modo de chamada para atingir a condição de parada é: % pertence(?elemento, +Lista) pertence(e, [E _]). pertence(e, [_ Cauda]) :- pertence(e,cauda). 39 Exercício Inserção de um elemento na primeira posição de uma lista 40 20

Exemplo: Inserção Inserção na primeira posição: insere(x, L, [X L]).?- insere(a, [b,c,d], Y). Y=[a,b,c,d]; no X = a L = [b, c, d] Y = [X L] = [a, b, c, d] 41 Exercício Converter valores de uma lista em seus valores absolutos 42 21

Exemplo: Converte Converte valores de uma lista em seus valores absolutos. Exemplo:?- converte([5,-3, 1, -4], L). L= [5, 3, 1, 4] converte([ ], [ ]). converte([x L1], [Y L2]):- abs(x,y), converte(l1, L2). 43 converte/2 (arvore de busca)?- converte([-4], R). R = [4 L0]?- converte([ ],L0) / converte([ ], [ ]). converte([x L1], [Y L2]):- abs(x,y), converte(l1, L2). L0=[ ] L0=[ ] R=[4 L0]=[4] 44 22

converte/2 (arvore de busca)?- converte([-4, -3], R). R = [4 L0]?- converte([-3], L0) L0=[3 L1]?- converte([], L1) / L1=[] converte([ ], [ ]). converte([x L1], [Y L2]):- abs(x,y), converte(l1, L2). L1=[ ] L0=[3 L1]=[3] R=[4 L0]=[4,3] 45 Exercício Definir o procedimento último(elem,lista) que encontra o último elemento Elem de uma lista Lista Qual a lógica? 46 23

Exercício Definir o procedimento último(elem,lista) que encontra o último elemento Elem de uma lista Lista O último elemento de uma lista que tem somente um elemento é o próprio elemento O último elemento de uma lista que tem mais de um elemento é o ultimo elemento da cauda 47 Último Elemento de uma Lista O último elemento de uma lista que tem somente um elemento é o próprio elemento ultimo(elemento, [Elemento]). O último elemento de uma lista que tem mais de um elemento é o ultimo elemento da cauda ultimo(elemento, [Cabeca Cauda]) :- ultimo(elemento,cauda). Procedimento completo: % ultimo(?elemento, +Lista) ultimo(elemento, [Elemento]). ultimo(elemento, [Cabeca Cauda]) :- ultimo(elemento,cauda). 48 24

Exercício Concatenar duas listas, formando uma terceira Qual a lógica? 49 Exercício Concatenar duas listas, formando uma terceira Se o primeiro argumento é a lista vazia, então o segundo e terceiro argumentos devem ser o mesmo Se o primeiro argumento é a lista não-vazia, então ela tem uma cabeça e uma cauda da forma [X L1]; concatenar [X L1] com uma segunda lista L2 resulta na lista [X L3], onde L3 é a concatenação de L1 e L2 50 25

Concatenar duas Listas Se o primeiro argumento é a lista vazia, então o segundo e terceiro argumentos devem ser o mesmo concatenar([ ],L,L). Se o primeiro argumento é a lista não-vazia, então ela tem uma cabeça e uma cauda da forma [X L1]; concatenar [X L1] com uma segunda lista L2 resulta na lista [X L3], onde L3 é a concatenação de L1 e L2 concatenar([x L1],L2,[X L3]) :- [X L1] concatenar(l1,l2,l3). Procedimento completo: % concatenar(?/+l1,?/?l2,+/?l) concatenar([ ],L,L). L3 concatenar([x L1],L2,[X L3]) :- X L3 concatenar(l1,l2,l3). X L1 L2 [X L3] 51 concatenar/3 (arvore de busca)?- concatenar([a,b,c],[1,2,3], R). concatenar([], L, L). concatenar([x L1], L2, [X L3]):- concatenar(l1, L2, L3). 52 26

concatenar/3 (arvore de busca)?- concatenar([a,b,c],[1,2,3], R). concatenar([], L, L). concatenar([x L1], L2, [X L3]):- concatenar(l1, L2, L3). 53 concatenar/3 (arvore de busca)?- concatenar([a,b,c],[1,2,3], R). R = [a L0]?- concatenar([b,c],[1,2,3],l0) concatenar([], L, L). concatenar([x L1], L2, [X L3]):- concatenar(l1, L2, L3). 54 27

concatenar/3 (arvore de busca)?- concatenar([a,b,c],[1,2,3], R). R = [a L0]?- concatenar([b,c],[1,2,3],l0) concatenar([], L, L). concatenar([x L1], L2, [X L3]):- concatenar(l1, L2, L3). 55 concatenar/3 (arvore de busca)?- concatenar([a,b,c],[1,2,3], R). R = [a L0]?- concatenar([b,c],[1,2,3],l0) L0=[b L1]?- concatenar([c],[1,2,3],l1) concatenar([], L, L). concatenar([x L1], L2, [X L3]):- concatenar(l1, L2, L3). 56 28

concatenar/3 (arvore de busca)?- concatenar([a,b,c],[1,2,3], R). R = [a L0]?- concatenar([b,c],[1,2,3],l0) L0=[b L1]?- concatenar([c],[1,2,3],l1) concatenar([], L, L). concatenar([x L1], L2, [X L3]):- concatenar(l1, L2, L3). 57 concatenar/3 (arvore de busca)?- concatenar([a,b,c],[1,2,3], R). R = [a L0]?- concatenar([b,c],[1,2,3],l0) L0=[b L1]?- concatenar([c],[1,2,3],l1) concatenar([], L, L). concatenar([x L1], L2, [X L3]):- L1=[c L2]?- concatenar([],[1,2,3],l2) concatenar(l1, L2, L3). 58 29

concatenar/3 (arvore de busca)?- concatenar([a,b,c],[1,2,3], R). R = [a L0]?- concatenar([b,c],[1,2,3],l0) L0=[b L1]?- concatenar([c],[1,2,3],l1) L1=[c L2] concatenar([], L, L). concatenar([x L1], L2, [X L3]):- concatenar(l1, L2, L3).?- concatenar([],[1,2,3],l2) 59 concatenar/3 (arvore de busca)?- concatenar([a,b,c],[1,2,3], R). R = [a L0]?- concatenar([b,c],[1,2,3],l0) L0=[b L1]?- concatenar([c],[1,2,3],l1) L1=[c L2] concatenar([], L, L). concatenar([x L1], L2, [X L3]):- concatenar(l1, L2, L3).?- concatenar([],[1,2,3],l2) L2=[1,2,3] 60 30

concatenar/3 (arvore de busca) concatenar([], L, L).?- concatenar([a,b,c],[1,2,3], R). concatenar([x L1], L2, [X L3]):- R = [a L0]?- concatenar([b,c],[1,2,3],l0) concatenar(l1, L2, L3). L0=[b L1]?- concatenar([c],[1,2,3],l1) L2=[1,2,3] L1=[c L2] L1=[c L2]=[c,1,2,3]?- concatenar([],[1,2,3],l2) L0=[b L1]=[b,c,1,2,3] R=[a L0]=[a,b,c,1,2,3] L2=[1,2,3] 61 Exemplo concatenar/3 concatenar([], L, L). concatenar([x L], L2, [X L3]):- concatenar(l, L2, L3).?- concatenar(x, Y, [1,2,3,4]). X = [ ] Y = [1,2,3,4]; X = [1] Y = [2,3,4]; X = [1,2] Y = [3,4]; X = [1,2,3] Y = [4]; X = [1,2,3,4] Y = [ ]; no 62 31

Exercícios Encontrar o maior valor de uma lista de valores numéricos. 63 Exercícios Verificar se dois elementos são consecutivos em uma lista. 64 32

Exercícios Somar elementos de uma lista numérica. 65 Exercícios Encontrar n-ésimo elemento de uma lista. 66 33

Exercícios Determinar o número de elementos de uma lista. 67 Exercícios Retirar uma ocorrência de um elemento de uma lista. 68 34

Exercícios Substituir elemento de uma lista por um outro elemento. 69 Exercícios Dividir uma lista numérica em 2 sublistas que contenham os elementos iguais ou menores e os maiores que um dado elemento. 70 35