Baixe o app para aproveitar ainda mais
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
Compartilhar