Você está na página 1de 41

Introdução à Linguagem Prolog

INTELIGÊNCIA ARTIFICIAL PARA


AUTOMAÇÃO
INTRODUÇÃO À LINGUAGEM PROLOG
 Prolog é uma linguagem de programação para
computação simbólica e não numérica.
 É especialmente adaptada para resolver problemas
que envolvem relações entre objetos.
 Prolog é uma linguagem relacional.
 Suponhamos que queremos criar a relação
“progenitor”, tal que “fulano seja progenitor de
ciclano”.
 E então criar uma “árvore genealógica da família”.
DEFININDO RELAÇÕES FAMILIARES
 progenitor(pam,bob).
 progenitor(tom,bob).

 progenitor(tom,liz).

 progenitor(bob,ann).

 progenitor(bob,pat).

 progenitor(pat,jim).

“pam é um dos progenitores de


bob” é uma instância particular
da relação “é um dos progenitores
de”, abreviada para “progenitor”.
DEFININDO RELAÇÕES FAMILIARES
 O programa anterior é constituído por 6 cláusulas.
 Cada uma dessas cláusulas declara um fato sobre a
relação “progenitor”.
 Uma relação é definida pelo conjunto de todas as
suas instâncias.
 Após haver entrado com esse “programa” no
sistema do Prolog ele está pronto para responder
algumas perguntas: ?-
DEFININDO RELAÇÕES FAMILIARES
 Como perguntamos ao Prolog se “bob” é um dos
progenitores de “pat”?
 ?- progenitor(bob,pat).
 A resposta é “true”, ou seja, sim.
 E se quisermos saber se “liz” é dos progenitores
de “pat”?
 ?- progenitor(liz,pat).
 A resposta é “false”, ou seja, não.
DEFININDO RELAÇÕES FAMILIARES
 Por que a resposta progenitor(liz,pat) foi falsa?
 Porque o programa não menciona nada sobre liz ser
um dos progenitores de pat.
 E se quisermos perguntar “Quem são os progenitores
de liz?”
 ?- progenitor(X,liz).
 Prolog vai então nos dizer “qual é um valor de X que
torna a resposta verdadeira” (true).
 X = tom.
DEFININDO RELAÇÕES FAMILIARES
 E se quisermos perguntar “Quem são os filhos de
bob?”
 ?- progenitor(bob,X).
 Dessa vez teremos mais de uma resposta (usamos
o “;” para solicitar mais respostas).
 As respostas serão:
 X = ann ;
 X = tom.
DEFININDO RELAÇÕES FAMILIARES
 E se quisermos perguntar “Quem são os progenitores
de Quem?”
 ?- progenitor(X,Y).
 X = pam
 Y = bob ;
 X = tom
 Y = bob;
 E assim por diante... Para desistir da busca basta clicar
“.” ou apenas teclar “Enter”.
DEFININDO RELAÇÕES FAMILIARES
 E se quisermos perguntar “Quem são avós de jim?”
 Usaremos uma pergunta composta já que não existe
a relação “avós” no nosso programa.
 Quem é o pai (X), do pai de jim (Y)?

?- progenitor(Y,jim),
progenitor(X,Y).

A ordem é crucial para a


pergunta?
DEFININDO RELAÇÕES FAMILIARES
 E se quisermos perguntar “Quem são
os netos de tom?”
 Quem é um (Y) cujo pai (X) é filho
de tom?
 ?- progenitor(tom,X),
progenitor(X,Y).
 Crie a seguinte relação: Quem é um
dos progenitores de ann que também
é pai de pat?
 progenitor(X,ann), progenitor(X,pat).
PONTOS IMPORTANTES ILUSTRADOS
 É fácil definir uma relação em Prolog: basta estabelecer
uma n-tupla de objetos que satisfaça a relação.
 O usuário pode facilmente consultar o Prolog sobre a
relação definida no programa.
 Um programa em Prolog consiste de cláusulas. Cada
cláusula termina com ponto final.
 Os argumentos das relações podem ser (entre outras
coisas): objetos concretos, ou constantes (como tom e
ann), ou objetos gerais tais como X e Y. Os primeiros
objetos são os átomos e os últimos são as variáveis.
PONTOS IMPORTANTES ILUSTRADOS
 Perguntas ao sistema consistem de uma ou mais metas
(goals). Uma sequência de metas, tais como:
progenitor(X,ann), progenitor(X,pat), significa a
conjunção das metas:
 X é um dos progenitores de ann, e
 X é um dos progenitores de pat.
 A palavra “meta” é usada porque o Prolog aceita
questões como metas que têm que ser satisfeitas.
PONTOS IMPORTANTES ILUSTRADOS
 Uma resposta a uma questão pode ser tanto positiva
quanto negativa, dependendo se a meta correspondente
pode ou não ser satisfeita.
 No caso de uma resposta positiva dizemos que a meta
correspondente foi satisfeita e que a meta foi bem
sucedida. De outra forma a meta não foi satisfeita e ela
falhou.
 Se várias respostas satisfazem a questão então o Prolog
encontrará tantas quantas forem as desejadas pelo
usuário.
EXERCÍCIOS:
 Qual a resposta do Prolog para as seguintes
questões:
 ?- progenitor(jim,X).
 ?- progenitor(X,jim).
 ?- progenitor(pam,X), progenitor(X,pat).
 ?- progenitor(pam,X), progenitor(X,Y),
progenitor(Y,jim).
 Formule em Prolog as seguintes questões:
 Quem são os progenitores de pat?
 Liz tem um(a) filho(a)?
 Quem são os avós de pat?
 Criar um conjunto de relações interessantes
para a classe.
REGRAS E RELAÇÕES
 É possível estender o programa exemplo facilmente de diversas maneiras
interessantes.
 Acrescentar informações (fatos) sobre o sexo das pessoas envolvidas:
masculino e feminino.
 masculino(tom).
 masculino(bob).
 masculino(jim).
 feminino(liz).
 feminino(pat).
 feminino(ann).
 feminino(pam).
 A ordem das relações pode variar: carregue “Aula01_2”.
REGRAS E RELAÇÕES
 As relações masculino/1 e feminino/1 são unárias, isto é,
relações de apenas um objeto, ou que se referem a apenas um
objeto.
 Usamos “/” para indicar que o que vem depois é a aridade do
predicado, no caso, 1.
 As palavras “masculino” e “feminino” são os nomes das relações
(predicado), que são átomos.
 Uma relação binária, como progenitor/2, define um
relacionamento entre pares de objetos, apresenta aridade 2.
 Relações unárias declaram propriedades simples dos objetos
(sim/não).
REGRAS E RELAÇÕES
 feminino(pam), é uma relação unária que pode ser lida como:
pam é do sexo feminino.
 Essa informação poderia ter sido dada com um predicado de
aridade 2: sex(pam,feminino).
 Continuando a estender o programa criar uma relação binária
“prole/2” que seja o inverso da relação binária “progenitor/2”.
 Poderia simplesmente ser do tipo: prole(liz,tom),
prole(bob,tom), etc.
 Use a declaração: “Para todo X e Y, Y é prole de X se X é
progenitor de Y” para construir prole/2.
REGRAS E RELAÇÕES
 prole(Y,X) :- progenitor(X,Y).
 Uma cláusula Prolog como a anterior é chamada de regra.
 Há uma diferença fundamental entre fatos e regras:
 O fato “progenitor(tom,pam).” é algo incondicionalmente
verdadeiro (true);
 A regra “prole(Y,X) :- progenitor(X,Y).” é verdadeira se alguma
condição é satisfeita.
 Dizemos que as regras têm:
 Uma parte condicional (o lado à direita de “:-”), chamada CORPO;
 Uma parte conclusiva (o lado à esquerda de “:-”), chamada
CABEÇA.
REGRAS E RELAÇÕES
 Se a condição progenitor(X,Y) é verdadeira então uma
consequência lógica disso é prole(Y,X).
 Vejamos como as regras são realmente utilizadas pelo Prolog:
 Não há fatos sobre prole no programa, assim Prolog terá que
aplicar a regra sobre prole.
 A regra geral pode ser aplicada a objetos particulares como liz e
tom.
 Ao aplicar a regra, Y e X são substituídos por liz e tom, isto é, as
variáveis são instanciadas: X=tom e Y=liz.
 Temos prole(Y,X) :- progenitor(X,Y)  prole(liz,tom) :-
progenitor(tom,liz).
REGRAS E RELAÇÕES
 A parte da condição se tornou progenitor(tom,liz).
 Prolog tenta agora provar que a parte da condição é true.
 Assim a meta inicial prole(liz,tom) foi substituída pela submeta
progenitor(tom,liz) que agora pode ser encontrada como fato no nosso
programa .
 Isso significa que a parte da conclusão da regra é também verdadeira e o
Prolog responde a questão com um “true”.
 Escreva a relação mae/2 no programa baseada na seguinte declaração lógica:
“Para todo X e Y, X é mãe de Y se X é progenitor de Y e X é feminino.”
 Resposta: mae(X,Y) :- progenitor(X,Y), feminino(X).
 A vírgula entre as duas condições indica conjunção de conjunção de
condições (ambas devem ser true).
REGRAS E RELAÇÕES
 Escreva a relação mae/2 no programa baseada na
seguinte declaração lógica: “Para todo X e Y, X é mãe
de Y se X é progenitor de Y e X é feminino.”
 Resposta: mae(X,Y) :- progenitor(X,Y), feminino(X).
 A vírgula entre as duas condições indica conjunção de
condições (ambas devem ser true).
 Escreva a relação “avo/2” baseada na seguinte
declaração lógica: “Para todo X e Y, X é avo de Z se
X é progenitor de Y e Y é progenitor de Z”.
REGRAS E RELAÇÕES: DIAGRAMA
1. “Nós” correspondem a objetos (argumentos).
2. “Arcos entre nós” correspondem a relações binárias.
3. Os arcos são orientados de maneira a apontar do primeiro
argumento da relação para o segundo.
4. Para as relações unárias basta marcar o objeto
correspondente com o nome da relação.
5. A relação que está sendo definida é representada por um
arco tracejado.
6. Cada diagrama deve ser entendido da seguinte maneira: se
as relações mostradas pelos arcos sólidos permanecem,
então a relação mostrada por um arco tracejado permanece.
DEFINA AS RELAÇÕES ABAIXO:
DEFINA AS RELAÇÕES ABAIXO:
 Acrescente a seguinte regra ao programa: irma(X,Y) :-
progenitor(Z,X), progenitor(Z,X), feminino(X).
 Teste a regra criada. O resultado satisfaz?
 ?- irma(X,pat).
 X = ann ;
 X = pat ;
 false.
 Como evitar que pat seja irmã de si mesma?
 Sugestão: acrescentar na definição da regra a submeta
dif(X,Y).
PONTOS IMPORTANTES ILUSTRADOS
 Os programas Prolog podem ser estendidos por simples
adição de novas cláusulas.
 As cláusulas Prolog são de 3 tipos: fatos, regras e
questões.
 Fatos declaram coisas que são sempre,
incondicionalmente verdadeiras.
 Regras declaram coisas que são verdadeiras
dependendo de uma dada condição.
PONTOS IMPORTANTES ILUSTRADOS
 Por meio de questões o usuário pode questionar o
programa que coisas são verdadeiras.
 As cláusulas Prolog consistem de uma cabeça e um
corpo. O corpo é uma lista de metas separadas por
vírgulas. Vírgulas são entendidas como conjunção.
 Fatos são cláusulas que têm uma cabeça e um corpo
vazio. Questões tem apenas o corpo. Regras têm a
cabeça e o corpo (não vazio).
PONTOS IMPORTANTES ILUSTRADOS
 No processo de computação, a variável pode ser substituída por
outro objeto. Dizemos que a variável se torna instanciada.
 Variáveis são assumidas como sendo quantificada
universalmente e são lidas como “para todo”. Leituras
alternativas são, no entanto, possíveis para variáveis que
aparecem apenas no corpo. Por exemplo:
 tem_filhos(X) :- progenitor(X,Y). pode ser lida de duas
maneiras:
 Para todo X e Y, se X é progenitor de Y então X tem filho;
 Para todo X, X tem filho se há algum Y tal que X é um

progenitor de Y.
A DEFINIÇÃO DE UMA REGRA RECURSIVA
 Vamos adicionar mais uma relação ao programa da
família: a relação ancestral.
 Esta relação será definida em termos da relação
progenitor.
 Com duas regras a tarefa estará cumprida:
 A primeira regra definirá o ancestral direto (imediato), e
 A segunda regra definirá o ancestral indireto.
 Dizemos que algum X é um ancestral indireto de algum
Z se houver uma cadeia de parentesco entre Z e X.
A DEFINIÇÃO DE UMA REGRA RECURSIVA
 A primeira regra é simples: Para todo
X e Z, X é um ancestral de Z se X é
um progenitor de Z.
 A segunda regra é mais complicada:
qual o tamanho da cadeia de
parentesco que teremos que
implementar?
 Para todo X e Z, X é um ancestral de Z
se Y2 é progenitor de Z e Y1 é um
progenitor de Y2 e X é progenitor de
Y1. ou ... ???
 Quais os problemas dessa
implementação??
A DEFINIÇÃO DE UMA REGRA RECURSIVA
 Há uma maneira mais elegante de
resolver o problema: a idéia chave
é definir a relação ancestral em
termos dela mesma.
 Para todo X e Z, X é um ancestral
de Z se há um Y tal que (1) X é
progenitor de Y e (2) Y é ancestral
de Z.
 ancestral(X,Z) :- progenitor(X,Y),
ancestral(Y,Z).
COMO PROLOG RESPONDE QUESTÕES
 Uma questão em Prolog é sempre uma sequência
de uma ou mais metas.
 Prolog tenta satisfazer todas as metas. Mas, o que
é satisfazer uma meta?
 Satisfazer uma meta significa demonstrar que a meta
é verdadeira, assumindo que as relações no programa
são verdadeiras.
 Satisfazer uma meta significa demonstrar que a meta
decorre logicamente dos fatos e regras do programa.
COMO PROLOG RESPONDE QUESTÕES
 Prolog também tem que encontrar quais são os objetos particulares
(no lugar das variáveis) para os quais as metas são satisfeitas.
 A instanciação particular de variáveis a esses objetos é mostrada
ao usuário.
 Se o Prolog não pode demonstrar para alguma instanciação de
variáveis que as metas decorrem logicamente do programa, então o
Prolog responde “false”.
 Em termos matemáticos: Prolog aceita fatos e regras como um
conjunto de axiomas, e a questão do usuário como um teorema
conjeturado; então tenta provar o teorema – isto é: demonstrar que
ele pode ser logicamente derivado dos axiomas.
COMO PROLOG RESPONDE QUESTÕES
 E se o teorema a ser provado fosse:
 ?- ancestral(tom, pat).
 Sabemos que progenitor(bob,pat) é um fato.
 Usando esse fato e a regra pr1 podemos concluir
ancestral(bob,pat). Esse é um fato derivado, não pode ser
encontrado explicitamente no nosso programa.
 Um passo de inferência como esse pode ser escrito de uma
forma mais compacta:
 progenitor(bob,pat) ==> ancestral(bob,pat)
 Isso pode ser lido: de progenitor(bob,pat) segue-se ancestral(bob,pat)
pela regra pr1.
COMO PROLOG RESPONDE QUESTÕES
 Sabemos também que progenitor(tom,bob) é um fato.
 Usando esse fato e o fato derivado ancestral(bob,pat)
podemos concluir ancestral(tom,pat) pela regra pr2.
 Assim, demonstramos que nossa declaração meta
ancestral(tom,pat) é verdadeira.
 O processo todo de inferência pode ser escrito como:
 progenitor(bob,pat) ==> ancestral(bob,pat)
 progenitor(tom,bob) e ancestral(bob,pat) ==>
ancestral(tom,pat)
 Mas, como o Prolog realiza essa prova?
COMO PROLOG RESPONDE QUESTÕES
 Prolog encontra a sequência de prova na ordem inversa da que nós
usamos.
 Prolog começa com as metas e, utilizando as regras, substitui a meta
corrente por novas metas até que as novas metas se tornem fatos
simples.
 Dado a questão: ?- ancestral(tom,pat). Prolog vai tentar satisfazer essa
meta.
 Primeiro procura uma cláusula no programa da qual a meta acima
decorra imediatamente. As únicas cláusulas relevantes são pr1 e pr2.
 Essas duas cláusulas representam dois caminhos alternativos para o
Prolog prosseguir. Dizemos que as cabeças dessas regras casam com a
meta.
COMO PROLOG RESPONDE QUESTÕES
 Prolog tenta a primeira cláusula casada que encontra:
 Ancestral(X,Z) :- progenitor(X,Z).
 Uma vez que a meta é ancestral(tom,pat) as variáveis são instanciadas:
X = tom e Z = pat.
 A meta original agora é substituída pela nova meta do corpo de pr1:

 progenitor(tom,pat).

 Não há clausula no programa cuja cabeça case com essa nova meta, que

então essa meta falha.


 Prolog então retrocede

(backtrack) para a meta


original e busca um
caminho alternativo (regra
pr2) para derivar
ancestral(tom,pat).
COMO PROLOG RESPONDE QUESTÕES
 Novamente as variáveis são instanciadas nos valores dados X = tom e
Z = pat. Y, porém não é instanciada ainda.
 A meta do topo é então substituída por duas novas metas:
 progenitor(tom,Y) e ancestral(Y,pat).
 Prolog tenta satisfazer essas novas metas na ordem em que elas aparecem.
 Progenitor(tom,Y) resulta num casamento em que Y é instanciado em bob e
o Prolog parte em busca de provar que ancestral(bob,pat) pode ser inferido
do programa.
 Ele encontra a regra pr1 que dirige a verificar se progenitor(bob,pat) é um
fato. A meta é satisfeita.
 A cada vez que o Prolog aplica uma regra ele cria utiliza um novo conjunto
de variáveis.
 Veja a árvore da solução a seguir: os nós da árvore correspondem às metas,
os arcos à aplicação de cláusulas transformadoras.
COMO PROLOG RESPONDE QUESTÕES

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

ancestral(X,Y) :- progenitor(X,Z),
ancestral(Z,Y).
SIGNIFICADOS DECLARATIVOS E PROCEDURAL DE
PROGRAMAS

 O significado declarativo diz respeito apenas às relações


definidas pelo programa, isto é o que será a saída do
programa.
 O significado procedural também determina o como essa
saída será obtida, isto é, como as relações são avaliadas pelo
sistema Prolog.
 Ainda que o significado declarativo seja suficiente para
escrever programas, sendo mais fácil de se entender e ainda
que o programador deva ficar mais concentrado no
significado declarativo, há situações em que as restrições
práticas recomendam o significado procedural.
PONTOS IMPORTANTE ILUSTRADOS
 Programar em Prolog consiste da definição de relações e
questionamentos sobre as relações.
 Um programa consiste de cláusulas: fatos, regras e questões.
 Uma relação pode ser especificada pelos fatos, simplesmente
estabelecendo as n-tuplas de objetos que a satisfazem, ou as
regras sobre a relação.
 Um procedimento é um conjunto de cláusulas da mesma relação.
 Questionar as relações é parecido com questionar um banco de
dados. As respostas do Prolog a uma questão consiste de um
conjunto de objetos que a satisfazem.
PONTOS IMPORTANTE ILUSTRADOS
 Em Prolog, estabelecer se um objeto satisfaz a uma consulta é
frequentemente um processo complexo que envolve: inferência
lógica, exploração entre alternativas e possivelmente retrocesso
(backtracking).
 O significado declarativo dos programas Prolog são vantajosos do
ponto de vista do programador. Contudo, os detalhes procedurais
frequentemente também têm que ser considerados.
 Conceitos introduzidos até aqui: cláusula, fato, regra, questão,
cabeça da regra, corpo da regra, regra recursiva, definição recursiva,
procedure, átomo, variável, instanciação de uma variável, meta,
satisfação de metas, metas bem sucedidas, metas não satisfeitas,
falha de metas, retrocesso, significado declarativo e procedural.

Você também pode gostar