- Desenvolvida por Alain Colmerauer e Philippe Roussel
- Concebida em 1970, primeiro sistema Prolog em 1972
- \alert{Cálculo de Predicados} e \alert{Princípio de Resolução}
- Informar ao computador os fatos e as regras
- Usar o princípio da resolução para inferir verdades
- Diferentes dialetos e implementações
- BProlog, Ciao, ECLiPSe, GNU Prolog, Jekejeke Prolog, Logic Programming Associates, Poplog Prolog, P#, Quintus, SICStus, Strawberry, SWI-Prolog, tuProlog, XSB, YAP-Prolog
- Diferem-se na sintaxe e nas bibliotecas
→ Funcionamento se mantém semelhante
- SWI-Prolog
- Open Source (Kernel licenciado pela LGPL)
http://www.swi-prolog.org/ - Disponível para diferentes plataformas
No Debian/Ubuntu Linux, o binário se chama swipl
- Open Source (Kernel licenciado pela LGPL)
Em um terminal, executar o \texttt{swipl}
write('Ola Mundo').
Ou:
Coloque o conteúdo acima em codigo.pl
(todas as letras do nome do
arquivo devem ser minúsculas) e depois
cat codigo.pl | swipl
Consultas
- Usuário
- Banco de dados Inteligente (BDI) & Sistemas Especialistas
Modelo imperativo e funcional
- Implementam um mapeamento da entrada para a saída
- Em geral, um para um
Modelo lógico
- Implementa uma relação (que pode ser de vários tipos)
- Um elemento se relaciona com outro
- Relação é mais geral que o mapeamento (maior abstração)
Sejam dois conjuntos de valores S e T
- Relação é estabelecida, resulta em verdadeiro ou falso
- Não há distinção entre entrada e saída
- y não é gerado a partir de x
- uma entrada não é transformada em saída
- Alfred Horn, propôs tais cláusulas em 1951
- Um programa lógico é uma coleção de cláusulas Horn
H ← B_1, B_2, B_3, …, B_n
Lê-se: H é verdade se B_1, …, B_n forem verdades
Tipos
- Fato (cláusula incondicional)
inteiro(3)
← - Consulta (cláusula negativa)
←inteiro(3)
- Regra (cláusula positiva)
inteiro(N)
←natural(N)
- Regra (cláusula condicional)
natural(N)
←inteiro(N), positivo(N)
É o único tipo da linguagem
- Representam qualquer coisa; natureza é indefinida
pessoa(joao). pessoa(jose). masculino(joao). masculino(jose). pai(joao,jose).
Nota de sintaxe
- Termos são todos em minúsculas e sem espaço
- Variáveis tem a primeira letra em maiúscula
Termos simples
- Átomos
- Constantes alfanuméricas:
leonardo
,'Porto Alegre'
- Constantes numéricas:
1
,12.12
- Constantes alfanuméricas:
- Variáveis:
X
,Cidades
,_ruas
,_123abc
Termos funcionais (cláusulas)
- Fatos/consultas:
pessoa(pedro,22,masculino).
- Regras:
capital_pais(X,Y):-pais(X), cidade(Y), capital(X,Y).
Especifique, no arquivo exercicio.pl
(este arquivo deve ser composto
apenas de letras minúsculas) os fatos que representem a árvore
seguinte, considerando as pessoas e seus respectivos sexos
pessoa(maria). feminino(maria).
Lançar swipl
e executar o comando
[exercicio].
Realizar uma consulta simples
pessoa(leandro). %Leandro é uma pessoa?
Descobrir o conhecimento sobre o mundo (barra de espaço, enter)
pessoa(X).
masculino(X).
feminino(X).
- Termos com letra maiúscula são variáveis
- Uma consulta pode ter uma única resposta
- verdadeiro ou falso
- várias ou nenhuma
- Um programa lógico é considerado um “mundo fechado”
- Tudo que a máquina sabe deve ser definida nele
- O que não se sabe ser verdadeiro é considerado falso
- O que não se pode provar é considerado falso
(mas não prova que não é verdade)
Prolog
permite especificar e consultar
- Dados a e b, determinar se
r(a,b).
é verdadeira - Dado a, encontrar todo X, tal que
r(a,X).
é verdadeira - Dado b, encontrar todo X, tal que
r(X,b).
é verdadeira - Encontrar todo X e Y, tal que
r(X,Y).
é verdadeira
Adicione novos fatos à base de conhecimento, no arquivo exercicio.pl
,
que especifiquem relações entre pais e filhos
pai(ana,joao).
mae(ana,maria).
Determinar se as relações são válidas
- João é pai de José?
Encontrar elementos que satisfaçam relações
- Quem é o pai de José?
- Quem são os avôs ou avós de Marcelo?
Sabe se há um elemento que satisfaça uma relação
- Existem pais?
- Existem filhos?
- Existem avôs e avós?
Descritas por cláusulas Horn Condicionais
irmao(X,Y) :- pai(X,P),
pai(Y,P),
X \= Y.
irmao(X,Y) :- mae(X,M),
mae(Y,M),
X \= Y.
, e
; ou
= unificação
\= Negação da unificação
== teste de identidade
\== negação da identidade
=:= igualdade aritmética
< > >= <= relacional
:= condicional
O que significa “Eu programo em Prolog”? Alguém que sabe como especificar uma base de conhecimento com fatos e regras utilizando a sintaxe da linguagem Prolog
capital(‘Brasil’, ‘Brasilia’).
capital(‘Franca’, ‘Paris’).
capital(‘RS’, 'Porto Alegre').
capital(‘SC', ‘Florianopolis’).
estadode(‘Brasil’, ‘SC’).
estadode(‘Brasil, ‘RS’).
estadode(‘Franca’, ‘Bretanha').
estadode(‘Franca’, ‘Normandia').
capital_pais(X, Y) :- pais(X), cidade(Y), capital(X,Y).
capital_estado(X,Y) :- estado(X), cidade(Y), capital(X,Y).