Paradigma Lógico
* Linguagens do paradigma lógico fazem parte do paradigma declarativo.
* Lembrando, o paradigma declarativo:
- É oposto ao paradigma imperativo
- Descreve/declara o que um programa faz, e não o seu fluxo de controle/como ele funciona.
- Descreve seus resultados desejados sem listar os passos ou a lista de comandos necessários para isso.
- Concentra-se em detalhes do problema e abstrai os detalhes de implementação.
- Dentro deste paradigma estão o paradigma lógico e o paradigma funcional.
* O paradigma lógico é baseado na lógica formal, especialmente em FATOS, REGRAS e CONSULTAS que envolvem o domínio em questão.
* Este conjunto de fatos e regras é chamado de BASE DE CONHECIMENTO.
* É um paradigma importante para aplicações de inteligência artificial (ex: robótica), SGBDs (Sistemas de Gerenciamento de Bancos de Dados), sistemas especialistas, processadores de linguagem natural, demonstração de teoremas e construção de compiladores.
* FATO: sentença aceita como verdadeira que estabelece um relacionamento entre objetos.
Exemplos:
Todo ser vivo é mortal.
Brasil é um país.
Blumenau é uma cidade.
é uma tag HTML.
A guerra dos cem anos durou mais de cem anos.
* REGRA é a composição de fatos. Define novas relações com base nas relações já existentes.
Exemplos:
João é pai de Otávio.
Otávio é pai de Pedro.
.:. João é avô de Pedro.
.:. Pedro é neto de João.
Macron governa a França.
França é um país.
.:. Macron governa um país.
* A linguagem Prolog
- Prolog significa programming in logic.
- É a linguagem de programação lógica mais utilizada (SEBESTA).
- Surgiu na década de 70.
- Possui uma sintaxe rigorosa quanto ao uso de letras minúsculas, maiúsculas e exige o uso do ponto final.
- Um programa em prolog é formado por um conjunto de declarações chamadas de cláusulas (fatos e regras), formando a base de conhecimento.
- Com uma base de conhecimento criada, realizam-se consultas por meio de uma interface.
- A base de conhecimento é acessada por meio do Motor de Inferências. É este motor que aplica as regras aos fatos, parando a execução quando encontra a solução -- que pode estar implícita -- ou quando não há regra a ser aplicada.
- Recomenda-se que a base de conhecimento seja completa, pois em prolog adota-se a hipótese de mundo fechado (o que não é explicitamente verdadeiro, assume-se como falso, ou, melhor dizendo, falso é aquilo que não é comprovadamente verdadeiro).
- A linguagem Prolog possui implementações compiladas e interpretadas desde a década de 70.
- Em sistemas unix like, a ferramenta utilizada é o "swipl" (SWI-Prolog), também executada pela palavra reservada "prolog".
- Ambiente on-line para programação com Prolog: https://swish.swi-prolog.org/
- Clicando em "Program" é exibida uma tela dividida em três partes: base de conhecimento, consultas e resultados.
- A base de conhecimento conterá o conjunto de fatos e regras
- A área de consultas é realizada para se fazer perguntas à base de conhecimento, verificando se ela pode provar que a consulta é verdadeira.
- A área de resultados exibe os resultados das consultas.
A linguagem Prolog funciona da seguinte maneira:
consulta
|------------| ---------> |------------| ---------> |------------| ---------> |------------|
| USER | | INTERFACE | | MOTOR INF. | |BASE CONHEC.|
|------------| <--------- |------------| <--------- |------------| <--------- |------------|
resposta
Exemplos de FATOS em Prolog:
cidade(blumenau). (***)
cidade(pelotas).
taghtml(tr).
país(brasil).
país(frança).
presidente(bolsonaro, brasil).
presidente(macron, frança). // Significado: Macron é presidente da França.
Exemplos de FATOS em linguagem natural e em Prolog:
Em linguagem natural // Prolog
Blumenau é uma cidade // cidade(blumenau).
SC é um estado // estado(sc).
Prolog é uma LP // lp(prolog).
- Pegando o exemplo (***) e usando a nomenclatura da linguagem Prolog, diz-se que "cidade" é um predicado.
- Cada valor inserido no predicado é chamado de átomo.
- Átomos devem ser escritos em letras minúsculas.
- No âmbito da matemática, um predicado é uma função cujo contradomínio é um conjunto formado por dois elementos: verdadeiro e falso. Assim, quando uma consulta for feita utilizando aquele predicado, o resultado será verdadeiro ou falso.
- Variáveis devem ser escritas em letras maiúsculas. Costuma-se utilizar X, Y, Z etc.
Exemplos de REGRAS em Prolog:
neto(X,Y) :- pai(Y,Z), pai(Z,X). // Define a relação "neto" em termos da relação "pai".
|
|
|-----> vírgula significa "E" lógico, ponto-e-vírgula significa "OU" lógico.
Portanto, para X ser neto de Y, é necessário que Y seja pai de Z e Z seja pai de X.
As relações neto e pai têm aridade 2 (quantidade de parâmetros).
De acordo com Baranauskas (2022), a regra em Prolog será sempre escrita da forma P :- Q[, R, S, T...].
P será sempre verdade se Q[, R, S, T...] for(em) verdade.
P será uma consequência de Q[,R, S, T...].
A partir de Q[, R, S, T...] segue P.
Para resolver o problema P, resolve-se primeiro o sub-problema Q[, depois o sub-problema R, depois o sub-problema S, depois o sub-problema T...].
Ainda para Baranauskas (2022), no caso das regras, diz-se que P é a cabeça da cláusula e Q[, R, S, T...] são as condições no corpo.
Com a declaração da regra é possível identificar, em uma base de conhecimento, através de uma consulta, se X é neto de Y.
Criação de uma base de conhecimento:
1) Digite em um editor de texto simples ou no quadro à esquerda em https://swish.swi-prolog.org/:
% Isso é um comentário
cidade(blumenau).
cidade(pelotas).
cidade(riogrande).
cidade(brusque).
cidade(florianopolis).
cidade(criciuma).
cidade(joinville).
cidade(indaial).
cidade(timbo).
2) Se optar pelo editor de texto, salve o arquivo como cidades.pl.
Realização de consultas (verificando se um relacionamento existe):
1) Se optar pelo terminal, abra-o no diretório em que cidades.pl está salvo e digite "prolog" ou "swipl".
2) No ambiente swipl, carregue o arquivo cidades.pl digitando [cidades]. (não esqueça que o ponto final é obrigatório).
Se optar pelo serviço online (https://swish.swi-prolog.org/), inicie pelo passo abaixo:
3) Realize consultas, por exemplo:
?- cidade(capão do leão).
?- cidade(joinville). // Joinville é uma cidade?
Cada consulta dessas retornará um valor lógico: verdadeiro (true) ou falso (false), caso a cidade faça ou não parte da base do conhecimento, respectivamente. Os símbolos "?-" já vêm inseridos no interpretador.
Fatos desconhecidos são assumidos como falsos.
Você também pode consultar os valores existentes:
cidade(X).
Nesta consulta você obterá um valor válido para X. Se quiser mais valores, pressione ";" no swipl ou o botão "next" em https://swish.swi-prolog.org/.
* O swipl é encerrado teclando "halt.".
* Outros operadores:
?- not(abacaxi==banana).
?- not(abacaxi\==banana).
?- -3 > 2.
?- 4+4^2 =< 24.99.
Analisar o arquivo times.pl.
Como realizar uma consulta equivalente às perguntas abaixo?
1) Que time tem verde na bandeira?
2) O Grêmio tem vermelho na bandeira?
As respostas seriam:
?- bandeira(X, verde).
?- bandeira(gremio, vermelho).
Na primeira resposta, um time que possui verde na bandeira seria exibido. Caso existem mais times, é possível solicitar que o próximo time seja informado. Neste caso, utilizamos a variável X onde seria escrito um time, assim o programa irá procurar um átomo válido para substituir aquela variável.
Na segunda consulta, basta utilizar os átomos grêmio e vermelho, pois queremos saber se a bandeira do Grêmio tem vermelho.
Outros exemplos: pai.pl e politico.pl.
Prolog permite o uso de um "curinga" no texto. Ele é representado pelo underline (_). Neste caso, qualquer coisa que você digitar no lugar será válida. Por exemplo, considere que temos o fato abaixo em nossa base de conhecimento:
bairro(_).
Neste caso, ao realizar a consulta e inserir qualquer valor para bairro, a consulta sempre retornará true:
bairro(araraquara).
bairro(ricardo).
bairro(iushdiua).
Desvantagens da linguagem Prolog:
- A hipótese de mundo fechado, pois Prolog consegue provar o que é verdade, mas não prova o que é falso.
- Limitações intrínsecas do modelo declarativo: por se preocupar em declarar o que o programa deve fazer, e não como fazer. Por exemplo: como tornar eficiente um processo de ordenação?
- Para mais informações, leia Sec. 16.7 de SEBESTA.