Anda di halaman 1dari 9

1

Jos Augusto Baranauskas


Departamento de Fsica e Matemtica FFCLRP-USP
E-mail: augusto@usp.br
URL: http://dfm.fmrp.usp.br/~augusto
Inteligncia Artificial
Introduo Programao Introduo Programao
Prolog (Tutorial) Prolog (Tutorial)
Nesta aula so introduzidos
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
2
Introduo 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
3
Programao Lgica 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
4
Programao em Prolog 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
5
Definindo Relaes por Fatos 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
Abrao Sara
Isaque Ismael
Esa Jac
Jos
6
Definindo Relaes por Fatos 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
Abrao Sara
Isaque Ismael
Esa Jac
Jos
2
7
Definindo Relaes por Fatos 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
Abrao Sara
Isaque Ismael
Esa Jac
Jos
8
Definindo Relaes por Fatos 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)
9
Definindo Relaes por Fatos 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
10
Definindo Relaes por Fatos Definindo Relaes por Fatos
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
Abrao Sara
Isaque Ismael
Esa Jac
Jos
progenitor(sara,isaque).
progenitor(abrao,isaque).
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
11
Definindo Relaes por Fatos Definindo Relaes por Fatos
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
Abrao Sara
Isaque Ismael
Esa Jac
Jos
progenitor(sara,isaque).
progenitor(abrao,isaque).
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
12
Definindo Relaes por Fatos Definindo Relaes por Fatos
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
Abrao Sara
Isaque Ismael
Esa Jac
Jos
progenitor(sara,isaque).
progenitor(abrao,isaque).
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
3
13
Definindo Relaes por Fatos Definindo Relaes por Fatos
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)
Abrao Sara
Isaque Ismael
Esa Jac
Jos
progenitor(sara,isaque).
progenitor(abrao,isaque).
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
14
Definindo Relaes por Fatos Definindo Relaes por Fatos
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 ;
Abrao Sara
Isaque Ismael
Esa Jac
Jos
progenitor(sara,isaque).
progenitor(abrao,isaque).
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
15
Definindo Relaes por Fatos 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
X
Y
Jos
progenitor
progenitor
av
16
Definindo Relaes por Fatos 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
17
Definindo Relaes por Fatos 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
18
Pontos Importantes 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 n-
tuplas de objetos que satisfazem a relao
O usurio pode perguntar ao sistema Prolog
sobre relaes definidas no programa
4
19
Pontos Importantes 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
20
Pontos Importantes 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 ;
21
Exerccio Exerccio
Expressar em portugus:
valioso(ouro).
femea(jane).
possui(joao,ouro).
pai(joao,maria).
da(joao,livro,maria).
22
Exerccio 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).
23
Exerccio Exerccio
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).
Abrao Sara
Isaque Ismael
Esa Jac
Jos
progenitor(sara,isaque).
progenitor(abrao,isaque).
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
24
Definindo Relaes por Regras 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
5
25
Definindo Relaes por Regras 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).
26
Escolhendo Objetos e Relaes 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
27
Definindo Relaes por Regras 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).
...
28
Definindo Relaes por Regras 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
29
Definindo Relaes por Regras 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
30
Definindo Relaes por Regras 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)
6
31
Definindo Relaes por Regras 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).
32
Definindo Relaes por Regras 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
33
Definindo Relaes por Regras 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
34
Definindo Relaes por Regras 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).
35
Definindo Relaes por Regras 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).
36
Exerccio 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).
7
37
Exerccio 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).
38
Grafos Definindo Relaes 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
X
progenitor
progenitor
av_geral
Y
Z
X
progenitor filho_geral
Y
X
progenitor
me
Y
mulher
39
Grafos Definindo Relaes 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).
X
progenitor
progenitor
av_geral
Y
Z
X
progenitor filho_geral
Y
X
progenitor
me
Y
mulher
40
Layout de um Programa Prolog 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
41
Layout de um Programa Prolog 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).
42
Definindo Relaes por Regras 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
Z
progenitor progenitor
irmo
X Y
homem
8
43
Definindo Relaes por Regras 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
44
Definindo Relaes por Regras 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).
45
Pontos Importantes 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)
46
Pontos Importantes 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
47
Exerccios 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
48
Regras Recursivas 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
Z
9
49
Regras Recursivas Regras Recursivas
X
progenitor
progenitor
ancestral
Y
Z
X
progenitor
Z
Y1
Y2
ancestral progenitor
progenitor
X
progenitor
ancestral
Y3
Z
Y1
Y2
progenitor
progenitor
progenitor
ancestral(X,Z) :-
progenitor(X,Y),
progenitor(Y,Z).
ancestral(X,Z) :-
progenitor(X,Y1),
progenitor(Y1,Y2),
progenitor(Y2,Z).
ancestral(X,Z) :-
progenitor(X,Y1),
progenitor(Y1,Y2),
progenitor(Y2,Y3),
progenitor(Y3,Z).
50
Regras Recursivas 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).
X
progenitor
ancestral
Z
Y
...
ancestral
51
Regras Recursivas 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
52
Programa da Famlia Bblica 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).
53
Exerccio Exerccio
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?
X
progenitor
ancestral
Z
Y
...
ancestral
54
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 elaborado por
Jos Augusto Baranauskas
2004

Anda mungkin juga menyukai