Você está na página 1de 9

Introdução à Programação Introdução

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

José Augusto Baranauskas E-mail: augusto@usp.br


Departamento de Física e Matemática – FFCLRP-USP URL: http://dfm.fmrp.usp.br/~augusto
2

Programação Lógica Programação em Prolog

‰ Programação Procedural (procedimental): Programar em Prolog envolve:


ƒ Programa = Algoritmo + Estruturas de Dados ‰ declarar alguns fatos a respeito de objetos
‰ Programação Lógica e seus relacionamentos
ƒ Algoritmo = Lógica + Controle ‰ definir algumas regras sobre os objetos e
ƒ Programa = Lógica + Controle + Estruturas de seus relacionamentos e
Dados ‰ fazer perguntas sobre os objetos e seus
ƒ Em PL, programa-se de forma declarativa, ou relacionamentos
seja, especificando o que deve ser computado
ao invés de como deve ser computado

3 4

Definindo Relações por Fatos Definindo Relações por Fatos

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

Definindo Relações por Fatos Definindo Relações por Fatos


Sara Abraão
Quando o programa é
‰ Os nomes das relações e seus argumentos são ‰
interpretado/compilado, pode-se
arbitrários, ou seja: Isaque Ismael
questionar Prolog sobre a relação
ƒ progenitor(abraão,isaque) progenitor, por exemplo: Isaque é
o pai de Jacó?
ƒ a(b,c) Esaú Jacó ‰ Esta pergunta pode ser
‰ são semanticamente equivalentes desde que comunicada à Prolog digitando:
?- progenitor(isaque,jacó).
ƒ “a” signifique “progenitor” José
‰ Como Prolog encontra essa
ƒ “b” signifique “abraão” e progenitor(sara,isaque). pergunta como um fato inserido
ƒ “c” signifique “isaque” progenitor(abraão,isaque). em sua base, Prolog responde:
progenitor(abraão,ismael). yes
‰ Normalmente, o programador escolhe nomes
progenitor(isaque,esaú).
significativos progenitor(isaque,jacó).
progenitor(jacó,josé).
9 10

Definindo Relações por Fatos Definindo Relações por Fatos


Sara Abraão Sara Abraão
‰ Uma outra pergunta pode ser ‰ Perguntas mais interessantes
?- progenitor(ismael,jacó). também podem ser efetuadas:
Isaque Ismael ‰ Prolog responde: Isaque Ismael
Quem é o progenitor de Ismael?
no ?- progenitor(X,ismael).

porque o programa não menciona ‰ Neste caso, Prolog não vai


Esaú Jacó Esaú Jacó responder apenas yes ou no.
nada sobre Ismael como sendo o
progenitor de Jacó Prolog fornecerá o valor de X tal
José José que a pergunta acima seja
‰ Prolog também responde no à
verdadeira
pergunta:
progenitor(sara,isaque). progenitor(sara,isaque). ‰ Assim a resposta é:
?- progenitor(jacó,moisés).
progenitor(abraão,isaque). progenitor(abraão,isaque). X = abraão
no
progenitor(abraão,ismael). progenitor(abraão,ismael).
progenitor(isaque,esaú). progenitor(isaque,esaú).
progenitor(isaque,jacó). progenitor(isaque,jacó).
progenitor(jacó,josé). progenitor(jacó,josé).
11 12

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

Definindo Relações por Fatos Definindo Relações por Fatos


‰ Perguntas mais complexas também podem ser ‰ A pergunta composta
efetuadas, tais como: Quem é o avô de José? ?- progenitor(Y,josé), progenitor(X,Y).
X
‰ Como nosso programa não conhece ‰ Pode ser lida como:
diretamente a relação avô, esta pergunta deve ƒ Encontre X e Y tais que satisfaçam os seguintes requisitos
progenitor
ser desmembrada em dois passos
ƒ progenitor(Y,josé) e progenitor(X,Y)
(1) Quem é o progenitor de José? Assuma que é um avô
Y
Y ‰ De maneira similar, podemos perguntar: Quem são os
(2) Quem é o progenitor de Y? Assuma que é um X netos de Abraão?
progenitor ?- progenitor(abraão,X), progenitor(X,Y).
‰ Esta pergunta composta pode ser escrita em
Prolog como: X = isaque
José
?-progenitor(Y,josé),progenitor(X,Y). Y = esaú;
X = isaque
Y = jacó X = isaque
Y = jacó

15 16

Definindo Relações por Fatos Pontos Importantes


‰ Outro tipo de pergunta pode ser efetuado: ‰ O nome de uma relação deve começar com uma
Esaú e Jácó têm um progenitor em letra minúscula
comum? ‰ A relação é escrita primeiro e os seus
argumentos são separados por vírgulas e
‰ Isso pode ser expresso em duas etapas:
colocados entre parênteses
ƒ Quem é o progenitor, X, de Esaú? ‰ O ponto final “.” deve seguir o final do fato
ƒ É (este mesmo) X um progenitor de Jacó? ‰ É fácil definir uma relação em Prolog, por
‰ A pergunta correspondente em Prolog é: exemplo a relação progenitor, escrevendo n-
?- progenitor(X,esaú), progenitor(X,jacó). tuplas de objetos que satisfazem a relação
X = isaque ‰ O usuário pode perguntar ao sistema Prolog
sobre relações definidas no programa
17 18

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

Exercício Definindo Relações por Regras


Sara Abraão
Quais as respostas dadas por Prolog? ‰ Nosso programa sobre famílias ‰ As relações mulher e
(a) ?- progenitor(josé,X). pode ser estendido de várias homem são relações
formas
Isaque Ismael (b) ?- progenitor(X,josé). unárias
‰ Vamos adicionar a informação
(c) ?- progenitor(sara,X), sobre o sexo das pessoas ‰ Uma relação binária,
Esaú Jacó
progenitor(X,jacó). envolvidas na relação como progenitor, define
(d) ?- progenitor(sara,X), progenitor um relacionamento entre
progenitor(X,Y), ‰ Por exemplo: pares de objetos
José progenitor(Y,josé). ƒ mulher(sara).
‰ Relações unárias são
ƒ homem(abraão).
progenitor(sara,isaque). ƒ homem(isaque).
usadas para declarar
progenitor(abraão,isaque). ƒ homem(ismael).
propriedades simples
ƒ homem(esaú). sim/não dos objetos
progenitor(abraão,ismael).
progenitor(isaque,esaú).
ƒ homem(jacó). ‰ A primeira cláusula unária
ƒ homem(josé). pode ser lida como “Sara
progenitor(isaque,jacó).
é uma mulher”
progenitor(jacó,josé).
23 24

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

Definindo Relações por Regras Definindo Relações por Regras


‰ Vamos estender o programa introduzindo a ‰ Entretanto, a relação filho_geral pode ser
relação filho_geral como o inverso da relação definida de modo mais elegante:
progenitor ƒ Para todo X e Y,
‰ Podemos definir filho_geral de maneira similar à Y é um filho_geral de X se
X é um progenitor de Y.
relação progenitor, ou seja enumerando uma
lista de fatos sobre a relação filho_geral, por ‰ Em Prolog:
exemplo ƒ filho_geral(Y,X) :-
ƒ filho_geral(isaque,sara). progenitor(X,Y).
ƒ filho_geral(isaque,abraão). ‰ Esta cláusula também pode ser lida como:
ƒ filho_geral(ismael,abraão). ƒ Par todo X e Y,
se X é um progenitor de Y então
ƒ ... Y é um filho_geral de X

27 28

Definindo Relações por Regras Definindo Relações por Regras


‰ Cláusulas Prolog como: ‰ filho_geral(Y,X) :- progenitor(X,Y).
ƒ filho_geral(Y,X) :-
progenitor(X,Y).
são chamadas regras (rules)
‰ Há uma diferença importante entre fatos e
regras:
Cabeça (head) ou Corpo (body) ou condição
ƒ Um fato é sempre verdadeiro (verdade conclusão da regra da regra
incondicional) (lado esquerdo da regra) (lado direito da regra)

ƒ Regras especificam coisas que são


verdadeiras se alguma condição é satisfeita

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

Definindo Relações por Regras Definindo Relações por Regras


‰ Vamos incluir a especificação da relação mãe, ‰ Exemplo: de Português para Prolog
com base no seguinte fundamento lógico: ƒ Uma pessoa é mãe se tiver algum filho e essa pessoa
ƒ Para todo X e Y, for mulher
X é a mãe de Y se
X é um progenitor de Y e ƒ Uma pessoa é mãe se for progenitor de alguém e essa
X é uma mulher. pessoa for mulher
‰ Traduzindo para Prolog: ƒ Uma pessoa X é mãe de Y se X for progenitor de Y e X
ƒ mãe(X,Y) :- for mulher
progenitor(X,Y),
mulher(X). ƒ X é mãe de Y se X é progenitor de Y e X é mulher
‰ Uma vírgula entre duas condições indica a ƒ mãe(X,Y) :-
conjunção das condições, significando que progenitor(X,Y),
ambas condições têm que ser verdadeiras mulher(X).

33 34

Definindo Relações por Regras Exercício


‰ Em Prolog, uma regra consiste de uma ‰ Identifique a cabeça e cauda de cada regra.
cabeça e uma corpo ‰ Expressar cada regra em Português:
‰ A cabeça e o corpo são conectados pelo
símbolo :-, denominado neck, formado por gosta(joao,X) :-
dois pontos e hífen gosta(X,vinho),
‰ :- é pronunciado “se” gosta(X,comida).
mãe(X,Y) :- progenitor(X,Y), mulher(X). gosta(joao,X) :-
mulher(X),
gosta(X,vinho).

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

Grafos Definindo Relações Layout de um Programa Prolog


‰ Cada diagrama deve ser interpretado da seguinte forma: ‰ Prolog fornece liberdade na escrita do layout do
se as relações mostradas pelos arcos sólidos são
verdadeiras então a relação mostrada pelo arco tracejado programa
também é verdadeira
‰ Entretanto, os programas devem ter um aspecto
‰ Assim, a relação avô_geral pode ser imediatamente
escrita como: compacto e, acima de tudo, fácil de ler
ƒ avô_geral(X,Z) :- progenitor(X,Y), progenitor(Y,Z). ‰ Assim, é um padrão escrever a cabeça de uma
X cláusula bem como cada condição em seu corpo
mulher
X X progenitor em uma linha separada
progenitor filho_geral progenitor mãe avô_geral ‰ Além disso, as condições são deslocadas de
Y

Y Y progenitor
modo a melhor separar a cabeça do corpo de
uma regra
Z

39 40

Layout de um Programa Prolog Definindo Relações por Regras


A relação irmão pode ser definida como:
‰ Por exemplo, a relação
‰
ƒ Para todo X e Y,
ƒ avô_geral(X,Z) :- progenitor(X,Y), progenitor(Y,Z). X é irmão de Y se
ambos X e Y têm um progenitor em comum e
Z
deve ser escrita da seguinte forma: X é um homem.
‰ Em Prolog: progenitor progenitor
ƒ avô_geral(X,Z) :- ƒ irmão(X,Y) :-
progenitor(Z,X),
progenitor(X,Y), progenitor(Z,Y), homem X
irmão
Y

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

‰ Entretanto, de acordo com nossa definição sobre irmãos,


a resposta de Prolog é perfeitamente lógica
43 44

Pontos Importantes Pontos Importantes


‰ Programas Prolog podem ser estendidos simplesmente ‰ Durante a computação, uma variável pode ser substituída
pela adição de novas cláusulas por um objeto: dizemos que a variável está instanciada
‰ Cláusulas Prolog são de três tipos: fatos, regras e ‰ As variáveis são universalmente quantificadas e são lidas
perguntas como “Para todo”
ƒ Fatos declaram coisas que são sempre (incondicionalmente) ‰ Todavia, leituras alternativas são possíveis para variáveis
verdadeiras que aparecem apenas no corpo
ƒ Regras declaram coisas que são verdadeiras dependendo de
determinadas condições ‰ Por exemplo:
ƒ Através de perguntas, o usuário pode questionar o programa ƒ temfilhos(X) :- progenitor(X,Y).
sobre quais coisas são verdadeiras ‰ Pode ser lida de duas formas:
‰ Cláusulas Prolog consistem em uma cabeça e o corpo; o ƒ Para todo X e Y,
corpo é uma lista de condições separadas por vírgulas se X é um progenitor de Y então
(que significam conjunções) X tem filhos
ƒ Para todo X,
‰ Fatos são cláusulas que têm uma cabeça e o corpo vazio; X tem filhos se
perguntas têm apenas o corpo; regras têm uma cabeça e existe algum Y tal que X é um progenitor de Y
um corpo (não vazio)
45 46

Exercícios Regras Recursivas

‰ 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

Regras Recursivas Programa da Família Bíblica


‰ ancestral(X,Z) :- % caso base progenitor(sara,isaque).
progenitor(abraão,isaque).
filho_geral(Y,X) :-
progenitor(X,Y).
progenitor(X,Z). progenitor(abraão,ismael). mãe(X,Y) :-
‰ ancestral(X,Z) :- % caso recursivo progenitor(isaque,esaú). progenitor(X,Y),
progenitor(X,Y), progenitor(isaque,jacó).
progenitor(jacó,josé).
mulher(X).
avô_geral(X,Z) :-
ancestral(Y,Z). progenitor(X,Y),
‰ Podemos perguntar: quais os descendentes de mulher(sara). progenitor(Y,Z).
homem(abraão). irmão(X,Y) :-
Sara? homem(isaque). progenitor(Z,X),
ƒ ?- ancestral(sara,X). homem(ismael). progenitor(Z,Y),
ƒ X = isaque; homem(esaú). homem(X).
ƒ X = esaú; homem(jacó).
homem(josé).
ancestral(X,Z) :-
progenitor(X,Z).
ƒ X = jacó; ancestral(X,Z) :-
ƒ X = josé progenitor(X,Y),
ancestral(Y,Z).

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

Você também pode gostar