Programa˘c~ao L ogica Aula 11 - Faculdade de Computaçãosendin/Cursos/PL/2S2019/aula11.pdf ·...

Post on 03-Aug-2020

0 views 0 download

Transcript of Programa˘c~ao L ogica Aula 11 - Faculdade de Computaçãosendin/Cursos/PL/2S2019/aula11.pdf ·...

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 Uberlandiasendin@ufu.br

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