Você está na página 1de 21

Introduo Programao Lgica

Pontos importantes

O nome de uma relao deve comear com uma letra


minscula
A relao escrita primeiro e os seus argumentos so
separados por vrgulas e colocados entre parnteses
O ponto final . deve seguir o final do fato
fcil definir uma relao em Prolog, por exemplo a
relao progenitor, escrevendo ntuplas de objetos
que satisfazem a relao
O usurio pode perguntar ao sistema Prolog sobre
relaes definidas no programa
2

Pontos importantes

Perguntas consistem em uma ou mais clusulas


Uma
seqncia
de
clusulas,
tal
como:
progenitor(X,esa), progenitor(X,jac)
Significa a conjuno das clusulas
X um progenitor de Esa e
X um progenitor de Jac

A resposta a uma pergunta pode ser


Positiva: a pergunta satisfatvel e teve sucesso (suceeded)
Negativa: a pergunta insatisfatvel e falhou (failed)

Se vrias respostas satisfazem uma pergunta, Prolog


encontra tantas quantas possveis
Se o usurio estiver satisfeito com a resposta, basta digitar
enter
Se desejar mais respostas, usa-se
ponto-e-vrgula ;
3

Exerccios

Expressar em portugus:
valioso(ouro).
femea(jane).
possui(joao,ouro).
pai(joao,maria).
da(joao,livro,maria).

Exerccios

gosta(joao, peixe).
gosta(joao,maria).
gosta(maria,livro).
gosta(pedro,livro).
gosta(maria,flor).
gosta(maria,vinho).

Quais
as
respostas
dadas por Prolog?
?- gosta(maria,X).
?- gosta(X,livro).
?- gosta(Quem,Oque).
?- gosta(X,Y).
?- gosta(X,X).
?- gosta(_a,_b).
?- gosta(A,peixe).

Exerccios

Quais
as
respostas
dadas por Prolog?
(a) ?- progenitor(jos,X).
(b) ?- progenitor(X,jos).
(c) ?- progenitor(sara,X),
progenitor(X,jac).
(d) ?- progenitor(sara,X),
progenitor(X,Y),
progenitor(Y,jos).

progenitor(sara,isaque).
progenitor(abrao,isaque).
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
6

Definindo relaes por regras

Nosso
programa
sobre As relaes mulher e
famlias pode ser estendido homem
so
relaes
de vrias formas
unrias
Vamos
adicionar
a Uma relao binria, como
informao sobre o sexo das progenitor,
define
um
pessoas
envolvidas
na relacionamento entre pares
relao progenitor
de objetos
Por exemplo:
Relaes
unrias
so
usadas
para
declarar
mulher(sara).
propriedades
simples
homem(abrao).
sim/no dos objetos
homem(isaque).
A primeira clusula unria
homem(ismael).
pode ser lida como Sara
homem(esa).
uma mulher
homem(jac).
homem(jos).
7

Definindo relaes por regras

Informao sobre o sexo das Podemos declarar a mesma


pessoas
envolvidas
na informao usando uma
relao progenitor:
relao binria sexo:
mulher(sara).
sexo(sara,feminino).
homem(abrao).
sexo(abrao,masculino).
homem(isaque).
sexo(isaque,masculino).
homem(ismael).
sexo(ismael,masculino).
homem(esa).
sexo(esa,masculino).
homem(jac).
sexo(jac,masculino).
homem(jos).
sexo(jos,masculino).

Escolhendo objetos e relaes

Como representar: Sara uma mulher


mulher(sara).
Permite responder: Quem mulher?
No permite responder: Qual o sexo de Sara?

sexo(sara,feminino).
Permite responder: Quem mulher?
Permite responder: Qual o sexo de Sara?
No permite responder: Qual a propriedade de Sara que
tem o valor feminino?

propriedade(sara,sexo,feminino).
Permite responder todas as perguntas
Representao objeto-atributo-valor
9

Definindo relaes por regras

Vamos estender o programa introduzindo a relao


filho_geral como o inverso da relao progenitor
Podemos definir filho_geral de maneira similar
relao progenitor, ou seja enumerando uma lista de
fatos sobre a relao filho_geral, por exemplo:
filho_geral(isaque,sara).
filho_geral(iisaque,abrao).
filho_geral(ismael,abrao).
...

10

Definindo relaes por regras

Entretanto, a relao filho_geral pode ser definida de


modo mais elegante:
Para todo X e Y,
Y um filho_geral de X se
X um progenitor de Y.
Em Prolog:
filho_geral(Y,X) :- progenitor(X,Y).
Esta clusula tambm pode ser lida como:
Para todo X e Y,
se X um progenitor de Y ento
Y um filho_geral de X
11

Definindo relaes por regras

Clusulas Prolog como:


filho_geral(Y,X) :- progenitor(X,Y).
so chamadas regras (rules)
H uma diferena importante entre fatos e regras:
Um
fato

sempre
verdadeiro
(verdade
incondicional)
Regras especificam coisas que so verdadeiras se
alguma condio satisfeita

12

Definindo relaes por regras

filho_geral(Y,X) :- progenitor(X,Y).

Corpo (body) ou condio


da regra
(lado direito da regra)

Cabea (head) ou concluso


da regra
(lado esquerdo da regra)

13

Definindo relaes por regras

Vamos perguntar se Ismael filho_geral de Abrao:


?- filho_geral(ismael,abrao) .
Como no h fatos sobre a relao filho_geral, a nica forma de Prolog
responder esta pergunta aplicando a regra sobre filho_geral
filho_geral(Y,X) :- progenitor(X,Y).

A regra geral no sentido que aplicvel a quaisquer objetos X e Y;


portanto ela pode tambm ser aplicada a objetos particulares tais como
ismael e abrao
Para aplicar a regra a ismael e abrao, Y tem que ser substitudo por
ismael e X por abrao
Neste caso, dizemos que as variveis X e Y esto instanciadas a:
X = abrao e Y = ismael

Depois da instanciao, obtemos um caso especial da regra geral, que


:
filho_geral(ismael,abrao) :- progenitor(abrao,ismael).

14

Definindo relaes por regras

A condio da regra com as variveis instanciadas


filho_geral(ismael,abrao) :- progenitor(abrao,ismael).

:
progenitor(abrao,ismael).

Assim, Prolog tenta provar que a condio verdadeira


Para provar a condio, trivial por Prolog encontrar um fato
correspondente no programa
Isso implica que a concluso da regra tambm verdadeira e
Prolog responde afirmativamente pergunta:
?- filho_geral(ismael,abrao).
yes
15

Definindo relaes por regras

Vamos incluir a especificao da relao me, com


base no seguinte fundamento lgico:
Para todo X e Y,
X a me de Y se
X um progenitor de Y e
X uma mulher.

Traduzindo para Prolog:


me(X,Y) :progenitor(X,Y),
mulher(X).

Uma vrgula entre duas condies indica a conjuno


das condies, significando que ambas condies tm
que ser verdadeiras
16

Definindo relaes por regras

Exemplo: de Portugus para Prolog


Uma pessoa me se tiver algum filho e essa
pessoa for mulher
Uma pessoa me se for progenitor de algum e
essa pessoa for mulher
Uma pessoa X me de Y se X for progenitor de Y
e X for mulher
X me de Y se X progenitor de Y e X mulher
me(X,Y) :progenitor(X,Y),
mulher(X).
17

Definindo relaes por regras

Em Prolog, uma regra consiste de uma


cabea e uma corpo
A cabea e o corpo so conectados pelo
smbolo :-, denominado neck, formado por
dois pontos e hfen
:- pronunciado se
me(X,Y) :- progenitor(X,Y), mulher(X).

18

Exerccios

Identifique a cabea e cauda de cada regra.


Expressar cada regra em Portugus:
gosta(joao,X) :gosta(X,vinho),
gosta(X,comida).
gosta(joao,X) :mulher(X),
gosta(X,vinho).
19

Exerccios

Usando a base ao lado,


defina a regra: Uma pessoa
pode roubar algo se essa
pessoa um ladro e ela
gosta desse algo
Qual a resposta dada por
Prolog a pergunta: Joo rouba
o qu?

ladrao(joao).
ladrao(pedro).
gosta(maria,flor).
gosta(maria,queijo).
gosta(maria,vinho).
gosta(joao,rubi).
gosta(joao,X) :gosta(X,vinho).

20

FIM
21

Você também pode gostar