Skip to content

Instantly share code, notes, and snippets.

@tonussi
Created December 4, 2013 17:02
Show Gist options
  • Save tonussi/7791252 to your computer and use it in GitHub Desktop.
Save tonussi/7791252 to your computer and use it in GitHub Desktop.
grupo5.pro (corrigido)
%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