Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
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
Nmeros
tomos
So cadeias compostas pelos seguintes caracteres: letras maisculas: A, B, ..., Z letras minsculas: a, ..., z dgitos: 1, 2, ..., 9 caracters especiais, tais como: *, +, >, _, =, :, ., &.
Objetos
Nmeros
tomos (cont)
Podem ser construdos de trs maneiras: cadeias de letras, dgitos e o caractere _, comeando com uma letra minscula. cadeias de caracteres especiais cadeias de caracteres entre apstrofos
7
Nmeros
Nmeros
Incluem nmeros inteiros e nmeros reais.
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
Isaque
Ismael
A figura ao lado mostra um exemplo da relao famlia O fato que Abrao um progenitor de Isaque pode ser escrito em Prolog como:
progenitor(abrao,isaque).
Esa
Jac
Neste caso definiu-se progenitor como o nome de uma relao; abrao e isaque so seus argumentos
Jos
11
Isaque
Ismael
Esa
Jac
Jos
Este programa consiste de seis clusulas Cada uma dessas clusulas declara um fato sobre a relao progenitor
12
Por exemplo
progenitor(abrao,isaque).
Isaque
Ismael
Esa
Jac
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
progenitor(isaque,abrao)
significa que Isaque progenitor de Abrao
Esa
Jac
Jos
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
16
Isaque
Prolog responde: no porque o programa no menciona nada sobre Ismael como sendo o progenitor de Jac Prolog tambm responde no pergunta: ?- progenitor(jac,moiss). no
Esa
Jac
Jos
17
Perguntas mais interessantes tambm podem ser efetuadas: Quem o progenitor de Ismael? ?- progenitor(X,ismael). Neste caso, Prolog no vai responder apenas yes ou no. Prolog fornecer o valor de X tal que a pergunta acima seja verdadeira Assim a resposta : X = abrao
Esa
Jac
Jos
18
A pergunta Quais os filhos de Isaque? pode ser escrita como: ?- progenitor(isaque,X). Neste caso, h mais de uma resposta possvel; Prolog primeiro responde com uma soluo: X = esa Pode-se requisitar uma outra soluo (digitando ;) e Prolog encontra: X = jac Se mais solues forem requisitadas, Prolog responde no pois todas as solues foram exauridas (no = sem mais solues)
19
Esa
Jac
Jos
Esa
Jac
Questes mais amplas podem ser efetuadas: Quem o progenitor de quem? Reformulando: encontre X e Y tais que X o progenitor de Y ?- progenitor(X,Y). Prolog encontra todos os pares progenitor-filho um aps o outro As solues so mostradas uma de cada vez:
X = sara X = abrao X = abrao ... Y = isaque; Y = isaque; Y = ismael;
Jos
progenitor
Y
av
Esta pergunta composta pode ser escrita em Prolog como: ?-progenitor(Y,jos),progenitor(X,Y). X = isaque Y = jac
progenitor
Jos
21
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
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
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). gosta(joao,maria). gosta(maria,livro). gosta(pedro,livro). gosta(maria,flor). gosta(maria,vinho).
Quais as respostas dadas por Prolog?
???????-
28
Exerccio
Sara Abrao Isaque Ismael
Esa
Jac
Jos
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).
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
31
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
32
Em Prolog:
filho_geral(Y,X) :progenitor(X,Y).
36
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
:
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
Uma vrgula entre duas condies indica a conjuno das condies, significando que ambas condies tm que ser verdadeiras
39
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
X
progenitor
X
progenitor filho_geral
X
progenitor me
Y
progenitor
av_geral
Z
44
X
progenitor
X
progenitor filho_geral
X
progenitor me
Y
progenitor
av_geral
Z
45
47
Em Prolog:
irmo(X,Y) :progenitor(Z,X), progenitor(Z,Y), homem(X).
irmo
Uma forma alternativa, mas menos elegante seria: Z1 progenitor de X e Z2 progenitor de Y e Z1 igual a Z2
48
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).
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
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).
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 um progenitor de Z. ancestral(X,Z) :progenitor(X,Z).
X
progenitor ancestral
54
Regras Recursivas
X
progenitor progenitor
X
progenitor
Y
progenitor
ancestral progenitor
Y1
ancestral progenitor
Y1
Y2 Z
progenitor progenitor
Y2
ancestral
Y3
progenitor
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).
Z
56
ancestral
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
Exerccio
Vimos a seguinte definio da relao ancestral
ancestral(X,Z) :progenitor(X,Z). ancestral(X,Z) :progenitor(X,Y), ancestral(Y,Z).
X
progenitor
ancestral
...
Esta uma definio correta de ancestrais? possvel modificar o diagrama de forma a corresponder a esta nova definio?
Z
59
Slides baseados nos livros: Bratko, I.; Prolog Programming for Artificial Intelligence, 3rd Edition, Pearson Education, 2001. Clocksin, W.F.; Mellish, C.S.; Programming in Prolog, 5th Edition, Springer-Verlag, 2003.
Material baseado em slides de Jos Augusto Baranauskas USP-Ribeiro Preto
60