Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Programação em Lógica - Exercícios, Exercícios de Programação Funcional

lorem ipsum dolor sit amet consectetur adipiscing elit

Tipologia: Exercícios

2020

Compartilhado em 06/03/2020

jose-oliveira-z82
jose-oliveira-z82 🇧🇷

4.5

(2)

1 documento

1 / 52

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
FACULDADE DE ENGENHARIA DA UNIVERSIDADE DO PORTO
EXERCÍCIOS DE
PROGRAMAÇÃO EM LÓGICA
LUÍS PAULO REIS
LICENCIATURA EM ENGENHARIA INFORMÁTICA E COMPUTAÇÃO
PROGRAMAÇÃO EM LÓGICA - 3º ANO
SETEMBRO DE 2005
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34

Pré-visualização parcial do texto

Baixe Programação em Lógica - Exercícios e outras Exercícios em PDF para Programação Funcional, somente na Docsity!

FACULDADE DE ENGENHARIA DA UNIVERSIDADE DO PORTO

EXERCÍCIOS DE

PROGRAMAÇÃO EM LÓGICA

LUÍS PAULO REIS

LICENCIATURA EM ENGENHARIA INFORMÁTICA E COMPUTAÇÃO

PROGRAMAÇÃO EM LÓGICA - 3º ANO

SETEMBRO DE 2005

Faculdade de Engenharia da Universidade do Porto

Licenciatura em Engenharia Informática e Computação

Programação em Lógica

2004/ LEIC (3º Ano) 1º Sem

Exercícios RC– Representação de Conhecimento em Prolog

Exercício RC 1. Representação de Conhecimento – Autores de Livros

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?

Exercício RC 2. Representação de Conhecimento – Comidas e Bebidas

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?

Exercício RC 3. Representação de Conhecimento – Desportos e Jogos

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?

Exercício RC 4. Representação de Conhecimento – Tweety e Silverster

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.

Exercício RC 5. Representação de Conhecimento – Programação e Erros

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.

Exercício RC 8. Representação de Conhecimento – Carros e Valores

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).

a) Crie uma regra pode_vender onde o primeiro argumento é a pessoa, o segundo o carro e o

terceiro é o ano actual (não especificar “homem” ou “carro” nas regras), onde a pessoa só pode

vender o carro se o carro for comprado por ela nos últimos 10 anos e se seu valor for menor do que

10000 Euros.

Faculdade de Engenharia da Universidade do Porto

Licenciatura em Engenharia Informática e Computação

Programação em Lógica

2004/ LEIC (3º Ano) 1º Sem

Exercícios IP– Introdução ao Prolog

Exercício IP 1. Objectos e Atributos

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.

Faculdade de Engenharia da Universidade do Porto

Licenciatura em Engenharia Informática e Computação

Programação em Lógica

2003/ LEIC (3º Ano) 1º Sem

Docentes: Luís Paulo Reis e Eugénio da Costa Oliveira

Exercícios IP– Introdução ao Prolog

Exercício IP 3. Relações de Parentesco

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/

Exercício IP 4. Ordens de Serviço

Suponha que pretende guardar informação sobre quando e e para onde foram enviadas ordens de

serviço dentro de uma empresa. Qual é o melhor formato, em PROLOG, para os factos que

representam essa informação, e porquê?

(i) (, , , <distribuição>).

(ii) ordem (, , , <distribuição>).

(iii) facto (ordem, , , , <distribuição>).

Exercício IP 5. Electrodomésticos e Componentes - Fogão

a) Escreva os seguintes factos em PROLOG:

Um fogão é composto por uma estrutura e um cordão eléctrico.

Uma das componentes da estrutura é uma resistência de aquecimento.

A resistência de aquecimento é em metal.

Outra parte da estrutura é o painel do fogão.

O painel tem um botão.

Os botões são sempre feitos em plástico.

O cordão eléctrico é composto de fio metálico.

Parte do cordão é um isolador.

O isolador é feito de fibra.

b) Coloque as seguintes questões ao interpretador de PROLOG:

  • Que objectos têm metal?
  • Que objectos fazem parte da estrutura do fogão?

c) Defina regras de transitividade para parte_de e herança ascendente de material com respeito a

parte_de.

d) Agora questione o interpretador sobre:

  • Que objectos contém plástico?
  • Que objectos não contém plástico?
  • Que objectos contêm metal e fibra?

Solução:

a)

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).

b)

?- contem(Obj, metal).

?- parte_de(Obj, estrutura).

Luis Paulo Reis / Eugénio da Costa Oliveira Pág. 10/

b) Construa um predicado isolados_grandes(-Lista) que calcule a lista, ordenada por ordem alfabética,

de todos os continentes que possuem pelo menos dois países que tenham simultaneamente uma

população superior a 15 milhões e duas ou menos fronteiras terrestres (com países conhecidos).

Sugestão: Utilize o predicado sort para ordenar a lista final.

Exemplo:

?- isolados_grandes(Lista). Lista = [europa, oceania] % europa pois possui a espanha e a italia e a oceania devido à austrália e indonésia

Solução:

%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.

Exercício IP 8. Objectos e Pesos (Exame Recurso 2003/2004)

Suponha a seguinte representação do conhecimento relativo a objectos

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

a) Escreva o predicado sobre_tipo(+Tipo,-Lista) que retorne uma lista (com o formato indicado

abaixo) com todos os objectos que estão colocados directamente sobre objectos de um dado tipo.

Exemplo:

?- sobre_tipo(madeira, L). L = [bigornasobremesa2] ?- sobre_tipo(vidro, L). L = [cadeirasobremesa1, mesa2sobremesa1, caixasobrejarra]

b) Escreva o predicado partem(-Objectos), que retorne a lista de objectos que vão partir dado o

conhecimento apresentado. Um objecto pode partir se for feito de um material frágil e se estiver

debaixo de um conjunto de objectos que tenham um peso que seja mais do dobro do peso desse

objecto. Sugestão implemente uma função auxiliar pesototal(+Obj, -PesoTot), que calcule o peso

total suportado por um dado objecto.

Exemplo:

?- 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

LEIC

(3º Ano) 1º Sem

Docentes: Luís Paulo Reis e Eugénio da Costa Oliveira

Exercícios REC – Controlo e Recursividade em Prolog

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

LEIC

(3º Ano) 1º Sem

Docentes: Luís Paulo Reis e Eugénio da Costa Oliveira

Exercícios LIST – Utilização de Listas em Prolog

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