Escolar Documentos
Profissional Documentos
Cultura Documentos
Prolog (Tutorial)
Prolog = Programming in Logic
Nesta aula são introduzidos
conceitos básicos da linguagem Linguagem de programação utilizada para
de programação lógica Prolog
Os conceitos são introduzidos resolver problemas envolvendo objetos e
através de um tutorial sobre relações entre objetos
relações familiares
Maiores detalhes sobre Conceitos básicos: fatos, perguntas,
terminologia e notação serão variáveis, conjunções e regras
vistos nas próximas aulas
Conceitos avançados: listas e recursão
Inteligência Artificial
3 4
Sara Abraão
A figura ao lado mostra um Sara Abraão
A árvore familiar completa
exemplo da relação família em Prolog é:
O fato que Abraão é um progenitor(sara,isaque).
progenitor de Isaque pode progenitor(abraão,isaque).
Isaque Ismael ser escrito em Prolog como: Isaque Ismael progenitor(abraão,ismael).
progenitor(abraão,isaque). progenitor(isaque,esaú).
Neste caso definiu-se progenitor(isaque,jacó).
progenitor como o nome progenitor(jacó,josé).
Esaú Jacó Esaú Jacó Este programa consiste de
de uma relação; abraão e
isaque são seus seis cláusulas
argumentos Cada uma dessas cláusulas
José José declara um fato sobre a
relação progenitor
5 6
1
Definindo Relações por Fatos Definindo Relações por Fatos
Sara Abraão
Por exemplo A ordem dos argumentos em uma relação
progenitor(abraão,isaque). é definida arbitrariamente, mas deve ser
é uma instância particular seguida e usada de forma consistente
da relação progenitor
Isaque Ismael Esta instância é também progenitor(abraão,isaque)
chamada de significa que “Abraão é progenitor de Isaque”
relacionamento progenitor(isaque,abraão)
Em geral, uma relação é
Esaú Jacó
definida como o conjunto de
significa que “Isaque é progenitor de Abraão”
todas suas instâncias Note que progenitor(abraão,isaque) não
tem o mesmo significado que
José
progenitor(isaque,abraão)
7 8
2
Definindo Relações por Fatos Definindo Relações por Fatos
Sara Abraão Sara Abraão Questões mais amplas podem ser
A pergunta “Quais os filhos de
Isaque?” pode ser escrita como: efetuadas: Quem é o progenitor de
quem?
Isaque Ismael ?- progenitor(isaque,X). Isaque Ismael
Reformulando: encontre X e Y tais
Neste caso, há mais de uma resposta que X é o progenitor de Y
possível; Prolog primeiro responde ?- progenitor(X,Y).
Esaú Jacó com uma solução: Esaú Jacó
Prolog encontra todos os pares
X = esaú progenitor-filho um após o outro
José Pode-se requisitar uma outra solução José As soluções são mostradas uma de
(digitando ;) e Prolog encontra: cada vez:
progenitor(sara,isaque). progenitor(sara,isaque). X = sara Y = isaque;
X = jacó
progenitor(abraão,isaque). progenitor(abraão,isaque). X = abraão Y = isaque;
Se mais soluções forem requisitadas,
progenitor(abraão,ismael). progenitor(abraão,ismael). X = abraão Y = ismael;
Prolog responde no pois todas as
...
progenitor(isaque,esaú). soluções foram exauridas (no = sem progenitor(isaque,esaú).
As soluções podem ser interrompidas
progenitor(isaque,jacó). mais soluções) progenitor(isaque,jacó). digitando [enter] ao invés de ;
progenitor(jacó,josé). progenitor(jacó,josé).
13 14
15 16
3
Pontos Importantes Pontos Importantes
Um programa Prolog consiste de cláusulas; cada Perguntas consistem em uma ou mais cláusulas
cláusula termina com um ponto final Uma seqüência de cláusulas, tal como:
Os argumentos das relações podem (entre outras progenitor(X,esaú), progenitor(X,jacó)
coisas) ser: objetos concretos ou constantes (tais Significa a conjunção das cláusulas
X é um progenitor de Esaú e
como abraão e isaque) ou objetos gerais tais
X é um progenitor de Jacó
como X e Y. Objetos do primeiro tipo são
chamados átomos; objetos do segundo tipo são A resposta a uma pergunta pode ser
chamados variáveis Positiva: a pergunta é satisfatível e teve sucesso (suceeded)
Negativa: a pergunta é insatisfatível e falhou (failed)
A aridade de uma relação é o seu número de
Se várias respostas satisfazem uma pergunta, Prolog
argumentos e é denotada como uma barra encontra tantas quantas possíveis
seguida pela aridade Se o usuário estiver satisfeito com a resposta, basta digitar return
progenitor/2 significa que a relação progenitor possui Se desejar mais respostas, usa-se ponto-e-vírgula “;”
2 argumentos, ou que a relação progenitor tem aridade
2
19 20
Exercício Exercício
gosta(joao, peixe).
Expressar em português: Quais as respostas dadas por
Prolog?
gosta(joao,maria).
valioso(ouro). gosta(maria,livro). ?- gosta(maria,X).
femea(jane). gosta(pedro,livro). ?- gosta(X,livro).
gosta(maria,flor). ?- gosta(Quem,Oque).
possui(joao,ouro). gosta(maria,vinho). ?- gosta(X,Y).
pai(joao,maria). ?- gosta(X,X).
da(joao,livro,maria). ?- gosta(_a,_b).
?- gosta(A,peixe).
21 22
4
Definindo Relações por Regras Escolhendo Objetos e Relações
Informação sobre o sexo Podemos declarar a Como representar: “Sara é uma mulher”
das pessoas envolvidas mesma informação
na relação progenitor: usando uma relação mulher(sara).
mulher(sara). binária sexo: Permite responder: “Quem é mulher?”
homem(abraão). sexo(sara,feminino). Não permite responder: “Qual o sexo de Sara?”
homem(isaque). sexo(abraão,masculino).
homem(ismael). sexo(isaque,masculino). sexo(sara,feminino).
homem(esaú). sexo(ismael,masculino). Permite responder: “Quem é mulher?”
homem(jacó). sexo(esaú,masculino). Permite responder: “Qual o sexo de Sara?”
homem(josé). sexo(jacó,masculino). Não permite responder: “Qual a propriedade de Sara que tem
sexo(josé,masculino). o valor feminino?”
propriedade(sara,sexo,feminino).
Permite responder todas as perguntas
Representação objeto-atributo-valor
25 26
27 28
29 30
5
Definindo Relações por Regras Definindo Relações por Regras
Vamos perguntar se Ismael é filho_geral de Abraão: A condição da regra com as variáveis instanciadas
?- filho_geral(ismael,abraão). filho_geral(ismael,abraão) :-
Como não há fatos sobre a relação filho_geral, a única forma de progenitor(abraão,ismael).
Prolog responder esta pergunta é aplicando a regra sobre filho_geral
filho_geral(Y,X) :-
é:
progenitor(X,Y). progenitor(abraão,ismael).
A regra é geral no sentido que é aplicável a quaisquer objetos X e Y; Assim, Prolog tenta provar que a condição é verdadeira
portanto ela pode também ser aplicada a objetos particulares tais Para provar a condição, é trivial por Prolog encontra um
como ismael e abraão
Para aplicar a regra a ismael e abraão, Y tem que ser substituído por
fato correspondente no programa
ismael e X por abraão Isso implica que a conclusão da regra também é
Neste caso, dizemos que as variáveis X e Y estão instanciadas a: verdadeira e Prolog responde afirmativamente à
X = abraão e Y = ismael pergunta:
Depois da instanciação, obtemos um caso especial da regra geral, ?- filho_geral(ismael,abraão).
que é: yes
filho_geral(ismael,abraão) :-
progenitor(abraão,ismael).
31 32
33 34
35 36
6
Exercício Grafos Definindo Relações
ladrao(joao). Relações como progenitor, filho_geral e mãe podem ser ilustradas
Usando a base ao
por diagramas que seguem as seguintes convenções
lado, defina a regra: ladrao(pedro). Nós nos grafos correspondem a objetos (argumentos das relações)
Arcos entre nós correspondem a relações binárias (2 argumentos)
Uma pessoa pode gosta(maria,flor). Arcos são orientados apontando do primeiro argumento da relação para o
segundo argumento
roubar algo se essa gosta(maria,queijo).
Relações unárias são indicadas nos diagramas simplesmente marcando
pessoa é um ladrão e gosta(maria,vinho). os objetos correspondentes com o nome da relação
As relações sendo definidas são representadas por arcos tracejados
ela gosta de um objeto gosta(joao,rubi).
X
Qual a resposta dada gosta(joao,X) :- mulher
X X progenitor
por Prolog a pergunta: gosta(X,vinho).
progenitor filho_geral progenitor mãe avô_geral
João rouba o quê? Y
Y Y progenitor
37 38
Y Y progenitor
modo a melhor separar a cabeça do corpo de
uma regra
Z
39 40
progenitor(Y,Z). homem(X).
Note a forma de expressar “ambos X e Y têm 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
41 42
7
Definindo Relações por Regras Definindo Relações por Regras
Podemos perguntar a Prolog: Nossa regra sobre irmãos não menciona que X e Y não devem ser a
?- irmão(esaú,jacó). mesma pessoa se X deve ser irmão de Y
yes Como isso não foi definido, Prolog (corretamente) assume que X e Y
podem ser a mesma pessoa e como conseqüência encontra que todo
Portanto, poderíamos concluir que a relação irmão, como homem que tem um progenitor é irmão de si próprio
definida, funciona corretamente Para corrigir a regra sobre irmãos, devemos adicionar a restrição que
Entretanto há uma falha em nosso programa que é X e Y devem ser diferentes
revelada se perguntamos “Quem é o irmão de Jacó?” Veremos nas próximas aulas como isso pode ser efetuado de
?- irmão(X,jacó). diversas maneiras, mas para o momento, vamos assumir que a
relação diferente já é conhecida de Prolog e que diferente(X,Y) é
Prolog fornecerá duas respostas satisfeita se e somente se X e Y não são iguais
X = esaú ; Isso nos leva à seguinte regra sobre irmãos:
X = jacó irmão(X,Y) :-
progenitor(Z,X),
Assim, Jacó é irmão dele mesmo? Provavelmente isso progenitor(Z,Y),
não era bem o que tínhamos em mente quando definimos homem(X),
a relação irmão diferente(X,Y).
Traduza para Prolog: Todo mundo que tem Vamos adicionar a relação ancestral
filho é feliz (defina a relação unária feliz) Esta relação será definida por duas regras:
Defina as relações irmã e irmão_geral a primeira será o caso base (não recursivo)
Defina a relação neto_geral usando a e a segunda será o caso recursivo
relação progenitor Para todo X e Z,
X é um ancestral de Z se
Defina a relação tio(X,Y) em termos das
X
X é um progenitor de Z.
relações progenitor e irmão
progenitor ancestral
ancestral(X,Z) :- Z
progenitor(X,Z).
47 48
8
Regras Recursivas Regras Recursivas
X X X X
progenitor progenitor Para todo X e Z, progenitor
progenitor
Y1 Y1
X é um ancestral de Z se Y
ancestral
Y
progenitor ancestral progenitor há algum Y tal que
progenitor
Y2 Y2 ancestral
X é um progenitor de Y e
Z
progenitor progenitor Y é um ancestral de Z. ancestral
ancestral
ancestral(X,Z) :- Z Y3 ancestral(X,Z) :- ...
progenitor(X,Y),
progenitor(Y,Z).
ancestral(X,Z) :-
progenitor(X,Y1),
progenitor
progenitor(X,Y),
ancestral(X,Z) :-
progenitor(Y1,Y2), progenitor(X,Y1),
Z ancestral(Y,Z).
progenitor(Y2,Z). progenitor(Y1,Y2),
progenitor(Y2,Y3), Z
progenitor(Y3,Z).
49 50
51 52
Exercício
Vimos a seguinte definição da X
Slides baseados nos livros:
relação ancestral progenitor
ancestral(X,Z) :-
progenitor(X,Z). Bratko, I.;
Y
ancestral(X,Z) :- Prolog Programming for Artificial Intelligence,
progenitor(X,Y),
ancestral(Y,Z). 3rd Edition, Pearson Education, 2001.
Considere a seguinte definição
alternativa: ancestral
ancestral(X,Z) :- Clocksin, W.F.; Mellish, C.S.;
progenitor(X,Z). ancestral
Programming in Prolog,
ancestral(X,Z) :- ...
progenitor(Y,Z), 5th Edition, Springer-Verlag, 2003.
ancestral(X,Y).
Esta é uma definição correta de
ancestrais? Material elaborado por
É possível modificar o diagrama José Augusto Baranauskas
de forma a corresponder a esta 2004
nova definição? Z
53 54