Sei sulla pagina 1di 60

Introduo Programao

Prolog (Tutorial)
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

Inteligncia Artificial
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

2
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

4
Objetos de dados e Prolog

Objetos

Objetos Simples Estruturas

Constantes Variveis

tomos Nmeros

5
tomos

So cadeias compostas pelos


seguintes caracteres:
Objetos
letras maisculas: A, B, ...,
Z
Objetos Simples Estruturas
letras minsculas: a, ..., z
Constantes Variveis
dgitos: 1, 2, ..., 9
tomos Nmeros caracters especiais, tais
como: *, +, >, _, =, :, ., &.

6
tomos (cont)

Podem ser construdos de


trs maneiras:
Objetos
cadeias de letras,
dgitos e o caractere _,
Objetos Simples Estruturas
comeando com uma
Constantes Variveis letra minscula.
cadeias de caracteres
tomos Nmeros especiais
cadeias de caracteres
entre apstrofos

7
Nmeros

Incluem nmeros inteiros e


nmeros reais.
Objetos

Objetos Simples Estruturas

Constantes Variveis

tomos Nmeros

8
Variveis

So cadeias de letras,
dgitos e caracteres _,
Objetos
sempre comeando com
letra maiscula ou com o
Objetos Simples Estruturas caractere _.

Constantes Variveis

tomos Nmeros

9
Estruturas

So objetos de dados que


tm vrios componentes,
Objetos
podendo cada um deles,
por sua vez, ser uma
Objetos Simples Estruturas estrutura.

Constantes Variveis

tomos Nmeros

10
Definindo Relaes por Fatos

Sara Abrao
A figura ao lado mostra um
exemplo da relao famlia
O fato que Abrao um
progenitor de Isaque pode
Isaque Ismael ser escrito em Prolog como:
progenitor(abrao,isaque).
Neste caso definiu-se
progenitor como o nome
Esa Jac
de uma relao; abrao e
isaque so seus
argumentos
Jos

11
Definindo Relaes por Fatos

Sara Abrao
A rvore familiar completa
em Prolog :
progenitor(sara,isaque).
progenitor(abrao,isaque).
Isaque Ismael progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
Esa Jac Este programa consiste de
seis clusulas
Cada uma dessas clusulas
Jos declara um fato sobre a
relao progenitor
12
Definindo Relaes por Fatos

Sara Abrao
Por exemplo
progenitor(abrao,isaque).
uma instncia particular
da relao progenitor
Isaque Ismael Esta instncia tambm
chamada de
relacionamento
Esa Jac
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 Quando o programa
interpretado/compilado, pode-se
Isaque Ismael
questionar Prolog sobre a relao
progenitor, por exemplo: Isaque
o pai de Jac?
Esa Jac Esta pergunta pode ser
comunicada Prolog digitando:
Jos
?- progenitor(isaque,jac).
Como Prolog encontra essa
progenitor(sara,isaque). pergunta como um fato inserido
progenitor(abrao,isaque). em sua base, Prolog responde:
progenitor(abrao,ismael). yes
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
16
Definindo Relaes por Fatos
Sara Abrao Uma outra pergunta pode ser
?- progenitor(ismael,jac).
Isaque Ismael Prolog responde:

no
porque o programa no menciona
Esa Jac
nada sobre Ismael como sendo o
progenitor de Jac
Jos Prolog tambm responde no
pergunta:
progenitor(sara,isaque).
?- progenitor(jac,moiss).
progenitor(abrao,isaque).
no
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
17
Definindo Relaes por Fatos
Sara Abrao Perguntas mais interessantes
tambm podem ser efetuadas:
Isaque Ismael
Quem o progenitor de Ismael?
?- progenitor(X,ismael).
Neste caso, Prolog no vai
Esa Jac responder apenas yes ou no.
Prolog fornecer o valor de X tal
Jos
que a pergunta acima seja
verdadeira
progenitor(sara,isaque). Assim a resposta :

progenitor(abrao,isaque). X = abrao
progenitor(abrao,ismael).
progenitor(isaque,esa).
progenitor(isaque,jac).
progenitor(jac,jos).
18
Definindo Relaes por Fatos
Sara Abrao A pergunta Quais os filhos de
Isaque? pode ser escrita como:
Isaque Ismael ?- progenitor(isaque,X).
Neste caso, h mais de uma
resposta possvel; Prolog primeiro
Esa Jac responde com uma soluo:
X = esa
Jos Pode-se requisitar uma outra soluo
(digitando ;) e Prolog encontra:
progenitor(sara,isaque). X = jac
progenitor(abrao,isaque). Se mais solues forem requisitadas,
progenitor(abrao,ismael). Prolog responde no pois todas as
progenitor(isaque,esa). solues foram exauridas (no = sem
progenitor(isaque,jac). mais solues)
progenitor(jac,jos).
19
Definindo Relaes por Fatos
Sara Abrao Questes mais amplas podem ser
efetuadas: Quem o progenitor de
quem?
Isaque Ismael Reformulando: encontre X e Y tais
que X o progenitor de Y
?- progenitor(X,Y).
Esa Jac
Prolog encontra todos os pares
progenitor-filho um aps o outro
Jos As solues so mostradas uma de
cada vez:
progenitor(sara,isaque). X = sara Y = isaque;
progenitor(abrao,isaque). X = abrao Y = isaque;
X = abrao Y = ismael;
progenitor(abrao,ismael).
...
progenitor(isaque,esa). As solues podem ser interrompidas
progenitor(isaque,jac). digitando [enter] ao invs de ;
progenitor(jac,jos).
20
Definindo Relaes por Fatos
Perguntas mais complexas tambm podem ser
efetuadas, tais como: Quem o av de Jos?
X
Como nosso programa no conhece
diretamente a relao av, esta pergunta deve
progenitor
ser desmembrada em dois passos
(1) Quem o progenitor de Jos? Assuma que um av
Y Y

(2) Quem o progenitor de Y? Assuma que um X


progenitor
Esta pergunta composta pode ser escrita em
Prolog como:
Jos
?-progenitor(Y,jos),progenitor(X,Y).
X = isaque
Y = jac

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 n-
tuplas 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). Quais as respostas dadas por
gosta(joao,maria). Prolog?
gosta(maria,livro). ?- gosta(maria,X).
gosta(pedro,livro). ?- gosta(X,livro).
gosta(maria,flor). ?- gosta(Quem,Oque).
gosta(maria,vinho). ?- gosta(X,Y).
?- gosta(X,X).
?- gosta(_a,_b).
?- gosta(A,peixe).

28
Exerccio
Sara Abrao
Quais as respostas dadas por Prolog?
(a) ?- progenitor(jos,X).
Isaque Ismael (b) ?- progenitor(X,jos).
(c) ?- progenitor(sara,X),
progenitor(X,jac).
Esa Jac
(d) ?- progenitor(sara,X),
progenitor(X,Y),
Jos 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 As relaes mulher e
pode ser estendido de vrias homem so relaes
formas
unrias
Vamos adicionar a informao
sobre o sexo das pessoas Uma relao binria,
envolvidas na relao como progenitor, define
progenitor um relacionamento entre
Por exemplo: pares de objetos
mulher(sara).
homem(abrao).
Relaes unrias so
homem(isaque). usadas para declarar
homem(ismael). propriedades simples
homem(esa). sim/no dos objetos
homem(jac). A primeira clusula unria
homem(jos). pode ser lida como Sara
uma mulher
30
Definindo Relaes por Regras
Informao sobre o sexo Podemos declarar a
das pessoas envolvidas mesma informao
na relao progenitor: usando uma relao
mulher(sara). binria sexo:
homem(abrao). sexo(sara,feminino).
homem(isaque). sexo(abrao,masculino).
homem(ismael). sexo(isaque,masculino).
homem(esa). sexo(ismael,masculino).
homem(jac). sexo(esa,masculino).
homem(jos). sexo(jac,masculino).
sexo(jos,masculino).

31
Escolhendo Objetos e Relaes
Como representar: Sara uma mulher
mulher(sara).
Permiteresponder: 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).
Permiteresponder 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 Corpo (body) ou condio


da regra da regra
(lado esquerdo 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 ladrao(joao).
lado, defina a regra: ladrao(pedro).
Uma pessoa pode gosta(maria,flor).
roubar algo se essa gosta(maria,queijo).
pessoa um ladro e gosta(maria,vinho).
ela gosta de um objeto gosta(joao,rubi).
Qual a resposta dada gosta(joao,X) :-
por Prolog a pergunta: gosta(X,vinho).
Joo rouba o qu?

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
X
mulher
X X progenitor

progenitor filho_geral progenitor me


Y av_geral

Y Y progenitor

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).
X
mulher
X X progenitor

progenitor filho_geral progenitor me


Y av_geral

Y Y progenitor

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

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
X um progenitor de Z. progenitor ancestral

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

54
Regras Recursivas
X X X
progenitor progenitor
progenitor

Y1 Y1
Y ancestral
progenitor ancestral progenitor
progenitor
Y2 Y2 ancestral
Z
progenitor progenitor

ancestral(X,Z) :- Z Y3
progenitor(X,Y),
ancestral(X,Z) :- progenitor
progenitor(Y,Z). progenitor(X,Y1), ancestral(X,Z) :-
progenitor(Y1,Y2), Z
progenitor(X,Y1),
progenitor(Y2,Z). progenitor(Y1,Y2),
progenitor(Y2,Y3),
progenitor(Y3,Z).
55
Regras Recursivas
X
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
ancestral(X,Z) :- ...

progenitor(X,Y),
ancestral(Y,Z).
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). filho_geral(Y,X) :-
progenitor(abrao,isaque). progenitor(X,Y).
progenitor(abrao,ismael). me(X,Y) :-
progenitor(isaque,esa). progenitor(X,Y),
progenitor(isaque,jac). mulher(X).
progenitor(jac,jos). av_geral(X,Z) :-
progenitor(X,Y),
mulher(sara). progenitor(Y,Z).
homem(abrao). irmo(X,Y) :-
homem(isaque). progenitor(Z,X),
homem(ismael). progenitor(Z,Y),
homem(esa). homem(X).
homem(jac). ancestral(X,Z) :-
homem(jos). progenitor(X,Z).
ancestral(X,Z) :-
progenitor(X,Y),
ancestral(Y,Z).

58
Exerccio
X
Vimos a seguinte definio da
relao ancestral progenitor
ancestral(X,Z) :-
progenitor(X,Z). Y
ancestral(X,Z) :-
progenitor(X,Y),
ancestral(Y,Z).
Considere a seguinte definio
alternativa: ancestral
ancestral(X,Z) :-
progenitor(X,Z). ancestral
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 Z
definio?
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

Potrebbero piacerti anche