Download - Prolog - Introducao
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 1/60
Inteligência Artificial
Introdução à Programação
Prolog (Tutorial) Esta aula introduz conceitosbásicos da linguagem deprogramação lógica Prolog
Os conceitos são introduzidosatravs de um tutorial sobrerelaç!es "amiliares
#aiores detal$es sobreterminologia e notação serão
vistos nas pró%imas aulas
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 2/60
&
Introdução
Prolog ' Programming in ogic inguagem de programação utilizada para
resolver problemas envolvendo objetos erelações entre obetos
*onceitos básicos+ "atos, perguntas,variáveis, conunç!es e regras
*onceitos avançados+ listas e recursão
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 3/60
-
Programação ógica
Programação Procedural (procedimental)+ Programa ' .lgoritmo / Estruturas de 0ados
Programação ógica .lgoritmo ' ógica / *ontrole Programa ' ógica / *ontrole / Estruturas de
0ados
Em P, programa1se de "orma declarativa, ousea, especi"icando o que deve ser computadoao invs de como deve ser computado
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 4/60
2
Programação em Prolog
Programar em Prolog envolve+ declarar alguns fatos a respeito de obetos
e seus relacionamentos de"inir algumas regras sobre os obetos e
seus relacionamentos e "azer perguntas sobre os obetos e seus
relacionamentos
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 5/60
3
Obetos de dados e Prolog
Átomos
Objetos
Objetos Simples Estruturas
Constantes Variáveis
Números
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 6/60
4
5tomos
Átomos
Objetos
Objetos Simples Estruturas
Constantes Variáveis
Números
6ão cadeias compostas pelosseguintes caracteres+
•
letras mai7sculas+ ., 8, 999,:
• letras min7sculas+ a, 999, z
• d;gitos+ <, &, 999, =
• caracters especiais, taiscomo+ >, /, ?, @, ', +, 9, A9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 7/60B
5tomos (cont)
Átomos
Objetos
Objetos Simples Estruturas
Constantes Variáveis
Números
Podem ser constru;dos detrCs maneiras+
•
cadeias de letras,d;gitos e o caractere @,começando com umaletra min7scula9
•
cadeias de caracteresespeciais
• cadeias de caracteresentre apóstro"os
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 8/60D
7meros
Átomos
Objetos
Objetos Simples Estruturas
Constantes Variáveis
Números
Incluem n7meros inteiros en7meros reais9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 9/60=
Fariáveis
Átomos
Objetos
Objetos Simples Estruturas
Constantes Variáveis
Números
6ão cadeias de letras,d;gitos e caracteres @,sempre começando com
letra mai7scula ou com ocaractere @9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 10/60<G
Estruturas
Átomos
Objetos
Objetos Simples Estruturas
Constantes Variáveis
Números
6ão obetos de dados HuetCm vários componentes,podendo cada um deles,
por sua vez, ser umaestrutura9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 11/60<<
0e"inindo elaç!es por Jatos
. "igura ao lado mostra ume%emplo da relação família
O "ato Hue .braão umprogenitor de IsaHue pode
ser escrito em Prolog como+ progenitor(abraão,isaHue)9
este caso de"iniu1seprogenitor como o nome
de uma relaçãoK abraão eisaque são seusargumentos
.braão6ara
IsaHue Ismael
Esa7 Lacó
Los
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 12/60<&
0e"inindo elaç!es por Jatos
. árvore "amiliar completaem Prolog + progenitor(sara,isaHue)9 progenitor(abraão,isaHue)9
progenitor(abraão,ismael)9 progenitor(isaHue,esa7)9 progenitor(isaHue,acó)9 progenitor(acó,os)9
Este programa consiste deseis cláusulas
*ada uma dessas cláusulasdeclara um "ato sobre arelação progenitor
.braão6ara
IsaHue Ismael
Esa7 Lacó
Los
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 13/60<-
0e"inindo elaç!es por Jatos
Por e%emplo progenitor(abraão,isaHue)9
uma instância particularda relação progenitor
Esta instMncia tambmc$amada derelacionamento
Em geral, uma relação
de"inida como o conunto detodas suas instMncias
.braão6ara
IsaHue Ismael
Esa7 Lacó
Los
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 14/60<2
0e"inindo elaç!es por Jatos
. ordem dos argumentos em uma relação de"inida arbitrariamente, mas deve serseguida e usada de "orma consistente
progenitor(abraão,isaHue) signi"ica Hue N.braão progenitor de IsaHue
progenitor(isaHue,abraão)
signi"ica Hue NIsaHue progenitor de .braãoote Hue progenitor(abraão,isaHue) não
tem o mesmo signi"icado Hueprogenitor(isaHue,abraão)
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 15/60<3
0e"inindo elaç!es por Jatos
Os nomes das relaç!es e seus argumentos sãoarbitrários, ou sea+ progenitor(abraão,isaHue)
a(b,c) são semanticamente eHuivalentes desde Hue Na signi"iHue Nprogenitor Nb signi"iHue Nabraão e
Nc signi"iHue NisaHue ormalmente, o programador escol$e nomes
signi"icativos
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 16/60<4
0e"inindo elaç!es por Jatos
uando o programa interpretadoQcompilado, pode1seHuestionar Prolog sobre a relaçãoprogenitor, por e%emplo+ IsaHue o pai de LacóR
Esta pergunta pode sercomunicada à Prolog digitando+
?- progenitor(isaque,jacó).
*omo Prolog encontra essapergunta como um "ato inseridoem sua base, Prolog responde+
yes
.braão6ara
IsaHue Ismael
Esa7 Lacó
Los
progenitor(sara,isaHue)9
progenitor(abraão,isaHue)9
progenitor(abraão,ismael)9
progenitor(isaHue,esa7)9
progenitor(isaHue,acó)9
progenitor(acó,os)9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 17/60<B
0e"inindo elaç!es por Jatos
Sma outra pergunta pode ser ?- progenitor(ismael,jacó).
Prolog responde+
no
porHue o programa não mencionanada sobre Ismael como sendo oprogenitor de Lacó
Prolog tambm responde no àpergunta+
?- progenitor(jacó,moisés).no
.braão6ara
IsaHue Ismael
Esa7 Lacó
Los
progenitor(sara,isaHue)9
progenitor(abraão,isaHue)9
progenitor(abraão,ismael)9
progenitor(isaHue,esa7)9
progenitor(isaHue,acó)9
progenitor(acó,os)9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 18/60<D
0e"inindo elaç!es por Jatos
Perguntas mais interessantestambm podem ser e"etuadas+uem o progenitor de IsmaelR
?- progenitor(X,ismael).
este caso, Prolog não vairesponder apenas yes ou no9Prolog "ornecerá o valor de talHue a pergunta acima seaverdadeira
.ssim a resposta +
X = abraão
.braão6ara
IsaHue Ismael
Esa7 Lacó
Los
progenitor(sara,isaHue)9
progenitor(abraão,isaHue)9
progenitor(abraão,ismael)9
progenitor(isaHue,esa7)9
progenitor(isaHue,acó)9
progenitor(acó,os)9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 19/60<=
0e"inindo elaç!es por Jatos
. pergunta Nuais os "il$os deIsaHueR pode ser escrita como+
?- progenitor(isaque,X).
este caso, $á mais de umaresposta poss;velK Prolog primeiroresponde com uma solução+
X = esaú
Pode1se reHuisitar uma outra solução(digitando ;) e Prolog encontra+
X = jacó 6e mais soluç!es "orem reHuisitadas,
Prolog responde no pois todas assoluç!es "oram e%auridas (no ' semmais soluç!es)
.braão6ara
IsaHue Ismael
Esa7 Lacó
Los
progenitor(sara,isaHue)9
progenitor(abraão,isaHue)9
progenitor(abraão,ismael)9
progenitor(isaHue,esa7)9
progenitor(isaHue,acó)9
progenitor(acó,os)9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 20/60&G
0e"inindo elaç!es por Jatos
uest!es mais amplas podem sere"etuadas+ uem o progenitor deHuemR
e"ormulando+ encontre e U taisHue o progenitor de U
?- progenitor(X,Y). Prolog encontra todos os pares
progenitor1"il$o um após o outro .s soluç!es são mostradas uma de
cada vez+X = sara Y = isaque;
X = abraãoY = isaque;
X = abraãoY = ismael;
...
.s soluç!es podem ser interrompidasdigitando [enter] ao invs de ;
.braão6ara
IsaHue Ismael
Esa7 Lacó
Los
progenitor(sara,isaHue)9
progenitor(abraão,isaHue)9
progenitor(abraão,ismael)9
progenitor(isaHue,esa7)9
progenitor(isaHue,acó)9
progenitor(acó,os)9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 21/60&<
0e"inindo elaç!es por Jatos
Perguntas mais comple%as tambm podem sere"etuadas, tais como+ uem o avV de LosR
*omo nosso programa não con$ecediretamente a relação avV, esta pergunta deveser desmembrada em dois passos(<) uem o progenitor de LosR .ssuma Hue um
U
(&) uem o progenitor de UR .ssuma Hue um Esta pergunta composta pode ser escrita em
Prolog como+
?-progenitor(Y,josé),progenitor(X,Y).
X = isaque
Y = jacó
U
Los
progenitor
progenitor
avV
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 22/60&&
0e"inindo elaç!es por Jatos
. pergunta composta?- progenitor(Y,josé), progenitor(X,Y).
Pode ser lida como+ Encontre e U tais Hue satis"açam os seguintes reHuisitos
progenitor(Y,josé) e progenitor(X,Y) 0e maneira similar, podemos perguntar+ uem são os
netos de .braãoR?- progenitor(abraão,X), progenitor(X,Y).
X = isaque
Y = esaú;
X = isaque
Y = jacó
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 23/60&-
0e"inindo elaç!es por Jatos
Outro tipo de pergunta pode ser e"etuado+Esa7 e Lácó tCm um progenitor emcomumR
Isso pode ser e%presso em duas etapas+ uem o progenitor, , de Esa7R W (este mesmo) um progenitor de LacóR
. pergunta correspondente em Prolog +?- progenitor(X,esaú), progenitor(X,jacó).
X = isaque
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 24/60&2
Pontos Importantes
O nome de uma relação deve começar com umaletra min7scula
. relação escrita primeiro e os seus
argumentos são separados por v;rgulas ecolocados entre parCnteses O ponto "inal N9 deve seguir o "inal do "ato W "ácil de"inir uma relação em Prolog, por
e%emplo a relação progenitor , escrevendo n1tuplas de obetos Hue satis"azem a relação O usuário pode perguntar ao sistema Prolog
sobre relaç!es de"inidas no programa
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 25/60&3
Pontos Importantes
Sm programa Prolog consiste de cláusulasK cadacláusula termina com um ponto "inal
Os argumentos das relaç!es podem (entre outrascoisas) ser+ obetos concretos ou constantes (tais
como abraão e isaque) ou obetos gerais taiscomo X e Y 9 Obetos do primeiro tipo sãoc$amados átomosK obetos do segundo tipo sãoc$amados variáveis
. aridade de uma relação o seu n7mero deargumentos e denotada como uma barraseguida pela aridade progenitorQ& signi"ica Hue a relação progenitor possui
& argumentos, ou Hue a relação progenitor tem aridade
&
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 26/60
&4
Pontos Importantes
Perguntas consistem em uma ou mais cláusulas Sma seHXCncia de cláusulas, tal como+
progenitor(,esa7), progenitor(,acó) 6igni"ica a conunção das cláusulas
um progenitor de Esa7 e um progenitor de Lacó
. resposta a uma pergunta pode ser Positiva+ a pergunta satis"at;vel e teve sucesso (suceeded ) egativa+ a pergunta insatis"at;vel e "al$ou (failed )
6e várias respostas satis"azem uma pergunta, Prologencontra tantas Huantas poss;veis 6e o usuário estiver satis"eito com a resposta, basta digitar return
6e desear mais respostas, usa1se ponto1e1v;rgula N;
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 27/60
&B
E%erc;cio
E%pressar em portuguCs+ valioso(ouro)9 "emea(ane)9 possui(oao,ouro)9 pai(oao,maria)9
da(oao,livro,maria)9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 28/60
&D
E%erc;cio
gosta(joao, peixe).
gosta(joao,maria).
gosta(maria,livro).
gosta(pedro,livro).
gosta(maria,lor).
gosta(maria,vin!o).
uais as respostas dadas porPrologR
?- gosta(maria,X).
?- gosta(X,livro).
?- gosta("uem,#que).
?- gosta(X,Y).
?- gosta(X,X).
?- gosta($a,$b).
?- gosta(%,peixe).
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 29/60
&=
E%erc;cio
uais as respostas dadas por PrologR(a) ?- progenitor(josé,X).
(b) ?- progenitor(X,josé).
(c) ?- progenitor(sara,X),
progenitor(X,jacó).() ?- progenitor(sara,X),
progenitor(X,Y),
progenitor(Y,josé).
.braão6ara
IsaHue Ismael
Esa7 Lacó
Los
progenitor(sara,isaHue)9
progenitor(abraão,isaHue)9progenitor(abraão,ismael)9
progenitor(isaHue,esa7)9
progenitor(isaHue,acó)9
progenitor(acó,os)9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 30/60
-G
0e"inindo elaç!es por egras
osso programa sobre "am;liaspode ser estendido de várias"ormas
Famos adicionar a in"ormaçãosobre o se%o das pessoas
envolvidas na relação progenitor Por e%emplo+
mul$er(sara)9 $omem(abraão)9 $omem(isaHue)9 $omem(ismael)9 $omem(esa7)9 $omem(acó)9 $omem(os)9
.s relaç!es mulher ehomem são relaç!esunárias
Sma relação binária,
como progenitor, de"ineum relacionamento entrepares de obetos
elaç!es unárias sãousadas para declarar
propriedades simplessimQnão dos obetos
. primeira cláusula unáriapode ser lida como N6ara uma mul$er
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 31/60
-<
0e"inindo elaç!es por egras
In"ormação sobre o se%odas pessoas envolvidasna relação progenitor + mul$er(sara)9 $omem(abraão)9
$omem(isaHue)9 $omem(ismael)9 $omem(esa7)9 $omem(acó)9 $omem(os)9
Podemos declarar amesma in"ormaçãousando uma relaçãobinária sexo+ se%o(sara,"eminino)9
se%o(abraão,masculino)9 se%o(isaHue,masculino)9 se%o(ismael,masculino)9 se%o(esa7,masculino)9 se%o(acó,masculino)9
se%o(os,masculino)9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 32/60
-&
Escol$endo Obetos e elaç!es
*omo representar+ N6ara uma mul$er mul$er(sara)9
Permite responder+ Nuem mul$erR ão permite responder+ Nual o se%o de 6araR
se%o(sara,"eminino)9 Permite responder+ Nuem mul$erR Permite responder+ Nual o se%o de 6araR ão permite responder+ Nual a propriedade de 6ara Hue tem
o valor "emininoR propriedade(sara,se%o,"eminino)9
Permite responder todas as perguntas epresentação obeto1atributo1valor
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 33/60
--
0e"inindo elaç!es por egras
Famos estender o programa introduzindo arelação filho_geral como o inverso da relação
progenitor Podemos de"inir filho_geral de maneira similar à
relação progenitor , ou sea enumerando umalista de "atos sobre a relação filho_geral , pore%emplo "il$o@geral(isaHue,sara)9 "il$o@geral(isaHue,abraão)9 "il$o@geral(ismael,abraão)9 999
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 34/60
-2
0e"inindo elaç!es por egras
Entretanto, a relação filho_geral pode serde"inida de modo mais elegante+ Para todo e U,
U um "il$o@geral de se
um progenitor de U9 Em Prolog+ "il$o@geral(U,) +1
progenitor(,U)9
Esta cláusula tambm pode ser lida como+ Par todo e U,
se um progenitor de U então U um "il$o@geral de
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 35/60
-3
0e"inindo elaç!es por egras
*láusulas Prolog como+ "il$o@geral(U,) +1
progenitor(,U)9
são c$amadas regras (rules)Yá uma di"erença importante entre "atos e
regras+ Sm "ato sempre verdadeiro (verdade
incondicional) egras especi"icam coisas Hue são
verdadeiras se alguma condição satis"eita
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 36/60
-4
0e"inindo elaç!es por egras
"il$o@geral(U,) +1 progenitor(,U)9
*abeça ($ead) ou conclusão
da regra(lado esHuerdo da regra)
*orpo (bodZ) ou condição
da regra(lado direito da regra)
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 37/60
-B
0e"inindo elaç!es por egras
Famos perguntar se Ismael "il$o@geral de .braão+ ?- il!o$geral(ismael,abraão).
*omo não $á "atos sobre a relação "il$o@geral, a 7nica "orma deProlog responder esta pergunta aplicando a regra sobre "il$o@geral "il$o@geral(U,) +1
progenitor(,U)9 . regra geral no sentido Hue aplicável a HuaisHuer obetos e UK
portanto ela pode tambm ser aplicada a obetos particulares taiscomo ismael e abraão
Para aplicar a regra a ismael e abraão, U tem Hue ser substitu;do porismael e por abraão
este caso, dizemos Hue as variáveis e U estão instanciadas a+ ' abraão e U ' ismael
0epois da instanciação, obtemos um caso especial da regra geral,Hue + "il$o@geral(ismael,abraão) +1
progenitor(abraão,ismael)9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 38/60
-D
0e"inindo elaç!es por egras
. condição da regra com as variáveis instanciadas "il$o@geral(ismael,abraão) +1
progenitor(abraão,ismael)9 +
progenitor(abraão,ismael)9 .ssim, Prolog tenta provar Hue a condição verdadeira Para provar a condição, trivial por Prolog encontra um
"ato correspondente no programa Isso implica Hue a conclusão da regra tambm
verdadeira e Prolog responde a"irmativamente à pergunta+ ?- il!o$geral(ismael,abraão). yes
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 39/60
-=
0e"inindo elaç!es por egras
Famos incluir a especi"icação da relação mãe,com base no seguinte "undamento lógico+ Para todo e U,
a mãe de U se
um progenitor de U e uma mul$er9 Traduzindo para Prolog+ mãe(,U) +1
progenitor(,U),
mul$er()9 Sma v;rgula entre duas condiç!es indica aconunção das condiç!es, signi"icando Hueambas condiç!es tCm Hue ser verdadeiras
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 40/60
2G
0e"inindo elaç!es por egras
E%emplo+ de PortuguCs para Prolog Sma pessoa mãe se tiver algum "il$o e essa pessoa
"or mul$er Sma pessoa mãe se "or progenitor de algum e essa
pessoa "or mul$er Sma pessoa mãe de U se "or progenitor de U e
"or mul$er mãe de U se progenitor de U e mul$er mãe(X,Y) &'
progenitor(X,Y),
mul!er(X).
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 41/60
2<
0e"inindo elaç!es por egras
Em Prolog, uma regra consiste de umacabeça e uma corpo
. cabeça e o corpo são conectados pelo
s;mbolo :-, denominado neck , "ormado pordois pontos e $;"en
:- pronunciado Nse
mãe(,U) :- progenitor(,U), mul$er()9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 42/60
2&
E%erc;cio
Identi"iHue a cabeça e cauda de cada regra9 E%pressar cada regra em PortuguCs+
gosta(joao,X) !-
gosta(X,vin!o),
gosta(X,comida).
gosta(joao,X) !-mul!er(X),
gosta(X,vin!o).
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 43/60
2-
E%erc;cio
Ssando a base aolado, de"ina a regra+Sma pessoa pode
roubar algo se essapessoa um ladrão eela gosta de um obeto
ual a resposta dada
por Prolog a pergunta+Loão rouba o HuCR
ladrao(joao).
ladrao(pedro).
gosta(maria,lor).
gosta(maria,queijo).
gosta(maria,vin!o).
gosta(joao,rubi).
gosta(joao,X) &'
gosta(X,vin!o).
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 44/60
22
[ra"os 0e"inindo elaç!es
elaç!es como progenitor , filho_geral e mãe podem ser ilustradaspor diagramas Hue seguem as seguintes convenç!es ós nos gra"os correspondem a obetos (argumentos das relaç!es) .rcos entre nós correspondem a relaç!es binárias (& argumentos) .rcos são orientados apontando do primeiro argumento da relação para o
segundo argumento
elaç!es unárias são indicadas nos diagramas simplesmente marcandoos obetos correspondentes com o nome da relação .s relaç!es sendo de"inidas são representadas por arcos traceados
progenitor
progenitor
avV@geralU
:
progenitor "il$o@geral
U
progenitor mãe
U
mul$er
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 45/60
23
[ra"os 0e"inindo elaç!es
*ada diagrama deve ser interpretado da seguinte "orma+se as relaç!es mostradas pelos arcos sólidos sãoverdadeiras então a relação mostrada pelo arco traceadotambm verdadeira
.ssim, a relação av_geral pode ser imediatamente
escrita como+ avV@geral(,:) +1 progenitor(,U), progenitor(U,:)9
progenitor
progenitor
avV@geralU
:
progenitor "il$o@geral
U
progenitor mãe
U
mul$er
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 46/60
24
aZout de um Programa Prolog
Prolog "ornece liberdade na escrita do layout doprograma
Entretanto, os programas devem ter um aspecto
compacto e, acima de tudo, "ácil de ler .ssim, um padrão escrever a cabeça de uma
cláusula bem como cada condição em seu corpoem uma lin$a separada
.lm disso, as condiç!es são deslocadas demodo a mel$or separar a cabeça do corpo deuma regra
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 47/60
2B
aZout de um Programa Prolog
Por e%emplo, a relação avV@geral(,:) +1 progenitor(,U), progenitor(U,:)9
deve ser escrita da seguinte "orma+
avV@geral(,:) +1 progenitor(,U), progenitor(U,:)9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 48/60
2D
0e"inindo elaç!es por egras
. relação irmão pode ser de"inida como+ Para todo e U,
irmão de U se ambos e U tCm um progenitor em comum e um $omem9
Em Prolog+ irmão(,U) +1 progenitor(:,), progenitor(:,U), $omem()9
ote a "orma de e%pressar Nambos e U tCm um
progenitor em comum+ .lgum : deve ser o progenitor de e este mesmo : deve ser oprogenitor de U
Sma "orma alternativa, mas menos elegante seria+ :< progenitor de e :& progenitor de U e :< igual a :&
:
progenitor progenitor
irmão U$omem
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 49/60
2=
0e"inindo elaç!es por egras
Podemos perguntar a Prolog+ ?- irmão(esaú,jacó). yes
Portanto, poder;amos concluir Hue a relação irmão, comode"inida, "unciona corretamente
Entretanto $á uma "al$a em nosso programa Hue revelada se perguntamos Nuem o irmão de LacóR ?- irmão(X,jacó).
Prolog "ornecerá duas respostas X = esaú ;
X = jacó .ssim, Lacó irmão dele mesmoR Provavelmente isso
não era bem o Hue t;n$amos em mente Huando de"inimosa relação irmão
Entretanto, de acordo com nossa de"inição sobre irmãos,
a resposta de Prolog per"eitamente lógica
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 50/60
3G
0e"inindo elaç!es por egras
ossa regra sobre irmãos não menciona Hue e U não devem ser amesma pessoa se deve ser irmão de U
*omo isso não "oi de"inido, Prolog (corretamente) assume Hue e Upodem ser a mesma pessoa e como conseHXCncia encontra Hue todo$omem Hue tem um progenitor irmão de si próprio
Para corrigir a regra sobre irmãos, devemos adicionar a restrição Hue
e U devem ser di"erentes Feremos nas pró%imas aulas como isso pode ser e"etuado de
diversas maneiras, mas para o momento, vamos assumir Hue arelação diferente á con$ecida de Prolog e Hue di"erente(,U) satis"eita se e somente se e U não são iguais
Isso nos leva à seguinte regra sobre irmãos+
irmão(,U) +1 progenitor(:,), progenitor(:,U), $omem(), di"erente(,U)9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 51/60
3<
Pontos Importantes
Programas Prolog podem ser estendidos simplesmentepela adição de novas cláusulas
*láusulas Prolog são de trCs tipos+ fatos, regras e perguntas Fatos declaram coisas Hue são sempre (incondicionalmente)
verdadeiras Regras declaram coisas Hue são verdadeiras dependendo de
determinadas condiç!es .travs de perguntas, o usuário pode Huestionar o programa
sobre Huais coisas são verdadeiras *láusulas Prolog consistem em uma cabeça e o corpoK o
corpo uma lista de condiç!es separadas por v;rgulas(Hue signi"icam conunç!es)
Jatos são cláusulas Hue tCm uma cabeça e o corpo vazioKperguntas tCm apenas o corpoK regras tCm uma cabeça eum corpo (não vazio)
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 52/60
3&
Pontos Importantes
0urante a computação, uma variável pode ser substitu;dapor um obeto+ dizemos Hue a variável está instanciada
.s variáveis são universalmente Huanti"icadas e são lidascomo NPara todo
Todavia, leituras alternativas são poss;veis para variáveisHue aparecem apenas no corpo
Por e%emplo+ tem"il$os() +1 progenitor(,U)9
Pode ser lida de duas "ormas+ Para todo e U,
se um progenitor de U então tem "il$os Para todo ,
tem "il$os seexiste algum U tal Hue um progenitor de U
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 53/60
3-
E%erc;cios
Traduza para Prolog+ Todo mundo Hue tem"il$o "eliz (de"ina a relação unária feli! )
0e"ina as relaç!es irmã e irmão_geral
0e"ina a relação neto_geral usando arelação progenitor
0e"ina a relação tio"X#Y$ em termos das
relaç!es progenitor e irmão
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 54/60
32
egras ecursivas
Famos adicionar a relação ancestral
Esta relação será de"inida por duas regras+a primeira será o caso base (não recursivo)
e a segunda será o caso recursivo Para todo e :,
um ancestral de : se
um progenitor de :9 ancestral(,:) +1
progenitor(,:)9
progenitor ancestral
:
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 55/60
33
egras ecursivas
progenitor
progenitor
ancestralU
:
progenitor
:
U<
U&
ancestralprogenitor
progenitor
progenitor
ancestral
U-
:
U<
U&
progenitor
progenitor
progenitor
ancestral(,:) +1 progenitor(,U),
progenitor(U,:)9 ancestral(,:) +1 progenitor(,U<),
progenitor(U<,U&),
progenitor(U&,:)9
ancestral(,:) +1 progenitor(,U<),
progenitor(U<,U&),
progenitor(U&,U-),
progenitor(U-,:)9
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 56/60
34
egras ecursivas
Para todo e :, um ancestral de : se$á algum U tal Hue
um progenitor de U eU um ancestral de :9
ancestral(,:) +1
progenitor(,U), ancestral(U,:)9
progenitor
ancestral
:
U
...ancestral
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 57/60
3B
egras ecursivas
ancestral(,:) +1 \ caso base progenitor(,:)9
ancestral(,:) +1 \ caso recursivo progenitor(,U),
ancestral(U,:)9 Podemos perguntar+ Huais os descendentes de
6araR ?- ancestral(sara,X). X = isaque;
X = esaú;
X = jacó;
X = jos"
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 58/60
3D
Programa da Jam;lia 8;blica
progenitor(sara,isaque).progenitor(abraão,isaque).progenitor(abraão,ismael).progenitor(isaque,esaú).progenitor(isaque,jacó).progenitor(jacó,josé).
mul!er(sara).!omem(abraão).!omem(isaque).!omem(ismael).!omem(esaú).
!omem(jacó).!omem(josé).
il!o$geral(Y,X) &'progenitor(X,Y).
mãe(X,Y) &' progenitor(X,Y), mul!er(X).av$geral(X,) &'
progenitor(X,Y), progenitor(Y,).irmão(X,Y) &'progenitor(,X),
progenitor(,Y), !omem(X).
ancestral(X,) &' progenitor(X,).ancestral(X,) &' progenitor(X,Y), ancestral(Y,).
E ; i
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 59/60
3=
E%erc;cio
Fimos a seguinte de"inição darelação ancestral ancestral(,:) +1
progenitor(,:)9 ancestral(,:) +1
progenitor(,U),
ancestral(U,:)9 *onsidere a seguinte de"iniçãoalternativa+ ancestral(,:) +1
progenitor(,:)9 ancestral(,:) +1
progenitor(U,:),
ancestral(,U)9 Esta uma de"inição correta de
ancestraisR W poss;vel modi"icar o
diagrama de "orma acorresponder a esta nova
de"iniçãoR
progenitor
ancestral
:
U
...ancestral
7/21/2019 Prolog - Introducao
http://slidepdf.com/reader/full/prolog-introducao 60/60
6lides baseados nos livros+
8rat]o, I9K
Prolog Programming for Artificial Intelligence,
-rd Edition, Pearson Education, &GG<9
*loc]sin, ^9J9K #ellis$, *969K
Programming in Prolog ,
3t$ Edition, 6pringer1Ferlag, &GG-9
#aterial baseado em slides de
Los .ugusto 8aranaus]as
S6P1ibeirão Preto