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