Paradigmas de Programação Programação Lógica (em uma aula!) Profª Andréa Schwertner Charão DLSC/CT/UFSM
Programação lógica Paradigma baseado no Cálculo de Predicados (Lógica Matemática Dedutiva) Exemplo: Zé Carioca é um papagaio. Todo papagaio é uma ave. Logo, Zé Carioca é uma ave.
Bases da programação lógica Lógica matemática Cálculo de predicados Cláusulas de Horn Em outras palavras Descrição de proposições e verificação quanto à validade das mesmas Proposições envolvem símbolos e operadores lógicos Significado peq p ou q p implica q p equivale a q Representação p q p q p q p q
Elementos de um programa Fatos: cláusulas sem nenhuma negação (verdades incondicionais) Regras: cláusulas com condicionais Consultas: verificação de uma verdade (execução do programa)
Elementos de um programa: exemplo Fato Zé Carioca é um papagaio. Regra de inferência Todo papagaio é uma ave (ou "se X é um papagaio, X é uma ave") Consulta Zé Carioca é uma ave? Solução/resposta/resultado Sim
Elementos de um programa: exemplo Base de fatos João é pai de José. João é pai de Maria. Consulta João é pai de quem? Solução/resposta/resultado José Maria
Elementos de um programa: exemplo Fato O fatorial de 0 é 1. Regra O fatorial de um número N é F, se (N > 0) e F é N*fatorial(N-1). Consultas/Respostas: O fatorial de 2 é 200? Resposta: Não Consulta: Quanto é o fatorial de 3? Resposta: 6
Origens e aplicações Sistemas especialistas: emulação da habilidade humana em algum domínio do conhecimento (ex. medicina) Sistemas inteligentes, por exemplo: jogos: capacidade de derivar novos cenários, comportamentos, etc. bancos de dados: capacidade de deduzir informações a partir dos dados no banco Processamento de linguagem natural: chatbots Educação: ensino de lógica, contribuindo para pensamento e expressão mais claros
Linguagens de programação lógica
Linguagem Prolog Diferentes dialetos Interpretadores e compiladores Exemplos: SWI Prolog, Turbo Prolog, LPA Prolog, GNU Prolog, etc.
Programas em Prolog "Zé Carioca é um papagaio" papagaio("ze Carioca"). fato "Todo papagaio é uma ave" (ou "se X é um papagaio, então X é uma ave") ave(x) :- papagaio(x). regra Zé Carioca é uma ave??- ave("ze Carioca"). true resultado consulta
Programas em Prolog Ciclo de programação Prolog Fornecer base de fatos e regras ao interpretador (carga do programa) Solicitar a verificação de uma proposição/meta (consulta) Programa é um mundo fechado Um fato é considerado falso quando Não está presente na base de fatos do programa Não é dedutível a partir da base de fatos usando a base de regras
Instruções em Prolog termo constante variável iniciam com Maiúscula átomo número string valores simbólicos Ex.: pai, adao, fatorial, teste1, Ex.: 9, 10.2, 0.133 raiz_2 iniciam com minúscula estrutura Ex.: X, Area predicado(arg1,..., argn) Ex.: "Adão" proposições do cálculo de predicados
Variáveis em Prolog Não são como variáveis de linguagens imperativas Não são declaradas e não são vinculadas a tipos Vinculação de valor (instanciação) ocorre no processo de resolução, para verificar se uma meta é verdadeira (exemplo: X = "Ze Carioca") ave(x) :- papagaio(x).
Declaração de fatos Formas gerais de declaração de fatos: 1) propriedade(obj_const). predicado Ex.: cachorro(bobbypai). gordo(bobbypai). bobbypai é um cachorro 2) relacao(obj_const1,..., obj_constn). Ex.: pai(bobbypai, bobbyfilho). bobbypai é pai de bobbyfilho
Consultas Consultas/metas devem seguir as mesmas convenções da base de fatos Formas de consultas: 1) validação de uma proposição?- predicado(arg1,..., argn). Resposta/resultado: yes ou no Ex.: cachorro(bobbypai). cachorro(bobbyfilho).?- cachorro(bobbypai). true?- cachorro(pluto). false
Consultas Formas de consultas: consulta com unificação: ligação de conteúdo a variáveis 2) verificação de existência?- predicado(..., Var1,...). Resposta/resultado: constante(s) Ex.: cachorro(bobbypai). cachorro(bobbyfilho). gordo(bobbypai). Ponto-e-vírgula:?- gordo(x). verifica se existe X = bobbypai outra resposta?- cachorro(x). X = bobbypai ; X = bobbyfilho
Consultas com operadores Operadores relacionais (aritméticos) > maior < menor >= maior ou igual =< menor ou igual =:= igual =\= não igual Exemplos idade(pedro, 35). idade(ana, 30). idade(paulo, 27).?- idade(n, X), X =< 30.?- idade(n, X), X > 25, X < 30.?- 1 + 2 =\= 2 + 1. false?- 1 + 2 =:= 2 + 1. true
Declaração de regras Esta cláusula é uma regra: ave(x) :- papagaio(x). Neste exemplo X é uma variável ave e papagaio são predicados Forma geral: consequente : antecedente leia-se: então : se
Declaração de regras Regras compostas: conetivo e (,) Ex.: Se X é pai de Y E Y é pai de Z, então X é avô de Z Em Prolog: avo(x,z) :- pai(x,y), pai(y,z). Regras compostas: conetivo ou (;) Ex.: Se X é um papagaio OU uma coruja, então X é uma ave Em Prolog: ave(x) :- papagaio(x) ; coruja(x).
Regras com operações aritméticas Operador is soma(a,b,c) :- A is B + C.?- soma(a, 1, 4). A = 5 Atenção!!! este operador não deve ser usado como uma atribuição: Ex.: soma(a,b,c) : A is A + B + C. Isso é ERRADO, pois as variáveis só são instanciadas para satisfazer metas. Se A já estiver instanciado, A não pode estar do lado esquerdo do "is"!
Declaração de regras Exemplo com uso de operadores aritméticos: largura(sala,4). comprimento(sala,5). largura(quarto,3). comprimento(quarto,2). area(x,y) :- largura(x,l), comprimento(x,c), Y is L * C.?- area(sala,x). X = 20?- area(banheiro,x). false
Listas em Prolog Estruturas suportadas nativamente Seqüência finita de elementos Homogêneas ou heterogêneas Representação: elementos entre colchetes, separados por vírgula [a, b, c, d]. [casa(1, azul), casa(2, verde)]. pessoas([jose, 20, brasil, santa_maria], [maria, 24, uruguai, montevideo]).
Listas em Prolog Representação genérica: formato [H T], onde: H representa primeiro elemento (head) T representa o restante (tail)?- [7,8,9] = [H T] H = 7 T = [8, 9]?- [7] = [X Y] X = 7 Y = []?- [] = [A B] false. operador "=": (unificação) ligação de conteúdo a variáveisc
Listas em Prolog Representação genérica: formato [H T] Pode ser usada em fatos e regras teste(lis, H, T) :- Lis = [H T].?- teste([7,8,9], X, Y). X = 7 Y = [8,9]?- teste(l, 7, [8,9]). L = [7,8,9].?- teste([7,8,9], 10, Z). false.
Listas em Prolog Representação genérica: formato [H T] Pode ser usada em fatos e regras teste(lis, H, T) :- Lis = [H T]. Forma abreviada (fato com variáveis): teste([h T], H, T).
Listas em Prolog Outro exemplo: "U é o último na lista [_ R] se for o último na lista R" ultimo([u],u). ultimo([_ R], U) :- ultimo(r,u).?- ultimo([9,7,8], U). U = 8.
Listas em Prolog Podemos definir outros predicados "Somatório S de uma lista [H T] é igual a H mais o somatório S1 de T" sumlist([],0). sumlist([h T], S) :sumlist(t, S1), S is H + S1.
Listas em Prolog Existem predicados pré-definidos, p.ex.:?- member(a, [a,b,c]). true.?- member(x, [a,b,c]). false.?- length([a,b,c],l). L = 3?- nextto(1,2,[1,2,3]). true.?- nextto(2,y,[1,2,3]). Y = 3
Problemas em Prolog Há 5 casas de diferentes cores, com donos de diferentes nacionalidades. Os proprietários bebem diferentes bebidas, fumam diferentes cigarros e têm diferentes animais de estimação. Sabe-se que: 1. O inglês vive na casa vermelha. 2. O sueco tem cachorros. 3. O dinamarquês bebe chá. 4. A casa verde fica à esquerda da casa branca. 5. O dono da casa verde bebe café. 6. A pessoa que fuma Pall Mall cria pássaros. 7. O dono da casa amarela fuma Dunhill. 8. O homem que vive na casa do centro bebe leite. 9. O norueguês vive na primeira casa. 10. O homem que fuma Blends vive ao lado do que tem gatos. 11. O homem que cria cavalos vive ao lado do que fuma Dunhill. 12. O homem que fuma Bluemaster bebe cerveja. 13. O alemão fuma Prince. 14. O norueguês vive ao lado da casa azul. 15. O homem que fuma Blends é vizinho do que bebe água. Pergunta-se: QUEM CRIA PEIXES?"
Problemas em Prolog % Regras para determinar se X está ao lado de Y ao_lado(x, Y, List) :- nextto(x, Y, List). % X à esquerda de Y ao_lado(x, Y, List) :- nextto(y, X, List). % Y à esquerda de X % A solução é uma lista de casas, sendo que cada casa tem a forma: % casa(cor, nacionalidade, animal, bebida, cigarro) % member(e, List): verdadeiro se E é um dos elementos de List % O operador "=" unifica o lado esquerdo com o direito solucao(casas, Dono_Peixe) :Casas = [_, _, _, _, _], % a solucao é uma lista com 5 elementos member(casa(vermelha, ingles, _, _, _), Casas), % Condição 1: esta casa é membro da solucao member(casa(_, sueco, cachorro, _, _), Casas), % Condição 2: esta casa também, e assim por diante member(casa(_, dinamarques, _, cha, _), Casas), nextto(casa(verde,_,_,_,_), casa(branca,_,_,_,_), Casas), member(casa(verde, _, _, cafe, _), Casas), member(casa(_, _, passaro, _, pallmall), Casas), member(casa(amarela, _, _, _, dunhill), Casas), [_, _, casa(_, _, _, leite, _), _, _] = Casas, % Condição 8: na casa do centro se bebe leite [casa(_, noruegues, _, _, _) _] = Casas, % Condição 9: primeira casa ao_lado(casa(_, _, _, _, blends), casa(_, _, gato, _, _), Casas), ao_lado(casa(_, _, _, _, dunhill), casa(_, _, cavalo, _, _), Casas), member(casa(_, _, _, cerveja, bluemaster), Casas), member(casa(_, alemao, _, _, prince), Casas), ao_lado(casa(_, noruegues, _, _, _), casa(azul, _, _, _, _), Casas), ao_lado(casa(_, _, _, _, blends), casa(_, _, _, agua, _), Casas), member(casa(_, Dono_Peixe, peixe, _, _), Casas). % Condição final, para saber quem cria peixes
Mais sobre isso em... Sebesta, R. Conceitos de Linguagens de Programação. Bookman, 2011. Capítulo 16: Linguagens de programação lógica.