Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser...
Transcript of Prof. Dr. Silvio do Lago Pereira - IME-USPslago/ia-6u.pdf · Uma instância trivial deve ser...
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
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.
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
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
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
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
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
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
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
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
Listas
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)
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].
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
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
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
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]
????----
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.
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.
Fim