Documente Academic
Documente Profesional
Documente Cultură
1/170
Inteligncia Computacional
Fundamentos de Prolog e ECLi P S e (Joinville, 14 de outubro de 2009) Claudio Cesar de S Departamento de Cincia da Computao Bloco F - 2o. Piso - F-209 - Sala 13 Joinville - SC email: claudio@joinville.udesc.br
Back Close
Sumrio
1 2 3 4 5 6 7 8 Introduo Proposta destes Slides Requisitos 7 8 10 11 12 13 14 21
Back Close 2/170
Index of Distribution
Implementaes e Ambientes Caractersticas Resolvendo um Problema Explicando o Fluxo da Mquina Prologuiana
Um Predicado Composto
22 25 console 27 28 29 31 37 39 40 41 60
Back Close 3/170
10 Implementando em
ECLiP S e ECLiP S e
11 Ambiente de Programao:
12 Ambiente de Programao: TKECLi P S e 13 Um Outro Exemplo: Os Trs Msicos 14 Apresentao do Prolog 15 Quanto ao Eclipse 16 Ambiente Grco de Programao: TKECLi P S e 17 O Tracer para Auto-aprendizagem 18 Sintaxe do Prolog 19 Resumindo Via Exemplo
20 Exerccios de Warmup 21 Semntica Operacional 22 Recursividade 23 Iterao Clssica 24 Recurso Ilustrada 25 Recurso Ilustrada 2 26 Quase Tudo So Flores 27 Um Outro Clssico: Os Ancestrais 28 Seu Processamento 29 Functores 30 Denies dos Functores
63 66 71 72 73 74 75 82 85 95 96
Back Close 4/170
31 Listas 32 Resumindo o Fluxo do Clculo Recursivo 33 O Fluxo Operacional das Listas Anlogo 34 Uma Lista Genrica 35 A Sintaxe das Listas 36 Denies sobre Listas 37 Listas: Uma Auto-Denio 38 Problemas de Buscas em IA 39 Reusando o Conhecimento de Listas e Functores 40 Resolvendo com Busca em Profundidade 41 Resolvendo com Busca em Largura
102 103 104 105 106 107 112 135 139 140 143
Back Close 5/170
45 Gerando Programas Executveis (ou quase com o SWIProlog) 46 Operaes Especiais 47 Programando com Elegncia 48 Sites Interessantes 49 Alguns Bons Livros 50 Sugestes 154 161 165 167 169 170
Back Close
Introduo
Histrico
7/170
A linguagem Prolog: As bases na lgica clssica Incio da dcada de 70 sua primeira implementao Foi evoluindo, e continua at hoje ativo. Os fundamentos da LPO (Lgica de Primeira Ordem), seguindo para uma notao em clusulas (forma clausal), e numa notao restrita em clusulas de Horn. Depois tem mais, ...
Back Close
udesc.br/~coca/cursos/ic/pgms_em_prolog/
Please, react me
9/170
Back Close
Requisitos
Novamente: apenas fazendo/praticando o verdadeiro aprendizado ocorre. Escutar e ver, trazem apenas lembranas. Assim, tenha em mos um dos dois programas instalados. Prolog sugerido: http://www.swi-prolog.org/, v na aba de download. Quanto ao ECLi P S e : http://www.eclipse-clp.org ou http: //87.230.22.228/, mais especicamente http://www.eclipse-clp.org/Distribution/, escolha uma verso e a plataforma (linux, sun, mac, ..., windows) que lhe convier.
10/170
Back Close
Index of Distribution
11/170
Index of /Distribution/6.0_96 22-Jul-2009 07:26 Icon [DIR] [ ] [DIR] [DIR] [DIR] [DIR] [DIR] Name RPMS/ This is ECLiPSe 6.0#96 common/ i386_linux/ i386_nt/ sparc_sunos5/ src/
Implementaes e Ambientes
H vrios Prolog disponveis na WEB, um dos mais utilizados o SWI-Prolog http://www.swi-prolog.org/, Multiplataforma: Windows (95, 98 ou NT), Linux ( Unix-like), Mac. Tem-se Prolog bem-pagos e gratuitos; Interfaces grcas ou texto; E o ECLi P S e , objeto de investigao da segunda parte deste curso.
12/170
Back Close
Caractersticas
Um programa em Prolog rompe com o conceito de sequencialidade e uxo de programas, a exemplo de outras linguagens tradicionais de programao.
13/170
Back Close
Resolvendo um Problema
Esse exemplo instigante e contm todos conceitos iniciais do Prolog, acompanhe com ateno a discusso em sala de aula. A proposta resolver de imediato um problema interessante, antes de entrar nos detalhes da linguagem.
Fui h uma festa e apresentado h trs casais. Os maridos tinham prosses e esposas distintas. Aps alguns
14/170
goles
me
confundi quem era casado com quem, e as prosses. Apenas lembro de alguns fatos, ento me ajude descobrir quem so estes casais, com base nos seguintes dados:
1. 2. 3. 4.
O mdico casado com a Maria; O Paulo advogado; Patrcia no casada com Paulo; Carlos no mdico.
Problemas de Lgica)
Back Close
Modelagem
Os demais nomes de nossos personagens so (sim, estavam faltando mesmo no enunciado): 1. H = { carlos (c) , luiz (l) , paulo (p) } 2. M = { maria, lucia, patricia } 3. P = { advogado (a), medico (m), engenheiro (e) } Em resumo, um tupla-3 do tipo (H,M,P)
15/170
(H3,M3,P3))
/ Os demais nomes de nosso personagens sao : H = { carlos ( c ) , l u i z ( l ) , paulo (p) } M = { maria , lucia , p a t r i c i a } P = { advogado (a ) , medico (m) , engenheiro ( e ) }
Back Close
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
Modelagem : (H,M,P) logo ((H1,M1, P1) , (H2,M2, P2) , (H3,M3, P3)) / / aqui comeca o codigo /
p r o f ( advogado ) . p r o f ( medico ) . prof ( engenheiro ) . esposa ( p a t r i c i a ) . esposa ( l u c i a ) . e s p o s a ( maria ) . x : deduz (X, Y, Z ) , (X) , , (Y) , , (Z) , deduz ( ( c a r l o s , M1, P1 ) , ( l u i s , M2, P2 ) , ( paulo , M3, advogado ) ) : e s p o s a (M1) , e s p o s a (M2) , e s p o s a (M3) , p r o f ( P1 ) , p r o f ( P2 ) , M3 \== p a t r i c i a , P1 \== medico , P1 \== advogado , P2 \== advogado , P1 \== P2 , M1 \== M2, M1 \== M3, M2 \== M3.
16/170
write
nl write
nl write
nl .
Back Close
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
/ A r e s t r i c a o a) nao f o i atendida : %% O medico eh casado com a Maria logo o programa acima deve s o f r e r uma modificacao : basta r e l e r as hipoteses e voce vai concluir que o programa se reduz a : /
y : deduz2 (X, Y, Z ) ,
17/170
deduz2 ( ( c a r l o s , M1, P1 ) , ( l u i s , maria , medico ) , ( paulo , M3, advogado ) ) : e s p o s a (M1) , e s p o s a (M3) , p r o f ( P1 ) , M3 \== p a t r i c i a , P1 \== medico , P1 \== advogado .
/ ? [ ' casais . pl ' ] . % casais . pl compiled 0.00 sec , 0 bytes Yes ? x . carlos , patricia , engenheiro luis , lucia , medico paulo , maria , advogado
Back Close
63 64 65 66 67 68 69 70 71
Yes ? y . carlos , patricia , engenheiro luis , maria , medico paulo , lucia , advogado Yes ? /
Listing 1: 3 casais e prosses dos maridos Ao longo deste texto, este exemplo ser detalhado, bem como o estudante vai estar apto em resolv-lo de outras maneiras.
18/170
Back Close
Exerccios
1. Execute este programa no Tkeclipse explorando Tracer. Utilize a opo Creep para avanar passo-a-passo. 2. Assegure o entendimento do Tracer pois vai favorecer a sua autoaprendizagem. 3. No SWI-Prolog, Execute este programa ativando o trace grco, guitracer; e analise porque alguns resultados foram duplicados. Ou seja:
19/170
?- guitracer. ....
4. Faa as seguintes experimentaes na console do interpretador: (a) ?- prof(X). (b) ?- esposa(Y). (c) ?- prof(X) , X = medico. 5. Altere e/ou inclua algumas regras, am de restringir a quantidade de respostas.
Back Close
Avance ao exerccio seguinte, caso tenhas entendido a Mquina Prolog, deduzir tais respostas. Caso tenhas dvida, habilite o trace (?- trace, ...) no prexo das questes acima.
20/170
Back Close
? p(X).
p(b)
p(c)
....
Um Predicado Composto
22/170
p(X,Y,Z)
r(X) a c s(Y) 1 4
2 t(Z) d
r (a ). r (b ) . r(c ). s (1). s (2). t (d ) . t(e ). p (X, Y, Z ) : r (X) , s (Y) , t (Z ) . s a i d a : p (X, Y, Z ) , format ( 'X : ~w \ t Y : ~ w \ t Z : ~ w ' , [ X, Y, Z ] ) . / ? s a i d a . X: a Y: 1 Z: d true ; X: a Y: 1 Z: e ...................... X: c Y: 2 Z: d true ; X: c Y: 2 Z: e true . /
23/170
Observaes:
sala de aula.
Nestes dois slides se encontram vrias pginas de texto. Muita calma nesta hora com as guras 8 e 9. Como exerccio explique o que dizem estas guras, bem como a numerao indicada nas echas. Feito? Agora avance!
24/170
Back Close
Implementando em
ECLiP S e
25/170
O exemplo dos trs casais em ECLi P S e (ao interessado apenas em Prolog, salte este exemplo):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ : l i b ( i c _ s y m b o l i c ) . / : l i b ( i c ) . p r o f ( 1 , medico ) . p r o f ( 3 , advogado ) . prof (2 , engenheiro ) . m( 1 , p a t r i c i a ) . m( 2 , l u c i a ) . m( 3 , maria ) . x : deduz ( ( c a r l o s , M1, P1 ) , ( l u i s , M2, P2 ) , ( paulo , M3, advogado ) ) , m(M1, E1 ) , m(M2, E2 ) , m(M3, E3 ) , p r o f ( P1 , P1_out ) , p r o f ( P2 , P2_out ) , w r i t e l n ( " A saida e dada por : " ) , w r i t e l n ( ( c a r l o s , E1 , P1_out ) ) , w r i t e l n ( ( l u i s , E2 , P2_out ) ) , w r i t e l n ( ( paulo , E3 , advogado ) ) . deduz ( ( c a r l o s , M1, P1 ) , ( l u i s , M2, P2 ) , ( paulo , M3, advogado ) ) :
Back Close
20 21 22 23 24 25 26 27
26/170
Back Close
ECLiP S e
con27/170
Back Close
iP S e
28/170
violoncelo e piano. Contudo, no se sabe quem toca o qu. Sabe-se que o Antnio no o pianista. Mas o pianista ensaia sozinho Tera. O Joo ensaia com o Violoncelista s Quintas. Quem toca o qu ?
i n s t r u m e n t o ( harpa ) . instrumento ( v i o l o n c e l o ) . instrumento ( piano ) . dia ( 3 ) . dia ( 5 ) . m u s i co s ( m( joao , X1 , 5 ) , m( a n t o n i o , X2 , D2 ) , m( x i c o , X3 , D3) ) : i n s t r u m e n t o (X1 ) , i n s t r u m e n t o (X2 ) , i n s t r u m e n t o (X3 ) ,
Back Close
13 14 15 16 17 18
(X2 \== p i a n o ) , (X1 \== X2 , X3 \== X2 , X1 \== X3 ) , d i a (D3 ) , d i a (D2 ) , ( ( D2 == 3 , D3 == 5 ) ; ( D2 == 5 , D3 == 3 ) ) , (X1 \== v i o l o n c e l o , X3 == p i a n o , D3 == 3 ) .
30/170
consult
Este exemplo ser melhorado ....... e como o anterior refeito com recursos da PLR.
Back Close
Apresentao do Prolog
Prolog uma linguagem de programao implementada sobre um paradigma lgico (Lgica de 1a . Ordem (LPO)). Logo, a con31/170
cepo da linguagem apresenta uma terminologia prpria, mas fundamentada sobre a LPO. com um mtodo de prova sistemtico e completo, chamado de SLD. Detalhes: Logic, Programming and Prolog, de Ulf Nilsson e Jan Maluszyns, editado pela by John Wiley & Sons, 2000.
Back Close
Caractersticas
Manipula smbolos (objetos) por natureza, logo 7 + 13 tem vrias conotaes; Um tomo, literal ou um objeto dado por: `a', 77, "aa", '7' , "777". . . Seu princpio inferencial o backward chaining (encadeamento regressivo), ou seja, para encontrar algum smbolo como verdade, devemos demonstrar que suas premissas eram tambm verdadeiras; Apresenta um propsito geral como Linguagem de Programao, bem como tem interface com linguagens como Delphi, C, Visual Basic, e outras; Portabilidade entre plataformas para o Prolog padro. Logo, Prolog uma linguagem livre; Fcil aprendizado; reas de aplicaes: problemas de IA, provadores de teoremas,
Back Close 32/170
Back Close
Mquina Prologuiana
Uma arquitetura clssica para essa linguagem de programao, encontra-se na gura 14. Sua fundamentao terica encontra-se no processo de raciocnio tpico do backward chaining. A operacionalidade anlogo a esse esquema de raciocnio.
Conhecimento Embutido (ULA de predicados) Base de Conhecimenbto (programa usuario)
34/170
Prologuiana
Back Close
Alm do Prolog ou do Eclipse instalado, necessrio ter um editor de texto padro ASCII. Aquele de sua preferncia. Qualquer um desde que apresente o nmero das linhas no texto. Caso a escolha seja um Prolog com interface grca tipo XPCE (http://www.swi-prolog.org/), o qual funciona muito bem sob o Linux, tal editor acionado pelo comando:
?- edit(le('nome do pgm.pl')).
35/170
O ambiente do SWI-Prolog inicialmente interpretado, e apresenta um prompt default ao ser executado: ?Veja os exemplos iniciais:
Back Close
No ?- 3 > 2. Yes
Para carregar um programa usurio, previamente editado e salvo no padro ASCII, para ser usado no SWI-Prolog, ento:
36/170
?- consult('c:/temp/teste.pl'). /* ou */ ?- ['c:/temp/teste.pl']. % teste.pl compiled 0.00 sec, 560 bytes Yes ?- homem( X ). /* X maisculo */ X = joao Yes ?- homem( x ). /* x minsculo */ No
As letras maisculas so as variveis da linguagem Prolog, isto , aceitam qualquer objeto.
Back Close
Quanto ao Eclipse
Como todo ambiente com algum requinte de interfaces, exige acertos iniciais para dar produtividade. O Eclipse tem no modo console, mas aconselho o modo com janelas, mais confortvel para quem est comeando. Ento vamos l: Veja a janela grca inicial. H apenas File, Query, e Tools. Apenas as duas abas iniciais nos interessam de momento. V a File e acerte suas preferncias como Editor, cores, fontes, etc. Em seguida acerte o seu diretrio de trabalho. Algo como meus_programas\ Ou selecione um arquivo novo para digitares, ou carregue um arquivo para execuo na opo Compile File. Veja na janela de Output. Se nenhum erro, estamos indo bem.
Back Close 37/170
38/170
Back Close
iP S e
39/170
Sintaxe do Prolog
A sintaxe Prologuiana construda a partir de formulaes com os predicados lgicos o conceito de
predicado
41/170
reete o
esprito
do Prolog.
Inclua um cdigo exemplo aqui.... As construes (linhas de cdigo em Prolog) seguem uma sintaxe de trs tipos, que podem ser identicada novamente no programa inicial.
1o. tipo:
goals
?- >(3,2). ?Yes
/* ou ?-
3 > 2.
Ou seja,
3 maior qu
Back Close
2o. tipo:
so os fatos ... algo sempre verdadeiro ou verdades dicionais, encontrados na base de conhecimento.
incon-
42/170
so as regras . . . que aproximadamente so verdades ou teoremas condicionais, isto : necessitam de uma prova lgica!
?- listing(mortal). mortal(A) :- homem(A). /* obs. o smbolo :- o implica ao contrrio /* homem --> mortal leia-se ... para demonstrar que algum X mortal, preciso demonstrar e provar que A um homem */ Yes
<- */
Back Close
Resumindo o Prolog
fatos, ques-
43/170
Back Close
Detalhando a Sintaxe
H alguns detalhes de como se montam esses predicados prologuianos, os mais trabalhosos so os das regras. Essa Receita de Bolo segue abaixo:
44/170
OBRIGATORI-
(ponto); .
irmo/2, pai/2 e \ == /2, so predicados binrios (i. . aridade igual a dois); A vrgula (,) o and lgico; O or lgico o ponto-e-vrgula ( ;) ; O :- o pescoo da regra; O ponto no nal . o p da regra;
Back Close
Logo a regra possui uma cabea, que o predicado irmo/2; O corpo composto pelos predicados: pai/2 e \ == /2.
45/170
Nomes que comeam por letras minsculas so smbolos no Pro O escopo a validade da instncia de uma varivel na regra; As variveis possuem o seu escopo apenas dentro de suas regras;
Back Close
Outros Conceitos
Eventualmente vais encontrar os termos abaixo em livros de lgica, de Prolog, do Eclipse, de IC, etc:
1. Aridade: Nmero de argumentos do predicado. Leia-se que capital(paris, frana) um predicado de aridade dois; 2.
Matching:
46/170
Ao processar uma busca na Memria de Trabalho (MT), a mquina inferncia do Prolog realiza vericaes do incio do programa para o nal. Encontrando um predicado de mesmo nome, em seguida verica a sua aridade. Se nome e aridade casarem, o matching foi bem sucedido;
3. Instncia: Quando uma varivel de uma regra for substituda por um objeto, esse dito ser uma instncia temporria regra; 4. Unicao: Quando uma regra for satisfeita por um conjunto de objetos, se encontra um instncia bem sucedida para regra inteira. Neste caso, as variveis foram unicados pelos objetos, resultando em uma regra verdade e demonstrvel. Em resumo, uma instncia que foi bem sucedida;
Back Close
5.
Backtracking:
Esse conceito particular ao Prolog, e o diferencia das demais linguagens convencionais de computador. Basicamente, e no completamente, o conceito de backtracking o mesmo da Engenharia de Software. Ou seja, na falha de uma soluo proposta, o programa deve retroceder e recuperar pontos e/ou estados anteriores j visitados, visando novas exploraes a partir destes. Como exemplo ilustrativo, imaginemos uma estrutura em rvore qualquer, e em que um dos ns terminais (folhas) exista uma ou mais sadas. Qual a heurstica de encontrar uma das sadas ou o n desejado? Vrias abordagens podem ser feitas, algumas discutidas neste livro. O Prolog usa uma busca em profundidade (depth-rst), cujo retrocesso ocorre ao n mais recente, cuja visita foi bem sucedida. Esses ns referem aos predicados que formam um corpo da rvore corrente de busca. Logo, vrias rvores so construdas, cada vez que uma nova regra disparada. Mas o controle dessas rvores e seu objetivo corrente, implementado como uma estrutura de pilha, em que ns no solucionados so empilhados.
47/170
Back Close
Os conceitos acima, fazem parte de uma tentativa de descrever o funcionamento aa Mquina Prologuiana da gura 18, via um uxograma, e este mostrado: Avalie e verique a interpretao desse esquema da pilha abstrata de questes que o Prolog faz, representado na gura 18. Esta gura efetivamente atende as queries do Prolog?
48/170
Back Close
Exceto o Visual Prolog (http://www.visual-prolog.com/), todos os demais Prolog so basicamente idnticos. Atualmente deve existir ter uns dez (10) fabricantes de Prolog comerciais e um outro tanto oriundos da academia. Todos oferecem algo gratuito como chamariz ao seu sistema. Logo, ao leitor sinta-se livre em experimentar outros ambientes do Prolog. Quanto ao SWI-Prolog, as suas caractersticas so: velocidade, portabilidade (interoperacionabilidade), padro, robustez, facilidades de uso, interface com vrias outras linguagens de programao, free-source, etc. Os passos bsicos para se usar o SWI-Prolog em seu ambiente interpretado so: 1. Editar o programa. Use o
com numerao de linhas;
edit
49/170
Back Close
pl
+ <Enter>
51/170 Welcome to SWI-Prolog (Version 3.2.3) Copyright (c) 1993-1998 University of Amsterdam. All rights r For help, use ?- help(Topic). or ?- apropos(Word). Yes ?-
Idem ao
do Claudio.
eclipse.
?- halt.
Para carregar um programa na Memria de Trabalho (MT) (Working Memory-WM,
ou
Back Close
Yes ?ou ?- load_files('nomes','opcoes'). /* para conferir se est na ``{\em Working ?- ensure_loaded(rosa). Yes ?-
Memory}'' */
52/170
?- abolish(cor/1). Yes ?- listing(cor/1). [WARNING: No predicates for `cor/1'] No ? Para executar uma regra:
Back Close
numero maior que 10 Yes ? Para bisbilhotar o help, bem como inferir novas caractersticas do
Prolog:
53/170
?- help(nome_do_predicado). ou ?- apropos(padro_desejado). ou ?- explain(nome_do_predicado). ?- apropos(setenv). setenv/2 Set shell environment variable unsetenv/1 Delete shell environment variable Yes ? As imperfeies:
dicado e o incio dos argumentos, no caso o (...) . no pode existir espao entre o nome do pre-
Este erro
Back Close
bastante comum entre os iniciantes do Prolog. Vejamos o exemplo abaixo no predicado >:
?> (9, 5). [WARNING: Syntax error: Operator expected > (9, 5 ** here ** ) . ] ?- >(9, 5). Yes ? Para entrar no mdulo de depurao ou debugger:
54/170
Back Close
na console:
55/170
===> <abort.> sai do debug/trace ou da pendencia... ou <Crtl C> + <a> de abort ou ?- abort. Execution Aborted Typing an 'h' gets us: ---a: abort b: break c: continue e: exit g: goals t: trace h (?): help Action (h for help) ? ---`What does this mean?`, that's my first question. 'e' exits the program immediately 'a' aborts whatever you've type so far 'c' continues where you left off 'h' gets us the 'Action' help menu, again So what does 'g', 't' and 'b' do?
Back Close
I don't know yet, but I suspect: 'g' lists possible goals ===> os pendentes 't' traces the program, a debugging tool 'b' breaks the current script (whatever your working on) and give a new shell.
No esquea que:
56/170
?- trace, t. e ?- spy(t), t.
so equivalentes !
Back Close
Outros Detalhes
Correes automticas:
?- patos(X,Y). Correct to: `pratos(X, Y)'? yes X = alho Y = peixe ; /* ; ^ */ /* ; para forar uma nova resposta manualmente */ X = cebola Y = peixe ; X = tomate Y = peixe ; No ?57/170
Back Close
Back Close
59/170
Figura 8: Fluxo
Aproximado
de Inferncias em Prolog
Back Close
60/170
x(7). x(5). x(3). par ( Xpar ) : x (N1 ) , x (N2 ) , N1 =\= N2 , Xpar (N1+N2 ) , (N1) , ( ' .... ' ) , (N2) , ( ' .... ' ) , ( Xpar ) , , .
is
write write
? par (N ) .
Back Close
61/170
Back Close
62/170
Back Close
Exerccios de Warmup
1. Construa a rvore geneolgica de sua famlia, tendo as relaes (predicados): filho e pai; 2. A partir do programa anterior, construa as relaes: irmo, av, tio, bisav, etc. Num prximo assunto, o conceito de ancestral generaliza estes conceitos de pai, av, bisav, etc; 3. Quais dos predicados abaixo casam, e se a unicao ocorrer, quais so os resutados? Escreva os seus signicados, tomando por base os conceitos de termos ou tomos, matching (casamento), e unicao:
1 2 3 4 5 6 7
63/170
? ? ? ? ? ? ?
Back Close
8 9 10 11 12 13 14 15 16 17
? ? ? ? ? ? ? ? ? ?
X = 1+2. a (X, Y) = a ( 1 , X ) . a (X, 2 ) = a ( 1 , X ) . 1+2 = 3 X + 2 = 3 Y. X+Y = 1+2. 1+Y = X + 3 . p a i (X, adao ) = p a i ( a b e l , Y ) . X+Y = 1+5 , Z = X. X+Y = 1+5 , X=Y.
64/170
b(1). b(2). d(3). d(4). c(5). c(6). a(W) :- b(X), c(Y), W is (X+Y), fail. a(W) :- c(X), d(Y), W is (X+Y).
Encontre os valores para a(Y) e explique como foi o esquema de
Back Close
backtraking ?
65/170
Back Close
Semntica Operacional
Mais um resumo sobre a operacionalidade dos predicados. Estas guras so difceis de serem encontradas, mas revelam a essncia do Prolog
66/170
Retirado de http:
//grack.com/downloads/school/enel553/report/prolog.html
Ainda da gura 21, temos:
call:
o caminho de entrada do predicado, o qual chamado em sua primeira vez, para aquela instncia. uma soluo encontrada, sua porta de sada para um retorno com Yes. a porta de entrada para o backtracking (caso ocorra uma falha neste predicado, este ser exaustivamente inspecionado em todas as suas possibilidades de solues). a porta de sada no caso de no existirem mais nenhuma alternativa a ser pesquisada. Retorno com o No.
67/170
exit:
redo:
fail:
Back Close
Predicados de E/S
68/170
Figura 11: Um uxo operacional de um predicado de E/S - sem redo Exemplo: o predicado write/1
Back Close
69/170
fail
Um uxo completo
70/170
Figura 13: Um uxo operacional completo Faa uma reexo e veja se est tudo claro ....
Back Close
Recursividade
A recursividade em Prolog a sua prpria denio em lgica. Apesar da inecincia de solues recursivas, esta uma das elegncias do Prolog. Os exemplos se auto-descrevem. A exemplo das demais linguagens de programao, uma funo recursiva aquela que busca em si prprio a soluo para uma nova instncia, at que esta encontre uma instncia conhecida e retorne um valor desejado. Algumas ilustraes:
71/170
Back Close
Iterao Clssica
72/170
Back Close
Recurso Ilustrada
73/170
Recurso Ilustrada 2
74/170
Exemplo:
S (n) = 1 + 2 + 3 + 4 + ..... + (n 1) + n
Este problema pode ser reformulado sob uma viso matemtica, mais especicamente, pela induo nita como:
76/170
S (n) =
1 para n = 1 S (n 1) + n para n 2
1 + 2 + 3 + ..... + (n 1) +n S (n) = S (n 1)
Como o procedimento recursivo, necessrio encontrar a denio para a parada da recursividade. Como n no tem limite superior, para qualquer n, inicia-se pelo que se conhece:
logo: soma(N,S) ... = ... Nant = (N-1), soma(Nant, S_Nant) e S = (N + S_Nant).
#1. A soma de 1 1, logo: soma(1,1). #2. Para soma dos n-simos termos, necessrio a soma do (n 1)-simos termos,
Back Close
Notas:
A regra #1, soma(1,1)., conhecida como condio ou parada, ou ainda, regra de aterramento.
regra de
Pelo fato de que o Prolog inicia seu procedimento sequencial de cima para baixo , a condio #1 deve vir antes de #2. Em alguns casos, a regra recusirva, regra #2, vem antes da regra #1. Alguns desses exemplos so mostrados nestes slides. Quando estiveres conante com o Prolog, estas condies de parada pode vir depois da regra geral. Mas para isto, outros mecanismos de controle de uxo de programa precisam serem apresentados. de tais casos.
77/170
Back Close
s ( 1 , 1 ) : . / REGRA #1 / s (N, S ) : / REGRA #2 / N > 1, Aux (N 1) , format ( '\ n N : ~ w \ t AUX : ~ w \t PARCIAL : ~ w \ t S : ~ w ' , [ N, Aux , P a r c i a l , S ] ) , s (Aux , P a r c i a l ) , format ( '\ n == > Apos o casamento da REGRA #1: ' ) , S (N + P a r c i a l ) , format ( '\ n N : ~ w \ t AUX : ~ w \t PARCIAL : ~ w \ t S : ~ w ' , [ N, Aux , P a r c i a l , S ] ) .
true
is
78/170
is
Listing 4: Soma dos nmeros de 1 a N O procedimento recursivo tpico da movimentao da pilha intrnseca do Prolog. O quadro abaixo ilustra o exemplo de um goal do tipo:
?-s(5,X).
Back Close
79/170
Back Close
A execuo na console:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
? s ( 5 ,X ) . N: 5 AUX: 4 N: 4 AUX: 3 N: 3 AUX: 2 N: 2 AUX: 1 == > Apos o casamento N: 2 AUX: 1 == > Apos o casamento N: 3 AUX: 2 == > Apos o casamento N: 4 AUX: 3 == > Apos o casamento N: 5 AUX: 4 X = 15 PARCIAL : _G254 PARCIAL : _G269 PARCIAL : _G284 PARCIAL : _G299 REGRA #1: PARCIAL : 1 REGRA #1: PARCIAL : 3 REGRA #1: PARCIAL : 6 REGRA #1: PARCIAL : 10 S: S: S: S: S: 3 S: 6 S : 10 S : 15 _G181 _G254 _G269 _G284
80/170
da da da da
Back Close
Observaes:
O predicado format funciona apenas no Prolog; Acompanhe as explicaes em sala de aula; Nem todo conjunto de regras recursivas so passveis de admitirem tal quadro.
81/170
Back Close
Back Close
83/170
Figura 18: Uma rvore que representa os descendentes de algum Este cdigo em Prolog, agora em ingls:
1 2 3 4 5 6 7
p a r e n t ( john , p a u l ) . / p a u l i s john ' s p a r e n t / p a r e n t ( paul , tom ) . / tom i s p a u l ' s p a r e n t / p a r e n t ( tom , mary ) . / mary i s tom ' s p a r e n t / a n c e s t o r (X,Y) : p a r e n t (X,Y ) . / I f Y i s a p a r e n t o f X, then Y i s an a n c e s t o r o f X / a n c e s t o r (X,Y) : p a r e n t (X, Z ) , a n c e s t o r ( Z ,Y ) .
Back Close
8 9
/ i f Y i s an a n c e s t o r o f Z and Z i s a p a r e n t o f X, then Y i s an a n c e s t o r o f X /
84/170
Back Close
Seu Processamento
Calculando ?- ancestor(john,tom).
1 2 3 4 5 6 7 8 9 10 11
85/170
CALL a n c e s t o r ( john , tom ) . CALL p a r e n t ( john , tom ) . p a r e n t ( john , tom ) . CALL p a r e n t ( john , Z ) . TRY Z=p a u l CALL a n c e s t o r ( paul , tom ) . CALL p a r e n t ( paul , tom ) . SUCCEEDS p a r e n t ( paul , tom ) . SUCCEEDS a n c e s t o r ( paul , tom ) . SUCCEEDS with Z=p a u l SUCCEEDS a n c e s t o r ( john , tom ) .
FAIL
Back Close
: alm do uso da recursividade, este exemplo mostra o que fazer quando em aparentemente no h predicados disponveis ao que se deseja; ou seja: X <= 3 no existe, mas como opo equivalente tem-se:
86/170
Back Close
87/170
Back Close
fail :
human ( s o c r a t e s ) . % f a c t s about who i s human human ( a r i s t o t l e ) . human ( p l a t o ) . god ( z e u s ) . % and who i s a god god ( a p o l l o ) . m o r t a l (X) : human (X ) . % a l o g i c a l a s s e r t i o n that X i s mortal i f X i s Fazendo a s p e r g u n t a s : ? m o r t a l ( p l a t o ) . yes ? m o r t a l ( a p o l l o ) . no ? m o r t a l (X ) . X = s o c r a t e s >; X = a r i s t o t l e >; X = p l a t o >; no % i s Plato mortal ? % i s a p o l l o mortal ? % f o r which X i s X m o r t a l ?
88/170
%human
write
nl , nl ,
Back Close
25 26 27 28 29 30 31 32 33 34 35
mortal_report . Ento :
/ ou : :
m o r t a l _ r e p o r t : t r u e . /
89/170
Back Close
Clculo do Fatorial
: Reformulando sob uma viso matemtica, mais especicamente, pela induo nita tem-se:
F at(n) =
90/170
F at(n) =
1 2 3 ..... (n 1) n F at(n 1)
Como o procedimento recursivo, deve-se encontrar a denio para parada da recursividade. Como n no tem limite superior, para qualquer n, ento inicia-se pelo que se conhece:
#1.
O fatorial de 0 1, logo: fatorial(0,1). #2. O fatorial do n-simo termo, necessrio o fatorial do (n 1)-simo termo, logo: fatorial(N, Fat) :: Nant = (N-1), fatorial(Nant, Fat_Nant) e Fat = (N Fat_Nant).
Back Close
91/170
Back Close
O caminho do portugus
: A proposta do problema encontrar o custo entre dois vrtices quaisquer em um grafo orientado dado pela gura 28. O nome do problema dene a proposta do exerccio. Este grafo no apresenta ciclos, e nem bidirecional entre os vrtices.
25
b f
92/170
20
g
5
a
5
e
10
c
5 10
d
15
75
Figura 19: Um grafo que dene custos entres as cidades - unidirecional Para expressar a idia da rota tem-se que:
Back Close
mente; Uma rota entre X e Y uma estrada entre X e Z e e uma rota entre Z e Y.
ligado(a,b,5). ligado(c,d,10). ligado(g,f,20). ligado(b,e,5). ligado(a,c,10). ligado(d,g,15). ligado(e,f,5). ligado(b,f,25). ligado(a,g,75). ligado(d,e,5). ligado(b,f,25).
93/170
Back Close
Triangulo de Astericos
94/170
Back Close
Functores
95/170
seja a descrio de uma classe de objetos do tipo carro (ver gura 30):
carro(Nome, estilo( esporte(Portas, opcionais(L1,L2)), passeio(Portas), off_road(L3, motor(Comb, outros(Turbo, L4))) ) ).
Back Close
Carro
# nome
Estilo
Esporte
Passeio
Off-road
97/170
Motor
# portas
Opcionais
# portas
# lista (opcionais)
# comb
Outros
# turbo
# lista
A principal observao do exemplo acima a hierarquia natural e estabelecida, para representar um conhecimento. Tal representao
Back Close
conhecida por frames, que incorpora a maioria dos conceitos da programao orientada--objetos. Em resumo tem-se: 1. Construo de fatos genricos (prximo ao conceito de classes, instncias, etc.); 2. Quantidade varivel de argumentos, leva h novos predicados. H com isso um certo ganho de generalidade, pois um mesmo predicado pode ser utilizado para descrever vrios tipos de objetos, buscas sobre padres so facilitadas; 3. Legibilidade dos dados, e consequentemente o entedimento do problema; 4. Em resumo, os functores podem serem vistos como uma estruturao os dados sob formas dos REGISTROS convencionais.
Exemplo
98/170
artista("Pablo Picasso", dados(pintor(cubista), 89, espanhol)). artista("Jorge Amado", dados(escritor(contemporaneo), 86, brasileiro)).
Para vericar seu aprendizado, verique e entenda o porqu das perguntas e repostas abaixo: 1. Dentro do predicado artista h outros predicados? Resp: Errado. No so outros predicados e sim funes lgicas! 2. Quantos argumentos tem o predicado artista? Resp: 02 argumentos, um campo o `nome e o outro a funo dados ! 3. Quantos argumentos tem a funo dados? Resp: 04 e 03 argumentos para o primeiro e segundo fato respectivamente. Logo, apesar de terem o mesmo nome, elas so diferentes! 4. Quantos argumentos tem a funo pintor? Resp: 01 argumento! 5. A funo pintor equivalente a escritor? Resp: No, um objeto tem caractersticas da funo pintor e outro da escritor; 6. Quanto ao valor de retorno dessas funes lgicas?
99/170
Back Close
Resp: No existe,
Concluindo Functores
100/170
Alguns de regras e questes que podem ser encontrados a partir do exemplo acima:
/* qual o nome e os dados de cada artista ? */ ?- artista(X,Y), write(X), nl, write(Y),nl, fail. Do exemplo, deduz-se que functor ``\emph{casa}'' (``\emph{matching}'') com variveis (letras maisculas). /* quem so os cubistas?*/ ?- artista(X, dados(pintor(Y) ,_ ,_ )), Y == cubista, nl, write(X), write('=====>'), write(Y), nl, fail. /* quem tem mais de 80 anos? */ ?- artista(X,dados(_ , Y _)), Y > 80, nl, write(X), write(Y),nl, fail. /* no caso acima, nem todos resultados foram encontrados, porqu? */
Back Close
Resumindo: os functores organizam dados e visualizam regras recursivas de uma maneira mais simples e controlvel. Outro detalhe que como objetos, functores respeitam todas as regras de casamento vistas at o momento. Sem exceo !
101/170
Back Close
Listas
Pr-requisito: conceitos de recursividade e functor dominados! Seguem conceitos das LPs convencionais Essencialmente vamos computar sob uma rvore binria Ilustrando esta computao
102/170
Back Close
e recursivas ar
107/170
Uma lista uma estrutura de dados que representa uma coleo de objetos homogneos; Uma lista uma seqncia de objetos; Uma lista um tipo particular de functor1 (veja esta nota de roda-p), pois apresenta uma hierarquia interna.
Notao:
O smbolo [ usado para descrever o incio de uma lista, e ] para o nal da mesma;
Back Close
Exemplos:
[a, b, c, d ], logo um predicado cujo argumento seja algumas letras, tem-se uma lista do tipo:
108/170
Como o conceito de listas introduziram novos smbolos, isto , os seus delimitadores [. . . ], h um novo operador que separa ou dene quem a cabea da cauda da lista. Este operador o pipe, simbolizado por |, que distingue a parte da esquerda da direita da lista. Isto necessrio para se
Back Close
109/170
Back Close
Exemplos de casamentos:
os exemplos abaixo denem como ocorrem os casamentos entre variveis e listas. Portanto, preste ateno em cada exemplo, bem como teste e faa suas prprias concluses de como as listas operam.
[ a , b , c , d ] == X [ X | b , c , d ] == [ a , b , c , d ] [ a | b , c , d ] == [ a , b , c , d ] [ a , b | c , d ] == [ a , b , c , d ] [ a , b , c | d ] == [ a , b , c , d ] [ a , b , c , d | [ ] ] == [ a , b , c , d ] [ ] == X [ [ a | b , c , d ] ] == [ [ a , b , c , d ] ] [ a | b , c , [ d ] ] == [ a , b , c , [ d ] ] [ _ | b , c , [ d ] ] == [ a , b , c , [ d ] ] [ a | Y ] == [ a , b , c , d ] [ a | _ ] == [ a , b , c , d ] [ a , b | c , d ] == [ X , Y | Z ]
110/170
1 2 3 4 5 6 7 8 9 10 11 12 13
Back Close
Contra-exemplos de casamentos:
plos abaixo,
no
1 2 3 4
Enm, os tipos de casamentos de objetos de uma lista, segue o mesmo padro dos matching considerados at o momento em Prolog.
Aplicao:
Devido ao fato de listas modelarem qualquer estrutura de dados, invariavelmente, seu uso extensivo em problemas de IA, pois envolvem buscas sobre estas estruturas.
Back Close
As denies acima so recorrentes, isto , uma depende da outra. Em outras palavras, tem-se uma denio recursiva uma vez mais. Sendo assim, reescrenvendo em Prolog tal denio dada por:
dado por:
Back Close
X T a [b,c] b [c] c []
113/170
Basicamente, quase todas operaes com listas possuem regras anlogas a denio acima. O exemplo anterior serve apenas para identicar que o objeto: [a,b,c,d ], uma lista.
Back Close
Exemplos de Listas
As regras sobre listas so diversas e elegantes. Apenas exercitando que se cria a destreza necessria para resolver qualquer desao em Prolog. Alguns clssicos so mostrados nos exemplos que se seguem. H alguns que so combinados com outros criando alguns bem complexos.
Comprimento de uma lista:
114/170
O comprimento de uma lista o comprimento de sua sub-lista, mais um, sendo que o comprimento de uma lista vazia zero. Em Prolog isto dado por:
#1 compto([ ], 0). #2 compto([X | T], N):- compto(T, N1), N is N1+1. ? - compto([a, b, c, d], X). X = 4
Um mapa
de memria aproximado
dado por:
Back Close
115/170
Back Close
Em ingls este predicado2 conhecido como append, e em alguns Prolog's pode estar embutido como predicado nativo:
#1 #2
116/170
dado por:
L2 [b,d] [b,d] [b,d] [b,d]
Regra #2 #2 #2 #1
X a c e
L1 [c,e] [e] []
L3
L[X | L3]
A palavra predicado, neste contexto, reete o conjunto de regras que denem as operaes dos mesmos sobre listas.
Back Close
#1 #2 #3
divide([], [], []). % N par de objetos na lista divide([X], [], [X]). % N impar da lista L2 divide([X,Y | L3] , [X | L1], [Y | L2] ):divide( L3, L1, L2).
117/170
Obs: Estes dois ltimos predicados apresentam uma particularidade interessante. Permitem que os predicados encontrem a lista original. Exemplo:
dado por:
[X | L1]
Regra #3 #3 #2
X a c e
Y b d
[a,c] [c] []
[Y | L2]
L3 [c,d,e] [e]
Back Close
observe o uso do predicado put ao invs do write. Esta troca se deve a razo que o Prolog trata as listas no cdigo original ASCII, ou seja fred = [102,101, 114, 100].
escreve_lista( [ ] ). escreve_lista( [ Head | Tail ] ) :write( ' : ' ), put( Head ), escreve_lista( Tail ).
Como uso simplicado tem-se:
118/170
Ao nal de qualquer exemplo que use listas, temos que imprimir.... assim, h muitos exemplos
Back Close
119/170
?- member(3, X). X = [3|_G231] Yes ?- member(3, X). X = [3|_G231] ; X = [_G230, 3|_G234] ; X = [_G230, _G233, 3|_G237] .........................
120/170
Back Close
121/170
Neste exemplo, um objeto adicionado a lista sem repetio caso este j esteja contido na lista:
add_to_set(X, [ ], [X]).
Back Close
Back Close
uma lista.
1. 2. 3. 4.
123/170
Neste momento, o estudante deve ter percebido que a ordem com que as regras se encontram dispostas na Memria de Trabalho (MT) deve ser considerada. Pois o mecanismo de backtracking do Prolog, fora uma ordem nica de como estas regras so avaliadas. Sendo assim, uma disciplina de programao em Prolog se faz necessria algumas vezes! No caso das listas, as condi-
A exceo a leitura de uma lista, este predicado descrito mais adiante. A regra geral aquela que contm uma recursividade, no exemplo anterior, a regra nmero 4. As demais regras, 1 a 3, so
Back Close
regras destinadas parada da recurso. Logo, obrigatrias. Estas regras de parada, tambm so chamadas de regras ou clusulas aterradas (grounding), pois delimitam o nal da recurso. Como exerccio, determine nos exemplos anteriores quem so as regras gerais e as aterradas.
124/170
Back Close
este mtodo ingnuo (primrio) na inverso de uma lista, no sentido que faz n(n + 1)/2 chamadas recursivas a uma lista de comprimento n.
125/170
Back Close
usa como
truque
um acumu-
xinvertex(A, Z) :- reverse(A, [ ], Z). reverse( [], Z, Z). reverse( [A | X ],Acumulador, Z) :reverse(X, [A|Acumulador], Z).
126/170
Back Close
usa uma tcnica simples de ir comparando sequencialmente. Caso ocorra um erro, a substring procurada restaurada por meio de uma cpia, presente no terceiro argumento.
subs(A,B) :- sub(A,B,A). /* A lista A est contida em B ? */ sub([],_,_). sub([A|B] , [C|D] , Lcopia) :- A == C, sub( B, D, Lcopia). sub([A|_] , [C|D] , Lcopia) :- A \== C, sub(Lcopia,D, Lcopia).
Como exerccio, faa este predicado utilizando dois append.
127/170
Back Close
observe que a clusula aterrada quase sempre se encontra antes da clusula geral. Contudo, a leitura de uma lista uma das raras excees em que o aterramento vem depois da regra geral recursiva.
le_lista( Lista ) :write('Digite <Enter> ou <Escape> para terminar: '), write(' ===> '), le_aux( Lista ). le_aux( [Char | Resto ] ) :write(' '), get0(Char), testa(Char), put(Char), put(7), /* beep */ le_aux( Resto ). /* Condio da Parada */ le_aux( [ ] ) :- !. testa(13) :- !, fail. /* Return */ testa(10) :- !, fail. /* New line ===> UNIX */
128/170
Back Close
/* Escape */
Back Close
Exlcui todas ocorrncias de um termo na lista. Junto com o unio (append) este predicado tem vrias utilidades. Observe os exemplos:
del_X_all (X, [ ] , [ ] ) . del_X_all (X, [X| L ] , L1 ) : del_X_all (X, L , L1 ) . del_X_all (X, [Y| L1 ] , [Y| L2 ] ) : del_X_all (X, L1 , L2 ) .
130/170
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Back Close
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
Observe que neste ltimo exemplo o predicado del_X_all deduziu o valor do termo X excludo no predicado. Ou seja, este um dos muitos predicados que apresentam uma multi-funcionalidade.
Back Close
Permutao:
Alguns predicados so difceis em qualquer linguagem de programao. Um destes a permutao a qual til vrios problemas. O predicado exlclui_1a excluia a primeira ocorrncia de um termo na lista, enquanto o del_X_all, visto anteriormente, exclui todas ocorrncias.
/ Permutacao de e l e m e n t o s / permutar ( [ ] , [ ] ) . / Condicao de parada / permutar ( [ X| L ] , Lpermutada ): permutar (L , L1 ) , e x c l u i _ 1 a (X, Lpermutada , L1 ) . / E x c l u i X apenas em sua p r i m e i r a o c o r r e n c i a / e x c l u i _ 1 a (X, [X| L ] , L ) . e x c l u i _ 1 a (X, [Y| L ] , [Y| L1 ] ) : e x c l u i _ 1 a (X, L , L1 ) . / executando / i n i t : permutar ( [ 5 , 7 , 9 ] ,X) ,
132/170
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
nl
? i n i t . [5 , 7 , 9] [7 , 5 , 9] [7 , 9 , 5]
Back Close
20 21 22 23 24 25
[5 , 9 , 7] [9 , 5 , 7] [9 , 7 , 5] No ?
133/170
Back Close
Partico:
134/170
Back Close
Problemas de Buscas em IA
Faa muitos exerccios sobre listas e functores Combinando os functores as listas, qual a sua utilidade? Resgate o exemplo da Cruz ... xx aulas atrs Os problemas de buscas em IA, basicamente se utilizam do ncleo descrito abaixo, ou uma variao sobre o mesmo. Acompanhe a discusso com o professor, e veja o link http://www.csupomona. edu/~jrfisher/www/prolog_tutorial/. O ncleo abaixo retirei deste stio. Retrata exatamente/precisamente os problemas de buscas em geral.
135/170
Back Close
Ncleo Mgico
s o l v e (P) : start ( Start ) , s e a r c h ( S t a r t , [ S t a r t ] ,Q) , r e v e r s e (Q, P ) . s e a r c h ( S , P , P) : g o a l ( S ) , ! . s e a r c h ( S , V i s i t e d , P) : n e x t _ s t a t e ( S , Nxt ) , s a f e _ s t a t e ( Nxt ) , no_loop ( Nxt , V i s i t e d ) , s e a r c h ( Nxt , [ Nxt | V i s i t e d ] , P ) . no_loop ( Nxt , V i s i t e d ) : \+member ( Nxt , V i s i t e d ) . / done / / / / g e n e r a t e next s t a t e check s a f e t y check f o r l o o p continue searching . . .
/ / / / /
Back Close
n e x t _ s t a t e ( S , Nxt ) : < f i l l i n h e r e >. s a f e _ s t a t e ( Nxt ) : < f i l l i n h e r e >. no_loop ( Nxt , V i s i t e d ) : < f i l l i n h e r e >. / i f d i f f e r e n t from d e f a u l t c l a u s e / start ( . . . ) . goal ( . . . ) .
137/170
Logo, voce tem um cdigo quase que padro para resolver qualquer problema de buscas! Basicamente tudo que z que problemas em IA envolve esta estrutura cannina de cdigo prologuiano
Back Close
138/170
Back Close
139/170
Casa 1
Hospital 3
Farmacia 5
8 Teatro
4 6
Parque
UDESC
140/170
/ BUSCA em PROFUNDIDADE MAPA da CIDADE / i n i c i o ( S o l _ i n v e r t i d a ) : no_origem ( N o _ i n i c i a l ) , busca ( N o _ i n i c i a l , [ No_inicial ] , Solucao ) , r e v e r s e ( Solucao , S o l _ i n v e r t i d a ) , ( Sol_invertida ) , no_destino (Y) , , ( ' Onde o no de origem do mapa era : ' ) , ( 'E o no de destino do mapa era : ' ) ,
nl
write ( N o _ i n i c i a l ) , nl , write (Y ) .
i n i c i o ( ' Nao hah mais solucoes ' ): ! . / para t e r m i n a r com y e s / / / / Ns i n i c i a i s e f i n a i s do problema / no_origem ( c a s a ) . no_destino ( t e a t r o ) .
Back Close
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
/ R r e p r e s e n t a o de um MAPA QUALQUER / / MODELAGEM do Problema === > p a r t e mais d i f i c i l / a ( casa , h o s p i t a l ) . a ( casa , c l u b e ) . a ( h o s p i t a l , parque ) . a ( hospital , farmacia ) . a ( farmacia , udesc ) . a ( teatro , farmacia ) . a( fabrica , clube ) . a( fabrica , teatro ) . / para no t e r que r e e s c r e v e r que : a ( f a b r i c a , t e a t r o ) \== a ( t e a t r o , f a b r i c a ) . / conexao (X,Y) : a (X,Y ) . conexao (X,Y) : a (Y,X ) . / / % % cond . de parada . . . . o n c o r r e n t e o n d e s e j a d o = n f i n a l busca ( No_final , [ No_final | Caminho ] , [ No_final | Caminho ] ) : no_destino ( No_final ) . % % t e r m i n a a busca . . .
141/170
Back Close
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
busca ( Noh , [ Noh | Caminho ] , S o l u c a o ): conexao ( Noh , Novo_nodo ) , / proximo no = e s t a d o / ( member ( Novo_nodo , [ Noh | Caminho ] ) ) , / v e r i f i c a s e no f o i v i s i t a d o / busca ( Novo_nodo , [ Novo_nodo , Noh | Caminho ] , S o l u c a o ) .
not
/ / / ? i n i c i o (X ) . [ casa , h o s p i t a l , f a r m a c i a , t e a t r o ] Onde o no de origem do mapa e r a : c a s a E o no de d e s t i n o do mapa e r a : t e a t r o X = [ casa , h o s p i t a l , f a r m a c i a , t e a t r o ] ; [ casa , c l u b e , f a b r i c a , t e a t r o ] Onde o no de origem do mapa e r a : c a s a E o no de d e s t i n o do mapa e r a : t e a t r o X = [ casa , c l u b e , f a b r i c a , t e a t r o ] ; X = ' Nao hah mais s o l u c o e s ' ; No ? /
142/170
Back Close
143/170
/ BUSCA EM LARGURA PROBLEMA DO MAPA / / R r e p r e s e n t a o de um MAPA/GRAFO QUALQUER / / MODELAGEM do Problema === > p a r t e mais d i f i c i l / a ( casa , h o s p i t a l ) . a ( casa , c l u b e ) . a ( h o s p i t a l , parque ) . a ( hospital , farmacia ) . a ( farmacia , udesc ) . a ( teatro , farmacia ) . a( fabrica , clube ) . a( fabrica , teatro ) . / / hospital casa
clube
Back Close
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
parque
\ farmacia / \ udesc t e a t r o
\ fabrica \ teatro
144/170
/
/ para no t e r que r e e s c r e v e r que : a ( f a b r i c a , t e a t r o ) \== a ( t e a t r o , f a b r i c a ) . / conexao (X,Y) : a (X,Y ) . conexao (X,Y) : a (Y,X ) . / Ns i n i c i a i s e f i n a i s do problema / no_origem ( c a s a ) . no_destino ( parque ) . / / i n i c i o ( S o l _ i n v e r t i d a ) : ( cputime , T1 ) , no_origem ( N o _ i n i c i a l ) , busca_L ( [ [ N o _ i n i c i a l ] ] , S o l u c a o ) , / l i s t a de l i s t a / / N i n i c i a l : e n t r a na l i s t a i n i c i a l / r e v e r s e ( Solucao , S o l _ i n v e r t i d a ) , ( Sol_invertida , Total ) , no_destino (FIM ) , , format ( '\ n CAMINHO PERCORRIDO : ~ w ' , [ S o l _ i n v e r t i d a ] ) , format ( '\ n N de origem do mapa era : : ~ w ' , [ N o _ i n i c i a l ] ) ,
statistics
length
nl
Back Close
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
format ( '\ n N de destino do mapa era : ~ w ' , [ FIM ] ) , format ( '\ n Total de estados : ~d ' , T o t a l ) , Aux ( T o t a l 1) , format ( '\ n Total de movimentos : ~ w ' , Aux ) , ( cputime , T2 ) , Temp T2 T1 , format ( '\ n T1 : ~ f \ t T2 : ~ f msec ' , [ T1 , T2 ] ) , format ( '\ n Tempo total : ~10 f msec ' , Temp ) .
is statistics is
145/170
i n i c i o ( ' Nao hah mais solucoes ' ): ! . / para t e r m i n a r com y e s / / / t o d a s _ s o l u c o e s : (X, i n i c i o (X) , L ) , ( '\ n RESUMO DAS SOLUCOES : ' ) , w_L(L ) . / / % % c o n d i o de parada . . . . o n c o r r e n t e o d e s e j a d o busca_L ( [ [ No_corrente | Caminho ] |_] , [ No_corrente | Caminho ] ): no_destino ( No_final ) , member ( No_final , [ No_corrente | Caminho ] ) . % % t e r m i n a a busca . . .
findall write
/ p a r t e r e c u r s i v a g e r a l => DETALHE: LISTA DE LISTA / busca_L ( [ Nodo | Caminho ] , S o l u c a o ): e x p a n d i r ( Nodo , Expansao_do_NODO ) , / na p r i m e i r a vez Caminho = [ ] / append ( Caminho , Expansao_do_NODO , Novos_caminhos ) ,
Back Close
/ o b s e r v a r que o append e s t ao c o n t r r i o . . . . fazendo que no prximo p a s s o Nodo , s e j a um proximo d e s t e n v e l / busca_L ( Novos_caminhos , S o l u c a o ) . e x p a n d i r ( [ Nodo | Caminho ] , Novos_caminhos ) : ( [ Novo_nodo , Nodo | Caminho ] , ( conexao ( Nodo , Novo_nodo ) , ( member ( Novo_nodo , [ Nodo | Caminho ] ) ) ) , Novos_caminhos ) , ! . / u l t i m a l i n h a do f i n d a l l /
findall not
146/170
e x p a n d i r (_, [ ] ) : ! . / / w_L ( [ ] ) . w_L( [ A| Cauda ] ) : format ( '\ n == > ~ w ' , [A] ) , w_L( Cauda ) . / / / SAIDA : ? i n i c i o (X ) . CAMINHO PERCORRIDO: [ casa , h o s p i t a l , parque ] N de origem do mapa e r a : : c a s a N de d e s t i n o do mapa e r a : parque T o t a l de e s t a d o s : 3 T o t a l de movimentos : 2 T1 : 0 . 0 9 0 0 0 0 T2 : 0 . 0 9 0 0 0 0 msec
Back Close
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
Tempo t o t a l : 0 . 0 0 0 0 0 0 0 0 0 0 msec X = [ casa , h o s p i t a l , parque ] . ? t o d a s _ s o l u c o e s . CAMINHO PERCORRIDO: [ casa , h o s p i t a l , parque ] N de origem do mapa e r a : : c a s a N de d e s t i n o do mapa e r a : parque T o t a l de e s t a d o s : 3 T o t a l de movimentos : 2 T1 : 0 . 0 9 0 0 0 0 T2 : 0 . 0 9 0 0 0 0 msec Tempo t o t a l : 0 . 0 0 0 0 0 0 0 0 0 0 msec
147/170
CAMINHO PERCORRIDO: [ casa , c l u b e , f a b r i c a , t e a t r o , f a r m a c i a , h o s p i t a l , parque ] N de origem do mapa e r a : : c a s a N de d e s t i n o do mapa e r a : parque T o t a l de e s t a d o s : 7 T o t a l de movimentos : 6 T1 : 0 . 0 9 0 0 0 0 T2 : 0 . 0 9 0 0 0 0 msec Tempo t o t a l : 0 . 0 0 0 0 0 0 0 0 0 0 msec RESUMO DAS SOLUCOES : == > [ casa , h o s p i t a l , parque ] == > [ casa , c l u b e , f a b r i c a , t e a t r o , f a r m a c i a , h o s p i t a l , parque ] == > Nao hah mais s o l u c o e s true . ?
Back Close
133
Back Close
Dicas de Programao
Tenha um editor sensvel a sintaxe do Prolog. Isto ajuda muito aos iniciantes. Ao carregar o programa no interpretador, certique-se que no existam erros. Seno o cdigo com erro no carregado completamente. Evite car pensando obstinadamente sobre um predicado que est dando problema. Faa uma abordagem nova ou v andando. Respire, saia de frente do computador, oxal! Cuidado ao dar nomes de variveis. Use nomes signicativos e curtos. Cuidar nos predicados proibidos de backtraking. Exemplo o is. Veja o que fazer para contornar, por exemplo:
cor(X) :- X is random(5), X > 0, !. cor(X) :- cor(X). /* sem backtraking */
Back Close 149/170
Back Close
Predicados Mo-na-roda
Na console digite ?- help(nome_do_predicado) para detalhes, nos seguintes predicados mo-na-roda. findall, setof e bagof format var e nonvar atom e string atomic ground compound e functor integer e float callable e call
Back Close 151/170
152/170
Os detalhes de uso deles voce descobre via ?- help e apropos, manual e exemplos via Google.
Back Close
153/170
for while
Back Close
Back Close
A seguir mostrado como gerar um executvel com o SWIProlog. Considere um programa exemplo, como este:
x(1). x(5). x(3). par(PAR) :- x(N1), x(N2), N1 =\= N2, is(PAR , (N1+N2)), write(PAR), write(' .... '), write(N1), write(' .... '), write(N2), nl, fail. /*, fail. */ par( 0 ) :- true. inicio :- nl, par(_), halt. %% este halt para sair do ambiente de interpreteo %% ao final
155/170
Back Close
scripts
que se se-
156/170
ou
#!/bin/sh pl --goal=inicio -t halt --stand_alone=true -o saida.exe -c impares.pl
Detalhando: A opo goal=inicio indica o ponto de incio que o interpretador comear a processar. Neste exemplo, o predicado chama-se inicio.
A opo -t halt indica um encerramento nal do interpretador, inclusive, no processamento do executvel.
Back Close
ou [claudio@goedel pgms]$ sh comp2.script % impares.pl compiled 0.00 sec, 1,524 bytes [claudio@goedel pgms]$ ./saida.exe 6 .... 1 .... 5 4 .... 1 .... 3 6 .... 5 .... 1 8 .... 5 .... 3 4 .... 3 .... 1 8 .... 3 .... 5 [claudio@goedel pgms]$
Back Close
Estes dois scripts so equivalentes ao seguinte procedimento dentro do ambiente interpretado. Logo, este vai funcionar para outros SO's:
?- consult('impares.pl'). % impares.pl compiled 0.00 sec, 1,556 bytes Yes ?- qsave_program('nova_saida.exe', [goal=inicio, stand_alone=true, toplevel=halt]). Yes
Aqui, o predicado qsave_program gerou um executvel chamado de nova_saida.exe. Leia com ateno o help deste predicado. A interface com linguagens como C, Java e outros relativamente fcil. Contudo, neste momento ser omitido.
158/170
Back Close
Mais recentemente, o compilador do swi-prolog, o qual emula uma mquina virtual, chamado de swipl. Assim, um segundo exemplo completo de compilao dado por:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/ $ s w i p l g o a l=main t h a l t o s a i d a 2 c f a t o r i a l . p l % f a t o r i a l . pl compiled 0.00 sec , 1 ,164 bytes $ ./ saida2 6 120 5040 $ s w i p l stand_alone=t r u e g o a l=main t h a l t o s a i d a 1 c f a t o r i a l . p l % f a t o r i a l . pl compiled 0.00 sec , 1 ,164 bytes $ ./ saida1 6 120 5040 $ l s a l s a i d a rwxrwxrwx 1 r o o t r o o t 907617 S e t 1 0 0 : 2 7 s a i d a 1 rwxrwxrwx 1 r o o t r o o t 122822 S e t 1 0 0 : 2 6 s a i d a 2 / % %% s w i p l stand_alone=t r u e % % n e s t a ordem . . .
159/170
g main t h a l t o s a i d a . exe c f a t o r i a l . p l
Back Close
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
is is
160/170
/ Exemplificando : $ s w i p l stand_alone=t r u e g main t h a l t o s a i d a . exe c f a t o r i a l . p l % f a t o r i a l . pl compiled 0.00 sec , 1 ,164 bytes $ . / s a i d a . exe 6 120 5040 $ /
Operaes Especiais
Alterando a memria de trabalho em tempo de execuo. Alteraes de dados e linhas de cdigo de programa. Ou seja, isto permite que um programa que se
auto-modique
161/170
)).
Back Close
Basicamente, o que se precisa fazer para remover ou adicionar um fato ou regra MT, bastam dois passos: 1. Denir que este predicado dinmico na MT. Use o predicado: dynamic(nome_do_novo/aridade) . 2. Pronto para usar, com o
assert
162/170
ou
retract.
Back Close
Veja outros exemplos: 1. Removendo uma regra ou fato da Memria de Trabalho (MT):
?- retract(uniao([A|B], C, [A|D]) :- uniao(B, C, D)).
2. Adicionando
uma regra
ou
fato
da MT:
163/170
?- assertz(uniao(B, [A|C], [A|D]) :- uniao(B, C, D)). Correct to: `assertz( (uniao(B, [A|C], [A|D]):-uniao(B, C, D)))'? yes B = _G519 A = _G513 C = _G514 D = _G517 Yes
Enm, avalie o impacto do que representa incluir ou excluir uma regra durante a execuo de um programa. Ou seja, potencialmente se constri um programa que se auto-modica durante a sua execuo!
164/170
Back Close
Entenda
o problema que queres escrever em Prolog. Um problema mal entendido, dicilmente ser bem implementado (se que for);
profundamente
Escreva da mesma maneira que o problema montado mentalmente. Assim como se fala, se escreve em Prolog. Declare
a-passo o problema, sem se preocupar como ele calculado passo-
isto normalmente revela uma proximidade com a programao procedural. O foco do Prolog Casamento de Padres.
Back Close
Pense que dois objetos podem ser equivalentes ou diferentes, apenas isto. Logo, eles casam ou no;
alguma premissa assumida previamente, est errada. Volte atrs, e refaa tudo sob um outro enfoque. Refazer um novo programa por inteiro, normalmente mais simples do que forar um problema mal estruturado, convergir em uma soluo aceitvel;
mestres
166/170
Consulte os grandes
em Prolog. Aprender Prolog com programadores experientes uma boa dica. Alguns conhecidos no Brasil: Pedro Porfrio (porrio@unifor.br), Edilson Ferneda (ferneda@pos.ucb.br). Finalmente, a lista de discusso do SWIProlog tambm fcil encontrar muitos peritos em Prolog.
Back Close
Sites Interessantes
http://www.cbl.leeds.ac.uk/~tamsin/Prologtutorial/ http://www.sju.edu/~jhodgson/ugai/ http://www.cee.hw.ac.uk/~alison/ai3notes/ http://dobrev.com/download.html http://www.swi-prolog.org/ http://www.amzi.com (tem vrios artigos e tutoriais que ilustram o uso e aprendizado do Prolog, respectivamente. Um site fortemente recomendado, pois h um farto material gratuito, incluindo um ambiente de programao.)
167/170
Back Close
Prentice-Hall, 1997;
2nd 3rd
W.F. Clocksin and C.S. Mellish; Leon Sterling and Ehud Shapiro; Richard A. O'Keefe;
MIT Press;
Back Close
Sugestes
Sugestes de exemplos so bem-vindos Envie para: claudio@joinville.udesc.br
170/170
Back Close