Exercícios de
Números
I
Construa os seguintes predicado:
a) iguais/2 que testa se dois números são iguais.
?- iguais(5,6).
false.
?- iguais(5,X).
false.
?- iguais(Y,8).
false.
?- iguais(3,3).
true.
b) iguais/2 que testa se dois números são iguais mas unificando se algum dos
argumentos for uma variável.
?- iguais(5,X).
X = 5.
?- iguais(X,15).
X = 15.
c) menor/3 que verifica/devolve o menor de dois números.
?- menor(3,4,M).
M = 3 ;
false.
?- menor(3,3,M).
M = 3 ;
false.
?- menor(6,3,M).
M = 3.
d) inc/2 em que o segundo
consecutivos.
argumento é = ao primeiro + 1 — números
?- inc(2,X).
X = 3.
?- inc(4,C).
C = 5.
?- inc(X,4).
ERROR: is/2: Arguments are not sufficiently instantiated
e) inc/2 em que o segundo argumento é = ao primeiro + 1 — números
consecutivos, mas mais poderoso (turbo).
?- incPlus(2,3).
true .
?- incPlus(2,X).
X = 3 ;
false.
?- incPlus(X,5).
X = 4.
f) par/1 que verifica se um dado número é par.
?- par(4).
true.
?- par(5).
false.
g) multiplo/2 que verifique a relação de múltiplo entre dois números, neste caso,
verifica se o segundo argumento é ou não múltiplo do primeiro.
?-multiplo(2,4).
yes
?-multiplo(3,2).
No
h) factorial/2 em que o segundo elemento é o factorial do primeiro.
?- fact(5,X).
X = 120 ;
false.
II
Suponha que tem um conjunto de números na base de factos definidos pela relação
num/1. (Para os exemplos suponha que tem os três números seguintes).
num(1).
num(-2).
num(5).
num(50).
num(-3).
num(87).
a) Construa um predicado par/1 que verifique/devolva os números (de entre os
definidos) que sejam pares.
?- par(X).
X = -2 ;
X = 50 ;
false.
b) nao_menor(X) que verifica se um dado número não é o menor de todos os
definidos.
?- nao_menor(5).
true.
?- nao_menor(X).
X = 1 ;
X = -2 ;
X = 5 ;
X = 50 ;
X = 87.
c) menor(X) que verifique se um dado número é o menor do que todos os definidos
e que devolva o menor quando é invocado com uma variável como argumento.
?- menor(X).
X = -3 .
?- menor(-4).
false.
?- menor(-3).
true.
d) Faça 3 novos predicados correspondentes aos 3 predicados definidos no exercício
anterior mas assumindo que os números não estão na base de factos do Prolog mas
que são dados numa lista.
?- par(X,[1,-2,5,50,-3,87]).
X = -2 ;
X = 50 ;
false.
?-nao_menor(29,[1,-2,5,50,-3,87]).
yes
?- menor(X,[1,-2,5,50,-3,87]).
X=12 ? ;
no
?-menor(X,[1,-2,5,50,-3,87]).
X=-3 ? ;
false
e) Faça um predicado que calcule o máximo divisor comum entre um conjunto de
números. O algoritmo é o seguinte: enquanto houver dois números diferentes, escolhe
dois deles e substitui o maior deles pela diferença entre o maior e o menor; se todos
forem iguais, isso será o mdc.
?- mdc(M,[12,6,9]).
M = 3 .
f) Faça um predicado que calcule o máximo divisor comum entre um conjunto de
números, mas em que os números aparecem nos factos num/1. O mdc deve ser
calculado sem estragar os números originais.
III
a) Construa um predicado que gera uma série de inteiros de 1 a N, em que N é um
argumento.
?- serie(10).
1 2 3 4 5 6 7 8 9 10
true
b) Faça um predicao que devolva o próximo elemento de uma série de números e que
vá devolvendo os elementos da série, por ordem, através do retrocesso. A série
começa em 1, mas não tem limite superior.
?- elemSerie(X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5 ;
X = 6 ;
X = 7 ;
X = 8 ;
X = 9 ;
X = 10 ;
…
c) Faça um predicado que devolva o próximo elemento de uma série de números e
que vá devolvendo os elementos da série, por ordem, através do retrocesso. A série
começa em 1, e acaba no valor dado por um argumento.
?-elemSerie(X,4).
X = 1;
X = 2;
X = 3;
X = 4;
no
d) Construa um predicado em Prolog gera_multiplo/2 que gera os múltiplos de
um determinado número.
?- gera_multiplo(6,X).
X = 6 ;
X = 12 ;
X = 18 ;
X = 24 ;
X = 30 ;
X = 36 ;
X = 42 ;
...
e) O mesmo que em cima mas em que só se geram os múltiplos até um determinado
limite.
?- multiplo_lim(6,34,X).
X=6 ? ;
X=12 ? ;
X=18 ? ;
X=24 ? ;
X=30 ? ;
no
Download

Exercícios de Números I