Created
October 9, 2012 20:40
-
-
Save bfb/3861275 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* NOMES: BRUNO FLACH BOHN / CASSIO SCHAAB GHILARDI */ | |
/* | |
Especificação dos predicados | |
*/ | |
/* | |
operações básicas | |
*/ | |
somasub :- | |
write('Digite um valor: '), nl, | |
read(N), | |
write('Digite o segundo valor: '), nl, | |
read(M), | |
S is N+M, | |
SU is N - M, | |
writef('%w%w%w%w%w%w',['A soma de ', N, ' + ',M, ' é ', S]),nl, | |
writef('%w%w%w%w%w%w',['A substração de ', N, ' - ',M, ' é ', SU]). | |
multdiv :- | |
write('Digite um valor: '), nl, | |
read(N), | |
write('Digite o segundo valor: '), nl, | |
read(M), | |
MU is N*M, | |
DI is N / M, | |
writef('%w%w%w%w%w%w',['O produto de ', N, ' por ',M, ' é ', MU]),nl, | |
writef('%w%w%w%w%w%w',['A divisão de ', N, ' / ',M, ' é ', DI]). | |
pot :- | |
write('Digite a base: '), nl, | |
read(N), | |
write('Digite o expoente: '), nl, | |
read(M), | |
pow(N, M, E), | |
writef('%w%w%w%w%w%w',['Potência de ', N, ' na ',M, ' é ', E]). | |
raiz :- | |
write('Digite um valor: '), nl, | |
read(N), | |
R is sqrt(N), | |
writef('%w%w%w%w%w%w',['Raiz quadrada de ', N, ' é ', R]). | |
resto :- | |
write('Digite o dividendo: '), nl, | |
read(N), | |
write('Digite o divisor: '), nl, | |
read(M), | |
R is mod(N, M), | |
writef('%w%w%w%w%w%w',['O resto da divisão de ', N, 'por ', M, ' é ', R]). | |
sucant :- | |
write('Digite um valor: '), nl, | |
read(N), | |
A is N - 1, | |
S is N + 1, | |
writef('%w%w%w%w%w%w',['Antecessor de ', N, ' é ', A, ' e o sucessor é ', S]). | |
parimpar :- | |
write('Digite um valor: '), nl, | |
read(N), | |
A is mod(N, 2), | |
A =:= 0 -> writef('Número par') ; writef('Número ímpar'). | |
/* | |
operações com expressões | |
*/ | |
/* 2.1 Quadrado e cubo*/ | |
quadcubo :- | |
write('Digite um valor: '), nl, | |
read(N), | |
Q is N*N, | |
C is N*N*N, | |
writef('%w%w%w%w',['O quadrado de ', N, ' é ',Q]), nl, | |
writef('%w%w%w%w',['O cubo de ', N, ' é ',C]). | |
/* 2.3 Fatorial*/ | |
fat :- | |
write('Cálculo do fatorial, digite um valor: '), nl, | |
read(N), | |
fatorial(N,F), | |
writef('%w%w%w%w',['O fatorial de ', N, ' é ',F]). | |
fatorial(0,1). | |
fatorial(N,F) :- | |
N>0, | |
N1 is N-1, | |
fatorial(N1,F1), | |
F is N * F1. | |
/* 2.4 Somatório */ | |
somanum :- | |
write('Cálculo do somatório, digite um valor: '), nl, | |
read(N), | |
somatotal(N,F), | |
writef('%w%w%w%w',['A soma total ', N, ' é ',F]). | |
somatotal(0,0). | |
somatotal(N,F) :- | |
N>0, | |
N1 is N-1, | |
somatotal(N1,F1), | |
F is N + F1. | |
/* 2.6 valores entre 2 números */ | |
entre :- | |
write('Digite um valor inicial: '), nl, | |
read(N), | |
write('Digite um valor final: '), nl, | |
read(M), | |
entrenum(N,M). | |
entrenum(N,M) :- | |
N<M-1, | |
N1 is N+1, | |
write(N1), nl, | |
entrenum(N1,M). | |
/* 2.7 MDC */ | |
mdc :- | |
write('Cálculo do mdc, digite um valor: '), nl, | |
read(A), | |
write('digite o segundo valor: '), nl, | |
read(B), | |
mdc(A,B,C), | |
writef('%w%w%w%w%w%w',['O mdc dos valores ', A, ' e ', B, ' é ',C]). | |
mdc(A, A, A). | |
mdc(A,B,C) :- | |
A < B, | |
Temp is B - A, | |
mdc(A,Temp,C). | |
mdc(A,B,C) :- | |
A > B, | |
Temp is A - B, | |
mdc(Temp,B,C). | |
/* 2.8 MMC */ | |
mmc :- | |
write('Digite um valor: '), nl, | |
read(N1), | |
write('Digite outro valor: '), nl, | |
read(N2), | |
mmccalc(N1,N2,2). | |
mmccalc(0,0,0). | |
mmccalc(N1,N2,D) :- | |
D > N1 -> D is 0, N1 is 0, N2 is 0;D is D, | |
D > N2 -> D is 0, N1 is 0, N2 is 0;D is D, | |
mod(N1,D) =:= 0 , mod(N2,D) =:= 0 -> write(D);D8 is D+1, mmccalc(N1,N2,D8). | |
/* 2.9 Quadrado perfeito */ | |
perf :- | |
write('Digite um valor : '), nl, | |
read(N), | |
perfcalc(N,1). | |
perfcalc(0,0). | |
perfcalc(N,N2) :- | |
N2 > N -> write('NÃO é quadrado perfeito'),N is 0,N2 is -1; | |
N3 is N2*N2, | |
N3 =:= N -> write('É quadrado perfeito');N4 is N2+1,perfcalc(N,N4). | |
/* 2.11 Area: Triangulo, Quadrado e Circulo */ | |
area :- | |
write('Escolha um opção: 1 - Triângulo / 2 - Quadrado / 3 - Círculo'), nl, | |
read(N), | |
N = 1 -> triangulo, N = 2 -> quadrado ; circulo. | |
triangulo :- | |
write('Digite o valor da base:'), nl, | |
read(B), | |
write('Digite o valor da altura:'), nl, | |
read(A), | |
Area is (B * A) / 2, | |
write('Área: '), | |
write(Area). | |
quadrado :- | |
write('Digite o valor do lado:'), nl, | |
read(B), | |
Area is (B * B), | |
write('Área: '), | |
write(Area). | |
circulo :- | |
write('Digite o valor do raio:'), nl, | |
read(R), | |
Area is 2 * 3.14159265 * R, | |
write('Área: '), | |
write(Area). | |
/*Operações com listas */ | |
/*3.1 X é elemento da lista */ | |
memb :- | |
write('Digite o membro: '), nl, | |
read(N), | |
write('Digite a lista: '), nl, | |
read(M), | |
membro(N,M), | |
writef('%w%w%w%w',['O valor ', N, ' é membro da lista ', M]). | |
membro(X,[X|_]). % X é membro de uma lista se X é a | |
membro(X,[_|Y]):- % cabeça da lista. Ou então se X é | |
membro(X,Y). % membro do corpo da lista. | |
/*3.3 Concatena 3 vezes a mesma lista*/ | |
conclista :- | |
write('Digite uma lista (entre [ , ]): '), nl, | |
read(N), | |
concat(N,N,S), | |
concat(N,S,S2), | |
writef('%w%w%w%w',['A lista ', N, ' concatenada 3 vezes é ', S2]). | |
/*3.5 Média de elementos da lista*/ | |
med :- | |
write('Digite uma lista (entre [ , ]): '), nl, | |
read(N), | |
somalista(N,S), | |
tamanho(N,S2), | |
S3 is S / S2, | |
writef('%w%w',['A média dos elementos da lista é ', S3]). | |
/* 3.5 Soma e produto de elementos da lista*/ | |
somaprodutolista :- | |
write('Digite uma lista (entre [ , ]): '), nl, | |
read(N), | |
somalista(N,S), | |
produto(N,P), | |
writef('%w%w%w%w',['A soma dos valores da lista ', N, ' é ',S]), | |
writef('%w%w%w%w',['O produto dos valores da lista ', N, ' é ',P]). | |
somalista([], 0). % A soma dos elementos de uma lista de números é | |
somalista([H|R], S):- % obtida somando o valor da cabeça á soma dos | |
somalista(R, X), % elementos do corpo da lista. | |
S is H + X. | |
produto([],0). % O produto de uma lista é obtido com o uso de | |
produto([X],X). % um predicado auxiliar, prod/2, necessario para | |
produto(L,P):- % isolar a aplicação do elemento neutro da | |
prod(L,P). % multiplicação do caso em que se pede diretamente | |
prod([],1). % o produto de uma lista vazia. | |
prod([X|Y],P):- | |
prod(Y,Q), | |
P is Q * X. | |
/*Verifica o tamanho da lista */ | |
tam :- | |
write('Digite uma lista (entre [ , ]): '), nl, | |
read(N), | |
tamanho(N,Z), | |
writef('%w%w%w%w',['O tamanho da lista ', N, ' é ', Z]). | |
tamanho([], 0). % O tamanho de uma lista vazia é zero. O tamanho de | |
tamanho([_|R], N):- % uma lista não-vazia é obtido acrescentando-se uma | |
tamanho(R, N1), % unidade ao tamanho de seu corpo. | |
N is N1 + 1. | |
/* 3.7 Ultimo elemento da list */ | |
ult :- | |
write('Digite uma lista (entre [ , ]): '), nl, | |
read(N), | |
ultimo(N,U), | |
writef('%w%w%w%w',['O último elemento da lista ', N, ' é ', U]). | |
ultimo([U], U). | |
ultimo([_|R], U) :- ultimo(R, U). | |
/*3.9 Concatenação de duas listas*/ | |
conc :- | |
write('Digite uma lista (entre [ , ]): '), nl, | |
read(N), | |
write('Digite a segunda lista (entre [ , ]): '), nl, | |
read(M), | |
concat(N,M,S), | |
writef('%w%w%w%w%w%w',['A concatenação da lista ', N, ' e da lista ', M, ' é ', S]). | |
concat([], L, L). | |
concat([X | L1], L2, [X | L3]):- | |
concat(L1, L2, L3). | |
/*3.12. Enesimo elemento da lista | |
enes:- | |
write('Digite uma lista (entre [ , ]): '), nl, | |
read(X), | |
write('Digite o elemento: '), nl, | |
read(Y), | |
enesimo(M,X,Y), | |
write(N). */ | |
enesimo(1, X, [X | _]). % Este predicado devolve em X o enésimo elemento de | |
enesimo(N, X, [_ | Y]):- % uma lista. Pode ser usado no sentido inverso para | |
enesimo(M, X, Y), % informar a posição de um determinado elemento | |
N is M + 1. % na lista. | |
/* 3.14 Menor e Maior valor da lista*/ | |
menormaior :- | |
write('Digite uma lista (entre [ , ]): '), nl, | |
read(N), | |
min(N,ME), | |
max(N,MA), | |
writef('%w%w%w%w',['O menor valor da lista ', N, ' é ',ME]),nl, | |
writef('%w%w%w%w',['O maior valor da lista ', N, ' é ',MA]). | |
min([X],X). | |
min([X|Y],M):- | |
min(Y,N), | |
(X<N -> M=X; M=N). | |
max([X],X). % Calcula o maior elemento de uma lista numérica. | |
max([X|Y],M):- % Notar a semelhança com o predicado min/2, a | |
max(Y,N), % seguir, e o emprego da construção "if then else" | |
(X>N -> M=X; M=N). % dada por (A -> B ; C). | |
/* 3.18 Posicao do maior elemento da lista */ | |
posic :- | |
write('Digite uma lista (entre [ , ]): '), nl, | |
read(N), | |
max(N,M), | |
posel(M,N,1). | |
posel(X,[X|_],_). | |
posel(X,[_|Y],C):- | |
C1 is C+1, | |
posel(X,Y,C1), | |
writef('%w%w%w%w',['O elemento ', X, ' é o maior elemento e está na posição ', C1]). | |
/* | |
Especificação do Menu principal! | |
*/ | |
menu :- | |
repeat, | |
write('-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x'),nl, | |
write(' :... Programa em Prolog -+- Menu de Operacoes ...: '),nl, | |
write('-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x'),nl,nl, | |
write('Digite a opcao escolhida (opcao com * ja esta implementada): '), nl, | |
write('1: Operacoes basicas\n \t 1.1 Soma e subtracao (*)\t 1.2 Multiplicacao e Divisao\t\t 1.3 Potenciacao\n \t 1.4 Raiz Quadrada\t\t 1.5 Resto da Divisao\t\t\t 1.6 Sucessor e antecessor\n2: Operacoes com expressoes\n \t 2.1 Numero par ou impar\t\t 2.2 Quadrado e Cubo (*)\n\t 2.3 Soma n valores inteiros\t\t 2.4 Fatorial (*)\n\t 2.5 Fibonacci \t\t\t\t 2.6 Valores entre N =< X =< N1\n\t 2.7 MDC (*)\t\t\t\t 2.8 MMC\n\t 2.9 Numero perfeito\t\t\t 2.11 Área do quadrado, triangulo e circulo\n3: Operacoes com listas\n \t 3.1 X e um elemento na lista (*) \t 3.2 Prefixo e Sufixo da lista\n\t 3.3 Sublista \t\t\t\t 3.4 X e Y sao adjacentes\n\t 3.5 Soma e Produto dos elementos (*) \t 3.6 Concatena 3 vezes a mesma lista\n \t 3.7 Tamanho da lista (*)\t\t 3.8 Media dos elementos da lista\n\t 3.9 Concatenacao de listas (*) \t 3.10 Quantas vezes um elemento aparece na lista\n \t 3.11 Ultimo elemento da lista\t\t 3.12 Enesimo elemento da lista (*)\n \t 3.13 Intersecao de listas\t\t 3.14 Menor e Maior valor digitado (*)\n \t 3.15 Ordena uma lista\t\t\t 3.16 Elimina todas as ocorrências de X\n \t 3.17 Elimina um elemento da posição X da lista\n \t 3.18 Posicao do maior elemento da lista\n0: Para sair do programa '),nl, | |
write('Opcao: '), | |
read(X), | |
X >= 0, | |
X =< 5, | |
operacao(X),nl,nl, | |
menu. | |
operacao(0) :- halt. | |
operacao(1.1) :- somasub. | |
operacao(1.2) :- multdiv. | |
operacao(1.3) :- pot. | |
operacao(1.4) :- raiz. | |
operacao(1.5) :- resto. | |
operacao(1.6) :- sucant. | |
operacao(2.1) :- parimpar. | |
operacao(2.2) :- quadcubo. | |
operacao(2.3) :- somanum. | |
operacao(2.4) :- fat. | |
operacao(2.5) :- fibo. | |
operacao(2.6) :- entre. | |
operacao(2.7) :- mdc. | |
operacao(2.8) :- mmc. | |
operacao(2.9) :- perf. | |
operacao(2.11) :- area. | |
operacao(3.1) :- memb. | |
operacao(3.2) :- prefsuf. | |
operacao(3.3) :- conclista. | |
operacao(3.4) :- adja. | |
operacao(3.5) :- somaprodutolista. | |
operacao(3.6) :- conclista. | |
operacao(3.7) :- tam. | |
operacao(3.8) :- med. | |
operacao(3.9) :- conc. | |
operacao(3.10) :- contagem. | |
operacao(3.11) :- ult. | |
operacao(3.12) :- enes. | |
operacao(3.13) :- inter. | |
operacao(3.14) :- menormaior. | |
operacao(3.15) :- ordena. | |
operacao(3.16) :- delall. | |
operacao(3.17) :- delx. | |
operacao(3.18) :- posic. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment