Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1/157
Inteligncia Computacional
JJ
II
J
I
Back
Close
Sumrio
1
Introduo
Requisitos
10
Index of Distribution
11
Implementaes e Ambientes
12
Caractersticas
13
Resolvendo um Problema
14
21
2/157
JJ
II
J
I
Back
Close
Um Predicado Composto
10 Implementando em
22
ECLiP S e
11 Ambiente de Programao:
ECLiP S e
25
console
27
28
29
14 Apresentao do Prolog
31
15 Quanto ao Eclipse
37
39
40
18 Sintaxe do Prolog
41
60
3/157
JJ
II
J
I
Back
Close
20 Exerccios de Warmup
63
21 Semntica Operacional
66
22 Recursividade
71
23 Iterao Clssica
72
24 Recurso Ilustrada
73
25 Recurso Ilustrada 2
74
75
82
28 Seu Processamento
85
29 Functores
95
96
4/157
JJ
II
J
I
Back
Close
31 Listas
102
103
104
105
106
107
112
38 Problemas de Buscas em IA
135
39 Dicas de Programao
139
40 Predicados Mo-na-roda
141
41 Predicados Baixaria
142
5/157
JJ
II
J
I
Back
Close
143
148
6/157
152
45 Sites Interessantes
154
156
47 Sugestes
157
JJ
II
J
I
Back
Close
Introduo
Histrico
7/157
A linguagem Prolog:
JJ
II
J
I
Back
Close
8/157
Lembrar que: apenas fazendo/praticando o verdadeiro aprendizado ocorre. Escutar e ver, trazem apenas lembranas.
Assim, ao nal das partes, faas os exerccios propostos.
Estes slides foram feitos h uns 10 anos atrs e abandonados e
ainda esto com alguns erros. O abuso (exagero) das aspas o
principal deles.
Agora retomado devido o ECLi P S e e a Programao em Lgica
com Restries PLR (CLP Constraint Logic Programming) e
as pesquisas em torno da PLR.
A segunda parte deste material, tem o foco na PLR.
JJ
II
J
I
Back
Close
Please, react me
9/157
JJ
II
J
I
Back
Close
Requisitos
Novamente: apenas fazendo/praticando o verdadeiro aprendizado
ocorre. Escutar e ver, trazem apenas lembranas.
10/157
JJ
II
J
I
Back
Close
Index of Distribution
11/157
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/
JJ
II
J
I
Back
Close
Implementaes e Ambientes
X H vrios Prolog disponveis na WEB, um dos mais utilizados o
12/157
SWI-Prolog http://www.swi-prolog.org/,
JJ
II
J
I
Back
Close
Caractersticas
X Um programa em Prolog rompe com o conceito de sequencialidade
13/157
JJ
II
J
I
Back
Close
Resolvendo um Problema
X Esse exemplo instigante e contm
conceitos iniciais do
Prolog, acompanhe com ateno a discusso em sala de aula.
todos
14/157
goles
me
1.
2.
3.
4.
Problemas de Lgica)
JJ
II
J
I
Back
Close
Modelagem
15/157
(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 ) }
JJ
II
J
I
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
16/157
write
nl write
nl write
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.
nl .
JJ
II
J
I
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/157
JJ
II
J
I
Back
Close
63
64
65
66
67
68
69
70
71
Yes
? y .
carlos , patricia , engenheiro
luis , maria , medico
paulo , lucia , advogado
Yes
?
/
18/157
JJ
II
J
I
Back
Close
Exerccios
19/157
?- guitracer.
....
JJ
II
J
I
Back
Close
JJ
II
J
I
Back
Close
ana
? p(X).
p(a).
p(b).
p(c).
........
........
p(a)
p(b)
p(c)
X=b
X=c
....
? p(X).
X=a;
......
X=a
JJ
II
J
I
Back
Close
Um Predicado Composto
22/157
p(X,Y,Z)
r(a).
r(b).
r(c)
s(1).
s(2).
t(d).
t(e).
r(X)
a
s(Y)
1
t(Z)
d
? p(X,Y,Z).
X=a
Y=1
Z=d
JJ
II
J
I
Back
Close
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/157
JJ
II
J
I
Back
Close
Observaes:
sala de aula.
24/157
JJ
II
J
I
Back
Close
Implementando em
ECLiP S e
25/157
/ : 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 ) ) :
JJ
II
J
I
Back
Close
20
21
22
23
24
25
26
27
[ M1, M2,M3] : : 1 . . 3 ,
[ P1 , P2 ] : : 1 . . 2 ,
P2 #= 1 ,
M2 #= 3 ,
M3 #\= 1 ,
P1 #\= 1 ,
P1 #\= P2 ,
a l l d i f f e r e n t ( [ M1, M2,M3 ] ) .
26/157
JJ
II
J
I
Back
Close
Ambiente de Programao:
ECLiP S e
con27/157
sole
JJ
II
J
I
Back
Close
iP S e
28/157
JJ
II
J
I
Back
Close
29/157
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 ) .
7
8
m u s i c os ( m( joao , X1 , 5 ) , m( a n t o n i o , X2 , D2 ) , m( x i c o , X3 , D3) ) :
9
10
11
12
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 ) ,
JJ
II
J
I
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/157
consult
16 ?
( 'c:/ publico/musicos.txt ' ) .
% c : / p u b l i c o / m u s i c o s . t x t c o m p i l e d 0 . 0 0 s e c , 64 b y t e s
Yes
17 ? m u s i c os (X, Y, Z ) .
X = m( joao , harpa , 5 ) ,
Y = m( a n t o n i o , v i o l o n c e l o , 5 ) ,
Z = m( x i c o , piano , 3 ) ;
No
18 ?
JJ
II
J
I
Back
Close
Apresentao do Prolog
Prolog uma linguagem de programao implementada sobre
um paradigma lgico (Lgica de 1a . Ordem (LPO)). Logo, a con-
31/157
JJ
II
J
I
Back
Close
Caractersticas
32/157
JJ
II
J
I
Back
Close
JJ
II
J
I
Back
Close
Mquina Prologuiana
34/157
Base de
Conhecimenbto
(programa usuario)
Maquina
Inferencial
(raciocinio)
Memoria
de
Trabalho
Maquina
Prologuiana
Prologuiana
JJ
II
J
I
Back
Close
35/157
X
Veja os exemplos iniciais:
?- 2 > 3.
No
?- 2 == 2.
Yes
?- mae(eva, abel).
JJ
II
J
I
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/157
?- 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.
JJ
II
J
I
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:
37/157
JJ
II
J
I
Back
Close
38/157
JJ
II
J
I
Back
Close
iP S e
39/157
JJ
II
J
I
Back
Close
JJ
II
J
I
Back
Close
Sintaxe do Prolog
X A sintaxe Prologuiana construda a partir de formulaes com
41/157
os predicados lgicos
1o. tipo:
goals
pergunta:
Seja uma
?- >(3,2).
?Yes
/* ou ?-
3 > 2.
Ou seja,
JJ
II
J qu
maior
I
Back
Close
2o. tipo:
incon-
?- listing(homem).
homem(joao).
homem(jose).
homem(jedro).
Yes
42/157
3o. tipo:
?- 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
JJ
II
J
I
Back
Close
Resumindo o Prolog
fatos, ques-
43/157
JJ
II
J
I
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:
OBRIGATORI-
(ponto);
44/157
JJ
II
J
I
Back
Close
Prolog. As variveis podem receber nmeros, letras, frases, arquivos, regras, fatos, at mesmo outras variveis, mesmo sendo
desconhecidas !
45/157
underscore)
dispensa a necessidade
de ser instanciada, isto , sem restries quanto ao seu escopo;
Outros Conceitos
46/157
Matching:
JJ
II
J
I
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/157
JJ
II
J
I
Back
Close
48/157
JJ
II
J
I
Back
Close
edit
49/157
JJ
II
J
I
Back
Close
4. Validar os resultados;
5. Voltar ao passo inicial, se for o caso.
50/157
JJ
II
J
I
Back
Close
pl
+ <Enter>
51/157
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
eclipse.
do Claudio.
?- halt.
Para carregar um programa na Memria de Trabalho (MT) (Working Memory-WM,
ou
?- consult('d:/curso/udesc/autind/iia/ex1').
d:/curso/udesc/autind/iia/ex1 compiled, 0.00 sec, 52 bytes.
JJ
II
J
I
Back
Close
Yes
?ou
?- load_files('nomes','opcoes').
/* para conferir se est na ``{\em Working
?- ensure_loaded(rosa).
Yes
?-
Memory}'' */
52/157
?- abolish(cor/1).
Yes
?- listing(cor/1).
[WARNING: No predicates for `cor/1']
No
? Para executar uma regra:
?- eh_maior_que_10.
DIGITE UM NUMERO:: 30
|
. < ......... faltou o ponto . >
JJ
II
J
I
Back
Close
?- 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:
Este erro
53/157
JJ
II
J
I
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
?-
54/157
?- trace, predicado.
ou
?- debug, predicado.
ou
?- spy(predicado_em_particular).
para desativar:
?- nospy(predicado_em_particular).
JJ
II
J
I
Back
Close
e
?- notrace.
e
?- nodebug. /* ou Crtl-C para sair do modo debug */
Apavoramentos com o modo
trace
na console:
55/157
JJ
II
J
I
Back
Close
No esquea que:
56/157
?- trace, t.
e
?- spy(t), t.
so equivalentes !
JJ
II
J
I
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/157
JJ
II
J
I
Back
Close
JJ
II
J
I
Back
Close
59/157
Figura 8: Fluxo
Aproximado
de Inferncias em Prolog
JJ
II
J
I
Back
Close
60/157
x(7).
x(5).
x(3).
4
5
6
7
8
9
10
11
write
write
write
nl
fail
12
13
is
write
write
? par (N ) .
JJ
II
J
I
Back
Close
61/157
JJ
II
J
I
Back
Close
62/157
JJ
II
J
I
Back
Close
Exerccios de Warmup
1. Construa a rvore geneolgica de sua famlia, tendo as relaes
(predicados): filho e pai;
63/157
?
?
?
?
?
?
?
2 > 3.
>(2 , 3 ) .
2 == 2 .
a ( 1 , 2 ) = a (X, X ) .
a (X, 3 ) = a ( 4 , Y ) .
a ( a ( 3 , X) ) = a (Y ) .
1+2 = 3 .
JJ
II
J
I
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/157
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
JJ
II
J
I
Back
Close
backtraking ?
65/157
JJ
II
J
I
Back
Close
Semntica Operacional
Mais um resumo sobre a operacionalidade dos predicados.
66/157
JJ
II
J
I
Back
Close
Retirado de http:
//grack.com/downloads/school/enel553/report/prolog.html
Ainda da gura 21, temos:
call:
67/157
exit:
redo:
fail:
JJ
II
J
I
Back
Close
Predicados de E/S
68/157
JJ
II
J
I
Back
Close
69/157
fail
JJ
II
J
I
Back
Close
Um uxo completo
70/157
JJ
II
J
I
Back
Close
Recursividade
X A recursividade em Prolog a sua prpria denio em lgica.
71/157
X Apesar da inecincia de solues recursivas, esta uma das elegncias do Prolog. Os exemplos se auto-descrevem.
Algumas ilustraes:
JJ
II
J
I
Back
Close
Iterao Clssica
72/157
JJ
II
J
I
Back
Close
Recurso Ilustrada
73/157
JJ
II
J
I
Back
Close
Recurso Ilustrada 2
74/157
JJ
II
J
I
Back
Close
JJ
II
J
I
Back
Close
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:
S(n) =
76/157
1
para n = 1
S(n 1) + n para n > 2
1 + 2 + 3 + ..... + (n 1) +n
{z
}
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).
JJ
II
J
I
Back
Close
Notas:
regra de
77/157
JJ
II
J
I
Back
Close
true
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 ] ) .
is
78/157
is
?-s(5,X).
JJ
II
J
I
Back
Close
#2
#2
#2
#2
#1 (aterrada)
5
4
3
2
1
4
3
2
1
-
?...<10>...
?...<6>...
?...<3>...
?...<1>...
-
...<15>...
-...<10>...
-...<6>...
-...<3>...
-1
79/157
JJ
II
J
I
Back
Close
A execuo na console:
1
? s ( 5 ,X ) .
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
da
da
da
da
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:
_G181
_G254
_G269
_G284
80/157
S: 3
S: 6
S : 10
S : 15
JJ
II
J
I
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/157
JJ
II
J
I
Back
Close
82/157
ancestral(X,Y) :- pai(X,Y).
ancestral(X,Y) :- pai(X,Z), ancestral(Z,Y).
Este conhecimento em LPO dado por:
xy((pai(x, y) ancestral(x, y))
xyz((pai(x, z) ancestral(z, y) ancestral(x, y))
JJ
II
J
I
Back
Close
83/157
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 /
6
7
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 ) .
JJ
II
J
I
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/157
JJ
II
J
I
Back
Close
Seu Processamento
Calculando ?- ancestor(john,tom).
1
2
3
4
5
6
7
8
9
10
11
85/157
FAIL
JJ
II
J
I
Back
Close
86/157
X =< 3 ;
\ + (X >= 3).
menu(0).
menu(_) :repeat,
write('......'), nl,
.......................
write('......'), nl,
write(' DIGITE A OPCAO: '),
read(X),
X >= 0,
\+(X >= 3), /* isto : X =< 3 */
/* X \== 0
equivalente a: \+(X == 3 ) */
acao(X),
menu(X).
%%%%%%%%%%%%%%%%%%%%%%%%%%%
acao(0).
/* continua acoes etc */
JJ
II
J
I
Back
Close
acao(1).
acao(2).
acao(3).
87/157
JJ
II
J
I
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
88/157
8
9
10
11
12
13
14
15
16
17
18
19
20
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 ?
%human
21
22
23
24
m o r t a l _ r e p o r t :
( 'Mostre todos mortais conhecidos:' ) ,
m o r t a l (X) ,
write
nl , nl ,
JJ
II
J
I
Back
Close
25
26
27
write (X) , nl ,
fail .
mortal_report .
/ ou : :
m o r t a l _ r e p o r t : t r u e . /
28
29
30
31
32
33
34
35
Ento :
? m o r t a l _ r e p o r t .
Mostre t o d o s m o r t a i s c o n h e c i d o s :
socrates
aristotle
plato
yes
89/157
JJ
II
J
I
Back
Close
Clculo do Fatorial
F at(n) =
1
para n = 0
F at(n 1) n para n > 1
90/157
1 2 3 ..... (n 1) n
{z
}
F at(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.
JJ
II
J
I
Back
Close
X > 0,
Aux is (X - 1),
fatorial( Aux , Parcial ),
Fat is ( X
* Parcial ).
91/157
#
#
#
#
#
#
......
......
......
......
......
......
......
......
......
......
......
......
?......
?......
?......
?......
?......
?......
......
-......
-......
-......
-......
-......
JJ
II
J
I
Back
Close
: 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.
O caminho do portugus
20
25
92/157
a
e
10
5
c
10
15
75
JJ
II
J
I
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/157
rota(X,Y,C) :- ligado(X,Y,C).
rota(X,Y,C) :- ligado(X,Z,C1),
rota(Z,Y, C2),
C is (C1 + C2).
?- rota(a,g,X).
X = 75 ;
X = 35 ;
No
?-
JJ
II
J
I
Back
Close
Triangulo de Astericos
94/157
JJ
II
J
I
Back
Close
Functores
95/157
JJ
II
J
I
Back
Close
96/157
JJ
II
J
I
Back
Close
Carro
Estilo
#nome
Passeio
Esporte
#portas
Opcionais
#lista
(litens interno)
#lista
(itens externo)
#portas
Off-road
#lista
(opcionais)
97/157
Motor
#comb
#turbo
Outros
#lista
JJ
II
J
I
Back
Close
98/157
JJ
II
J
I
Back
Close
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/157
JJ
II
J
I
Back
Close
Resp: No existe,
Concluindo Functores
100/157
JJ
II
J
I
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/157
JJ
II
J
I
Back
Close
Listas
Pr-requisito: conceitos de recursividade e functor dominados!
102/157
JJ
II
J
I
Back
Close
JJ
II
J
I
Back
Close
JJ
II
J
I
Back
Close
JJ
II
J
I
Back
Close
JJ
II
J
I
Back
Close
e recursivas ar
107/157
o 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.
O smbolo [ usado para descrever o incio de uma lista,
e ] para o nal da mesma;
Notao:
JJ
II
J
I
Back
Close
Exemplos:
letras( [ a, b, c, d ] ).
^
|
|
cabea da lista
108/157
JJ
II
J
I
Back
Close
109/157
JJ
II
J
I
Back
Close
Exemplos de casamentos:
1
2
3
4
5
6
7
8
9
10
11
12
13
[ 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/157
JJ
II
J
I
Back
Close
Contra-exemplos de casamentos:
plos abaixo,
1
2
3
4
no
[ a , b | [ c , d ] ] \== [ a , b , c , d ]
[ [ a , b , c , d ] ] \== [ a , b , c , d ]
[ a , b , [ c ] , d , e ] \== [ a , b , c , d , e ]
[ [ [ a ] | b , c , d ] ] \== [ [ a , b , c , d ] ]
111/157
Aplicao:
JJ
II
J
I
Back
Close
2.
112/157
#1 _uma_lista( [ ] ).
/* 1a. premissa */
#2 _uma_lista( [X | T ] ) :- _uma_lista( T ).
?- _lista( [a,b,c] ).
yes
Um mapa
de memria aproximado
dado por:
/* 2a. */
JJ
II
J
I
Back
Close
Regra
_uma_lista([a,b,c]) #2
_uma_lista([b,c])
#2
_uma_lista([c])
#2
_uma_lista([])
#1
X T
a [b,c]
b [c]
c
[]
113/157
JJ
II
J
I
Back
Close
Exemplos de Listas
114/157
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:
JJ
II
J
I
Back
Close
Regra
compto([a,b,c,d],N) #2
compto([b,c,d],N)
#2
compto([c,d],N)
#2
compto([d],N)
#2
compto([],N)
#1
X
T
N1 N is N+1
a [b,c,d] 3 3+1=4
b [c,d] 2 - 2+1
c
[d]
1 - 1+1
d
[]
0 - 0+1
-0
115/157
JJ
II
J
I
Back
Close
#1 uniao([],X,X).
#2 uniao([X|L1],L2,[X|L3]) :- uniao( L1, L2, L3).
116/157
O ``goal'':
?- uniao([a,c,e],[b,d], W).
W=[a,c,e,b,d]
yes
Um mapa
de memria aproximado
uniao([a,c,e],[b,d],L)
uniao([c,e],[b,d],L)
uniao([e],[b,d],L)
uniao([],[b,d],L)
2
Regra
#2
#2
#2
#1
X
a
c
e
L1
[c,e]
[e]
[]
dado por:
L2
[b,d]
[b,d]
[b,d]
[b,d]
L3
L[X | L3]
[c,e,b,d] [a,c,e,b,d]
[e,b,d] - [c,e,b,d]
[b,d] - [e,b,d]
- [b,d]
A palavra predicado, neste contexto, reete o conjunto de regras que denem as operaes
dos mesmos sobre listas.
JJ
II
J
I
Back
Close
117/157
Obs: Estes dois ltimos predicados apresentam uma particularidade interessante. Permitem que os predicados encontrem a lista
original. Exemplo:
?- divide([a,b,c,d,e],L1,L2).
L1=[a,c]
L2=[b,d,e]
?- divide(L , [ a , b ], [ c , d ]).
L=[a, c, b, d]
Um mapa
de memria aproximado
divide([a,b,c,d,e],L1,L2)
divide([c,d,e],L1,L2)
divide([e],L1,L2)
Regra
#3
#3
#2
X
a
c
e
Y
b
d
dado por:
[X | L1]
[a,c]
[c]
[]
[Y | L2]
[b,d,e]
[d,e]
[e]
L3
[c,d,e]
[e]
JJ
II
J
I
Back
Close
escreve_lista( [ ] ).
escreve_lista( [ Head | Tail ] ) :write( ' : ' ),
put( Head ),
escreve_lista( Tail ).
118/157
JJ
II
J
I
Back
Close
: novamente,
em alguns Prolog's, este predicado pode estar embutido, conra.
member( H, [ H | _ ] ).
member( H, [ _ | T ] ) :- member(H, T).
119/157
?- member(3, [4,5,3]).
Yes
?- member(X, [4,5,3]).
X = 4 ;
X = 5 ;
X = 3 ;
No
JJ
II
J
I
Back
Close
?- member(3, X).
X = [3|_G231]
Yes
?- member(3, X).
120/157
X = [3|_G231] ;
X = [_G230, 3|_G234] ;
X = [_G230, _G233, 3|_G237]
.........................
JJ
II
J
I
Back
Close
121/157
add_to_set(X, [ ], [X]).
JJ
II
J
I
Back
Close
JJ
II
J
I
Back
Close
uma lista.
1.
2.
3.
4.
max(
max(
max(
max(
[] ,0) :- !.
[M] , M ) :- !.
[M , K], M ) :- M >= K , !.
[M|R] ,N ) :- max( R , K ) ,
max( [K , M] , N).
123/157
JJ
II
J
I
Back
Close
124/157
JJ
II
J
I
Back
Close
naive_reverse( [ ] , [ ] ).
naive_reverse( [ H | T ], Reversed ) :naive_reverse( T , R ),
append( R , [ H ], Reversed ).
125/157
JJ
II
J
I
Back
Close
usa como
truque
um acumu-
126/157
JJ
II
J
I
Back
Close
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).
127/157
JJ
II
J
I
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.
128/157
JJ
II
J
I
Back
Close
testa(27) :- !, fail.
testa( _ ) :- true.
/* Escape */
JJ
II
J
I
Back
Close
1
2
3
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/157
4
5
6
? del_X_all ( 3 , [ 3 , 4 , 5 , 3 , 3 , 7 , 3 ] ,X ) .
7
8
X = [4 , 5 , 7]
9
10
11
Yes
? del_X_all ( 8 , [ 3 , 4 , 5 , 3 , 3 , 7 , 3 ] ,X ) .
12
13
X = [3 , 4 , 5 , 3 , 3 , 7 , 3]
14
15
16
Yes
? del_X_all ( 3 , [ 3 ] , X ) .
17
18
X = []
19
20
21
22
Yes
? del_X_all ( 3 , [ ] , X ) .
JJ
II
J
I
Back
Close
23
X = []
24
25
26
Yes
? del_X_all (X, [ 3 , 4 ] ,Y ) .
27
28
29
X = 3
Y = [4] ;
131/157
30
31
32
X = 4
Y = [3] ;
33
34
35
X = _G189
Y = [3 , 4] ;
36
37
38
39
No
?
? del_X_all (X, [ 3 , 4 ] , [ 3 ] ) .
40
41
X = 4
42
43
Yes
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.
JJ
II
J
I
Back
Close
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.
Permutao:
132/157
1
2
3
4
5
6
/ 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 ) .
7
8
9
10
/ 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 ) .
11
12
13
/ executando /
i n i t : permutar ( [ 5 , 7 , 9 ] ,X) ,
14
15
? i n i t .
16
17
18
19
[5 , 7 , 9]
[7 , 5 , 9]
[7 , 9 , 5]
nl
JJ
II
J
I
Back
Close
20
21
22
[5 , 9 , 7]
[9 , 5 , 7]
[9 , 7 , 5]
23
24
25
No
?
133/157
JJ
II
J
I
Back
Close
Partico:
134/157
JJ
II
J
I
Back
Close
Problemas de Buscas em IA
Faa muitos exerccios sobre listas e functores
135/157
JJ
II
J
I
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 ) .
5
6
7
8
9
10
11
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 ) .
/ 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 . . .
12
13
14
no_loop ( Nxt , V i s i t e d ) :
\+member ( Nxt , V i s i t e d ) .
JJ
II
J
I
Back
Close
137/157
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
JJ
II
J
I
Back
Close
138/157
JJ
II
J
I
Back
Close
Dicas de Programao
Tenha um editor sensvel a sintaxe do Prolog. Isto ajuda muito
aos iniciantes.
139/157
/* sem backtraking */
JJ
II
J
I
Back
Close
JJ
II
J
I
Back
Close
Predicados Mo-na-roda
findall e setof
141/157
format
var e nonvar
statistics para estatsticas do sistema, tempo de cpu, etc.
......................
statistics(cputime,T1),
/* seus calculos */ .........
statistics(cputime ,T2),
Temp is T2 - T1,
format('\n T1: ~f \t T2: ~f msec', [T1, T2]),
format('\n Tempo total: ~10f msec', Temp).
trace e notrace
JJ
II
spy e nospy faz uma depurao em um predicado em particular.
J
Os detalhes de uso deles voce descobre via ?- help(nome do predicado).I
e via
google.
Back
Close
Predicados Baixaria
if then else , at tu?
142/157
for
while
JJ
II
J
I
Back
Close
143/157
JJ
II
J
I
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.
Para o ambiente Linux, construa um dos dois scripts que se seguem:
#!/bin/sh
144/157
JJ
II
J
I
Back
Close
base=~/pesquisa/livro/pgms
PL=pl
exec $PL -f none -g "load_files(['$base/impares'],[silent(true)])" \
-t inicio -- $*
ou
145/157
#!/bin/sh
pl --goal=inicio --stand_alone=true -o saida.exe -c impares.pl
JJ
II
J
I
Back
Close
....
....
....
....
....
....
1
1
5
5
3
3
....
....
....
....
....
....
5
3
1
3
1
5
146/157
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]$
JJ
II
J
I
Back
Close
?- consult('impares.pl').
% impares.pl compiled 0.00 sec, 1,556 bytes
147/157
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.
JJ
II
J
I
Back
Close
Operaes Especiais
Alterando a memria de trabalho em tempo de execuo.
148/157
auto-modique
)).
JJ
II
J
I
Back
Close
assert
ou
149/157
retract.
JJ
II
J
I
Back
Close
2. Adicionando
uma regra
ou
fato
da MT:
150/157
JJ
II
J
I
Back
Close
JJ
II
J
I
Back
Close
Entenda
152/157
Escreva da mesma maneira que o problema montado mentalmente. Assim como se fala, se escreve em Prolog. Declare
JJ
II
J
I
Back
Close
Pense que dois objetos podem ser equivalentes ou diferentes, apenas isto. Logo, eles casam ou no;
Consulte os grandes
153/157
mestres
JJ
II
J
I
Back
Close
Sites Interessantes
http://www.cbl.leeds.ac.uk/~tamsin/Prologtutorial/
154/157
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 ilus-
JJ
II
J
I
Back
Close
http://www.cse.unsw.edu.au/~billw/cs9414/notes/prolog/
intro.html
http://www.mars-attacks.org/~boklm/prolog/
155/157
JJ
II
J
I
Back
Close
Prentice-Hall, 1997;
156/157
Programming in Prolog,
2nd
3rd
MIT Press;
JJ
II
J
I
Back
Close
Sugestes
Sugestes de exemplos so bem-vindos
Envie para: claudio@joinville.udesc.br
157/157
JJ
II
J
I
Back
Close