2. A Linguagem
Prolog
A Cláusula Prolog
“se”
“e”
“ou”
a :- b1, b2... bi; bj... bn.
Cabeça,
Corpo,
Conclusão,
Condição,
Consequente.
Antecedente.
2
Introdução à Programação Prolog
Operadores Prolog
Linguagem
Natural
Cálculo de
Predicados
Programas
Prolog
E


,
;


:-
OU
SE
NÃO
not
3
Introdução à Programação Prolog
Fatos
Seja a árvore genealógica
mostrada abaixo...
Maria
que pode ser representada pelo
seguinte programa Prolog:
João
José
Júlia
Ana
Íris
progenitor(maria, josé).
progenitor(joão, josé).
progenitor(joão, ana).
progenitor(josé, júlia).
progenitor(josé, íris).
progenitor(íris, jorge).
Este programa representa a
relação progenitor/2, na forma de
um predicado, que contém 6
cláusulas, que são todas fatos.
Jorge
4
Introdução à Programação Prolog
Consultas
O programa pode ser pensado
como uma tabela em uma BD.
progenitor(maria, josé).
progenitor(joão, josé).
progenitor(joão, ana).
progenitor(josé, júlia).
progenitor(josé, íris).
progenitor(íris, jorge).
No caso de um programa
constituído unicamente de fatos, a
semântica é exatamente a mesma
de uma BD relacional...
Introdução à Programação Prolog
que pode ser consultada de várias
maneiras:
?- progenitor(joão, ana).
true
?- progenitor(joão, jorge).
fail
?- progenitor(joão, X).
X=josé;
X=ana.
fail
?- progenitor(X,Y).
X=maria, Y=josé;
X=joão, Y=josé;
...
X=íris,
Y=jorge.
fail
5
Ampliando a Base de Fatos
O programa pode ser ampliado
acrescentando-se novos fatos
que inclusive podem
estabelecer novas relações.
No exemplo ao lado
acrescentou-se ao programa
original as relações
masculino/1 e feminino/1.
Estas relações, que possuem
aridade 1, podem ser pensadas
como sendo atributos dos
objetos a que se aplicam.
progenitor(maria, josé).
progenitor(joão, josé).
progenitor(joão, ana).
progenitor(josé, júlia).
progenitor(josé, íris).
progenitor(íris, jorge).
masculino(joão).
masculino(josé).
masculino(jorge).
feminino(maria).
feminino(ana).
feminino(júlia).
feminino(íris).
6
Introdução à Programação Prolog
Regras
As relações pai/2 e mãe/2
podem agora ser definidas
da seguinte maneira:
X é pai de Y se
X é progenitor de Y e
X é masculino.
X é mãe de Y se
X é progenitor de Y e
X é feminino.
Em Prolog:
pai(X,Y) :progenitor(X,Y),
masculino(X).
mãe(X,Y) :progenitor(X,Y),
feminino(X).
7
Introdução à Programação Prolog
Mais Regras
As relações irmão/2 e
irmã/2 podem agora ser
definidas da seguinte
maneira:
X é irmão de Y se
Z é progenitor de X e
Z é progenitor de Y e
X é masculino.
X é irmã de Y se ...
Em Prolog:
irmão(X,Y) :progenitor(Z,X),
progenitor(Z,Y),
masculino(X).
irmã(X,Y) :- ...
mas, esta regra tem um
problema. (qual?)
8
Introdução à Programação Prolog
Exercício
Acrescentar ao programa da árvore
genealógica as seguintes relações
(em 10 minutos):
avô/2
tia/2
prima/2
9
Introdução à Programação Prolog
Representação Textual
Considere o seguinte texto:
nasceu(joão,pelotas).
nasceu(jean,paris).
“João nasceu em Pelotas e Jean
nasceu em Paris. Paris fica na
França, enquanto que Pelotas
fica no Rio Grande do Sul. Mas
só é gaúcho quem nasceu no Rio
Grande do Sul, tchê.”
fica(paris,frança).
fica(pelotas,rs).
Ao lado a codificação em
Prolog:
?- gaúcho(X).
X=joão;
no
gaúcho(X):nasceu(X,Y),
fica(Y,rs).
10
Introdução à Programação Prolog
Predicados Recursivos
Seja, por exemplo, a relação
antepassado/2:
Maria
progenitor
João
Uma tentativa de
codificar esta relação em
Prolog seria:
antepassado(X,Y) :progenitor(X,Y).
progenitor
Júlia
(a)
Íris
progenitor
antepassado direto
Jorge
(b)
antepassado indireto
antepassado(X,Y) :progenitor(X,Z),
progenitor(Z,Y).
... (indefinidamente).
Claramente, uma má
solução. (Por que?)
11
Introdução à Programação Prolog
Predicados Recursivos
Uma representação mais
geral:
João
antepassado(X,Y) :progenitor(X,Y).
progenitor
Íris
antepassado
antepassado
...
Uma codificação recursiva
para antepassado/2:
antepassado(X,Y) :progenitor(X,Z),
antepassado(Z,Y).
... (só!).
Y
Por que esta solução é
melhor que a anterior?
12
Introdução à Programação Prolog
Caminhos em Grafos
Seja o grafo direcionado abaixo:
B
2
1
3
E
2
D
4
A
F
4
5
5
conecta(a,b,3).
conecta(a,c,4).
...
conecta(e,f,2).
C
E as relações conecta(X,Y,K) e
caminho(X,Y,K), onde X e Y são
nodos e K é o custo entre eles.
Ao lado, em Prolog:
caminho(X,Y,K):conecta(X,Y,K).
caminho(X,Y,K):conecta(X,Z,K1),
caminho(Z,Y,K2),
K is K1+K2.
?- caminho(X,Y,K).
X=a, Y=b, K=3;
...
no
13
Introdução à Programação Prolog
Predicados Recursivos
• Referenciam a si próprios.
• Possuem, no mínimo, duas cláusulas, uma recursiva
e a outra não.
• A cláusula não-recursiva denomina-se cláusula
básica.
• As cláusulas básicas podem ser regras ou fatos.
• As cláusulas recursivas são sempre regras.
• O predicado recursivo somente é bem sucedido na
cláusula básica.
• A cláusula recursiva nunca é bem sucedida.
14
Introdução à Programação Prolog
Programa Prolog
Consulta:
?-pai(joão, X).
Teorema a
ser provado
É executado a
partir de uma
consulta ou
cláusula
objetivo
( A)
Programa
PROLOG
Sistema
PROLOG:
Regras de
Inferência
Método de
Dedução SLD
Conjunto de
axiomas
Resultado:
sim/não ou
instanciações
das variáveis
da consulta
que permitem
prová-la
verdadeira no
contexto do
programa.
Cada
predicado
denota uma
relação
O domínio do
problema é
representado
como um
conjunto de
relações em
notação clausal
Conjunto de
Predicados
Predicados são
conjuntos de
cláusulas com
o mesmo nome
e aridade (no.
de argumentos)
Um predicado é
verdadeiro se pelo
menos uma das
suas cláusulas é
verdadeira.
A é verdadeiro
Fatos:
Verdades
incondicionais
Regras:
Verdades
condicionais
A
A  B, C, D ...
A é verdadeiro
se B, C, D ...
são todos
verdadeiros
Fato:
pai(joão, josé).
Regra:
pai(X, Y) :masculino(X),
progenitor(X, Y).
Variáveis
começam com
maiúsculas e
constantes com
minúsculas
15
Introdução à Programação Prolog
Tema para Casa
Criar a base de fatos da sua árvore genealógica
(inicialmente só com as relações progenitor/2,
masculino/1 e feminino/1).
Enriquecer com outras relações de parentesco além
das apresentadas (por exemplo: bisavó/2,
cunhado/2, ... etc).
Testar! (por exemplo: quem é tio de X?)
Sugestão: Pedir a ajuda das pessoas mais velhas
da família.
16
Introdução à Programação Prolog
Download

Programas Prolog