Escolar Documentos
Profissional Documentos
Cultura Documentos
Prolog (Tutorial)
Inteligncia Artificial
Introduo
Prolog
= Programming in Logic
Linguagem de programao utilizada para
resolver problemas envolvendo objetos e
relaes entre objetos
Conceitos bsicos: fatos, perguntas,
variveis, conjunes e regras
Conceitos avanados: listas e recurso
Programao Lgica
Programao
Procedural (procedimental):
Programao em Prolog
Programar em Prolog envolve:
declarar alguns fatos a respeito de objetos
e seus relacionamentos
definir algumas regras sobre os objetos e
seus relacionamentos e
fazer perguntas sobre os objetos e seus
relacionamentos
Objetos
Objetos Simples Estruturas
Constantes
tomos
Variveis
Nmeros
tomos
Objetos
Variveis
Nmeros
tomos (cont)
Objetos
Objetos Simples Estruturas
Constantes
tomos
Variveis
Nmeros
Nmeros
Objetos
Variveis
Nmeros
Variveis
So cadeias de letras,
dgitos e caracteres _,
Objetos
sempre comeando com
letra maiscula ou com o
Objetos Simples Estruturas caractere _.
Constantes
tomos
Variveis
Nmeros
Estruturas
So objetos de dados que
tm vrios componentes,
Objetos
podendo cada um deles,
por sua vez, ser uma
Objetos Simples Estruturas estrutura.
Constantes
tomos
Variveis
Nmeros
10
Abrao
Isaque
Ismael
Esa
Jac
Jos
11
Abrao
Isaque
Esa
Ismael
Jac
Jos
Abrao
Isaque
Esa
Ismael
Jac
Por exemplo
progenitor(abrao,isaque).
uma instncia particular
da relao progenitor
Esta instncia tambm
chamada de
relacionamento
Em geral, uma relao
definida como o conjunto de
todas suas instncias
Jos
13
15
Abrao
Isaque
Esa
Quando o programa
interpretado/compilado, pode-se
questionar Prolog sobre a relao
progenitor, por exemplo: Isaque
o pai de Jac?
Esta pergunta pode ser
comunicada Prolog digitando:
?- progenitor(isaque,jac).
Como Prolog encontra essa
pergunta como um fato inserido
em sua base, Prolog responde:
yes
Ismael
Jac
Jos
progenitor(sara,isaque).
progenitor(abrao,isaque).
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
16
Abrao
Isaque
Esa
Ismael
Jac
Jos
progenitor(sara,isaque).
progenitor(abrao,isaque).
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
17
Abrao
Isaque
Esa
Ismael
Jac
Jos
progenitor(sara,isaque).
progenitor(abrao,isaque).
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
18
Abrao
Isaque
Esa
Ismael
Jac
Jos
progenitor(sara,isaque).
progenitor(abrao,isaque).
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
19
Abrao
Isaque
Esa
Ismael
Jac
Jos
progenitor(sara,isaque).
progenitor(abrao,isaque).
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
X = sara Y = isaque;
X = abrao Y = isaque;
X = abrao Y = ismael;
...
progenitor
Y
av
progenitor
Jos
21
A pergunta composta
?- progenitor(Y,jos), progenitor(X,Y).
?- progenitor(abrao,X), progenitor(X,Y).
X = isaque
Y = esa;
X = isaque
Y = jac
22
23
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
24
Pontos Importantes
Um programa Prolog consiste de clusulas; cada
clusula termina com um ponto final
Os argumentos das relaes podem (entre outras
coisas) ser: objetos concretos ou constantes (tais
como abrao e isaque) ou objetos gerais tais
como X e Y. Objetos do primeiro tipo so
chamados tomos; objetos do segundo tipo so
chamados variveis
A aridade de uma relao o seu nmero de
argumentos e denotada como uma barra
seguida pela aridade
progenitor/2 significa que a relao progenitor possui
25
Pontos Importantes
X um progenitor de Esa e
X um progenitor de Jac
Exerccio
Expressar em portugus:
valioso(ouro).
femea(jane).
possui(joao,ouro).
pai(joao,maria).
da(joao,livro,maria).
27
Exerccio
gosta(joao, peixe).
gosta(joao,maria).
gosta(maria,livro).
gosta(pedro,livro).
gosta(maria,flor).
gosta(maria,vinho).
???????-
gosta(maria,X).
gosta(X,livro).
gosta(Quem,Oque).
gosta(X,Y).
gosta(X,X).
gosta(_a,_b).
gosta(A,peixe).
28
Exerccio
Sara
Abrao
Isaque
Esa
Ismael
Jac
Jos
progenitor(sara,isaque).
progenitor(abrao,isaque).
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
29
mulher(sara).
homem(abrao).
homem(isaque).
homem(ismael).
homem(esa).
homem(jac).
homem(jos).
As relaes mulher e
homem so relaes
unrias
Uma relao binria,
como progenitor, define
um relacionamento entre
pares de objetos
Relaes unrias so
usadas para declarar
propriedades simples
sim/no dos objetos
A primeira clusula unria
pode ser lida como Sara
uma mulher
30
Podemos declarar a
mesma informao
usando uma relao
binria sexo:
sexo(sara,feminino).
sexo(abrao,masculino).
sexo(isaque,masculino).
sexo(ismael,masculino).
sexo(esa,masculino).
sexo(jac,masculino).
sexo(jos,masculino).
31
sexo(sara,feminino).
Permite
propriedade(sara,sexo,feminino).
Permite
33
Em Prolog:
filho_geral(Y,X) :progenitor(X,Y).
34
Prolog como:
filho_geral(Y,X) :progenitor(X,Y).
incondicional)
Regras especificam coisas que so
verdadeiras se alguma condio satisfeita
35
:- progenitor(X,Y).
36
?- filho_geral(ismael,abrao).
filho_geral(Y,X) :progenitor(X,Y).
X = abrao e Y = ismael
filho_geral(ismael,abrao) :progenitor(abrao,ismael).
37
:
progenitor(abrao,ismael).
Assim, Prolog tenta provar que a condio verdadeira
Para provar a condio, trivial por Prolog encontra um
fato correspondente no programa
Isso implica que a concluso da regra tambm
verdadeira e Prolog responde afirmativamente pergunta:
?- filho_geral(ismael,abrao).
yes
38
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).
40
41
Exerccio
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).
42
Exerccio
Usando a base ao
lado, defina a regra:
Uma pessoa pode
roubar algo se essa
pessoa um ladro e
ela gosta de um objeto
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).
43
mulher
X
progenitor
X
filho_geral
progenitor
X
progenitor
me
av_geral
progenitor
Z
44
X
progenitor
X
filho_geral
progenitor
X
progenitor
me
av_geral
progenitor
Z
45
46
exemplo, a relao
av_geral(X,Z) :progenitor(X,Y),
progenitor(Y,Z).
47
X irmo de Y se
ambos X e Y tm um progenitor em comum e
X um homem.
Em Prolog:
irmo(X,Y) :-
progenitor(Z,X),
progenitor(Z,Y),
homem(X).
Z
progenitor
progenitor
homem
irmo
49
irmo(X,Y) :-
progenitor(Z,X),
progenitor(Z,Y),
homem(X),
diferente(X,Y).
50
Pontos Importantes
verdadeiras
Regras declaram coisas que so verdadeiras dependendo de
determinadas condies
Atravs de perguntas, o usurio pode questionar o programa
sobre quais coisas so verdadeiras
Pontos Importantes
se X um progenitor de Y ento
X tem filhos
Para todo X,
X tem filhos se
existe algum Y tal que X um progenitor de Y
52
Exerccios
Traduza
53
Regras Recursivas
Vamos
Para todo X e Z,
X um ancestral de Z se
X um progenitor de Z.
ancestral(X,Z) :progenitor(X,Z).
X
progenitor
ancestral
54
Regras Recursivas
X
X
progenitor
progenitor
Y1
ancestral
progenitor
progenitor
Y1
ancestral
progenitor
progenitor
Y2
Z
ancestral(X,Z) :progenitor(X,Y),
progenitor(Y,Z).
Y2
ancestral
progenitor
progenitor
Y3
ancestral(X,Z) :progenitor(X,Y1),
progenitor(Y1,Y2),
progenitor(Y2,Z).
progenitor
ancestral(X,Z) :Z
progenitor(X,Y1),
progenitor(Y1,Y2),
progenitor(Y2,Y3),
progenitor(Y3,Z).
55
Regras Recursivas
Para
todo X e Z,
progenitor
X um ancestral de Z se
Y
h algum Y tal que
X um progenitor de Y e
Y um ancestral de Z.
ancestral
ancestral(X,Z) :...
progenitor(X,Y),
ancestral(Y,Z).
ancestral
Z
56
Regras Recursivas
ancestral(X,Z) :% caso base
progenitor(X,Z).
ancestral(X,Z) :% caso recursivo
progenitor(X,Y),
ancestral(Y,Z).
Podemos perguntar: quais os descendentes de
Sara?
?- ancestral(sara,X).
X = isaque;
X = esa;
X = jac;
X = jos
57
filho_geral(Y,X) :progenitor(X,Y).
me(X,Y) :progenitor(X,Y),
mulher(X).
av_geral(X,Z) :progenitor(X,Y),
progenitor(Y,Z).
irmo(X,Y) :progenitor(Z,X),
progenitor(Z,Y),
homem(X).
ancestral(X,Z) :progenitor(X,Z).
ancestral(X,Z) :progenitor(X,Y),
ancestral(Y,Z).
58
Exerccio
ancestral(X,Z) :
progenitor
progenitor(X,Z).
ancestral(X,Z) :progenitor(X,Y),
ancestral(Y,Z).
ancestral(X,Z) :-
progenitor(X,Z).
ancestral(X,Z) :progenitor(Y,Z),
ancestral(X,Y).
ancestral
ancestral
...
Z
59
60