Anda di halaman 1dari 62

Introduo Programao Lgica

Prof. Maurcio Rodrigues de Morais

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

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

Objetos e dados em Prolog

tomos

So cadeias compostas pelos seguintes caracteres:


letras maisculas: A, B,..., Z letras minsculas: a, ..., z dgitos: 1, 2, ..., 9 caracteres especiais, tais como: *, +, >, _, =, :, ., &.

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

Incluem nmeros inteiros e nmeros reais

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

Definindo relaes por fatos

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).

Neste caso definiu-se progenitor como o nome de uma relao; abrao e isaque so seus argumentos
11

Definindo relaes por fatos

A rvore familiar completa em Prolog :


progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos).

Este programa consiste de seis clusulas Cada uma dessas clusulas declara um fato sobre a relao progenitor
12

Definindo relaes por fatos

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

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

progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos).


16

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

Definindo relaes por fatos

progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos).


17

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

Definindo relaes por fatos

progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos).

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

Definindo relaes por fatos

progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos).

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

Definindo relaes por fatos

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

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
21

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

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

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
23

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:

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 ;
24

Exerccios

Expressar em portugus: valioso(ouro). femea(jane). possui(joao,ouro). pai(joao,maria). da(joao,livro,maria).

25

Exerccios

gosta(joao, peixe). gosta(joao,maria). gosta(maria,livro). gosta(pedro,livro). gosta(maria,flor). gosta(maria,vinho).

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

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).

progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos).


27

Definindo relaes por regras

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

Definindo relaes por regras

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

Escolhendo objetos e relaes

Como representar: Sara uma mulher mulher(sara).


Permite responder: 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).
Permite responder todas as perguntas Representao objeto-atributo-valor
30

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(iisaque,abrao). filho_geral(ismael,abrao). ...

31

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
32

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

33

Definindo relaes por regras

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

Cabea (head) ou concluso da regra (lado esquerdo da regra)

Corpo (body) ou condio da regra (lado direito da regra)

34

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).

35

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
36

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
37

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).
38

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 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?

ladrao(joao). ladrao(pedro). gosta(maria,flor). gosta(maria,queijo). gosta(maria,vinho). gosta(joao,rubi). gosta(joao,X) :gosta(X,vinho).

41

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

42

Grafos definindo relaes

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

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
44

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).

45

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 X um homem.

Em Prolog:
irmo(X,Y) :progenitor(Z,X), progenitor(Z,Y), 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

46

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

47

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 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).

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

50

Exerccios

Defina as relaes irm e irmo_geral Defina a progenitor relao neto_geral usando a relao

Defina a relao tio(X,Y) em termos das relaes progenitor e irmo


Defina a relao tia(X,Y) em termos das relaes progenitor e irm

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

Para todo X e Z, X um ancestral de Z se X um progenitor de Z.


ancestral(X,Z) :progenitor(X,Z).
52

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

Programa da famlia bblica


progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos). mulher(sara). homem(abrao). homem(isaque). homem(ismael). homem(esa). homem(jac). homem(jos).
filho_geral(Y,X) :progenitor(X,Y). me(X,Y) :progenitor(X,Y), mulher(X). av_geral(X,Z) :progenitor(X,Y), progenitor(Y,Z). irmo(X,Y) :progenitor(Z,X), progenitor(Z,Y), homem(X). ancestral(X,Z) :progenitor(X,Z). ancestral(X,Z) :progenitor(X,Y), ancestral(Y,Z).
56

Exerccios

Vimos a seguinte definio da relao ancestral


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

Considere a seguinte definio alternativa:


ancestral(X,Z) :progenitor(X,Z). 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 definio?

57

Guia de referncia rpida Prolog

58

Guia de referncia rpida Prolog

59

Guia de referncia rpida Prolog

60

FIM
61

Crditos

Material adaptado por Maurcio Rodrigues de Morais


62

Anda mungkin juga menyukai