Created
December 4, 2013 17:02
-
-
Save tonussi/7791252 to your computer and use it in GitHub Desktop.
grupo5.pro (corrigido)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
%INE5364 Programação em Lógica - 2013-2 | |
%Lista de Exercícios envolvendo listas encadeadas: | |
% Tarefa: Implemente as cláusulas em PROLOG referente aos procedimentos | |
% para o manuseio de listas, de acordo com os enunciados a seguir. | |
% Coloque as respostas de cada um dos exercícios na caixa de edição de | |
% texto abaixo copiando o enunciado como comentários em prolog, seguido | |
% da solução proposta em cada um deles. | |
% (ling, who, inst, curso, id) → (prolog, lucas-tonussi, ufsc, cco, | |
% 12106577) | |
%Exercício 0x00000001 | |
%Predicado: primeiro(L, P) | |
%Definição: L é uma lista e P é o primeiro dado de L. | |
% Meu predicado divide em primeiro elemento, e segundo (lista). Basta | |
% entrar com primeiro(X, Y, [1,2,3]). | |
%passo-basico | |
primeiro([]). | |
%passo-indutivo | |
primeiro(Cabecalho, Cauda, [Cabecalho | Cauda]). | |
% DE ACORDO COM O ENUNCIADO DEVERIA SER UM PREDICADO COM DOIS ARGUMENTOS | |
% Resposta: Verdade. | |
% Exercício 0x00000002 | |
%Predicado: segundo(L, S) | |
% Definição: L é uma lista e S é o segundo dado de L. | |
%passo-basico | |
segundo([], S) :- S is []. | |
%passo-indutivo | |
segundo([_, S|_], S). | |
% OK | |
% [trace] ?- segundo([1,v,3,d,5], X). | |
% Call: (7) segundo([1, v, 3, d, 5], _G1065) ? creep | |
% Exit: (7) segundo([1, v, 3, d, 5], v) ? creep | |
% X = v. | |
%Exercício 0x00000003 | |
%Predicado: ultimo(L, U) | |
%Definição: L é uma lista e U é o último dado de L. | |
%passo-basico | |
ultimo([L], L). | |
%passo-indutivo | |
ultimo([_|U], L) :- ultimo(U, L). | |
% OK | |
% [trace] ?- ultimo([1,1,3,4,5], X). | |
% Call: (7) ultimo([1, 1, 3, 4, 5], _G1065) ? creep | |
% Call: (8) ultimo([1, 3, 4, 5], _G1065) ? creep | |
% Call: (9) ultimo([3, 4, 5], _G1065) ? creep | |
% Call: (10) ultimo([4, 5], _G1065) ? creep | |
% Call: (11) ultimo([5], _G1065) ? creep | |
% Exit: (11) ultimo([5], 5) ? creep | |
% Exit: (10) ultimo([4, 5], 5) ? creep | |
% Exit: (9) ultimo([3, 4, 5], 5) ? creep | |
% Exit: (8) ultimo([1, 3, 4, 5], 5) ? creep | |
% Exit: (7) ultimo([1, 1, 3, 4, 5], 5) ? creep | |
% X = 5. | |
%Exercício 0x00000004 | |
%Predicado: penultimo(L, P) | |
%Definição: L é uma lista e P é o penúltimo de L. | |
%passo-basico | |
penultimo(X, [X,_]). | |
%passo-indutivo | |
penultimo(X, [_,Y|Ys]) :- penultimo(X, [Y|Ys]). | |
% OK | |
%Exercício 0x00000005 | |
%Predicado: tamanho(L, T) | |
%Definição: L é uma lista e T é o número de dados de L. | |
%passo-basico | |
tamanho([], 0). | |
%passo-indutivo | |
tamanho([Cabecalho|Cauda], Contador) :- !, tamanho(Cauda, Temp), Contador is Temp + 1. | |
% OK | |
%Exercício 0x00000006 | |
%Predicado: pertence(D, L) | |
%Definição: L é uma lista e D é um dos dados de L | |
%passo-basico | |
pertence(D, [D|L]). | |
%passo-indutivo | |
pertence(D, [Temp|Cauda]) :- pertence(D, Cauda). | |
% OK | |
% | |
% O unitário 2 não pertence a 2, Nessa Forma. | |
% ?- pertence(2, 2). | |
% false. | |
% O conjunto vazio não pertence a conjunto vazio. | |
% ?- pertence([], []). | |
% false. | |
% O conjunto [1,2] não pertence a [2,3] | |
% ?- pertence([1,2], [2,3]). | |
% false. | |
% O unitário 2 pertence ao conjunto [1,2] | |
% ?- pertence(2, [1,2]). | |
% true. | |
%Exercício 0x00000007 | |
%Predicado: posicao(D, L, Pos) | |
% Definição: L é uma lista e Pos é a posição (iniciando com 1) do dado D | |
% na lista L. Pos = 0 caso dado não esteja em L. | |
% Nota: Não consegui, Pos = 0, ele retorna False, Não existe na lista. | |
% Tentei usar o built-in write() para mostrar, mas também não consegui | |
% usar. | |
%passo-basico | |
posicao(D, 0, [D|Cauda]). % Quando L == 0 | |
posicao(_, -1, []). % Quando L == -1 | |
%passo-indutivo | |
posicao(D, D, [_|Temp]):- !, posicao(D, B, Temp), B > -1, D is B + 1 + 1. | |
posicao(D, D, [_|Temp]):- !, posicao(D, B, Temp), B = 0, B is 0, D is B. | |
% INCORRETO | |
% ?- posicao(c,P,[a,b,c,d]). | |
% false. | |
% Realmente errei. E ela precisa só de alguns ajustes. Você pode me dizer o que eu preciso concertar nos meus predicados para ele contar? | |
% [trace] ?- posicao(c,P,[a,b,c,d]). | |
% Call: (6) posicao(c, _G626, [a, b, c, d]) ? creep | |
% Call: (7) posicao(c, _G710, [b, c, d]) ? creep | |
% Call: (8) posicao(c, _G710, [c, d]) ? creep | |
% Exit: (8) posicao(c, 0, [c, d]) ? creep | |
% ^ Call: (8) 0 > -1 ? creep | |
% ^ Exit: (8) 0 > -1 ? creep | |
% ^ Call: (8) c is 0+1+1 ? creep | |
% ^ Fail: (8) c is 0+1+1 ? creep | |
% Redo: (8) posicao(c, _G710, [c, d]) ? creep | |
% Call: (9) posicao(c, _G710, [d]) ? creep | |
% Call: (10) posicao(c, _G710, []) ? creep | |
% Exit: (10) posicao(c, -1, []) ? creep | |
% ^ Call: (10) -1 > -1 ? creep | |
% ^ Fail: (10) -1 > -1 ? creep | |
% Redo: (10) posicao(c, _G710, []) ? creep | |
% Fail: (10) posicao(c, _G710, []) ? creep | |
% Fail: (9) posicao(c, _G710, [d]) ? creep | |
% Fail: (8) posicao(c, _G710, [c, d]) ? creep | |
% Fail: (7) posicao(c, _G710, [b, c, d]) ? creep | |
% Fail: (6) posicao(c, _G626, [a, b, c, d]) ? creep | |
% false. | |
%Exercício 0x00000008 | |
%Predicado: removidoPrimeiro(L, LR) | |
% Definição: L é uma lista e LR é uma lista com os mesmos dados de L | |
% menos o primeiro. | |
%passo-basico | |
removidoPrimeiro([_|Cauda], Cauda). | |
% OK | |
%Exercício 0x00000009 | |
%Predicado: removidoUltimo(L, LR) | |
% Definição: L é uma lista e LR é uma lista com os mesmos dados de L | |
% menos o último ver cut. | |
%passo-basico | |
removidoUltimo([_], []). | |
%passo-indutivo | |
removidoUltimo([Temp], MenosUltimo) :- !, retira([Temp], Temp, MenosUltimo). | |
removidoUltimo([_|Cauda], MenosUltimo) :- !, removidoUltimo(Cauda, MenosUltimo). | |
% INCORRETO, Tens razão, mas também não entende o que eu fiz de errado. | |
% ?- removidoUltimo([a,b,c,d], L). | |
% L = [] | |
% [trace] ?- removidoUltimo([a,b,c,d], L). | |
% Call: (6) removidoUltimo([a, b, c, d], _G574) ? creep | |
% Call: (7) removidoUltimo([b, c, d], _G574) ? creep | |
% Call: (8) removidoUltimo([c, d], _G574) ? creep | |
% Call: (9) removidoUltimo([d], _G574) ? creep | |
% Exit: (9) removidoUltimo([d], []) ? creep | |
% Exit: (8) removidoUltimo([c, d], []) ? creep | |
% Exit: (7) removidoUltimo([b, c, d], []) ? creep | |
% Exit: (6) removidoUltimo([a, b, c, d], []) ? creep | |
% L = [] . | |
% Exercício 0x00000010 | |
%Predicado: substituidoUltimo(D, L, LM) | |
% Definição: L é uma lista e LM é uma lista com os mesmos dados de L com | |
% exceção do último que é D. | |
%passo-basico | |
substituidoUltimo(D, L, LM). | |
%passo-indutivo | |
troca(L, R) :- substituidoUltimo(L,R). | |
substituidoUltimo([H|T1], [H|_]) :- substituidoUltimo(T1, _). | |
% INCORRETO | |
% ?- substituidoUltimo(x, [a, b, c, d], L). | |
% true. | |
%Exercício 0x00000011 | |
%Predicado: inseridoNoInicio(D, L, LM) | |
% Definição: D é um dado, L é uma lista e LM é a lista L mais o dado D no | |
% início. | |
%passo-basico | |
inseridoNoInicio([], L, L). | |
%passo-indutivo | |
inseridoNoInicio([Cabecalho | Cauda], ListaTemp, [Cabecalho | CaudaTemp]) :- | |
inseridoNoInicio(ListaTemp, CaudaTemp, Cauda). | |
%% %INCORRETO | |
%[1] 16 ?- inseridoNoInicio(x,[a,b,c,d],L). | |
%false. | |
%[1] 17 ?- inseridoNoInicio([a,b,c,d],x,L). | |
%false. | |
%[1] 18 ?- inseridoNoInicio([a,b,c,d],L,x). | |
%false. | |
% | |
%[1] 23 ?- inseridoNoInicio([a,b,c,d],[e,f],L). | |
%false. | |
%[1] 24 ?- inseridoNoInicio([a,b,c,d],L,[e,f]). | |
%false. | |
%Exercício 0x00000012 | |
%Predicado: inseridoNoFinal(D, L, LM) | |
% Definição: D é um dado, L é uma lista e LM é a lista L mais o dado D no | |
% final. Fiz assim: List is [] + List_ | |
%passo-basico | |
inseridoNoFinal([], L, L). | |
%passo-indutivo | |
inseridoNoFinal([Cabecalho | Cauda], ListaTemp, [Cabecalho | CaudaTemp]) :- | |
inseridoNoFinal(Cauda, ListaTemp, CaudaTemp). | |
%% %INCORRETO | |
%[1] 19 ?- inseridoNoFinal(x,[a,b,c,d],L). | |
%false. | |
%[1] 20 ?- inseridoNoFinal([a,b,c,d],x,L). | |
%L = [a, b, c, d|x]. | |
%[1] 21 ?- inseridoNoFinal([a,b,c,d],L,x). | |
%false. | |
%[1] 22 ?- inseridoNoFinal([a,b,c,d],[e,f],L). | |
%L = [a, b, c, d, e, f]. %ISSO É CONCATENAÇÃO DE DUAS LISTAS | |
%Exercício 0x00000013 | |
%Predicado: inseridoNaPos(D, Pos, L, LM) | |
% Definição: D é um dado, Pos é a posição onde D deve ser inserido na | |
% lista L e LM é a lista L mais o dado D na posição Pos. | |
%passo-basico | |
inseridoNaPos(D, 1, L, [D | L]). | |
%passo-indutivo | |
inseridoNaPos(D, Pos, [P | R], [P | R2]) :- Pos > 1, Pos1 is Pos - 1, inseridoNaPos(D, Pos1, R, R2). | |
%% %OK | |
% | |
%Exercício 0x00000014 | |
%Predicado: removidoDaPos(L, Pos, D, LM) | |
% Definição: L é uma lista, Pos é a posição do dado a ser removido, D é o | |
% dado removido e LM é a lista L sem o dado removido. | |
%passo-basico | |
removidoDaPos(L, [P|R], P, R). | |
%passo-indutivo | |
removidoDaPos(Pos, [P|R], D, [P|RM]) :- Pos > 1, Pos1 is Pos - 1, removidoDaPos(Pos1, R, D, RM). | |
%% %INCORRETO | |
%[1] 27 ?- removidoDaPos([a,b,c],0,a,L). | |
%false. | |
%[1] 28 ?- removidoDaPos([a,b,c],1,a,L). | |
%false. | |
%% 8 CORRETAS E 7 INCORRETAS |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment