Escolar Documentos
Profissional Documentos
Cultura Documentos
Conceitos Bsicos
Turma A
Prof. Marcelo Ladeira
CIC/UnB
Slides adaptados a partir de slides obtidos na Internet e de slides criados pelo Prof. Wagner
Teixeira da Silva
constantes
inteiros
reais
tomos
no so variveis
podem ser vistos como strings constantes
variveis
termos compostos
Atomos
::==
.:.
[]
Tom x_>:
Nmeros
*.= @#$
nil
tomos especiais
x_25
anna
reais:
3.14
inteiros: 23
-0.57
5753
1.23
-42
1.23^4
X_25_chica X
Barao Fred
simples underscore
haschild(X) :- parent(X,_).
comportamento
igual ou diferente ?
likes(mary,_), likes(_,mary).
likes(mary,X), likes(X,mary).
Por qu?
no uma funo
Exemplo
17
data
novembro
2012
Clusulas Prolog
fatos
regras
arquivo texto
Prompt interpretador
consultas
BC modificada via
assert (insere fato ou regra)
retract(elimina fato ou regra)
Construes Bsicas
Fatos Universais
Varivel
% fato
% regra
% fato
% regra
Usando o Prolog
Invocar o Prolog
Sair do Prolog:
^Z
halt. (retorna ao chamador)
% fonte ou objeto
% fonte
% carrega via teclado. Fim ^Z
% recarrega arquivo
Usando o Prolog
Capacidade
10
Fato
<functor> (t1,t2,...,tn).
Predicado expressa uma relao entre termos.
Aridade
11
Regra
cabea
meta
12
:- corpo.
Consulta
Meio de Recuperar Informaes em Prolog
Exemplo:
pai(joao,mane).
pai(joao, ze).
pai(joao, quim).
pai(mane,maria).
pai(ze, zefa).
pai(ze, ruth).
irmas(A,B) :- pai(P,A),
pai(P,B), A\==B.
avo(A,N) :- pai(P,N), pai(A,P).
tio(T,S) :- pai(P,S), irmas(P,T).
13
?- pai(P,zefa).
P = ze
?- irmas(quim,A).
A = mane ;
A = ze ;
false.
?- tio(T,zefa).
T = mane ;
T = quim ;
false.
?- avo(A,N).
A = joao , N = maria ;
A = joao , N = zefa ;
A = joao , N = ruth ;
false.
Consulta
Meio de Recuperar Informaes em Prolog
14
% existe um X + 3 = 8?
% existe um P pai de joao?
%Quem so os netos de joo?
% Quem o tio av de Maria?
Predicados Bidirecionais
Exemplo:
pai(joao,mane).
pai(joao, ze).
pai(joao, quim).
pai(mane,maria).
pai(ze, zefa).
pai(ze, ruth).
irmas(A,B) :- pai(P,A),
pai(P,B), A\==B.
avo(A,N) :- pai(P,N), pai(A,P).
tio(T,S) :- pai(P,S), irmas(P,T).
15
?- pai(P,zefa).
P = ze
?- pai(ze, F)
F = zefa ;
F=ruth;
false.
?- tio(T,zefa).
T = mane ;
T = quim ;
false.
?- avo(A,N).
A = joao , N = maria ;
A = joao , N = zefa ;
A = joao , N = ruth ;
false.
Predicados Bidirecionais
concat([],Ys,Ys).
% fato
concat([X|Xs],Ys,[X|Zs]) :- concat(Xs,Ys,Zs).
?- concat([1,2,3,4], [a,b,c,d], Rs).
Rs = [1,2,3,4,a,b,c,d]
16
Xs = [1,2,3,4] ;
false.
% regra
Relaes
membro(X,[X|Xs]).
membro(X,[Y|Xs]) :- membro(X,Xs).
?- membro(4, [1,2,3,4,5,6]).
true.
?- membro(x, [1,2,3,4,5,6]).
false.
?- membro(X, [1,2,3,4,5,6]).
X=1;
X=2;
X=3;
X=4;
X=5;
X=6;
false.
17
% fato
% regra
Predicado Unidirecional
fat(0,1):-!.
fat(1,1):-!.
fat(N,F) :- N1 is N - 1, fat(N1,F1), F is N * F1.
?- fat(0,F).
F=1
?- fat(5,F).
F = 120
?- fat(5,120).
true.
?- fat(5,100).
false.
?- fat(N,120).
ERROR: is/2: Arguments are not sufficiently instantiated
18
Predicado Unidirecional
fib(N,F) :- fibx(N,1,1,F), !.
fibx(0,A,_,A).
fibx(N,A,B,F) :- N1 is N - 1, AB is A + B, fibx(N1,B,AB,F).
?- fib(0,F).
F=1
?- fib(1,1).
true.
?- fib(10,F).
F = 89
?- fib(20,F).
F = 10946
?- fib(100,F).
F = 573147844013817084101.
?- fib(N,1).
N=0
?- fib(N,89).
19
20
Termo
21
Termo
No-Varivel
<constante>
<nmero>
22
Aritmtica em Prolog
Exemplos
X is 1+2.
X = 3.
X is ceiling( 2.1 ).
X = 3.
X is ceiling( -2.1).
X = -2.
23
Operadores Aritmticos
Nome/aridade
abs / 1
+/2
acos / 1
asin / 1
atan / 1
/\ / 2
\ /1
<< / 2
\/ / 2
>> / 2
ceiling / 1
cos / 1
cosh / 1
24
Explicao
valor absoluto (ISO)
adio (ISO)
arco cosseno
arco seno
arco tangente (ISO)
and bit a bit (ISO)
bit complement (ISO)
shift bit a bit para a esquerda (ISO)
or bit a bit (ISO)
shift bit a bit para a direita (ISO)
menor inteiro no menor que (ISO)
cosseno (ISO)
cosseno hiperblico
Operadores Aritmticos
Nome/aridade
e/0
exp / 1
** / 2
float / 1
/ /2
index / 3
// / 2
random / 1
floor / 1
length / 1
25
Explicao
nmero 2.71828. . .
e**exp (ISO)
exponenciao (ISO)
converso para float (ISO)
diviso (ISO)
localiza substring em string
diviso inteira (ISO)
gera nmero aleatrio inteiro
maior inteiro no maior que
comprimento da string
Operadores Aritmticos
Name/arity
log / 1
log10 / 1
mod / 2
*/2
pi / 0
rem / 2
round / 1
sign / 1
-/1
sin / 1
sinh / 1
sqrt / 1
26
Explanation
logaritmo neperiano (ISO)
logaritmo decimal
mdulo de diviso inteira (ISO)
multiplicao (ISO)
nmero 3.14159. . .
resto de diviso inteira (ISO)
inteiro mais prximo (ISO)
retorna -1, 0 ou +1 (ISO)
inverte o sinal (ISO)
seno (ISO)
seno hiperblico
raiz quadrada (ISO)
Operadores Aritmticos
Name/arity
-/2
tan / 1
tanh / 1
truncate / 1
27
Explanation
subtrao (ISO)
tangente
tangente hiperblica
parte inteira de um real (ISO)
Operadores Aritmticos
Operadores
Operator / arity
</2
>/2
=< / 2
>= / 2
=\= / 2
=:= / 2
28
Explanation
menor do que (ISO)
maior do que (ISO)
menor ou igual a (ISO)
maior ou igual (ISO)
diferente (ISO)
igual (ISO)
Avaliador de Expresses
X is E
X varivel no ligada. E expresso aritmtica.
E1 op E2
X = 2.
Y = 5.
R=3
?- X = 2, Y = 5, Y - X =\= X.
X = 2.
Y=5
?- X = 2, Y = 5, Y - X < Y, write(ok),nl.
ok
X = 2.
Y=5
29
Avaliador de Expresses
Exemplo
?- raizes.
quer achar as raizes de a*x*x+b*x+c ?(s/n)
Informe coef a > 1.
Informe coef b > 1.
Informe coef c > -12.
x1 = 3
x2 = 4
30
Avaliador de Expresses
Exemplo
31
tomo
32
tomo
<tomo-apostrofado> ::=
'qualquer seqncia de caracteres'
Exemplo: 'Avo'
'123' 'alo mundo' 'a'
Um caracter em si um tomo, exemplo: 'x'
33
tomo
<tomo especial> ::= ! | []
Tais
34
Termo Composto
<termo-composto>
35
::= <lista> |
<estrutura>
Lista
Exemplos:
[t1, t2, t3, ..., tn]
[ ] representa a lista vazia
[t1, t2, t3, ..., ti | Xs] representa uma lista com os primeiros i
termos, e os demais esto representados pela cauda Xs
(varivel).
[X|Xs] representa uma lista com pelo menos 1 termo
[X|Xs] = [1,2,3], com X= 1 e Xs = [2,3]
[X,Y|Xs] = [1,2,3,4], com X=1, Y=2, e Xs =[3,4]
36
Lista
Predicados
take(0,_,[]).
take(_,[],[]).
take(N,[X|Xs],[X|Ys]) :- N>0, N1 is N - 1,
take(N1,Xs,Ys).
?- take(3,[a,b,c,d,e], Rs).
Rs = [a,b,c] ;
false.
37
Lista
drop(0,Xs,Xs).
drop(_,[],[]).
drop(N,[X|Xs],Ys) :- N>0, N1 is N - 1,
drop(N1,Xs,Ys).
?- drop(3,[a,b,c,d,e], Rs).
Rs = [d,e] ;
false.
38
Estrutura
Exemplo:
39
Operadores
module(if,[se/1, entao/2, senao/2]).
:- op(800,xfx,entao).
:- op(750,fx, se).
:- op(810,xfx,senao).
se X :- X.
X entao Y :- X, Y.
X senao _ :- X,!.
_ senao Z :- Z.
X = 12, se X=10.
false.
% implicao
X=12,
Y=1.
40
X=10.
% ou
Operadores
?- X = 12, se X=10 entao Y=1.
false.
41
Operadores
Especifier
fx
fy
xfx
xfy
yfx
xf
yf
42
Class
prefix
prefix
infix
infix
infix
postfix
postfix
Associatively
non-associative
right-associative
non-associative
right-associative
left-associative
non-associative
left-associative
Operadores
43
Priority
1200
1200
1100
1050
1000
900
700
700
700
500
400
200
200
200
Specifier
xfx
fx
xfy
xfy
xfy
fy
xfx
xfx
xfx
yfx
yfx
xfx
xfy
fy
Operator(s)
::;
->
,
\+
=, \=
==, \==, @<, @=<, @>, @>=
is, =:=, =\=, <, =<, >, >=
+, -, /\, \/
*, /, //, rem, mod, <<, >>
**
^
-, \
Operadores
Priority
1000
900
700
600
200
44
Specifier Operator(s)
xfy
fy
xfx
yfx
fy
|
not
is_string
&
+
com varivel
X=Y
X
X \= Y
retorna
sempre false.
?- X \= Y.
false.
45
em dados estruturados, h
unificao se as estruturas forem isomrficas
e se houver uma substituio sobre as
variveis que torne as estruturas idnticas.
?- X = arco(a,b,10).
X = arco(a,b,10)
46
?- [X1,X2,c,d] = [a,b,c,d].
X1 = a , X2 = b
?- [[X|Xs],Y,c,d] = [[1,2,3],a,c,d].
X = 1 , Xs = [2,3] , Y = a
?- [[X,2,3],Y,b,c] = [[1|Xs],a,Z1,Z2].
X = 1 , Y = a , Xs = [2,3] , Z1 = b , Z2 = c
47
Unificando Constantes
T1 = T2
Unificam se tiverem valores idnticos e forem
estruturalmente isomrficos.
?- 10 = 10.
true.
?- arco(a,b,10) = arco(a,b,10).
true.
?- 'wagner' = wagner.
true.
48
os operadores
==/2 (idnticos), \==/2 ,
@>=/2, @>/2 , @</2, @=</2
Tipo
Comparao
49
variveis
nmeros
tomos
endereos
valor numrico
valor ASCII
os operadores
==/2 (idnticos), \== ,
@>=/2, @>/2 , @</2, @=</2
50
Segue a ordem
variveis < flutuantes < inteiros
< tomos < strings < listas < termos-compostos
Se os termos so do mesmo tipo, ento uma
comparao de tipo feita.
51
52
Base de Conhecimentos
livro(autor('Fernando A.'), titulo('Orientacao a Objetos')).
livro(autor('Pedro Rezende'), titulo('Criptografia em Redes')).
livro(autor('Luiz Frota'), titulo('Seguranca em BD')).
livro(autor('Marcelo Ladeira'), titulo('Redes Bayesianas')).
livro(autor('Fernando A.'), titulo('Redes de Computadores')).
livro(autor('Maria Emilia'), titulo('Genoma Humano')).
livro(autor('Wagner Teixeira'), titulo('Funcoes de Crenca')).
livro(autor('Aluizio Arcela'), titulo('Computacao Sonica')).
livro(autor('Homero Picolo'), titulo('Computacao Grafica')).
livro(autor('Maria de Fatima'), titulo('IA na Educacao')).
livro(autor('Marco Aurelio'), titulo('IA na Educacao de Adultos')).
livro(autor('Li Weigang'), titulo('Redes Neurais e o Tempo')).
livro(autor('Francisco Cartaxo'), titulo('Especificacoes Formais')).
artigo(autor('Fernando A.'), titulo('quem usa Orientacao a Objetos')).
artigo(autor(Wagner Teixeira'), titulo('soma ortogonal')).
artigo(autor('Antonio Nuno'), titulo('filtro Grafico')).
53
54
(retrocesso)
?- artigo(autor(X),_).
X = 'Fernando A.' ;
X = Wagner Teixeira' ;
X = 'Antonio Nuno'
55
Incluindo Clusulas na BC
asserta(clausula).
Inclui uma clusula na BC, no incio das clusulas
com mesmo nome.
?- dynamic(pai/2).
?- asserta(pai(joao, maria)).
true.
?- listing(pai/2).
:- dynamic(pai/2).
pai( joao, maria ).
true.
56
Incluindo Clusulas na BC
assertz(clusula)
?- listing(irmao/2).
:- dynamic irmao/2.
irmao(A, C) :pai(B, A),
pai(B, C),
A\==C.
true.
57
Univ
Operador
% relembre pai(joao,maria)!
P = pai(joao,maria) , X = maria
58
Unificao
Exemplo
t1= concat([1,2,3],[4,5],Rs),
t2= concat([X|XS],Ys,[X|Zs]),
t = concat([1,2,3],[4,5],[1|Zs]).
onde
1= (Rs/[1|Zs]),
59
Unificao
Unificador
um unificador de dois termos t e t1 uma
substituio que torna t t1/ (t e t1 ficam
idnticos).
Regras da unificao
a) variveis unificam com variveis
X = Y.
Continua ...
60
Unificao
Regras da unificao
d) Um termo no-atmico unifica com outro se houver
correspondncia estrutural.
livro(autor(Sn,N),titulo(Clarissa)) =livro(autor(Verissimo,Erico), T).
com = (Sn/Verissimo, N/Erico, T/titulo(Clarissa) )
Execuo
?- livro(autor(Sn,N),titulo('Clarissa')) =
livro(autor('Verissimo','Erico'), T).
Sn = 'Verissimo' ,
N = 'Erico' ,
T = titulo('Clarissa')
61
BC P
62
(BC P)
(BC P)
(BC P)
(BC P) False
(BC P) False
Resoluo
A B , B C
a)
A C
b) Seja os literais pi , q, r e si,
onde o unificador (pj/q), ento
r : - p1, ..., pj, ...pm
q : - s1, ..., sn
r : - p1, ..., pj - 1, pj 1,..., pm
63
Resoluo
Duas
Tautologia
64
65
?- presa(X).
67
Controle do Programa
Controla
68
69
a) ++([],Ys,Ys).
++([X|Xs],Ys,[X|Zs]) :- ++(Xs,Ys,Zs).
b) ++([X|Xs],Ys,[X|Zs]) :- ++(Xs,Ys,Zs).
++([],Ys,Ys).
X e Xs forem constantes.
no caso de serem variveis o desempenho pior.
70
As = [] ,
Bs = [1,2,3] ;
As = [1] ,
Bs = [2,3] ;
As = [1,2] ,
Bs = [3] ;
As = [1,2,3] ,
Bs = [] ;
71
false.
As = [1,2,3] ,
Bs = [] ;
As = [1,2] ,
Bs = [3] ;
As = [1] ,
Bs = [2,3] ;
As = [] ,
Bs = [1,2,3]
rvore de Refutao
1. ++([X|Xs],Ys,[X|Zs]) :- ++(Xs,Ys,Zs).
2. ++([],Ys,Ys).
X/2, Zs/[3],
Xs1/[2|Xs2]
Ys1/Ys2
X/3, Zs/[],
Xs2/[3|Xs3]
Ys2/Ys3
1
[] \= [X/Zs]
72
falha
Xs1/[],
Ys1/Ys=[2,3]
Xs2/[],
Ys2/Ys=[3]
Xs3/[],
Ys3/Ys=[]
As=[1,2,3],
Bs=[]
As/[],
Bs/Ys=[1,2,3]
As=[1],
Bs=[2,3]
As=[1,2],
Bs=[3]
9
As=[],
Bs=[1,2,3]
:- ++(Xs2,Ys2, [3])
7
6
:- ++(As,Bs, [1,2,3])
:- ++(Xs1,Ys1, [2,3])
:- ++(Xs3,Ys3,[])
X/1, Zs/[2,3],
As/[1|Xs1]
Bs/Ys1
73
:- irmao(P,T), pai(P,S).
Retrocesso (backtracking)
Meta
74
Retrocesso
simNao(Msg) :- nl, write(Msg), repeat,
write(' (s/n) '), get_char(N), nl,
member(N,"SsNn"), !,
member(N,"Ss").
(s/n)
n
false.
75
(virgula) - conjuno.
76
ifthen (P,Q) :- P, !, Q.
% falha sob retrocesso
ifthen(P,Q) :- !.
ifthenelse(P,Q,R) :- P, !, Q. % falha sob retrocesso
ifthenelse(P,Q,R) :- not(P), !, R.
case([C1 -> P1,
C2 -> P2,
....
Cn -> Pn|P]).
77
(s/n)
n
false.
78
% Se P ento Q.
79
repeat - fail
O
Exemplos:
% cidades e vizinhos.
cidades :- repeat, nl, write(' cidade (ultima = fim) >'),
read(X), assertz(cidade(X)), X= fim, !.
vizinhos :- repeat, cidade(X),
( X = fim, !;
nl, write('Informe os vizinhos de '),
write(X), read(Ys), assertz(vizinhos(X,Ys))), fail.
80
Resultado da execuo
?- cidades.
cidade
go.
cidade
bsb.
cidade
bh.
cidade
fim.
true.
?- vizinhos.
Informe os vizinhos de go|
[bsb,cuiaba, bh].
Informe os vizinhos de bh
[bsb, go].
true.
81
Situao no db
|
?- listing([vizinhos/2,
cidade/1]).
/* vizinhos/2 */
vizinhos( go, [bsb,cuiaba,bh] ).
vizinhos( bsb, [go,bh] ).
vizinhos( bh, [bsb,go] ).
/* cidade/1 */
cidade( go ).
cidade( bsb ).
cidade( bh ).
cidade( fim ).
true.
82
83
Cut - fail
elegivel(X) :- analfabeto(X), !, fail.
elegivel(X) :- cidadao(X),idade(X,Y), Y >= 18.
cidadao(joao).
?- elegivel(joao).
cidadao(susana).
false. % busca mnima, cut ok
cidadao(roberta).
?- elegivel(ricardo).
cidadao(ricardo).
true. % busca mnima, cut ok
cidadao(marcelo).
?- elegivel(X).
idade(joao, 36).
false. % como? Nesse caso devo tirar o ! ?
idade(susana, 15).
?- elegivel(X). % tirando o cut
idade(roberta, 31).
X = joao ; % como? Ele analfabeto!
idade(ricardo, 22).
X = roberta ;
idade(marcelo, 17).
X = ricardo ;
analfabeto(joao).
false.
84
Cut - fail
elegivel(X) :- cidadao(X),
analfabeto(X), fail.
elegivel(X) :- cidadao(X),
not( analfabeto(X)),
idade(X,Y), Y >= 18.
cidadao(joao).
cidadao(susana).
cidadao(roberta).
cidadao(ricardo).
cidadao(marcelo).
idade(joao, 36).
idade(susana, 15).
idade(roberta, 31).
idade(ricardo, 22).
idade(marcelo, 17).
analfabeto(joao).
85
?- elegivel(X).
X = roberta ;
X = ricardo ;
false.
?- elegivel(joao).
false.
?- elegivel(roberta).
true.
?- elegivel(marcelo).
false.
?- elegivel(susana).
false.
Obs.: nem sempre o cut a melhor
soluo.
Cut - fail
a(1) :- write('um'), nl.
a(X) :- d(X),
write('dois'), nl.
a(3) :- write('tres'), nl.
d('2a').
d('2b').
?- a(N).
um
N=1;
dois
N = '2a' ;
dois
N = '2b' ;
tres
N=3
?-
86
1
N/1
2
3
N/X
:- write(treis), nl
N/3
2
:- write(um), nl
3
4
X/2a
:- d(X), !, write(dois), nl
5
X/2b
87
Desvantagens
88
89
?- idade(joao, Y), !.
Y = 36
Obs.: dado que cada pessoa s tem
uma idade, o corte desejvel
?- idade(X,Y),!, Y > 18.
X = joao ,
Y = 36
obs.: Neste ltimo caso, quer-se mais de uma
resposta, para diferentes valores de X,
contudo, o cut impediu.
Corte na submeta
temRG(X) :- homem(X),
idade(X,Y),!,Y>18.
mulher(susana).
mulher(roberta).
homem(joao).
homem(ricardo).
homem(marcelo).
idade(joao, 36).
idade(susana, 15).
idade(roberta, 31).
idade(ricardo, 22).
idade(marcelo, 17).
90
?- temRG(X).
X = joao
?Obs.: reduz-se o espao de busca, mas
no atende o que se pretende.
91
?- temRG(X).
X = joao ;
X = ricardo ;
false.
obs.: agora OK, mas..
?- idade(X,Y).
X = joao ,
Y = 36
?Obs.: o corte no predicado idade/2
no permite mltiplas respostas.
92
?- temRG(X).
X = joao ;
X = ricardo ;
false.
?- idade(X,Y).
X = joao ,
Y = 36 ;
X = susana ,
Y = 15 ;
X = roberta ,
Y = 31 ;
X = ricardo ,
Y = 22 ;
X = marcelo ,
Y = 17
?-
93