Inteligência Artificial: A Linguagem Prolog (parte 2) Prof. Elaini Simoni Angelotti [email protected] A Linguagem Prolog LÓGICA E PROLOG Observe que a regra presa(X) :- come(Y,X), animal(X) Em lógica corresponde a: xy(come(Y,X) ^ animal(X)) -> presa(X) Aplicando as Leis de Equivalência temos: ~(come(X,Y) ^ animal(X)) v presa(X) ~come(X,Y) v ~animal(X) v presa(X) 2 A Linguagem Prolog REGRA DE INFERÊNCIA: RESOLUÇÃO Outro exemplo: acrescentando à BC a regra: “x é caçado se é presa” caçado(X) :- presa(X). a regra na forma simbólica é: presa(X) -> caçado(X) a cláusula correspondente é: ~(presa(X)) v caçado(X) 3 A Linguagem Prolog EXEMPLO DE PROGRAMA E CONSULTAS come (urso, peixe). come (peixe,peixinho). come (peixinho,alga). come (quati,peixe). come(urso,quati). come (urso, raposa). come(raposa,coelho). come (coelho, mato). come(urso,cavalo). come(cavalo,mato). come(gato-selvagem,cavalo). animal(urso). animal(peixe). animal(peixinho). animal(quati). animal(raposa). animal(coelho). animal(cavalo). animal(gato-selvagem). planta(mato). planta(alga). presa(X) :- come(Y,X), Animal(X). caçado(X) :- presa(X). 4 A Linguagem Prolog EXEMPLO DE PROGRAMA E CONSULTAS Consultas e respostas: ?- animal(coelho). yes ?- come(gato_selvagem,mato). no ?- come(X,peixe). urso; quati. ?- come(X,Y),planta(Y). peixinho alga; coelho mato; cavalo mato. 5 A Linguagem Prolog RETROCESSO (BACKTRACKING) O PROLOG tenta responder a uma questão comparando a questão com os fatos na BC. O Prolog tenta encontrar os predicados que se unificam. Se uma procura falha, o backtracking permite que se volte ao último momento onde se instanciou uma variável, procurando se existe outra possibilidade de instanciação. Exemplo: gosta(maria, comida). gosta(maria, vinho). gosta(joão, vinho). gosta(joão, maria). ?- gosta(maria, X), gosta(joão, X). 6 A Linguagem Prolog RETROCESSO (BACKTRACKING) 1º sub_objetivo 2º sub_objetivo gosta(maria, X), gosta(joão, X). gosta(maria, comida). gosta(maria, vinho). gosta(joão, vinho). gosta(joão, maria). X = comida Será procurado: gosta(joão, comida). A procura falha!! O valor instanciado na variável X (neste caso, comida) é esquecido e o Prolog procura um outro valor para a X. 7 A Linguagem Prolog RETROCESSO (BACKTRACKING) 1º sub_objetivo 2º sub_objetivo gosta(maria, X), gosta(joão, X). gosta(maria, comida). gosta(maria, vinho). gosta(joão, vinho). gosta(joão, maria). X = vinho 8 A Linguagem Prolog RECURSÃO As regras em Prolog são implicações lógicas Podem depender de fatos: presa(X) :- come(X,Y),animal(X) Podem depender de outras regras: caçado(X) :- presa(X) Podem depender da própria regra: com definição recursiva Uma das principais características herdadas da lógica pela linguagem Prolog é o uso da RECURSÃO. 9 A Linguagem Prolog RECURSÃO Exemplo: usar a BC ecológica para definir a relação na_cadeia_alimentar(X,Y) com o significado: ”Y está na cadeia alimentar de X” que por sua vez pode significar duas coisas: 1. X come Y diretamente. 2. X come algum animal que come algum animal que come algum animal ... que come Y. 10 A Linguagem Prolog RECURSÃO O caso 2. pode ser reescrito como: 2’. “X come Z e Y está na cadeia alimentar de Z” O caso 1. é o ponto de parada da regra recursiva. A regra incorpora os casos 1 e 2’: na_cadeia_alimentar(X,Y) :- come(X,Y). na_cadeia_alimentar(X,Y) :- come(X,Z), na_cadeia_alimentar(Z,Y). 11 A Linguagem Prolog RECURSÃO ?- na_cadeia_alimentar(urso,Y). resposta: 1. peixe 2. quati 3. raposa 4. cavalo 5. peixinho 6. alga 7. peixe 8. peixinho 9. alga 10. coelho 11. mato 12. mato 12 A Linguagem Prolog RECURSÃO antepassado(X,Z):-progenitor(X,Z). antepassado(X,Z):-progenitor(X,Y), antepassado(Y,Z). 13 A Linguagem Prolog LISTAS São estruturas simples de dados, largamente empregadas em computação não-numérica. Uma lista é uma seqüência de qualquer número de intens. Ex: [brasil, paraguai, uruguai, argentina] Para representar listas em Prolog, dois casos devem ser considerados: a lista vazia, representada por [ ]. A lista não-vazia. Ex: [maria, jorge, bete] 14 A Linguagem Prolog LISTAS A lista não-vazia possui dois componentes: CABEÇA e CAUDA. [brasil, paraguai, uruguai] CABEÇA = brasil CAUDA = [paraguai, uruguai] A cabeça de uma lista pode ser separada de sua cauda com o uso “ | “. Usando-se a lista [Cabeça|Cauda] e unificando essa lista com outra lista qualquer, a cabeça ficará com o 1º elemento da lista e a cauda ficará com o resto da lista. 15 A Linguagem Prolog LISTAS Lista 1 Lista 2 Unificação [a, b, c] [X|Y] [casa, pata] [X|Y] [a, b, c] [X,Y] X=a Y = [b, c] X = casa Y = pata Não unifica [data(7,Z,W),hoje] [X|Y] [a, b, c, d] [X,Y|Z] [elaini] [X|Y] X= Y= X= Y= Z= X= Y= data(7,Z,W) hoje a b [c, d] elaini [] 16 A Linguagem Prolog EXERCÍCIO: UNIFIQUE AS LISTAS ABAIXO LISTA 1 LISTA2 [[a,b]|Y] [H|T] [a,b] [X,Y|Z] [[a,b],[c,d]] [X,Y] [a] [X|Y] [[Ana,Y]|Z] [[X,foi],[ao_cinema]] [data(7,W,1993), hoje] [data(7,X,Y),Z] [a,b,c,d] [X,Y,Z] [X|[Y|Z]] [a,b,c,d] UNIFICAÇÃO 17 A Linguagem Prolog EXEMPLO USANDO LISTA E RECURSÃO Um programa em Prolog que retorna o último elemento de uma lista: ultimo([A],A). ultimo([Z|B],A):- ultimo(B,A). 18 A Linguagem Prolog DECLARAÇÃO IS Para realizar cálculos aritméticos em Prolog, usamos a declaração IS. Essa declaração deve ser colocada entre dois objetos: o 1º é uma variável e o segundo uma expressão aritmética. Exemplo: X is 2 + 5 * 9 / 4 A parte decimal do número é separada da parte inteira por um ponto (.) e não por uma vírgula (,). Ex: 13.23 19