prof. dr. silvio do lago pereira - ime-uspslago/ia-6u.pdf · uma instância trivial deve ser...

20
Recursividade e listas Prof. Dr. Silvio do Lago Pereira Departamento de Tecnologia da Informação Faculdade de Tecnologia de São Paulo

Upload: lebao

Post on 28-Jan-2019

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Recursividade e listas

Prof. Dr. Silvio do Lago Pereira

Departamento de Tecnologia da Informação

Faculdade de Tecnologia de São Paulo

Page 2: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Princípio de recursividade

RecursividadeRecursividade

é um princípio que permite obter a solução de um problema P, a partir das soluções

de subproblemas de P, que são similares ao próprio P.

é um princípio que permite obter a solução de um problema P, a partir das soluções

de subproblemas de P, que são similares ao próprio P.

De acordo com este princípio, o

problema deve ser decomposto

em subproblemas cada vez mais

Exemplo 1. Arrecadação de R$1500,00 para doação

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 2

em subproblemas cada vez mais

simples, até que tenhamos

apenas subproblemas triviais.

Cada subproblema trivial é

resolvido diretamente, sem

novas decomposições, e os

resultados obtidos são usados

para compor a solução do

problema original.

Page 3: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Princípio de recursividade

Para resolver um problema P, um algoritmo recursivo deve ser capaz de classificar

cada uma das instâncias de P como trivial ou não-trivial.

Uma instância trivial deve ser resolvida diretamente, já que não pode ser reduzida a outra mais simples.

Uma instância não-trivial deve ser resolvida recursivamente, usando o princípio de recursividade esquematizado a seguir:

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 3

instância original PPPP( I I I I )

instância mais simples PPPP( I’ I’ I’ I’ )

solução de PPPP( I I I I )

solução de PPPP( I’ I’ I’ I’ )

reduz usa

obtém

Page 4: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Definições recursivas

A cada passo, uma instância não-trivial é reduzida a

outra mais simples e ficamos cada vez mais perto de

Uma definição recursiva é composta porUma definição recursiva é composta por

base: cláusulas que resolvem as instâncias triviais diretamente.

passo: cláusulas que resolvem as instâncias não-triviais recursivamente.

base: cláusulas que resolvem as instâncias triviais diretamente.

passo: cláusulas que resolvem as instâncias não-triviais recursivamente.

23 8

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 4

outra mais simples e ficamos cada vez mais perto de

obter uma instância trivial

Quando uma instância trivial é obtida, a base faz

com que o processo de reduções termine

Então, usamos as soluções das instâncias menores

para construir as soluções das instâncias maiores

Assim, a incapacidade de reduzir instâncias, ou de

detectar instâncias triviais, pode fazer o processo

entrar em looping, sem jamais resolver o problema.

reduz usa

22 4reduz usa

21 2reduz usa

20 1

Page 5: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Definições recursivas

Exemplo 1. Cálculo de potência com expoente naturalExemplo 1. Cálculo de potência com expoente natural

% % % % potpotpotpot(X,N,P) : X elevado a N é P(X,N,P) : X elevado a N é P(X,N,P) : X elevado a N é P(X,N,P) : X elevado a N é P

potpotpotpot(_,0,1). (_,0,1). (_,0,1). (_,0,1). % base % base % base % base

potpotpotpot(X,N,P) :(X,N,P) :(X,N,P) :(X,N,P) :---- % passo% passo% passo% passo

N>0, N>0, N>0, N>0, % condição para redução% condição para redução% condição para redução% condição para redução

M is NM is NM is NM is N----1, 1, 1, 1, % reduz a instância% reduz a instância% reduz a instância% reduz a instância

potpotpotpot(X,M,R), (X,M,R), (X,M,R), (X,M,R), % obtém a solução da instância mais simples% obtém a solução da instância mais simples% obtém a solução da instância mais simples% obtém a solução da instância mais simples

% % % % potpotpotpot(X,N,P) : X elevado a N é P(X,N,P) : X elevado a N é P(X,N,P) : X elevado a N é P(X,N,P) : X elevado a N é P

potpotpotpot(_,0,1). (_,0,1). (_,0,1). (_,0,1). % base % base % base % base

potpotpotpot(X,N,P) :(X,N,P) :(X,N,P) :(X,N,P) :---- % passo% passo% passo% passo

N>0, N>0, N>0, N>0, % condição para redução% condição para redução% condição para redução% condição para redução

M is NM is NM is NM is N----1, 1, 1, 1, % reduz a instância% reduz a instância% reduz a instância% reduz a instância

potpotpotpot(X,M,R), (X,M,R), (X,M,R), (X,M,R), % obtém a solução da instância mais simples% obtém a solução da instância mais simples% obtém a solução da instância mais simples% obtém a solução da instância mais simples

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 5

P is X*R. P is X*R. P is X*R. P is X*R. % constrói solução da instância original% constrói solução da instância original% constrói solução da instância original% constrói solução da instância originalP is X*R. P is X*R. P is X*R. P is X*R. % constrói solução da instância original% constrói solução da instância original% constrói solução da instância original% constrói solução da instância original

Exercício 1. Cálculo de fatorialExercício 1. Cálculo de fatorial

% % % % fatfatfatfat(N,F) : o fatorial de N é F(N,F) : o fatorial de N é F(N,F) : o fatorial de N é F(N,F) : o fatorial de N é F

fatfatfatfat(0,1). (0,1). (0,1). (0,1). % base% base% base% base

fatfatfatfat(N,F) :(N,F) :(N,F) :(N,F) :---- ... ... ... ... % passo% passo% passo% passo

% % % % fatfatfatfat(N,F) : o fatorial de N é F(N,F) : o fatorial de N é F(N,F) : o fatorial de N é F(N,F) : o fatorial de N é F

fatfatfatfat(0,1). (0,1). (0,1). (0,1). % base% base% base% base

fatfatfatfat(N,F) :(N,F) :(N,F) :(N,F) :---- ... ... ... ... % passo% passo% passo% passo

Page 6: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Definições recursivas

Exemplo 2. Torres de HanóiExemplo 2. Torres de Hanói

Problema: mover todos os discos da torre A para a torre C, usando da torre B

Restrições:

Mover um disco de cada vez

Não colocar um disco sobre outro menor

Problema: mover todos os discos da torre A para a torre C, usando da torre B

Restrições:

Mover um disco de cada vez

Não colocar um disco sobre outro menor

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 6

A B C

Não colocar um disco sobre outro menor

Transferir os discos de uma torre para outra, imediatamente

Não colocar um disco sobre outro menor

Transferir os discos de uma torre para outra, imediatamente

Page 7: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Definições recursivas

Exercício 2. Torres de HanóiExercício 2. Torres de Hanói

hanóihanóihanóihanói(0,_,_,_). (0,_,_,_). (0,_,_,_). (0,_,_,_). % base% base% base% base

hanóihanóihanóihanói(N,Origem,Auxiliar,Destino) :(N,Origem,Auxiliar,Destino) :(N,Origem,Auxiliar,Destino) :(N,Origem,Auxiliar,Destino) :---- ... ... ... ... % passo% passo% passo% passo

hanóihanóihanóihanói(0,_,_,_). (0,_,_,_). (0,_,_,_). (0,_,_,_). % base% base% base% base

hanóihanóihanóihanói(N,Origem,Auxiliar,Destino) :(N,Origem,Auxiliar,Destino) :(N,Origem,Auxiliar,Destino) :(N,Origem,Auxiliar,Destino) :---- ... ... ... ... % passo% passo% passo% passo

Complete e teste o predicado hanói/4hanói/4hanói/4hanói/4, com base na idéia esquematizada a seguir:

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 7

A B C A B C A B C A B C

mova n-1 discos de A para B mova n-1 discos de B para Cmova 1 disco de A para C

Page 8: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Definições recursivas

Exercício 3. Exibição de números em binárioExercício 3. Exibição de números em binário

exibe_binárioexibe_binárioexibe_binárioexibe_binário(N) :(N) :(N) :(N) :---- % base% base% base% base

N<2, N<2, N<2, N<2, !!!!, , , , % condição para base% condição para base% condição para base% condição para base

write(N). write(N). write(N). write(N). % solução trivial% solução trivial% solução trivial% solução trivial

exibe_binárioexibe_binárioexibe_binárioexibe_binário(N) :(N) :(N) :(N) :---- % passo% passo% passo% passo

... ... ... ... % se chegou aqui, então N>=2% se chegou aqui, então N>=2% se chegou aqui, então N>=2% se chegou aqui, então N>=2

exibe_binárioexibe_binárioexibe_binárioexibe_binário(N) :(N) :(N) :(N) :---- % base% base% base% base

N<2, N<2, N<2, N<2, !!!!, , , , % condição para base% condição para base% condição para base% condição para base

write(N). write(N). write(N). write(N). % solução trivial% solução trivial% solução trivial% solução trivial

exibe_binárioexibe_binárioexibe_binárioexibe_binário(N) :(N) :(N) :(N) :---- % passo% passo% passo% passo

... ... ... ... % se chegou aqui, então N>=2% se chegou aqui, então N>=2% se chegou aqui, então N>=2% se chegou aqui, então N>=2

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 8

Complete e teste exibe_binário/1exibe_binário/1exibe_binário/1exibe_binário/1, com base na idéia esquematizada a seguir:

13131313 6666 3333 1111

1101101101101111 111111110000 11111111 1111

reduz reduz reduz

usa usa usa

Page 9: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Relações transitivas

Uma relação r/2r/2r/2r/2 é transitiva seUma relação r/2r/2r/2r/2 é transitiva se

r(X,Y)r(X,Y)r(X,Y)r(X,Y) e r(Y,Z)r(Y,Z)r(Y,Z)r(Y,Z) implicam r(X,Z)r(X,Z)r(X,Z)r(X,Z)r(X,Y)r(X,Y)r(X,Y)r(X,Y) e r(Y,Z)r(Y,Z)r(Y,Z)r(Y,Z) implicam r(X,Z)r(X,Z)r(X,Z)r(X,Z)

Uma relação transitiva pode ser definida, recursivamente, a partir de uma relação base.

Exemplo 3. Ancestrais de uma pessoaExemplo 3. Ancestrais de uma pessoa

pai(adão,cain).pai(adão,cain).ancestral

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 9

pai(adão,cain).pai(adão,abel).pai(adão,seth).pai(seth,enos).

ancestral(X,Y) :- % basepai(X,Y).

ancestral(X,Y) :- % passopai(X,Z), ancestral(Z,Y).

pai(adão,cain).pai(adão,abel).pai(adão,seth).pai(seth,enos).

ancestral(X,Y) :- % basepai(X,Y).

ancestral(X,Y) :- % passopai(X,Z), ancestral(Z,Y).

X Y

pai

X Y

ancestral

ancestralZ

pai

Page 10: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Relações transitivas

Exercício 4. A relação transitiva acima/2acima/2acima/2acima/2Exercício 4. A relação transitiva acima/2acima/2acima/2acima/2

sobre(b,a).sobre(b,a).sobre(b,a).sobre(b,a).sobre(d,b).sobre(d,b).sobre(d,b).sobre(d,b).sobre(d,c).sobre(d,c).sobre(d,c).sobre(d,c).sobre(e,d).sobre(e,d).sobre(e,d).sobre(e,d).

sobre(b,a).sobre(b,a).sobre(b,a).sobre(b,a).sobre(d,b).sobre(d,b).sobre(d,b).sobre(d,b).sobre(d,c).sobre(d,c).sobre(d,c).sobre(d,c).sobre(e,d).sobre(e,d).sobre(e,d).sobre(e,d).

Usando a relação sobre/2sobre/2sobre/2sobre/2, defina a relação acima/2acima/2acima/2acima/2 e faça as consultas a seguir:

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 10

A

B

C

D

????---- sobre(d,a).sobre(d,a).sobre(d,a).sobre(d,a).

????---- acima(d,a).acima(d,a).acima(d,a).acima(d,a).

????---- sobre(d,X).sobre(d,X).sobre(d,X).sobre(d,X).

????---- acima(d,X).acima(d,X).acima(d,X).acima(d,X).

????---- acima(X,a). acima(X,a). acima(X,a). acima(X,a).

E

Page 11: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Listas

Page 12: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Listas

Uma listaUma lista

é uma seqüência de itens separados por vírgulas e delimitados por colchetesé uma seqüência de itens separados por vírgulas e delimitados por colchetes

????---- [X|Y] = [terra, sol, lua].[X|Y] = [terra, sol, lua].[X|Y] = [terra, sol, lua].[X|Y] = [terra, sol, lua].

X = terra

Y = [sol, lua][[[[XXXX||||YYYY]]]]

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 12

O acesso aos itens de uma lista é feito por meio de casamento de padrões!O acesso aos itens de uma lista é feito por meio de casamento de padrões!

Y = [sol, lua]

????---- [X|Y] = [estrela].[X|Y] = [estrela].[X|Y] = [estrela].[X|Y] = [estrela].

X = estrela

Y = []

????---- [X|Y] = [].[X|Y] = [].[X|Y] = [].[X|Y] = [].

no

[[[[XXXX||||YYYY]]]]

cabeça(primeiro item)

cauda(demais itens)

Page 13: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Listas

Padrão Itens na lista

[][][][] nenhum

[X][X][X][X] exatamente um

[X|Y][X|Y][X|Y][X|Y] pelo menos um

[X,Y][X,Y][X,Y][X,Y] exatamente dois

Exercício 5. Uso de padrõesExercício 5. Uso de padrões

Veja os resultados das consultas:

????---- [1,2,3,4] = [A|R].[1,2,3,4] = [A|R].[1,2,3,4] = [A|R].[1,2,3,4] = [A|R].

????---- [1,2,3,4] = [A,B|R].[1,2,3,4] = [A,B|R].[1,2,3,4] = [A,B|R].[1,2,3,4] = [A,B|R].

????---- [1,2,3,4] = [A,B,C].[1,2,3,4] = [A,B,C].[1,2,3,4] = [A,B,C].[1,2,3,4] = [A,B,C].

????---- [1,2,3,4] = [A,B,C|R].[1,2,3,4] = [A,B,C|R].[1,2,3,4] = [A,B,C|R].[1,2,3,4] = [A,B,C|R].

Veja os resultados das consultas:

????---- [1,2,3,4] = [A|R].[1,2,3,4] = [A|R].[1,2,3,4] = [A|R].[1,2,3,4] = [A|R].

????---- [1,2,3,4] = [A,B|R].[1,2,3,4] = [A,B|R].[1,2,3,4] = [A,B|R].[1,2,3,4] = [A,B|R].

????---- [1,2,3,4] = [A,B,C].[1,2,3,4] = [A,B,C].[1,2,3,4] = [A,B,C].[1,2,3,4] = [A,B,C].

????---- [1,2,3,4] = [A,B,C|R].[1,2,3,4] = [A,B,C|R].[1,2,3,4] = [A,B,C|R].[1,2,3,4] = [A,B,C|R].

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 13

[X,Y|Z][X,Y|Z][X,Y|Z][X,Y|Z] pelo menos dois

[X,Y,Z][X,Y,Z][X,Y,Z][X,Y,Z] exatamente três

????---- [1,2,3,4] = [A,B,C|R].[1,2,3,4] = [A,B,C|R].[1,2,3,4] = [A,B,C|R].[1,2,3,4] = [A,B,C|R].

????---- [1,2,3,4] = [A,B,C,D].[1,2,3,4] = [A,B,C,D].[1,2,3,4] = [A,B,C,D].[1,2,3,4] = [A,B,C,D].

????---- [1,2,3,4] = [A,B,C,D|R].[1,2,3,4] = [A,B,C,D|R].[1,2,3,4] = [A,B,C,D|R].[1,2,3,4] = [A,B,C,D|R].

????---- [1,2,3,4] = [A,B,C|R].[1,2,3,4] = [A,B,C|R].[1,2,3,4] = [A,B,C|R].[1,2,3,4] = [A,B,C|R].

????---- [1,2,3,4] = [A,B,C,D].[1,2,3,4] = [A,B,C,D].[1,2,3,4] = [A,B,C,D].[1,2,3,4] = [A,B,C,D].

????---- [1,2,3,4] = [A,B,C,D|R].[1,2,3,4] = [A,B,C,D|R].[1,2,3,4] = [A,B,C,D|R].[1,2,3,4] = [A,B,C,D|R].

Page 14: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Tratamento recursivo de listas

Exemplo 4. Exibição dos itens de uma listaExemplo 4. Exibição dos itens de uma lista

/* 1 */ /* 1 */ /* 1 */ /* 1 */ exibaexibaexibaexiba([]).([]).([]).([]).

/* 2 */ /* 2 */ /* 2 */ /* 2 */ exibaexibaexibaexiba([X([X([X([X2222|Y|Y|Y|Y2222]) :]) :]) :]) :---- writeln(Xwriteln(Xwriteln(Xwriteln(X2222), exiba(Y), exiba(Y), exiba(Y), exiba(Y2222).).).).

/* 1 */ /* 1 */ /* 1 */ /* 1 */ exibaexibaexibaexiba([]).([]).([]).([]).

/* 2 */ /* 2 */ /* 2 */ /* 2 */ exibaexibaexibaexiba([X([X([X([X2222|Y|Y|Y|Y2222]) :]) :]) :]) :---- writeln(Xwriteln(Xwriteln(Xwriteln(X2222), exiba(Y), exiba(Y), exiba(Y), exiba(Y2222).).).).

????---- exiba([a,b]).exiba([a,b]).exiba([a,b]).exiba([a,b]).

????---- writeln(a), exiba([b]).writeln(a), exiba([b]).writeln(a), exiba([b]).writeln(a), exiba([b]).

2, X1=a, Y1=[b]

A cada chamada recursiva, as

variáveis da regra são renomeadas!

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 14

????---- exiba([a,b]).exiba([a,b]).exiba([a,b]).exiba([a,b]).

aaaa

bbbb

yesyesyesyes

????---- writeln(a), exiba([b]).writeln(a), exiba([b]).writeln(a), exiba([b]).writeln(a), exiba([b]).

????---- exiba([b]).exiba([b]).exiba([b]).exiba([b]).

????---- writeln(b), exiba([]).writeln(b), exiba([]).writeln(b), exiba([]).writeln(b), exiba([]).

2, X2=b, Y2=[]

????---- exiba([]).exiba([]).exiba([]).exiba([]).

????----

1

Page 15: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Tratamento recursivo de listas

????---- membro(d,[a,b,c,d,e]).membro(d,[a,b,c,d,e]).membro(d,[a,b,c,d,e]).membro(d,[a,b,c,d,e]).

2, X1=d, Y1=[b,c,d,e]

A cada chamada recursiva, as

variáveis da regra são renomeadas!

Exemplo 5. Verificação de pertinênciaExemplo 5. Verificação de pertinência

/* 1 */ /* 1 */ /* 1 */ /* 1 */ membromembromembromembro(X,[X|_]).(X,[X|_]).(X,[X|_]).(X,[X|_]).

/* 2 */ /* 2 */ /* 2 */ /* 2 */ membromembromembromembro(X(X(X(X3333,[_|Y,[_|Y,[_|Y,[_|Y3333]) :]) :]) :]) :---- membro(Xmembro(Xmembro(Xmembro(X3333,Y,Y,Y,Y3333).).).).

/* 1 */ /* 1 */ /* 1 */ /* 1 */ membromembromembromembro(X,[X|_]).(X,[X|_]).(X,[X|_]).(X,[X|_]).

/* 2 */ /* 2 */ /* 2 */ /* 2 */ membromembromembromembro(X(X(X(X3333,[_|Y,[_|Y,[_|Y,[_|Y3333]) :]) :]) :]) :---- membro(Xmembro(Xmembro(Xmembro(X3333,Y,Y,Y,Y3333).).).).

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 15

????---- membro(d,[a,b,c,d,e]).membro(d,[a,b,c,d,e]).membro(d,[a,b,c,d,e]).membro(d,[a,b,c,d,e]).

yesyesyesyes

????---- membro(d,[b,c,d,e]).membro(d,[b,c,d,e]).membro(d,[b,c,d,e]).membro(d,[b,c,d,e]).

????---- membro(d,[c,d,e]).membro(d,[c,d,e]).membro(d,[c,d,e]).membro(d,[c,d,e]).

????---- membro(d,[d,e]).membro(d,[d,e]).membro(d,[d,e]).membro(d,[d,e]).

2, X3=d, Y3=[d,e]

????----

2, X2=d, Y2=[c,d,e]

1, X=d

Page 16: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Tratamento recursivo de listas

Exemplo 6. Tamanho de uma listaExemplo 6. Tamanho de uma lista

/* 1 */ /* 1 */ /* 1 */ /* 1 */ tamtamtamtam([],0).([],0).([],0).([],0).

/* 2 */ /* 2 */ /* 2 */ /* 2 */ tamtamtamtam([_|Y([_|Y([_|Y([_|Y2222],T],T],T],T2222) :) :) :) :---- tam(Ytam(Ytam(Ytam(Y2222,R,R,R,R2222), T), T), T), T2222 is Ris Ris Ris R2222+1.+1.+1.+1.

/* 1 */ /* 1 */ /* 1 */ /* 1 */ tamtamtamtam([],0).([],0).([],0).([],0).

/* 2 */ /* 2 */ /* 2 */ /* 2 */ tamtamtamtam([_|Y([_|Y([_|Y([_|Y2222],T],T],T],T2222) :) :) :) :---- tam(Ytam(Ytam(Ytam(Y2222,R,R,R,R2222), T), T), T), T2222 is Ris Ris Ris R2222+1.+1.+1.+1.

????---- tam([a,b],N).tam([a,b],N).tam([a,b],N).tam([a,b],N).

????---- tam([b],Rtam([b],Rtam([b],Rtam([b],R ), N), N), N), N is Ris Ris Ris R +1+1+1+1....

2, Y1=[b], T1=N

A cada chamada recursiva, as

variáveis são renomeadas!

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 16

????---- tam([a,b],N).tam([a,b],N).tam([a,b],N).tam([a,b],N).

N = 2N = 2N = 2N = 2

yesyesyesyes

????---- tam([b],Rtam([b],Rtam([b],Rtam([b],R1111), N), N), N), N is Ris Ris Ris R1111+1+1+1+1....

????---- tam([],Rtam([],Rtam([],Rtam([],R2222), R), R), R), R1111 is Ris Ris Ris R2222+1, N is R+1, N is R+1, N is R+1, N is R1111+1.+1.+1.+1.

1, R2=0

????----

2, Y2=[], R1=T2

????---- RRRR1111 is 0+1, N is Ris 0+1, N is Ris 0+1, N is Ris 0+1, N is R1111+1.+1.+1.+1.

????---- N is 1+1.N is 1+1.N is 1+1.N is 1+1.

R1=1

N=2

Page 17: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Tratamento recursivo de listas

A cada chamada recursiva, as

variáveis são renomeadas!

Exemplo 7. Concatenação de listasExemplo 7. Concatenação de listas

/* 1 */ /* 1 */ /* 1 */ /* 1 */ concatconcatconcatconcat([],B,B).([],B,B).([],B,B).([],B,B).

/* 2 */ /* 2 */ /* 2 */ /* 2 */ concatconcatconcatconcat([X([X([X([X2222|A|A|A|A2222],B],B],B],B2222,[X,[X,[X,[X2222|C|C|C|C2222]) :]) :]) :]) :---- concat(Aconcat(Aconcat(Aconcat(A2222,B,B,B,B2222,C,C,C,C2222).).).).

/* 1 */ /* 1 */ /* 1 */ /* 1 */ concatconcatconcatconcat([],B,B).([],B,B).([],B,B).([],B,B).

/* 2 */ /* 2 */ /* 2 */ /* 2 */ concatconcatconcatconcat([X([X([X([X2222|A|A|A|A2222],B],B],B],B2222,[X,[X,[X,[X2222|C|C|C|C2222]) :]) :]) :]) :---- concat(Aconcat(Aconcat(Aconcat(A2222,B,B,B,B2222,C,C,C,C2222).).).).

????---- concat([a,b],[c,d],R).concat([a,b],[c,d],R).concat([a,b],[c,d],R).concat([a,b],[c,d],R).

2, X1=a, A1=[b], B1=[c,d], R=[aaaa|C1]

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 17

????---- concat([a,b],[c,d],R).concat([a,b],[c,d],R).concat([a,b],[c,d],R).concat([a,b],[c,d],R).

R = [a,b,c,d]R = [a,b,c,d]R = [a,b,c,d]R = [a,b,c,d]

yesyesyesyes

????---- concat([b],[c,d],Cconcat([b],[c,d],Cconcat([b],[c,d],Cconcat([b],[c,d],C1111))))....

????---- concat([],[c,d],Cconcat([],[c,d],Cconcat([],[c,d],Cconcat([],[c,d],C2222).).).).

1, B3=[c,d], C2=[c,dc,dc,dc,d]

2, X2=b, A2=[], B2=[c,d], C1=[bbbb|C2]

????----

Page 18: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Tratamento recursivo de listas

Exercício 6. Altere esta definição para exibir os itens da lista em ordem inversaExercício 6. Altere esta definição para exibir os itens da lista em ordem inversa

exibaexibaexibaexiba([]).([]).([]).([]).exibaexibaexibaexiba([X|Y]) :([X|Y]) :([X|Y]) :([X|Y]) :---- writeln(X), exiba(Y).writeln(X), exiba(Y).writeln(X), exiba(Y).writeln(X), exiba(Y).exibaexibaexibaexiba([]).([]).([]).([]).exibaexibaexibaexiba([X|Y]) :([X|Y]) :([X|Y]) :([X|Y]) :---- writeln(X), exiba(Y).writeln(X), exiba(Y).writeln(X), exiba(Y).writeln(X), exiba(Y).

Exercício 7. Acesso ao último item de uma listaExercício 7. Acesso ao último item de uma lista

Defina o predicado último(L,X)último(L,X)último(L,X)último(L,X), que dá o último item XXXX armazenado na lista LLLL. Defina o predicado último(L,X)último(L,X)último(L,X)último(L,X), que dá o último item XXXX armazenado na lista LLLL.

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 18

Exercício 8. Soma dos itens de uma listaExercício 8. Soma dos itens de uma lista

Com base na definição do predicado tam/2tam/2tam/2tam/2, defina o predicado soma(L,S)soma(L,S)soma(L,S)soma(L,S), que

determina a soma S dos itens armazenados na lista LLLL.

Com base na definição do predicado tam/2tam/2tam/2tam/2, defina o predicado soma(L,S)soma(L,S)soma(L,S)soma(L,S), que

determina a soma S dos itens armazenados na lista LLLL.

Exercício 9. Exclusão de um item da listaExercício 9. Exclusão de um item da lista

Usando o predicado concat/3concat/3concat/3concat/3, defina o predicado exclui(X,L1,L2)exclui(X,L1,L2)exclui(X,L1,L2)exclui(X,L1,L2), que dá a lista

L2L2L2L2 resultante da exclusão do item XXXX da lista L1L1L1L1.

Usando o predicado concat/3concat/3concat/3concat/3, defina o predicado exclui(X,L1,L2)exclui(X,L1,L2)exclui(X,L1,L2)exclui(X,L1,L2), que dá a lista

L2L2L2L2 resultante da exclusão do item XXXX da lista L1L1L1L1.

Page 19: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Tratamento recursivo de listas

Exercício 10. Permutação dos itens de uma listaExercício 10. Permutação dos itens de uma lista

Usando o predicado exclui/3exclui/3exclui/3exclui/3, defina o predicado permutação(L,P)permutação(L,P)permutação(L,P)permutação(L,P), que dá uma

permutação PPPP da lista LLLL.

Usando o predicado exclui/3exclui/3exclui/3exclui/3, defina o predicado permutação(L,P)permutação(L,P)permutação(L,P)permutação(L,P), que dá uma

permutação PPPP da lista LLLL.

Exercício 11. Inversão de uma listaExercício 11. Inversão de uma lista

Usando o predicado concat/3concat/3concat/3concat/3, defina o predicado inverte(L,I)inverte(L,I)inverte(L,I)inverte(L,I), que inverte a Usando o predicado concat/3concat/3concat/3concat/3, defina o predicado inverte(L,I)inverte(L,I)inverte(L,I)inverte(L,I), que inverte a

Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 19

Usando o predicado concat/3concat/3concat/3concat/3, defina o predicado inverte(L,I)inverte(L,I)inverte(L,I)inverte(L,I), que inverte a

ordem dos itens na lista LLLL, produzindo a lista IIII.

Usando o predicado concat/3concat/3concat/3concat/3, defina o predicado inverte(L,I)inverte(L,I)inverte(L,I)inverte(L,I), que inverte a

ordem dos itens na lista LLLL, produzindo a lista IIII.

Exercício 12. Item máximo de uma lista de númerosExercício 12. Item máximo de uma lista de números

Sem usar nenhum predicado previamente definido, defina o predicado máximo(L,M)máximo(L,M)máximo(L,M)máximo(L,M),

que dá o item de valor máximo MMMM armazenado numa lista de números LLLL.

Sem usar nenhum predicado previamente definido, defina o predicado máximo(L,M)máximo(L,M)máximo(L,M)máximo(L,M),

que dá o item de valor máximo MMMM armazenado numa lista de números LLLL.

Page 20: Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser resolvida diretamente , já que não pode ser reduzida a outra mais simples. Uma instância

Fim