Recursividade e listas Prof. Dr. Silvio do Lago Pereira Departamento de Tecnologia da Informação Faculdade de Tecnologia de São Paulo
Princípio de recursividade Recursividade é 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 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. Exemplo 1. Arrecadação de R$1500,00 para doação Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 2
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: instância original P( I ) solução de P( I ) reduz usa instância mais simples P( I ) obtém solução de P( I ) Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 3
Definições recursivas Uma 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. A cada passo, uma instância não-trivial é reduzida a 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. 2 3 8 reduz usa 2 2 4 reduz usa 2 1 2 reduz usa 2 0 1 Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 4
Definições recursivas Exemplo 1. Cálculo de potência com expoente natural % pot(x,n,p) : X elevado a N é P pot(_,0,1). % base pot(x,n,p) :- % passo N>0, % condição para redução M is N-1, % reduz a instância pot(x,m,r), % obtém a solução da instância mais simples P is X*R. % constrói solução da instância original Exercício 1. Cálculo de fatorial % fat(n,f) : o fatorial de N é F fat(0,1). % base fat(n,f) :-...... % passo Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 5
Definições recursivas Exemplo 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 Transferir os discos de uma torre para outra, imediatamente A B C Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 6
Definições recursivas Exercício 2. Torres de Hanói hanói(0,_,_,_). % base hanói(n,origem,auxiliar,destino) :-...... % passo Complete e teste o predicado hanói/4, com base na idéia esquematizada a seguir: mova n-1 discos de A para B mova 1 disco de A para C mova n-1 discos de B para C A B C A B C A B C A B C Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 7
Definições recursivas Exercício 3. Exibição de números em binário exibe_binário(n) :- % base N<2,!, % condição para base write(n). % solução trivial exibe_binário(n) :- % passo...... % se chegou aqui, então N>=2 Complete e teste exibe_binário/1, com base na idéia esquematizada a seguir: reduz reduz reduz 13 6 3 1 usa usa usa 1101 110 11 1 Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 8
Relações transitivas Uma relação r/2 é transitiva se r(x,y) e r(y,z) implicam r(x,z) Uma relação transitiva pode ser definida, recursivamente, a partir de uma relação base. Exemplo 3. Ancestrais de uma pessoa pai(adão,cain). pai(adão,abel). pai(adão,seth). pai(seth,enos). ancestral(x,y) :- % base pai(x,y). X X ancestral pai ancestral Y Y ancestral(x,y) :- % passo pai(x,z), ancestral(z,y). pai Z ancestral Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 9
Relações transitivas Exercício 4. A relação transitiva acima/2 sobre(b,a). sobre(d,b). sobre(d,c). sobre(e,d). Usando a relação sobre/2, defina a relação acima/2 e faça as consultas a seguir:?- sobre(d,a).?- acima(d,a).?- sobre(d,x).?- acima(d,x). B A E D C?- acima(x,a). Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 10
Listas
Listas Uma lista é uma seqüência de itens separados por vírgulas e delimitados por colchetes?- [X Y] = [terra, sol, lua]. X = terra Y = [sol, lua]?- [X Y] = [estrela]. X = estrela Y = [] cabeça (primeiro item) [X Y] cauda (demais itens)?- [X Y] = []. no O acesso aos itens de uma lista é feito por meio de casamento de padrões! Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 12
Listas Exercício 5. Uso de padrões Veja os resultados das consultas:?- [1,2,3,4] = [A R].?- [1,2,3,4] = [A,B R].?- [1,2,3,4] = [A,B,C].?- [1,2,3,4] = [A,B,C R].?- [1,2,3,4] = [A,B,C,D].?- [1,2,3,4] = [A,B,C,D R]. Padrão Itens na lista [] nenhum [X] [X Y] [X,Y] exatamente um pelo menos um exatamente dois [X,Y Z] pelo menos dois [X,Y,Z] exatamente três Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 13
Tratamento recursivo de listas Exemplo 4. Exibição dos itens de uma lista /* 1 */ exiba([]). /* 2 */ exiba([x 2 Y 2 ]) :- writeln(x 2 ), exiba(y 2 ). A cada chamada recursiva, as variáveis da regra são renomeadas!?- exiba([a,b]). a b yes?- exiba([a,b]). 2, X 1 =a, Y 1 =[b]?- writeln(a), exiba([b]).?- exiba([b]). 2, X 2 =b, Y 2 =[]?- writeln(b), exiba([]).?- exiba([]). 1?- Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 14
Tratamento recursivo de listas Exemplo 5. Verificação de pertinência /* 1 */ membro(x,[x _]). /* 2 */ membro(x 3,[_ Y 3 ]) :- membro(x 3,Y 3 ). A cada chamada recursiva, as variáveis da regra são renomeadas!?- membro(d,[a,b,c,d,e]). yes?- membro(d,[a,b,c,d,e]). 2, X 1 =d, Y 1 =[b,c,d,e]?- membro(d,[b,c,d,e]). 2, X 2 =d, Y 2 =[c,d,e]?- membro(d,[c,d,e]). 2, X 3 =d, Y 3 =[d,e]?- membro(d,[d,e]). 1, X=d?- Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 15
Tratamento recursivo de listas Exemplo 6. Tamanho de uma lista /* 1 */ tam([],0). /* 2 */ tam([_ Y 2 ],T 2 ) :- tam(y 2,R 2 ), T 2 is R 2 +1. A cada chamada recursiva, as variáveis são renomeadas!?- tam([a,b],n). N = 2 yes?- tam([a,b],n). 2, Y 1 =[b], T 1 =N?- tam([b],r 1 ), N is R 2, Y 2 =[], R 1 =T 2 is R 1 +1.?- tam([],r 2 ), R 1 is R 2 +1, N is R 1 +1. 1, R 2 =0?- R 1 is 0+1, N is R 1 +1. R 1 =1?- N is 1+1. N=2?- Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 16
Tratamento recursivo de listas Exemplo 7. Concatenação de listas /* 1 */ concat([],b,b). /* 2 */ concat([x 2 A 2 ],B 2,[X 2 C 2 ]) :- concat(a 2,B 2,C 2 ). A cada chamada recursiva, as variáveis são renomeadas!?- concat([a,b],[c,d],r). R = [a,b,c,d] yes?- concat([a,b],[c,d],r). 2, X 1 =a, A 1 =[b], B 1 =[c,d], R=[a C 1 ]?- concat([b],[c,d],c 1 ). 2, X 2 =b, A2=[], B2=[c,d], C 1 =[b C 2 ]?- concat([],[c,d],c 2 ). 1, B 3 =[c,d], C 2 =[c,d c,d]?- Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 17
Tratamento recursivo de listas Exercício 6. Altere esta definição para exibir os itens da lista em ordem inversa exiba([]). exiba([x Y]) :- writeln(x), exiba(y). Exercício 7. Acesso ao último item de uma lista Defina o predicado último(l,x), que dá o último item X armazenado na lista L. Exercício 8. Soma dos itens de uma lista Com base na definição do predicado tam/2, defina o predicado soma(l,s) determina a soma S dos itens armazenados na lista L. Exercício 9. Exclusão de um item da lista soma(l,s), que Usando o predicado concat/3, defina o predicado exclui(x,l1,l2), que dá a lista L2 L1. L2 resultante da exclusão do item X da lista L1 Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 18
Tratamento recursivo de listas Exercício 10. Permutação dos itens de uma lista Usando o predicado exclui/3, defina o predicado permutação(l,p), que dá uma permutação P da lista L. Exercício 11. Inversão de uma lista Usando o predicado concat/3, defina o predicado inverte(l,i), que inverte a ordem dos itens na lista L, produzindo a lista I. Exercício 12. Item máximo de uma lista de números Sem usar nenhum predicado previamente definido, defina o predicado máximo(l,m) que dá o item de valor máximo M armazenado numa lista de números L. máximo(l,m), Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 19
Fim