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 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
Programao em Prolog
tomos
tomos
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
Nmeros
Variveis
So cadeias de letras, dgitos e caracteres _, sempre comeando com letra maiscula ou com o caractere _.
Estruturas
So objetos de dados que tm vrios componentes, podendo cada um deles, por sua vez, ser uma estrutura.
10
Neste caso definiu-se progenitor como o nome de uma relao; abrao e isaque so seus argumentos
11
Este programa consiste de seis clusulas Cada uma dessas clusulas declara um fato sobre a relao progenitor
12
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
13
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
14
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
Uma outra pergunta pode ser ?- progenitor(ismael,jac). 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
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)
18
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 Y = isaque; X = abrao Y = isaque; X = abrao Y = ismael; ... As solues podem ser interrompidas digitando [enter] ao invs de ;
19
Perguntas mais complexas tambm podem efetuadas, tais como: Quem o av de Jos?
ser
Como nosso programa no conhece diretamente a relao av, esta pergunta deve ser desmembrada em dois passos
(1) Quem o progenitor de Jos? Assuma que um Y (2) Quem o progenitor de Y? Assuma que um X
Esta pergunta composta pode ser escrita em Prolog como: ?-progenitor(Y,jos),progenitor(X,Y). X = isaque Y = jac
20
A pergunta composta
?- progenitor(Y,jos), progenitor(X,Y).
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?
22
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
Pontos importantes
Perguntas consistem em uma ou mais clusulas Uma seqncia de clusulas, tal progenitor(X,esa), progenitor(X,jac) Significa a conjuno das clusulas
X um progenitor de Esa e X um progenitor de Jac
como:
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 ;
24
Exerccios
25
Exerccios
Quais as respostas dadas por Prolog? ?- gosta(maria,X). ?- gosta(X,livro). ?- gosta(Quem,Oque). ?- gosta(X,Y). ?- gosta(X,X). ?- gosta(_a,_b). ?- gosta(A,peixe).
26
Exerccios
Nosso programa sobre famlias As relaes mulher e homem pode ser estendido de vrias so relaes unrias formas Uma relao binria, como Vamos adicionar a progenitor, define um informao sobre o sexo das relacionamento entre pares pessoas envolvidas na relao de objetos progenitor Relaes unrias so usadas Por exemplo: para declarar propriedades simples sim/no dos objetos mulher(sara). homem(abrao). A primeira clusula unria pode ser lida como Sara homem(isaque). uma mulher homem(ismael).
homem(esa). homem(jac). homem(jos).
28
Informao sobre o sexo das Podemos declarar a mesma pessoas envolvidas na relao informao usando uma progenitor: relao binria sexo: mulher(sara). sexo(sara,feminino). homem(abrao). sexo(abrao,masculino). homem(isaque). sexo(isaque,masculino). homem(ismael). sexo(ismael,masculino). homem(esa). sexo(esa,masculino). homem(jac). sexo(jac,masculino). homem(jos). sexo(jos,masculino).
29
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
30
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(iisaque,abrao). filho_geral(ismael,abrao). ...
31
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
32
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
33
filho_geral(Y,X) :- progenitor(X,Y).
34
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
35
:
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
36
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.
Uma vrgula entre duas condies indica a conjuno das condies, significando que ambas condies tm que ser verdadeiras
37
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 me(X,Y) :- progenitor(X,Y), mulher(X).
39
Exerccios
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).
40
Exerccios
Usando a base ao lado, defina a regra: Uma pessoa pode roubar algo se essa pessoa um ladro e ela gosta desse algo Qual a resposta dada por Prolog a pergunta: Joo rouba o qu?
41
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
42
Cada diagrama deve ser interpretado da seguinte forma: se as relaes mostradas pelos arcos slidos soverdadeiras 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).
43
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
44
45
Em Prolog:
irmo(X,Y) :progenitor(Z,X), progenitor(Z,Y), homem(X).
Uma forma alternativa, mas menos elegante seria: Z1 progenitor de X e Z2 progenitor de Y e Z1 igual a Z2
46
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
47
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 Isso pode ser efetuado de diversas maneiras, mas para o momento, vamos assumir que exista a relao diferente em 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).
48
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)
49
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).
50
Exerccios
Defina as relaes irm e irmo_geral Defina a progenitor relao neto_geral usando a relao
51
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
Regras recursivas
53
Regras recursivas
Para todo X e Z, X um ancestral de Z se h algum Y tal que X um progenitor de Y e Y um ancestral de Z. ancestral(X,Z) :progenitor(X,Y), ancestral(Y,Z).
54
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
55
Exerccios
Esta uma definio correta de ancestrais? possvel modificar o diagrama de forma a corresponder a esta nova definio?
57
58
59
60
FIM
61
Crditos