Prolog_5
-
Upload
martin-spyyd-pridal -
Category
Documents
-
view
212 -
download
0
description
Transcript of Prolog_5
-
Prolog Aula #5 H
ugo
Pir
es
@ U
niv
ers
idad
e
Lus
fon
a d
o P
ort
o
1
-
Matching
Dois termo T1 e T2 unificam se existir uma substituio que os torne literalmente iguais
T1 == T2
Dois tomos ou nmeros s unificam se forem exactamente iguais.
Dois termos compostos unificam se os seus functores principais forem iguais (nome e aridade) e se os argumentos respectivos unificam.
Uma varivel unifica com qualquer termo se for instanciada com esse termo.
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
2
-
Matching
Exemplo:
Os termos data( D, M, 1983) e data( D1, maio, Y) unificam atravs da seguinte instanciao que os torna idnticos
D=D1
M=maio
Y=1983 Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
3
-
Matching
Exemplo:
Os termos data( D, M, 1983) e data( D1, maio, 1944) no unificam porque o tomo 1983 diferente de 1944
A unificao em Prolog sempre realizada utilizando a instanciao mais generalista
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
4
-
Matching
Em Prolog podemos testar a unificao com o operador =
Exemplos: ?- data(1,D) = data(Y,293).
D = 293,
Y = 1.
?- data(1,D) = data(Y,D).
Y = 1.
?- data(1,D) = data(Y,293,1).
false.
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
5
-
Matching
A unificao comea por testar o nome dos functores e como estes unificam prossegue para os argumentos, tendo unificar cada par.
Consideremos agora um outro exemplo:
?- triangulo(ponto(1,1), A, ponto(2,3)) = triangulo(X, ponto(4,Y), ponto(2,Z)) . H
ugo
Pir
es
@ U
niv
ers
idad
e L
us
fon
a d
o P
ort
o
6
-
Matching
?- triangulo(ponto(1,1), A, ponto(2,3)) = triangulo(X, ponto(4,Y), ponto(2,Z)) .
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
7
triangulo
ponto
1 1
A ponto
2 3
triangulo
X ponto
4 Y
ponto
2 Z
-
Matching
So verificadas as seguintes condies mais simples
triangulo = triangulo
ponto(1,1) = X
A = ponto(4,Y)
ponto(2,3) = ponto(2,Z)
A unificam sucede pois todas as unificaes mais simples sucedem. A instanciao resultante :
X=ponto(1,1)
A=ponto(4,Y)
Z=3
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
8
-
Aritmtica
Se colocarmos ao Prolog a questo
?- X = 1 + 2.
Obtemos a resposta
X=1 + 2
e no X = 3.
Para forar o Prolog a efectuar uma operao aritmtica temos de utilizar o operador is
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
19
-
Aritmtica
Como o operador is fora o clculo da expresso direita obrigatrio que todas as variveis dessa expresso estejam instanciadas
questo
?-X is 1 + 2.
J obtemos a resposta
X=3
Operadores vlidos: +, -, *, /
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
20
-
Aritmtica
Os seguintes operadores aritmticos pr-definidos comparam os valores das expresses numricas
=:= =\= < > =< >=
Operadores para a comparao sintctica de termos
X == Y (o termo X literalmente igual a Y)
X \== Y (o termo X no literalmente igual a Y)
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
21
-
Acumuladores
O operador is permite a utilizao de variveis como acumuladores de valores durante um processo recursivo
Consideremos o exemplo do somatrio dos elementos de uma lista
soma(Lista, R)
Lista uma varivel de entrada (instanciada) e R a varivel de sada que ser instanciada com o resultado aps efetuado o processo de prova
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
23
-
Acumuladores
Consideremos 2 casos:
Se a lista vazia o somatrio dos seus elementos igual a 0
Se a lista no vazia o somatrio dos seus elementos igual a valor da cabea acrescido do somatrios dos elementos da cauda
Em prolog
soma([],0).
soma([H|T],R):-
soma(T,S), R is H + S.
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
24
-
Acumuladores
O que acontece se trocarmos a ordem das expresses na segunda regra?
Erro! S no est instanciado no momento da operao aritmtica!
Todas as operaes aritmticas ou de comparao tem de ser realizadas sobre variveis previamente instanciadas!
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
25
-
Acumuladores
Consideremos agora o exemplo do clculo do nmero de elementos de uma lista
comprimento(Lista, N)
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
26
-
Acumuladores
Consideremos 2 casos:
Se a lista vazia tem o comprimento 0
Se a lista no vazia o seu comprimento igual ao comprimento da cauda acrescido de 1
Em prolog
comprimento([],0).
comprimento([_|T],N):-
comprimento(T,Nt), N is Nt + 1.
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
27
-
Acumuladores
O que acontece se trocarmos a ordem das expresses na segunda regra?
Novamente: Erro! Nt no est instanciado no momento da operao aritmtica!
Consideremos a seguinte implementao do predicado
comprimento1([],0).
comprimento1([_|T],N+1):-comprimento1(T,N).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
28
-
Acumuladores
O resultado apresentado como uma operao aritmtica e no como o resultado dessa operao
Como poderamos produzir esse resultado?
Ao colocarmos a questo nos seguintes termos ?-comprimento1([a,b,c],N),Res is N.
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
29
-
Exerccios
Implementar os predicados
Mximo dos elementos de uma lista.
Inverso de uma lista
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
30