Buscar

Prolog Aritmetica

Prévia do material em texto

Universidade Federal de São Carlos
Campus Sorocaba
Programação em Lógica
Aritmética
Profa: Katti Faceli
katti@ufscar.br
05/11/2013
Baseado nos slides de Eloize Seno, Ana Carolina Lorena e Maria Carolina Monard
 
Exercício
● Como seria a árvore e quais seriam as possíveis 
respostas para provar ciume(X,Y). dada a BC:
gosta(vicente,maria). % cl1 
gosta(marcelo,maria). % cl2
ciume(A,B):- % cl3
gosta(A,C), 
gosta(B,C).
 
Exercício
● E se alterarmos cl3 como segue?
gosta(vicente,maria). % cl1 
gosta(marcelo,maria). % cl2
ciume(A,B):- % cl3
gosta(A,C), 
gosta(B,C),
A \= B.
 
Exercício
● Construir uma BC com o predicado 
filho, representando todas as 
relações desse tipo presentes na 
árvore genealógica ao lado
● Como seria uma regra para 
identificar os possíveis 
descendentes nessa árvore, dado 
uma determinada pessoa, usando 
só o predicado filho?
 
Exercício
● Quais são as respostas possíveis à consulta 
descendente(manuel, X). considerando a BC 
anterior e o predicado descendente?
descendente(X,Y):- 
filho(X,Y).
descendente(X,Y):- 
filho(X,Z), 
filho(Z,Y).
 
Recursão
● E se quisermos um descendente em qualquer 
nível? Como poderíamos fazer?
● O que é ser descendente?
 
Exercício
● Digite o programa a seguir e veja o que acontece com as 
perguntas
filho(carlos,luisa).
filho(luisa,antonio).
filho(antonio,manuel).
descendente(X,Y):- 
filho(X,Y).
descendente(X,Y):- 
filho(X,Z), 
filho(Z,Y).
descendente(carlos,manuel).
descendente(A,B).
Programa:
Consultas:
 
Exercício
● Digite o programa a seguir e veja o que acontece com as 
perguntas
filho(carlos,luisa).
filho(luisa,antonio).
filho(antonio,manuel).
descendente(X,Y):- 
filho(X,Y).
descendente(X,Y):- 
filho(X,Z), 
descendente(Z,Y).
descendente(carlos,manuel).
descendente(A,B).
Programa:
Consultas:
 
Exercício
● Digite o programa a seguir e veja o que acontece com as 
perguntas
filho(carlos,luisa).
filho(luisa,antonio).
filho(antonio,manuel).
descendente(X,Y):- 
filho(X,Y).
descendente(X,Y):- 
descendente(Z,Y),
filho(X,Z).
descendente(carlos,manuel).
descendente(A,B).
Programa:
Consultas:
 
Exercício
● Digite o programa a seguir e veja o que acontece com as 
perguntas
filho(carlos,luisa).
filho(luisa,antonio).
filho(antonio,manuel).
descendente(X,Y):-
descendente(Z,Y), 
filho(X,Z).
descendente(X,Y):- 
filho(X,Y).
descendente(carlos,manuel).
descendente(A,B).
Programa:
Consultas:
 
Exercício
● O que ocorreu?
● De uma forma geral, é uma boa idéia colocar 
fatos antes de regras sempre que possível
● Algumas vezes as regras em uma determinada 
ordem serão úteis se forem usadas para 
resolver objetivos gerados de um modo, mas 
não se os objetivos forem gerados de outro
 
Exercício
● Ler capítulo 3 do site 
http://www.learnprolognow.org/ (Recursion)
● Fazer as práticas da seções 3:
– http://www.learnprolognow.org/html/lpn-
htmlse12.html#x25-380003.4
 
Operadores
● Os simbolos +, *, -, etc não realizam nenhuma 
operação aritmética
● Expressões como 3 + 2, 4 * 5, 3 - 5 são apenas 
termos
– Equivalentes a escrever: +(3,2), *(4,5), -(3,5)
● A utilização do funtor no meio dos argumentos 
é só para facilitar, pois estamos acostumados 
com essa notação
 
Operadores
● O que ocorre se fizermos as seguintes 
perguntas no prolog?
– X = 3 + 2.
– 5 * 3 = Z.
– 3 - X * 8 = B - 9.
– 10 / X = 10 / 1000.
 
Aritmetica em Prolog
● O operador = apenas tenta unificar os termos
● Para forçar a avaliação aritmética é utilizado o 
operador is
● Ex: ?- X is 1 + 2.
X = 3.
Faça agora as consultas:
X is 3 + 2.
Z is 5 * 3.
M is 5 + 6 * 3 / 2.
L is *(2,3).
is(X,+(3,2)).
 
Aritmetica em Prolog
● A expressão aritmetica a ser avaliada deve 
estar do lado direito do is
– ?- X is 6+2.
– X = 8 
– 6+2 is X.
– ERROR: is/2: Arguments are not sufficiently 
instantiated
 
Aritmetica em Prolog
● Podemos usar variáveis do lado direito do is, 
mas a variável deve estar instanciada com um 
número adequado
● Ex:
– ?- X = 3, M is X * 2 + 2 * (X - 1).
– X = 3.
– M = 10.
 
Aritmetica em Prolog
● Se a variável à esquerda do operador is já estiver 
instanciada, Prolog apenas compara o valor da variável 
com o resultado da expressão à direita de is
● A comparação também é feita se usarmos valores em vez 
de variáveis do lado esquerdo
?- 5 is 2+3.
true
15 is 3*4.
false
-2 is 3-5.
true
?- X = 3, X is 1 + 2.
X = 3.
?- X = 5, X is 1 + 2.
no
 
Exercício
1. X = 3*4. 
2. X is 3*4. 
3. 4 is X. 
4. X = Y. 
5. 3 is 1+2. 
6. 3 is +(1,2). 
7. 3 is X+2. 
8. X is 1+2. 
9. 1+2 is 1+2. 
10. is(X,+(1,2)). 
11. 3+2 = +(3,2). 
12. *(7,5) = 7*X. 
13. *(7,+(3,2)) = 7*(3+2). 
14. *(7,(3+2)) = 7*(3+2). 
15. 7*3+2 = *(7,+(3,2)). 
16. *(7,(3+2)) = 7*(+(3,2)).
Como prolog responde às seguintes consultas? Por que?
 
Definição de Predicados 
Aritméticos
● Crie um programa com o predicado:
calc(X, Y) :-
Y is (X+3) * 2.
Faça as consultas:
calc(1,W).
calc(20,W).
O que ocorre?
 
Definição de Predicados 
Aritméticos
● Crie um programa com o predicado:
calc(X, Y) :-
Y is (X+3) * 2.
Faça agora as consultas:
calc(W, 15).
calc(20,6).
calc(X,W).
calc(1,8).
O que ocorre?
 
Operadores
Como is, forçam a avaliação, mas 
das expressões em ambos os lados
 
Exercício
● 2 < 4. 
● 2 =< 4. 
● 4 =< 4. 
● 4=:=4. 
● 4=\=5. 
● 4=\=4. 
● 4 >= 4. 
● 4 > 2. 
● 2 < 4+1. 
● 2+1 < 4.
● 2+1 < 3+2. 
● 4=4. 
● 2+2 =4. 
● 2+2 =:= 4. 
● X < 3. 
● 3 < Y. 
● X =:= X. 
● X = 3, X < 4. 
● X = b, X < 4. 
 
Mais Operadores
?- f(a,b) == f(a,b).
?- f(a,b) == f(a,X).
?- f(a,X) == f(a,Y).
?- X == X.
?- X == Y.
?- X \== Y.
?- X \= Y.
?- g(X,f(a,Y)) == g(X,f(a,Y)).
Exemplos:
 
Mais Operadores
?- f(a,b) == f(a,b).
true.
?- f(a,b) == f(a,X).
false.
?- f(a,X) == f(a,Y).
false.
?- X == X.
true.
?- X == Y.
false.
?- X \== Y.
true.
?- X \= Y.
false.
?- g(X,f(a,Y)) == g(X,f(a,Y)).
true.
Exemplos:
 
Precedencia entre termos
● A precedência entre termos simples é 
determinada pela ordem alfabética ou numérica
– Variável livres @< números @< átomos @< 
estruturas
● Uma estrutura precede outra se o funtor da 
primeira tem menor aridade que o da segunda
● Se duas estruturas têm mesma aridade
– A primeira precede a segunda se seu funtor é 
menor que o da outra
– Se os funtores são iguais, então a precedência é 
definida (da esquerda para a direita) pelos funtores 
dos seus componentes
 
Precedencia entre termos
● Exemplos:
?- X @< 10.
?- X @< isaque.
?- X @< f(X,Y).
?- 10 @< sara.
?- 10 @< f(X,Y).
?- isaque @< sara.
?- g(X) @< f(X,Y).
?- f(Z,b) @< f(a,A).
?- 12 @< 13.
?- 12.5 @< 20.
?- g(X,f(a,Y)) @< g(X,f(b,Y)).
 
Precedencia entre termos
● Exemplos:
?- X @< 10.
true.
?- X @< isaque.
true.
?- X @< f(X,Y).
true.
?- 10 @< sara.
true.
?- 10 @< f(X,Y).
true.
?- isaque @< sara.
true.
?- g(X) @< f(X,Y).
true.
?- f(Z,b) @< f(a,A).
true.
?- 12 @< 13.
true.
?- 12.5 @< 20.
true.
?- g(X,f(a,Y)) @< g(X,f(b,Y)).
true.
 
Exercício
● Dadas as distâncias do sol aos planetas do sistema solar 
em milhões de milhas, construa uma BC que permita 
encontrar a distância entre dois planetas quaisquer, 
quando eles estão alinhados. Criar os predicados 
dsol(P,D) e dplanetas(P1, P2, D).
 
Exercício
dsol(mercurio, 36). % cl1
dsol(venus, 67). % cl2
dsol(terra, 93). % cl3
dsol(marte, 141). % cl4
dsol(jupter, 484). % cl5
dsol(saturno,886). % cl6
dsol(urano, 1790). % cl7
dsol(netuno, 2800). % cl8
dplanetas(P1,P2,Dist) :- % cl9
dsol(P1,D1),
dsol(P2,D2),
D1 >= D2, 
Dist is D1 - D2.
dplanetas(P1,P2,Dist) :- % cl10
dsol(P1,D1),
dsol(P2,D2),
D1 < D2, 
Dist is D2 - D1.
● Como fica a árvore gerada na 
busca para a resposta para as 
seguintes consultas:
– dplanetas(A,B,D).
– dplanetas(A,terra,D).
– dplanetas(venus,terra,D).
– dplanetas(A,B,48).
 
Exercício
● Faça um predicado em prolog para calcular o 
fatorial F de um número qualquer N
– fat(N, F).
	Slide 1
	Slide 2
	Slide 3
	Slide 4
	Slide 5
	Slide 6
	Slide 7
	Slide 8
	Slide 9
	Slide 10
	Slide 11
	Slide 12
	Slide 13
	Slide 14
	Slide 15
	Slide 16
	Slide 17
	Slide 18
	Slide 19
	Slide 20
	Slide 21
	Slide 22
	Slide 23
	Slide 24
	Slide 25
	Slide 26
	Slide 27
	Slide 28
	Slide 29
	Slide 30
	Slide 31

Continue navegando