Você está na página 1de 60

Introduo Programao

Prolog (Tutorial)

Inteligncia Artificial

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

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

Objetos de dados e Prolog

Objetos
Objetos Simples Estruturas
Constantes
tomos

Variveis

Nmeros

tomos

Objetos

So cadeias compostas pelos


seguintes caracteres:

Objetos Simples Estruturas


Constantes
tomos

Variveis

Nmeros

letras maisculas: A, B, ...,


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

tomos (cont)

Objetos
Objetos Simples Estruturas
Constantes
tomos

Variveis

Nmeros

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

Objetos

Incluem nmeros inteiros e


nmeros reais.

Objetos Simples Estruturas


Constantes
tomos

Variveis

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

Definindo Relaes por Fatos


Sara

Abrao

Isaque

Ismael

Esa

Jac

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

Jos
11

Definindo Relaes por Fatos


Sara

Abrao

Isaque

Esa

Ismael

Jac

Jos

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


Sara

Abrao

Isaque

Esa

Ismael

Jac

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

Jos
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


Sara

Abrao

Isaque

Esa

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

Ismael

Jac

Jos

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

16

Definindo Relaes por Fatos


Sara

Abrao

Isaque

Esa

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

Ismael

Jac

Jos

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

17

Definindo Relaes por Fatos


Sara

Abrao

Isaque

Esa

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

Ismael

Jac

Jos

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

18

Definindo Relaes por Fatos


Sara

Abrao

Isaque

Esa

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)

Ismael

Jac

Jos

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

19

Definindo Relaes por Fatos


Sara

Abrao

Isaque

Esa

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:

Ismael

Jac

Jos

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

X = sara Y = isaque;
X = abrao Y = isaque;
X = abrao Y = ismael;
...

As solues podem ser interrompidas


digitando [enter] ao invs de ;
20

Definindo Relaes por Fatos

Perguntas mais complexas tambm podem ser


efetuadas, tais como: Quem o av de Jos?
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

progenitor
Y

av

progenitor
Jos

21

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
22

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

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

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

???????-

gosta(maria,X).
gosta(X,livro).
gosta(Quem,Oque).
gosta(X,Y).
gosta(X,X).
gosta(_a,_b).
gosta(A,peixe).

28

Exerccio
Sara

Abrao

Isaque

Esa

Ismael

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

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

Definindo Relaes por Regras

Nosso programa sobre famlias


pode ser estendido de vrias
formas
Vamos adicionar a informao
sobre o sexo das pessoas
envolvidas na relao
progenitor
Por exemplo:

mulher(sara).
homem(abrao).
homem(isaque).
homem(ismael).
homem(esa).
homem(jac).
homem(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

Definindo Relaes por Regras

Informao sobre o sexo


das pessoas envolvidas
na relao progenitor:
mulher(sara).
homem(abrao).
homem(isaque).
homem(ismael).
homem(esa).
homem(jac).
homem(jos).

Podemos declarar a
mesma informao
usando uma relao
binria sexo:
sexo(sara,feminino).
sexo(abrao,masculino).
sexo(isaque,masculino).
sexo(ismael,masculino).
sexo(esa,masculino).
sexo(jac,masculino).
sexo(jos,masculino).

31

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
32

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

33

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

34

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
35

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)

36

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

37

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

38

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
39

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

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

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

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

mulher

X
progenitor

X
filho_geral

progenitor

X
progenitor

me

av_geral

progenitor

Z
44

Grafos Definindo Relaes

Cada diagrama deve ser interpretado da seguinte forma:


se as relaes mostradas pelos arcos slidos so
verdadeiras 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).
mulher

X
progenitor

X
filho_geral

progenitor

X
progenitor

me

av_geral

progenitor

Z
45

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

46

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

47

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

Z
progenitor

progenitor

homem

irmo

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
48

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

49

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
Veremos nas prximas aulas como isso pode ser efetuado de
diversas maneiras, mas para o momento, vamos assumir que a
relao diferente j conhecida de 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).

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

52

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

X
progenitor

progenitor

Y1

ancestral

progenitor

progenitor

Y1
ancestral

progenitor

progenitor

Y2
Z

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

Y2

ancestral

progenitor

progenitor

Y3

ancestral(X,Z) :progenitor(X,Y1),
progenitor(Y1,Y2),
progenitor(Y2,Z).

progenitor

ancestral(X,Z) :Z
progenitor(X,Y1),
progenitor(Y1,Y2),
progenitor(Y2,Y3),
progenitor(Y3,Z).
55

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

ancestral

Z
56

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

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

Exerccio

Vimos a seguinte definio da


relao ancestral

ancestral(X,Z) :

Considere a seguinte definio


alternativa:

progenitor

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

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?

ancestral
ancestral

...

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

Você também pode gostar