PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Programacao Logica
Aula 11
Ivan Sendin
FACOM - Universidade Federal de [email protected]
16 de setembro de 2019
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
not
not(). - antigo
\+
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
not
consoante(L) :- \+vogal(L).
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
not
Um pouco diferente de uma negacao logica
(complexidades do Prolog...)
consoante: eu(prolog) nao consegui provar que L euma vogal
(portanto e uma consoante...)
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
contaConsoante - sem o not
vogal(a).
vogal(e).
vogal(i).
vogal(o).
vogal(u).
contaConsoante([],0).
contaConsoante([H|T],N) :- vogal(H), contaConsoante(T,N1),N is N1,!;
contaConsoante(T,N1), N is N1 +1.
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
fail
forca uma falha
e executado o backtracking.
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
vogal(a).
vogal(e).
vogal(b) :- fail.
Para alguem que tem um conhecimento parcial sobreletras...
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Zero e par?
par(N) :- mod(N,2) =:= 0.
”par e um numero1 que dividido por 2 tem resto igual a0”(operador mod ....)
1natural
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Zero e par?
Vamos considerar que zero nao e par...
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Zero e par?
par(0) :- fail.
par(N) :- mod(N,2) =:= 0.
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Ainda nao...lembre-se que o Prolog tenta resolver umapergunta...se esforca ao maximo para isso. Depois depar(0), o Prolog continua procurando!
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Zero e par?
par(0) :- !,fail.
par(N) :- mod(N,2) =:= 0.
Pq o cut vem antes do fail??
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
O cut indica ao prolog para paa de procurar em outrospredicados...
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
ultimo
Como determinar o ultimo elemento do uma lista??* (2 minutos!)
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
ultimo
Para uma lista com a apenas um elemento e facil
ultimo(N,[N]).
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
ultimo
Agora resta fazer a lista chegar ate o ultimo, propagandoa variavel instanciada.
ultimo(N,[N]).
ultimo(N,[_|T]) :- ultimo(N1,T),N is N1.
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
ultimo - last
?- last([1,2,3,4],U).
U=4
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
length
length([a,b,c],L).
L=3
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
reverse
reverse([a,b,c],R).
R=[c,b,a]
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Alguns problema envolvendo numeros...
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Fibonacci
A recursao....
fib(N,R) :- N1 is N-1,N2 is N-2, fib(N1,R1),fib(N2,R2), R is R1+R2.
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Fibonacci
Completo(?)
fib(0,1) :- !.
fib(1,1) :- !.
fib(N,R) :- N1 is N-1,N2 is N-2, fib(N1,R1),fib(N2,R2), R is R1+R2.
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Fibonacci
| ?- fib(5,X).
X = 8
yes
| ?- fib(6,X).
X = 13
yes
| ?- fib(-1,X).
Fatal Error: local stack overflow
(size: 8192 Kb, environment variable used: LOCALSZ)
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
fib(N,_) :- N<0,!,fail.
fib(0,1) :- !.
fib(1,1) :- !.
fib(N,R) :- N1 is N-1,N2 is N-2, fib(N1,R1),fib(N2,R2), R is R1+R2.
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Numeros Primos
Natural com apenas os divisores triviais...
p e divisıvel apenas p e por 1
Para saber se um numero e primo, responder apergunta ”tem fator”e mei caminho andado.
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Para um determinado F vamos ver se F divide N comresto Zero:
tem_fator(N,F) :- N mod F =:= 0,!.
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Agora precisamos alterar F ate chegar a N .
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
tem_fator(N,F) :- N mod F =:= 0,!.
tem_fator(N,F) :- F < N, F2 is F+1, tem_fator(N,F2).
Ops!
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
tem_fator(N,F) :- N mod F =:= 0,!.
tem_fator(N,F) :- F2 is F +1,F2<N, tem_fator(N,F2).
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
tem_fator(N,F) :- N mod F =:= 0,!.
tem_fator(N,F) :- F*F < N, F2 is F+2, tem_fator(N,F2).
Mais rapido, porem ”mata”a semantica do nome tem fator.
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
eh_primo(2).
eh_primo(3).
eh_primo(N) :- N>3, N mod 2 =\=0, \+ tem_fator(N,3).
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Achar o ”primeiro”primo...
Dado um numero N , achar o menor primo maior que N .
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
pp(X,N) :- P is X+1, eh_primo(P), N is P,!;
pp(X+1,N1), N is N1.
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Potencia
Como calcular a potencia de um numero... com oexpoente inteiro e grande!!
x256
Como voce faria??
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Potencia
pot(_,0,R) :- R is 1,!.
pot(B,1,R) :- R is B,!.
pot(B,E,R) :- par(E), M is E//2, pot(B,M,R1), R is R1*R1,!;
M is E//2, pot(B,M,R1), R is R1*R1*B,!.
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Raiz quadrada em N
raiz(X,K,R) :- X*X =:=K, R is X.
raiz(X,K,R) :- X*X =<K, raiz(X+1,K,R1), R is R1.
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Ackermann
A(m, n) =
n + 1, se m = 0,
A(m − 1, 1) se m > 0, n = 0
A(m − 1,A(m, n − 1)) cc.
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Ackermann
ack(0, N, R) :- R is N+1.
ack(M, 0, R) :- M>0, X is M-1, ack(X, 1, R).
ack(M, N, R) :- M>0, N>0, X is M-1, Y is N-1, ack(M, Y, R2), ack(X, R2, R).
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
1 Determinar o maior elemento de uma lista
2 Calcular o fatorial
3 Conjectura de GoldbachDado um numero par, determinar se ele pode serescrito como a soma de dois primos
4 Soma de parDada uma lista de inteiros e um inteiro k ,determinar se existe dois elementos da lista quesomam k .
5 Sub Set SumDada uma lista de inteiros e um inteiro k ,determinar se existe um subconjunto cuja soma sejak .
PL-11
Ivan Sendin
Mais Prolog
not
fail
last
lenght
reverse
Numeros
Fibonacci
Primos
Quadrados, Raizese potencias...
Ackermann
Exercıcios
Exercicios deReforco
Exercicios de Reforco
1 Socrates e um homen, todos os homens sao mortaisdetermine se Socates e mortal.
2 Determinar se uma lista e um palindromo (usandoreverse).
3 Remover o k-esimo elemento de uma lista
4 Dado i e f , criar uma lista com os inteirosi , i + 1, . . . , f
Top Related