Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Prolog (Tutorial)
Esta aula introduz conceitos
bsicos da linguagem de
programao lgica Prolog
Os conceitos so introduzidos
atravs de um tutorial sobre
relaes familiares
Maiores detalhes sobre
terminologia e notao sero
vistos nas prximas aulas
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
2
Programao Lgica
Programao Procedural (procedimental):
Programa = Algoritmo + Estruturas de Dados
Programao Lgica
Algoritmo = Lgica + Controle
Programa = Lgica + Controle + Estruturas de
Dados
Em PL, programa-se de forma declarativa, ou
seja, especificando o que deve ser computado
ao invs de como deve ser computado
3
Programao em Prolog
4
Objetos de dados e Prolog
Objetos
Constantes Variveis
tomos Nmeros
5
tomos
6
tomos (cont)
7
Nmeros
Constantes Variveis
tomos Nmeros
8
Variveis
So cadeias de letras,
dgitos e caracteres _,
Objetos
sempre comeando com
letra maiscula ou com o
Objetos Simples Estruturas caractere _.
Constantes Variveis
tomos Nmeros
9
Estruturas
Constantes Variveis
tomos Nmeros
10
Definindo Relaes por Fatos
Sara Abrao
A figura ao lado mostra um
exemplo da relao famlia
O fato que Abrao um
progenitor de Isaque pode
Isaque Ismael ser escrito em Prolog como:
progenitor(abrao,isaque).
Neste caso definiu-se
progenitor como o nome
Esa Jac
de uma relao; abrao e
isaque so seus
argumentos
Jos
11
Definindo Relaes por Fatos
Sara Abrao
A rvore familiar completa
em Prolog :
progenitor(sara,isaque).
progenitor(abrao,isaque).
Isaque Ismael progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
Esa Jac Este programa consiste de
seis clusulas
Cada uma dessas clusulas
Jos declara um fato sobre a
relao progenitor
12
Definindo Relaes por Fatos
Sara Abrao
Por exemplo
progenitor(abrao,isaque).
uma instncia particular
da relao progenitor
Isaque Ismael Esta instncia tambm
chamada de
relacionamento
Esa Jac
Em geral, uma relao
definida como o conjunto de
todas suas instncias
Jos
13
Definindo Relaes por Fatos
A ordem dos argumentos em uma relao
definida arbitrariamente, mas deve ser
seguida e usada de forma consistente
progenitor(abrao,isaque)
significa que Abrao progenitor de Isaque
progenitor(isaque,abrao)
significa que Isaque progenitor de Abrao
Note que progenitor(abrao,isaque) no
tem o mesmo significado que
progenitor(isaque,abrao)
14
Definindo Relaes por Fatos
Os nomes das relaes e seus argumentos so
arbitrrios, ou seja:
progenitor(abrao,isaque)
a(b,c)
so semanticamente equivalentes desde que
a signifique progenitor
b signifique abrao e
c signifique isaque
Normalmente, o programador escolhe nomes
significativos
15
Definindo Relaes por Fatos
Sara Abrao Quando o programa
interpretado/compilado, pode-se
Isaque Ismael
questionar Prolog sobre a relao
progenitor, por exemplo: Isaque
o pai de Jac?
Esa Jac Esta pergunta pode ser
comunicada Prolog digitando:
Jos
?- progenitor(isaque,jac).
Como Prolog encontra essa
progenitor(sara,isaque). pergunta como um fato inserido
progenitor(abrao,isaque). em sua base, Prolog responde:
progenitor(abrao,ismael). yes
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
16
Definindo Relaes por Fatos
Sara Abrao Uma outra pergunta pode ser
?- progenitor(ismael,jac).
Isaque Ismael Prolog responde:
no
porque o programa no menciona
Esa Jac
nada sobre Ismael como sendo o
progenitor de Jac
Jos Prolog tambm responde no
pergunta:
progenitor(sara,isaque).
?- progenitor(jac,moiss).
progenitor(abrao,isaque).
no
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
17
Definindo Relaes por Fatos
Sara Abrao Perguntas mais interessantes
tambm podem ser efetuadas:
Isaque Ismael
Quem o progenitor de Ismael?
?- progenitor(X,ismael).
Neste caso, Prolog no vai
Esa Jac responder apenas yes ou no.
Prolog fornecer o valor de X tal
Jos
que a pergunta acima seja
verdadeira
progenitor(sara,isaque). Assim a resposta :
progenitor(abrao,isaque). X = abrao
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
18
Definindo Relaes por Fatos
Sara Abrao A pergunta Quais os filhos de
Isaque? pode ser escrita como:
Isaque Ismael ?- progenitor(isaque,X).
Neste caso, h mais de uma
resposta possvel; Prolog primeiro
Esa Jac responde com uma soluo:
X = esa
Jos Pode-se requisitar uma outra soluo
(digitando ;) e Prolog encontra:
progenitor(sara,isaque). X = jac
progenitor(abrao,isaque). Se mais solues forem requisitadas,
progenitor(abrao,ismael). Prolog responde no pois todas as
progenitor(isaque,esa). solues foram exauridas (no = sem
progenitor(isaque,jac). mais solues)
progenitor(jac,jos).
19
Definindo Relaes por Fatos
Sara Abrao Questes mais amplas podem ser
efetuadas: Quem o progenitor de
quem?
Isaque Ismael Reformulando: encontre X e Y tais
que X o progenitor de Y
?- progenitor(X,Y).
Esa Jac
Prolog encontra todos os pares
progenitor-filho um aps o outro
Jos As solues so mostradas uma de
cada vez:
progenitor(sara,isaque). X = sara Y = isaque;
progenitor(abrao,isaque). X = abrao Y = isaque;
X = abrao Y = ismael;
progenitor(abrao,ismael).
...
progenitor(isaque,esa). As solues podem ser interrompidas
progenitor(isaque,jac). digitando [enter] ao invs de ;
progenitor(jac,jos).
20
Definindo Relaes por Fatos
Perguntas mais complexas tambm podem ser
efetuadas, tais como: Quem o av de Jos?
X
Como nosso programa no conhece
diretamente a relao av, esta pergunta deve
progenitor
ser desmembrada em dois passos
(1) Quem o progenitor de Jos? Assuma que um av
Y Y
21
Definindo Relaes por Fatos
A pergunta composta
?- progenitor(Y,jos), progenitor(X,Y).
Pode ser lida como:
Encontre X e Y tais que satisfaam os seguintes requisitos
progenitor(Y,jos) e progenitor(X,Y)
De maneira similar, podemos perguntar: Quem so os
netos de Abrao?
?- progenitor(abrao,X), progenitor(X,Y).
X = isaque
Y = esa;
X = isaque
Y = jac
22
Definindo Relaes por Fatos
Outro tipo de pergunta pode ser efetuado:
Esa e Jc tm um progenitor em
comum?
Isso pode ser expresso em duas etapas:
Quem o progenitor, X, de Esa?
(este mesmo) X um progenitor de Jac?
A pergunta correspondente em Prolog :
?- progenitor(X,esa), progenitor(X,jac).
X = isaque
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 n-
tuplas 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
2 argumentos, ou que a relao progenitor tem aridade
2
25
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 return
Se desejar mais respostas, usa-se ponto-e-vrgula ;
26
Exerccio
Expressar em portugus:
valioso(ouro).
femea(jane).
possui(joao,ouro).
pai(joao,maria).
da(joao,livro,maria).
27
Exerccio
gosta(joao, peixe). Quais as respostas dadas por
gosta(joao,maria). Prolog?
gosta(maria,livro). ?- gosta(maria,X).
gosta(pedro,livro). ?- gosta(X,livro).
gosta(maria,flor). ?- gosta(Quem,Oque).
gosta(maria,vinho). ?- gosta(X,Y).
?- gosta(X,X).
?- gosta(_a,_b).
?- gosta(A,peixe).
28
Exerccio
Sara Abrao
Quais as respostas dadas por Prolog?
(a) ?- progenitor(jos,X).
Isaque Ismael (b) ?- progenitor(X,jos).
(c) ?- progenitor(sara,X),
progenitor(X,jac).
Esa Jac
(d) ?- progenitor(sara,X),
progenitor(X,Y),
Jos progenitor(Y,jos).
progenitor(sara,isaque).
progenitor(abrao,isaque).
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
29
Definindo Relaes por Regras
Nosso programa sobre famlias As relaes mulher e
pode ser estendido de vrias homem so relaes
formas
unrias
Vamos adicionar a informao
sobre o sexo das pessoas Uma relao binria,
envolvidas na relao como progenitor, define
progenitor um relacionamento entre
Por exemplo: pares de objetos
mulher(sara).
homem(abrao).
Relaes unrias so
homem(isaque). usadas para declarar
homem(ismael). propriedades simples
homem(esa). sim/no dos objetos
homem(jac). A primeira clusula unria
homem(jos). pode ser lida como Sara
uma mulher
30
Definindo Relaes por Regras
Informao sobre o sexo Podemos declarar a
das pessoas envolvidas mesma informao
na relao progenitor: usando uma relao
mulher(sara). binria sexo:
homem(abrao). sexo(sara,feminino).
homem(isaque). sexo(abrao,masculino).
homem(ismael). sexo(isaque,masculino).
homem(esa). sexo(ismael,masculino).
homem(jac). sexo(esa,masculino).
homem(jos). sexo(jac,masculino).
sexo(jos,masculino).
31
Escolhendo Objetos e Relaes
Como representar: Sara uma mulher
mulher(sara).
Permiteresponder: 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).
Permiteresponder todas as perguntas
Representao objeto-atributo-valor
32
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(isaque,abrao).
filho_geral(ismael,abrao).
...
33
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:
Par todo X e Y,
se X um progenitor de Y ento
Y um filho_geral de X
34
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
35
Definindo Relaes por Regras
filho_geral(Y,X) :- progenitor(X,Y).
36
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).
37
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 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
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
39
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).
40
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
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 ladrao(joao).
lado, defina a regra: ladrao(pedro).
Uma pessoa pode gosta(maria,flor).
roubar algo se essa gosta(maria,queijo).
pessoa um ladro e gosta(maria,vinho).
ela gosta de um objeto gosta(joao,rubi).
Qual a resposta dada gosta(joao,X) :-
por Prolog a pergunta: gosta(X,vinho).
Joo rouba o qu?
43
Grafos Definindo Relaes
Relaes como progenitor, filho_geral e me podem ser ilustradas
por diagramas que seguem as seguintes convenes
Ns nos grafos correspondem a objetos (argumentos das relaes)
Arcos entre ns correspondem a relaes binrias (2 argumentos)
Arcos so orientados apontando do primeiro argumento da relao para o
segundo argumento
Relaes unrias so indicadas nos diagramas simplesmente marcando
os objetos correspondentes com o nome da relao
As relaes sendo definidas so representadas por arcos tracejados
X
mulher
X X progenitor
Y Y progenitor
44
Grafos Definindo Relaes
Cada diagrama deve ser interpretado da seguinte forma:
se as relaes mostradas pelos arcos slidos so
verdadeiras ento a relao mostrada pelo arco tracejado
tambm verdadeira
Assim, a relao av_geral pode ser imediatamente
escrita como:
av_geral(X,Z) :- progenitor(X,Y), progenitor(Y,Z).
X
mulher
X X progenitor
Y Y progenitor
45
Layout de um Programa Prolog
Prolog fornece liberdade na escrita do layout do
programa
Entretanto, os programas devem ter um aspecto
compacto e, acima de tudo, fcil de ler
Assim, um padro escrever a cabea de uma
clusula bem como cada condio em seu corpo
em uma linha separada
Alm disso, as condies so deslocadas de
modo a melhor separar a cabea do corpo de
uma regra
46
Layout de um Programa Prolog
Por exemplo, a relao
av_geral(X,Z) :- progenitor(X,Y), progenitor(Y,Z).
deve ser escrita da seguinte forma:
av_geral(X,Z) :-
progenitor(X,Y),
progenitor(Y,Z).
47
Definindo Relaes por Regras
A relao irmo pode ser definida como:
Para todo X e Y,
X irmo de Y se
ambos X e Y tm um progenitor em comum e Z
X um homem.
Em Prolog: progenitor progenitor
irmo(X,Y) :-
progenitor(Z,X), homem X Y
progenitor(Z,Y), irmo
homem(X).
Note a forma de expressar ambos X e Y tm um
progenitor em comum:
Algum Z deve ser o progenitor de X e este mesmo Z deve ser o
progenitor de Y
Uma forma alternativa, mas menos elegante seria: Z1
progenitor de X e Z2 progenitor de Y e Z1 igual a Z2
48
Definindo Relaes por Regras
Podemos perguntar a Prolog:
?- irmo(esa,jac).
yes
Portanto, poderamos concluir que a relao irmo, como
definida, funciona corretamente
Entretanto h uma falha em nosso programa que
revelada se perguntamos Quem o irmo de Jac?
?- irmo(X,jac).
Prolog fornecer duas respostas
X = esa ;
X = jac
Assim, Jac irmo dele mesmo? Provavelmente isso
no era bem o que tnhamos em mente quando definimos
a relao irmo
Entretanto, de acordo com nossa definio sobre irmos,
a resposta de Prolog perfeitamente lgica
49
Definindo Relaes por Regras
Nossa regra sobre irmos no menciona que X e Y no devem ser a
mesma pessoa se X deve ser irmo de Y
Como isso no foi definido, Prolog (corretamente) assume que X e Y
podem ser a mesma pessoa e como conseqncia encontra que todo
homem que tem um progenitor irmo de si prprio
Para corrigir a regra sobre irmos, devemos adicionar a restrio que
X e Y devem ser diferentes
Veremos nas prximas aulas como isso pode ser efetuado de
diversas maneiras, mas para o momento, vamos assumir que a
relao diferente j conhecida de Prolog e que diferente(X,Y)
satisfeita se e somente se X e Y no so iguais
Isso nos leva seguinte regra sobre irmos:
irmo(X,Y) :-
progenitor(Z,X),
progenitor(Z,Y),
homem(X),
diferente(X,Y).
50
Pontos Importantes
Programas Prolog podem ser estendidos simplesmente
pela adio de novas clusulas
Clusulas Prolog so de trs tipos: fatos, regras e
perguntas
Fatos declaram coisas que so sempre (incondicionalmente)
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
Clusulas Prolog consistem em uma cabea e o corpo; o
corpo uma lista de condies separadas por vrgulas
(que significam conjunes)
Fatos so clusulas que tm uma cabea e o corpo vazio;
perguntas tm apenas o corpo; regras tm uma cabea e
um corpo (no vazio)
51
Pontos Importantes
Durante a computao, uma varivel pode ser substituda
por um objeto: dizemos que a varivel est instanciada
As variveis so universalmente quantificadas e so lidas
como Para todo
Todavia, leituras alternativas so possveis para variveis
que aparecem apenas no corpo
Por exemplo:
temfilhos(X) :- progenitor(X,Y).
Pode ser lida de duas formas:
Para todo X e Y,
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 para Prolog: Todo mundo que tem
filho feliz (defina a relao unria feliz)
Defina as relaes irm e irmo_geral
Defina a relao neto_geral usando a
relao progenitor
Defina a relao tio(X,Y) em termos das
relaes progenitor e irmo
53
Regras Recursivas
Vamos adicionar a relao ancestral
Esta relao ser definida por duas regras:
a primeira ser o caso base (no recursivo)
e a segunda ser o caso recursivo
Para todo X e Z,
X um ancestral de Z se X
X um progenitor de Z. progenitor ancestral
ancestral(X,Z) :-
Z
progenitor(X,Z).
54
Regras Recursivas
X X X
progenitor progenitor
progenitor
Y1 Y1
Y ancestral
progenitor ancestral progenitor
progenitor
Y2 Y2 ancestral
Z
progenitor progenitor
ancestral(X,Z) :- Z Y3
progenitor(X,Y),
ancestral(X,Z) :- progenitor
progenitor(Y,Z). progenitor(X,Y1), ancestral(X,Z) :-
progenitor(Y1,Y2), Z
progenitor(X,Y1),
progenitor(Y2,Z). progenitor(Y1,Y2),
progenitor(Y2,Y3),
progenitor(Y3,Z).
55
Regras Recursivas
X
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
ancestral(X,Z) :- ...
progenitor(X,Y),
ancestral(Y,Z).
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
Programa da Famlia Bblica
progenitor(sara,isaque). filho_geral(Y,X) :-
progenitor(abrao,isaque). progenitor(X,Y).
progenitor(abrao,ismael). me(X,Y) :-
progenitor(isaque,esa). progenitor(X,Y),
progenitor(isaque,jac). mulher(X).
progenitor(jac,jos). av_geral(X,Z) :-
progenitor(X,Y),
mulher(sara). progenitor(Y,Z).
homem(abrao). irmo(X,Y) :-
homem(isaque). progenitor(Z,X),
homem(ismael). progenitor(Z,Y),
homem(esa). homem(X).
homem(jac). ancestral(X,Z) :-
homem(jos). progenitor(X,Z).
ancestral(X,Z) :-
progenitor(X,Y),
ancestral(Y,Z).
58
Exerccio
X
Vimos a seguinte definio da
relao ancestral progenitor
ancestral(X,Z) :-
progenitor(X,Z). Y
ancestral(X,Z) :-
progenitor(X,Y),
ancestral(Y,Z).
Considere a seguinte definio
alternativa: ancestral
ancestral(X,Z) :-
progenitor(X,Z). ancestral
ancestral(X,Z) :- ...
progenitor(Y,Z),
ancestral(X,Y).
Esta uma definio correta de
ancestrais?
possvel modificar o
diagrama de forma a
corresponder a esta nova Z
definio?
59
Slides baseados nos livros:
Bratko, I.;
Prolog Programming for Artificial Intelligence,
3rd Edition, Pearson Education, 2001.
60