












































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
lorem ipsum dolor sit amet consectetur adipiscing elit
Tipologia: Exercícios
1 / 52
Esta página não é visível na pré-visualização
Não perca as partes importantes!













































Programação em Lógica
2004/ LEIC (3º Ano) 1º Sem
Exercícios RC– Representação de Conhecimento em Prolog
Escreva frases em Prolog que representem o seguinte conhecimento:
Os Maias, livro, Eça de Queiroz, português, inglês, romance, escreveu, autor, nacionalidade, tipo, ficção
Escreva as seguintes questões em Prolog:
a) Quem escreveu “Os Maias”? b) Que autores portugueses escrevem romances? c) Quais os autores de livros de ficção que escreveram livros de outro tipo também?
Escreva frases em Prolog que representem o seguinte conhecimento:
peru, frango, salmão, solha, cerveja, vinho verde, vinho maduro, Ana, António, Barbara, Bruno, gosta, casado, combina
Escreva as seguintes questões em Prolog:
a) Ana e Bruno são casados e gostam de vinho verde? b) Que bebida combina com salmão? c) Que comidas combinam com vinho verde?
Escreva frases em Prolog que representem o seguinte conhecimento:
João, Maria, Ana, casa, cão, xadrez, damas, ténis, natação, apartamento, gato, tigre, homem, mulher, animal, mora_em, gosta_de, jogo, desporto
Escreva as seguintes questões em Prolog:
a) Quem mora num apartamento e gosta de animais? b) Será que o João e a Maria moram numa casa e gostam de desportos? c) Quem gosta de jogos e de desportos? d) Existe alguma mulher que gosta de ténis e gosta de tigres?
Traduza as seguintes frases para Prolog:
“Tweety é um pássaro. Goldie é um peixe. Molie é uma minhoca. Pássaros gostam de minhocas. Gatos gostam de peixes. Gatos gostam de pássaros. Amigos gostam uns dos outros. O meu gato é meu amigo. O meu gato come tudo o que gosta. O meu gato chama-se Silvester.”
a) Use Prolog para determinar tudo o que come o Silvester? b) A resposta é razoável? Se não for, verifique se o problema está na especificação original ou na sua tradução para Prolog, corrija e execute novamente.
Um estudante acostumado a usar linguagens procedimentais está a desenvolver um compilador em Prolog. Uma das tarefas consiste em traduzir um código de erro para uma pseudo-descrição em português. O código por ele usado é:
frequenta(maria, feup). frequenta(joel, ist). professor(carlos, paradigmas). professor(ana_paula, estruturas). professor(pedro, lab2). funcionario(pedro, ist). funcionario(ana_paula, feup). funcionario(carlos, feup).
Escreva as seguintes regras em prolog:
a) Quem são os alunos do professor X? b) Quem são as pessoas da universidade X? (alunos ou docentes) c) Quem é colega de quem? Se aluno: é colega se for colega de disciplina ou colega de curso ou colega de universidade. Se professor: se for professor da mesma universidade.
Considere a seguinte base de factos exemplo:
comprou(joao, honda). ano(honda, 1997). comprou(joao, uno). ano(uno, 1998). valor(honda, 20000). valor(uno, 7000).
Programação em Lógica
2004/ LEIC (3º Ano) 1º Sem
Exercícios IP– Introdução ao Prolog
Suponha a seguinte representação do conhecimento relativo a objectos e relações de posição:
objecto(obj1). objecto(obj2). objecto(obj3). objecto(obj4). objecto(obj5). material(obj1,madeira). material(obj2,madeira). material(obj3, vidro). material(obj4, vidro). material(obj5, ferro).
tipo(obj1, mesa). tipo(obj2, cadeira). tipo(obj3, mesa). tipo(obj4, jarra). tipo(obj5, matraca). peso(obj1, 10.5). peso(obj2, 1.5). peso(obj3, 1.6). peso(obj4, 0.5). peso(obj5, 1.8).
fragil(vidro). forte(ferro). sobre(obj4, obj1). sobre(obj3, obj1). sobre(obj5, obj3).
a) Escreva o predicado debaixo(O1,O2) que sucede se o objecto O1 está debaixo (directamente) do objecto O2. b) Escreva o predica objectos(Lista) que calcula a Lista de objectos existentes no mundo (Lista=[obj1,obj2,obj3,obj4,obj5]) c) Escreva o predicado objectos_descricao(Lista), que retorne uma lista com a descrição de todos os objectos, incluindo o seu nome, material, tipo e peso ( [obj1-madeira-mesa-10.5, obj2-madeira- cadeira-1.5, …, obj5-ferro-matraca-1.8] ). d) Escreva o predicado tipos_objectos(Lista), que retorne uma lista com todos os tipos de objecto ( [mesa,cadeira,jarra,matraca] ), sem elementos repetidos. e) Escreva o predicado media_resistencia(Obj) que sucede se o objecto não é frágil nem é forte. f) Escreva o predicado mais_leve(O1,O2,Dif) que recebe como argumentos dois objectos e sucede se o primeiro for mais leve do que o segundo, retornando a diferença de peso entre eles. g) Escreva o predicado um_deles_fragil(O1,O2,Mat) que recebe como argumentos dois objectos e sucede unicamente se um dos objectos for composto por um material frágil e o outro não, retornando qual é esse material frágil. h) Escreva o predicado por_cima_indirecto(O1,O2) que sucede se o objecto O1 está sobre um objecto que por sua vez está sobre O2. i) Escreva o predicado sobre_mesmo(O1,O2,Obase) que sucede se dois objectos se encontram directamente sobre o mesmo objecto e retorne o objecto em causa. j) Escreva o predicado objectos_tipo(Tipo,Lista) que determine a lista de todos os objectos de um dado tipo. k) Escreva o predicado nao_toca_material(Obj) que sucede se um dado objecto não toca em nenhum objecto composto do mesmo material. l) Escreva o predicado eu_sou_original(Obj) que sucede se um dado objecto é o único de um dado tipo ou é o único de um dado material.
Programação em Lógica
2003/ LEIC (3º Ano) 1º Sem
Exercícios IP– Introdução ao Prolog
Suponha a seguinte representação do conhecimento relativo a diversas pessoas. homem(americo). homem(daniel). homem(paulo). homem(carlos). homem(joaquim). homem(filipe). mulher(teresa). mulher(sonia). mulher(ana).
mulher(carla). mulher(barbara). mulher(maria). idade(americo, 18). idade(paulo, 25). idade(carlos, 37). idade(filipe, 32). idade(teresa, 18). idade(sonia, 28).
idade(joana, 17). idade(carla, 26). idade(barbara, 51). idade(daniel, 60). idade(joaquim, 80). idade(maria, 79). irmaos(americo, paulo). irmaos(carlos, sonia). pai(carlos, teresa).
pai(daniel, americo). pai(daniel, paulo). pai(joaquim, daniel). mae(maria, daniel). mae(barbara, joana). casados(filipe, carla). casados(americo,teresa). casados(joaquim, maria).
a) Escreva o predicado pessoas(Lista) que calcula a Lista de todas as pessoas existentes na base de factos.
b) Escreva o predicado avof(Mul, Pess) em que Mul seja avó de Pess.
c) Escreva o predicado avom(Hom, Pess) em que Hom seja avô de Pess.
d) Escreva o predicado bisavom(Hom, Pess) que suceda se Hom for bisavô de Pess.
e) Escreva os predicados tio(Hom, Pess) e tia(Hom, Pess) que sucedem se Hom (Mul) for tio/tia de Pess.
f) Escreva os predicados neto(Hom, Pess) e neta(Hom, Pess) que sucedem se Hom (Mul) for neto/neta de Pess.
g) Escreve o predicado primo_1(P1, P2) que sucede se P1 e P2 forem primos no primeiro grau.
h) Escreve o predicado primo(P1, P2) que sucede se P1 e P2 forem primos no primeiro em qualquer grau.
i) Escreva o predicado maior_de_idade(Pess) que sucede se Pess for maior de idade.
j) Escreva o predicado mais_velho(Pess) que retorna a pessoa mais velha que consta na base de factos.
k) Escreva o predicado adequados(Hom, Mul) que sucede se Hom for um homem, Mul for uma mulher e o homem for (no máximo) mais novo 2 anos do que a mulher ou mais velho 10 anos do que ela e se ambos não tiverem nenhuma relação de parentesco nem nenhum deles for casado!
l) Escreva o predicado lista_pessoas(Lista,Sexo) que retorne uma lista de todas as pessoas do Sexo indicado (m/f), incluinda as suas respectivas idades. Por exemplo lista_pessoas(Lista, m) deveria retornar Lista=[americo-18, paulo-25, carlos-37, filipe-32].
m) Escreva o predicado numero_irmaos(Pess, N) que sucede se N for o número de irmãos de Pess.
n) Escreva o predicado lista_dos_mais_velhos_que_eu(Pess, Lista) que retorne uma lista com todas as pessoas mais velhas que Pess.
o) Escreva o predicado avos_e_netos(Lista) que retorne uma lista com todos os avos (homens ou mulheres e respectivos netos (Lista = [joaquim-daniel, maria-daniel]).
Luis Paulo Reis 8/
parte_de(estrutura,fogao). parte_de(cordao_electrico,fogao). parte_de(resistencia,estrutura). contem(resistencia,metal). parte_de(painel,estrutura). parte_de(botao,painel). contem(botao,plastico). parte_de(fio,cordao_electrico). contem(fio,metal). parte_de(isolador,cordao_electrico). contem(isolador,fibra).
?- contem(Obj, metal).
?- parte_de(Obj, estrutura).
Luis Paulo Reis / Eugénio da Costa Oliveira Pág. 10/
?- isolados_grandes(Lista). Lista = [europa, oceania] % europa pois possui a espanha e a italia e a oceania devido à austrália e indonésia
%1.1 a) pop_elevada(+Continente, -Lista). pop_elevada(Continente, Lista):- findall(Pop-Pais, (país(Pais, Continente, Pop, _), Pop>15), ListaIni), keysort(ListaIni, Lista).
% 1.1 b) isolados_grandes(Lista). isolados_grandes(Lista):- findall(Cont, (isolado_grande(Pais1, Cont), isolado_grande(Pais2, Cont) , Pais1=Pais2), Lista1), sort(Lista1, Lista). isolado_grande(Pais, Cont):- país(Pais, Cont, Pop, Front), Pop>15, length(Front, L), L<3.
% Outra versão isolados_grandes2(Lista):- findall(Cont, (país(,Cont,,_),findall(Pais1, isolado_grande2(Pais1, Cont), L), length(L,N), N>=2), Lista1), sort(Lista1, Lista). isolado_grande2(Pais, Cont):- país(Pais, Cont, Pop, Front), Pop>15, length(Front, L), L<3.
objecto(mesa1, vidro). objecto(cadeira, madeira). objecto(mesa2, madeira). objecto(bigorna, ferro). objecto(jarra, vidro). objecto(caixa, madeira).
peso(mesa1, 10). peso(cadeira, 2). peso(mesa2, 3). peso(bigorna, 20). peso(jarra, 0.5). peso(caixa, 2.5).
material(vidro, fragil). material(madeira, forte). material(ferro, forte).
sobre(cadeira, mesa1). sobre(mesa2,mesa1). %mesa2 em cima sobre(bigorna, mesa2). sobre(jarra, bigorna). sobre(caixa, jarra). % caixa em cima
?- sobre_tipo(madeira, L). L = [bigornasobremesa2] ?- sobre_tipo(vidro, L). L = [cadeirasobremesa1, mesa2sobremesa1, caixasobrejarra]
?- partem(L). L = [mesa1-2.8., jarra-5] %Partem a mesa pois tem 2.8 vezes o seu peso em cima (2+3+20+0.5+2.5=28kg) e a jarra que tem 5 vezes o seu peso em cima (pesa 0.5kg e tem a caixa com 2.5kg em cima).
Luis Paulo Reis / Eugénio da Costa Oliveira Pág. 11/
Faculdade de Engenharia da Universidade do Porto Licenciatura em Engenharia Informática e Computação
Programação em Lógica
(3º Ano) 1º Sem
Docentes: Luís Paulo Reis e Eugénio da Costa Oliveira
Exercício CR 1. Funcionamento do Backtracking
Considere a seguinte questão em PROLOG:
?- r(X,Y), s(Y,Z), not(r(Y,X)), not(s(Y,Y)).
tendo a seguinte base de dados:
r(a,b). r(a,c). r(b,a). r(a,d).
s(b,c). s(b,d). s(c,c). s(d,e).
a) Sem usar o computador, diga qual é a primeira resposta encontrada para a questão posta. (Tenha
em atenção que para encontrar a resposta não necessita de simular os passos dados pelo
interpretador de PROLOG).
b) Sem usar o computador, diga quantas vezes o interpretador retrocede do 3º para o 2º objectivo,
antes de obter a 1ª resposta.
Exercício CR 2. Funcionamento do Backtracking 2
Considere a seguinte base de factos Prolog:
a(a1,1).
a(A,2).
a(a3,N).
b(1,b1).
b(2,B).
b(N,b3).
c(X,Y) :- a(X,N), b(N,Y).
d(X,Y) :- a(X,N), b(Y,N).
d(X,Y) :- a(N,X), b(N,Y).
Efectue uma previsão de quais serão as respostas às seguintes perguntas e verifique-as utilizando-as o rastreio do Prolog
?- a(X,2).
?- b(X,kalamazoo).
?- c(X,b3).
?- c(X,Y).
?- d(X,Y).
Exercício CR 3. Funcionamento do Backtracking 3
Luis Paulo Reis / Eugénio da Costa Oliveira Pág. 13/
Faculdade de Engenharia da Universidade do Porto Licenciatura em Engenharia Informática e Computação
Programação em Lógica
(3º Ano) 1º Sem
Docentes: Luís Paulo Reis e Eugénio da Costa Oliveira
Exercício LIST 1. Funcionamento das Listas [H|T]
Preveja os resultados das seguintes questões em Prolog:
a) ?- [a|[b,c,d]] = [a,b,c,d].
b) ?- [a|b,c,d] = [a,b,c,d].
c) ?- [H|T] = [apple, broccoli, refrigerator].
d) ?- [H|T] = [a, b, c, d, e].
e) ?- [H|T] = [apples, bananas].
f) ?- [H|T] = [a, [b,c,d]].
g) ?- [H|T] = [apples].
h) ?- [H|T] = [].
i) ?- [One, Two | T] = [apple, sprouts, fridge, milk].
j) ?- [X,Y|T] = [a|Z].
k) ?- [H|T] = [apple, Z].
l) ?- [a|[b|[c|[d|[]]]]] = [a,b,c,d].
Solução:
a) yes
b) no
c) H = apple
T = [broccoli, refrigerator]
d) H = a
T = [b, c, d, e]
e) H = apples
T = [bananas]
f) H = a
T = [[b, c, d]]
g) H = apples
T = []
h) no
i) One = apple
Two = sprouts
T = [fridge, milk]
Luis Paulo Reis / Eugénio da Costa Oliveira Pág. 14/
j) X = a
Y = _
T = _
Z = [_01 | _03]
k) H = apple
T = [_01]
Z = _
l) yes
Exercício LIST 2. Funcionamento das Listas [H|T]
Resolva as igualdades, dizendo quais os valores finais das variáveis.
a) ?- lista([a,[b],c,[d]]) = lista([_|[X|X]).
b) ?- lista([[a],[b],C])=lista([C,B,[a]]).
c) ?- lista([c,c,c])=lista([X|[X|_]]).
d) ?- lista([a,[b,c]])=lista([A,B,C]).
e) ?- [joao,gosta,peixe]=[X,Y,Z].
f) ?- [gato]= lista([X|Y]).
g) ?- [vale,dos,sinos])=[sinos,X,Y].
h) ?- [branco,Q]=[P,cavalo].
i) ?- [1,2,3,4,5,6,7]=[X,Y,Z|D].
Exercício LIST 3. Concatenação de Listas - Predicado Append
Implemente o predicado append(L1,L2,L) em que L é constituída pela concatenação das listas L1 e
L2.
Solução:
append([],L,L).
append([X|L1],L2,[X|L3]):- append(L1,L2,L3).
Exercício LIST 4. Inversão de Listas
Construa um predicado inverter(L1, L2) que calcule a lista invertida de uma dada lista.
Solução:
inverter(Lista,InvLista):- rev(Lista,[],InvLista). rev([H|T],S,R):- rev(T,[H|S],R). rev([],R,R).
Exercício LIST 5. Membros de uma Lista - Predicado Member e Last
a) Implemente o predicado membro(X,L) que sucede se X for um membro da lista L. (member)
b) Utilizando unicamente o predicado append uma só vez, implemente o predicado membro(X,L). (member)
Luis Paulo Reis / Eugénio da Costa Oliveira Pág. 16/
a) Defina o predicado substitui(X,Y,Lista1,Lista2) que subsitui todas as ocorrências de X em Lista
por Y, resultando Lista2.
b) Defina o predicado elimina_duplicados(Lista1,Lista2) que elimina os duplicados em Lista1,
resultando Lista2.
Exercício LIST 10. Ordenação de Listas
a) Defina o predicado ordenada(Lista) que é verdadeiro se Lista é uma lista de inteiros ordenada.
b) Defina o predicado ordena(L1, L2) que ordena a lista L1, tendo como resultado L2.
Solução:
a) ordenada([N]).
ordenada([N1,N2]):- N1 =< N2.
ordenada([N1,N2|Resto]):-
N1 =< N2, ordenada([N2|Resto]).
Exercício LIST 11. Achatar Listas
Defina a relação achata_lista(Lista,ElemsLista) em que Lista é uma lista eventualmente de listas e
ElemsLista é uma lista com todos os elementos de Lista ao mesmo nível.
Exemplo:
?- achata_lista([a, [1,2,3], b],L).
L=[a,1,2,3,b]
Solução:
achata_lista([],[]).
achata_lista(X,[X]):- atomic(X).
achata_lista([Cab|Rest],L):-
achata_lista(Cab,L1), achata_lista(Rest,L2), append(L1,L2,L).
Exercício LIST 12. Calcular Permutações
Construa um predicado permutacao(L1,L2) que resulte se L2 for uma permutação de L.
Exercício LIST 13. Listas de Números.
a) Construa um predicado lista_ate(N,L) que devolva a lista L de todos os números inteiros entre 1 e N.
b) Construa um predicado lista_entre(N1,N2,L) que devolva a lista L de todos os números inteiros entre N1 e N2 (ambos incluídos).
Luis Paulo Reis / Eugénio da Costa Oliveira Pág. 17/
c) Construa um predicado soma_lista(L, Soma), que some todos os elementos da lista L, obtendo como resultado Soma.
d) Escreva um predicado par(N) que dado um número inteiro N, determine se ele é ou não um número par.
e) Escreva um predicado lista_pares(N, Lista) que aceite um número inteiro e que determine a lista de todos os números pares iguais ou inferiores a esse número.
f) Escreva um predicado lista_impares(N, Lista) que aceite um número inteiro e que determine a lista de todos os números impares iguais ou inferiores a esse número.
Exercício LIST 14. Números Primos
a) Escreva um predicado primo(N) que dado um número inteiro N, determine se ele é ou não um número primo (um número primo é aquele que só é divisível por 1 e por ele próprio).
b) Escreva um predicado lista_primos(N, Lista) que aceite um número inteiro e que determine a lista de todos os números primos iguais ou inferiores a esse número.
Exercício LIST 15. Produto Interno de Vectores
Construa um predicado produto_interno (L1, L2, N) que calcule o produto interno das listas L1 e L2.
Exercício LIST 16. Predicado Mistério
Considere a seguinte definição do predicado mistério:
misterio([],[]).
misterio([X],[X]).
misterio([X,Y|L],[X,censurado|M]):- misterio(L,M).
a) Descreva o que o predicado faz sobre uma lista constituída por palavras.
b) É comum as definições recursivas de manipulação de listas terem unicamente uma condição de
base. Porque necessita a definição acima de duas condições de base?
Exercício LIST 17. Listas Palindromas
a) Recorrendo ao predicado anterior, implemente um predicado que determine se uma lista é um palindroma. Nota: um palindroma pode ser lido da mesma forma para a frente ou para trás (exemplo: [x,a,m,a,x]).
b) Implemente o mesmo predicado sem recorrer ao predicado inverter.
Solução:
a) palindroma(L):- inverter(L,L).
Exercício LIST 18. Duplicação de Elementos de uma Lista
a) Construa um predicado que duplique os elementos de uma lista
b) Construa um predicado que copie os elementos de uma lista N vezes para a lista resultado
Exemplo a):
Luis Paulo Reis / Eugénio da Costa Oliveira Pág. 19/
Construa um predicado que rode de N elementos para a esquerda uma lista.
Exemplos:
?- rodar([a,b,c,d,e,f,g,h],3,X).
X = [d,e,f,g,h,a,b,c]
?- rodar([a,b,c,d,e,f,g,h],-2,X).
X = [g,h,a,b,c,d,e,f]
Exercício LIST 23. Sorteios Aleatórios e Listas
a) Extraia um determinado número de elementos seleccionados aleatoriamente de uma lista. E construa uma nova lista com esses elementos
b) Sorteie N elementos entre 1 e M aleatoriamente e coloque-os numa lista.
c) Gere uma permutação aleatória dos elementos de uma lista
Exemplo a):
?- rnd_selectN([a,b,c,d,e,f,g,h],3,L).
L = [e,d,a]
Exemplo b):
?- rnd_select(6,49,L).
L = [23,1,17,33,21,37]
Exemplo c):
?- rnd_permutation([a,b,c,d,e,f],L).
L = [b,a,d,c,e,f]
Exercício LIST 24. Bubble Sort de Listas
Implemente o conhecido método de ordenação bubble sort para listas em Prolog.
Solução:
bubble_sort(List,Sorted):- b_sort(List,[],Sorted).
b_sort([],Acc,Acc). b_sort([H|T],Acc,Sorted):- bubble(H,T,NT,Max), b_sort(NT,[Max|Acc],Sorted).
bubble(X,[],[],X). bubble(X,[Y|T],[Y|NT],Max):- X > Y, bubble(X,T,NT,Max). bubble(X,[Y|T],[X|NT],Max):- X <= Y, bubble(Y,T,NT,Max).
Exercício LIST 25. Triângulo de Pascal
Luis Paulo Reis / Eugénio da Costa Oliveira Pág. 20/
Defina o predicado pascal(N, L), onde L é a Nésima linha do triângulo de Pascal:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1