Skip to content

Instantly share code, notes, and snippets.

@bfb
Created October 9, 2012 20:40
Show Gist options
  • Save bfb/3861275 to your computer and use it in GitHub Desktop.
Save bfb/3861275 to your computer and use it in GitHub Desktop.
/* 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