SlideShare uma empresa Scribd logo
1 de 19
Prolog – 08
Fábio M. Pereira
Baseado em
Amzi! inc. – www.amzi.com
Aventura em Prolog 2
Aventura em Prolog
 Unificação
 Exercícios
Aventura em Prolog 3
Unificação
 Uma das características mais poderosas
de Prolog
 Unificação é o algoritmo interno de
Prolog para casamento de padrões
 Para todos os exemplos que vimos até
aqui, a unificação foi relativamente
simples
 Iremos agora examinar a unificação com
mais detalhes
Aventura em Prolog 4
O Processo de Unificação
Variável
&
Qualquer termo
A variável irá unificar com e ligar
(binding) a qualquer termo, incluindo
outra variável.
Primitivo
&
Primitivo
Dois termos primitivos (átomos ou
inteiros) unificam somente se eles
forem idênticos
Estrutura
&
Estrutura
Duas estruturas unificam se elas
possuem o mesmo funtor e aridade e
se cada par de argumentos
correspondentes unificam
Aventura em Prolog 5
Predicado Interno =/2
 Utilizado para verificar unificação:
 É bem sucedido quando os dois argumentos
unificam
 Falha se eles não unificam
 Sintaxe: arg1 = arg2 ou =(arg1, arg2)
 Aviso:
 O sinal de igualdade (=) não causa
atribuição como na maioria das linguagens,
também não causa avaliação aritmética
 Ele causa unificação em Prolog
Aventura em Prolog 6
Predicado Interno =/2
 A unificação entre os dois lados do sinal
de igualdade (=) é exatamente a
mesma unificação que ocorre quando
Prolog tenta casar objetivos com as
cabeças das cláusulas
 No backtracking, as ligações de
variáveis são desfeitas, da mesma
maneira quando Prolog faz backtracking
através de cláusulas
Aventura em Prolog 7
Forma mais simples de Unificação
 Entre duas estruturas sem variáveis
 Se elas forem idênticas, a unificação é bem
sucedida, se não, a unificação falha
?- a = a. ?- a = b.
Yes No
?- local(maçã, cozinha) = ?- local(maçã, cozinha) =
local(maçã, cozinha). local(pêra, cozinha).
Yes No
?- a(b, c(d, e(f,g))) = ?- a(b, c(d, e(f,g))) =
a(b, c(d, e(f,g))). a(b, c(d, e(g,f))).
Yes No
Aventura em Prolog 8
Unificação entre Variável e Primitivo
 Outra forma simples de unificação
 A variável assume o valor que faz com que
a unificação seja bem sucedida
?- X = a. ?- 4 = Y.
X = a Y = 4
?- local(maçã, cozinha) = local(maçã, X).
X = cozinha
Aventura em Prolog 9
Unificação entre Variável e Primitivo
 Em outros casos, múltiplas variáveis são
simultaneamente atribuídas a valores
?- local(X,Y) = local(maçã, cozinha).
X = maçã
Y = cozinha
?- local(maçã, X) = local(Y, cozinha).
X = cozinha
Y = maçã
Aventura em Prolog 10
Unificação entre Variáveis
 Uma variável também pode unificar com outra
 Cada instância de uma variável possui um
único valor interno em Prolog
 Quando duas variáveis unificam entre si,
Prolog anota que elas devem possuir o mesmo
valor
 Nos exemplos a seguir, assumimos que Prolog
usa ‘_nn’, onde ‘n’ é um dígito, para
representar variáveis não ligadas (unbound)
Aventura em Prolog 11
Unificação entre Variáveis
 Exemplos:
?- X = Y.
X = _01
Y = _01
?- local(X, cozinha) = local(Y, cozinha).
X = _01
Y = _01
Aventura em Prolog 12
Unificação entre Variáveis
 Variáveis Prolog são ligadas entre si, o
que irá se refletir se ocorrer ligação
tardia (later bound)
?- X = Y, Y = hello.
X = hello
Y = hello
?- X = Y, a(Z) = a(Y), X = hello.
X = hello
Y = hello
Z = hello
Aventura em Prolog 13
Unificação entre Variáveis
 Ilustra a principal diferença entre
unificação com variáveis Prolog e
atribuição de variáveis encontrada na
maioria das outras linguagens
 Observe cuidadosamente o comportamento
das consultas seguintes
?- X = Y, Y = 3, ?- X = Y, gosto_ruim(X),
write(X). write(Y).
3 brócolis
X = 3 X = brócolis
Y = 3 Y = brócolis
Aventura em Prolog 14
Unificação entre Estruturas
 Quando duas estruturas com variáveis
unificam, as variáveis tomam os valores
que tornam as duas estruturas idênticas
 Note que uma estrutura ligada a uma
variável pode ela mesma conter
variáveis
?- X = a(b,c). ?- a(b,X) = a(b, c(d,e)).
X = a(b,c) X = c(d,e)
?- a(b,X) = a(b, c(Y,e)).
X = c(_01, e)
Y = _01
Aventura em Prolog 15
Unificação entre Estruturas
 Mesmo em exemplos mais complexos, os
relacionamentos entre variáveis são
lembrados e atualizados assim que uma nova
ligação à variável ocorrer
?- a(b,X) = a(b, c(Y,e)), Y=hello.
X = c(hello, e)
Y = hello
?- alimento(X,Y) = Z, write(Z), nl, gosto_ruim(X),
comestivel(Y), write(Z).
alimento(_01, _02)
alimento(brócolis, maçã)
X = brócolis
Y = maçã
Z = alimento(brócolis, maçã)
Aventura em Prolog 16
Unificação entre Estruturas
 Se um novo valor é atribuído a uma
variável em uma ligação tardia, em
conflito com um padrão estabelecido
anteriormente, o objetivo falha
?- a(b,X) = a(b, c(Y,e)), X = hello.
No
?- a(b,X) = a(b, c(Y,e)), X = c(hello, e).
X = c(hello, e)
Y = hello
Aventura em Prolog 17
Unificação entre Estruturas
 Se não existir valores possíveis para a
variável, a unificação falha
?- a(X) = a(b,c). ?- a(b,c,d) = a(X,X,d).
No No
?- a(c,X,X) = a(Y,Y,b).
No
 A variável anônima (_) não se liga a nenhum
valor
 Múltiplas ocorrências dela não indicam valores
iguais
?- a(c,X,X) = a(_,_,b).
X = b
Aventura em Prolog 18
Exercícios
 Qual o resultado dessas consultas de
unificação?
?- a(b,c) = a(X,Y).
?- a(X, c(d,X)) = a(2, c(d,Y)).
?- a(X,Y) = a( b (c,Y), Z).
?- tree(left, root, Right) = tree(left, root,
tree(a, b, tree(c, d, e))).
Aventura em Prolog 19
O que vem a seguir?
 Listas
 Operadores
 ...

Mais conteúdo relacionado

Mais procurados (17)

Seminário Prolog
Seminário PrologSeminário Prolog
Seminário Prolog
 
Programacao logica
Programacao logicaProgramacao logica
Programacao logica
 
Algebra - Livro texto IV (UNIP/Matemática) 2018
Algebra - Livro texto IV (UNIP/Matemática) 2018Algebra - Livro texto IV (UNIP/Matemática) 2018
Algebra - Livro texto IV (UNIP/Matemática) 2018
 
Semana 9
Semana 9 Semana 9
Semana 9
 
Semana 10
Semana 10 Semana 10
Semana 10
 
Conjuntos
ConjuntosConjuntos
Conjuntos
 
Semana 11
Semana 11Semana 11
Semana 11
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Pincipio da indução
Pincipio da induçãoPincipio da indução
Pincipio da indução
 
MATEMATICARLOS - CONJUNTOS
MATEMATICARLOS - CONJUNTOSMATEMATICARLOS - CONJUNTOS
MATEMATICARLOS - CONJUNTOS
 
Apresentação recursividade rev2
Apresentação recursividade rev2Apresentação recursividade rev2
Apresentação recursividade rev2
 
Matematica discreta - estruturas algebricas
Matematica discreta -  estruturas algebricasMatematica discreta -  estruturas algebricas
Matematica discreta - estruturas algebricas
 
Programando em python conjuntos
Programando em python   conjuntosProgramando em python   conjuntos
Programando em python conjuntos
 
Estruturas algébricas
Estruturas algébricasEstruturas algébricas
Estruturas algébricas
 
Tutorial aed iii 007 - algoritmo de ordenação heapsort
Tutorial aed iii   007 - algoritmo de ordenação heapsortTutorial aed iii   007 - algoritmo de ordenação heapsort
Tutorial aed iii 007 - algoritmo de ordenação heapsort
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Programando em python recursao
Programando em python   recursaoProgramando em python   recursao
Programando em python recursao
 

Destaque

04 - Gerenciamento de Threads - II
04 -  Gerenciamento de Threads - II04 -  Gerenciamento de Threads - II
04 - Gerenciamento de Threads - IIFabio Moura Pereira
 
Desenvolvimento de Sistemas Web - HTML5 - Introdução
Desenvolvimento de Sistemas Web - HTML5 - IntroduçãoDesenvolvimento de Sistemas Web - HTML5 - Introdução
Desenvolvimento de Sistemas Web - HTML5 - IntroduçãoFabio Moura Pereira
 
Programação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte IIProgramação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte IIFabio Moura Pereira
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - IFabio Moura Pereira
 
Curso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTMLCurso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTMLFabio Moura Pereira
 
Desenvolvimento de Jogos - Mercado Parte 2
Desenvolvimento de Jogos - Mercado Parte 2Desenvolvimento de Jogos - Mercado Parte 2
Desenvolvimento de Jogos - Mercado Parte 2Fabio Moura Pereira
 
Aula de Desenvolvimento de Sistemas Web - CSS3
Aula de Desenvolvimento de Sistemas Web - CSS3Aula de Desenvolvimento de Sistemas Web - CSS3
Aula de Desenvolvimento de Sistemas Web - CSS3Fabio Moura Pereira
 
Desenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game DesignDesenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game DesignFabio Moura Pereira
 
Aula Interface Gráfica do Usuário
Aula Interface Gráfica do UsuárioAula Interface Gráfica do Usuário
Aula Interface Gráfica do UsuárioFabio Moura Pereira
 
Desenvolvimento de Sistemas Web - Conceitos Básicos
Desenvolvimento de Sistemas Web - Conceitos BásicosDesenvolvimento de Sistemas Web - Conceitos Básicos
Desenvolvimento de Sistemas Web - Conceitos BásicosFabio Moura Pereira
 
Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1Fabio Moura Pereira
 

Destaque (20)

Aula Prolog 03
Aula Prolog 03Aula Prolog 03
Aula Prolog 03
 
Aula Persistência 01 (Java)
Aula Persistência 01 (Java)Aula Persistência 01 (Java)
Aula Persistência 01 (Java)
 
Aula Prolog - 05
Aula Prolog - 05Aula Prolog - 05
Aula Prolog - 05
 
04 - Gerenciamento de Threads - II
04 -  Gerenciamento de Threads - II04 -  Gerenciamento de Threads - II
04 - Gerenciamento de Threads - II
 
Haskell - Introdução
Haskell - IntroduçãoHaskell - Introdução
Haskell - Introdução
 
Desenvolvimento de Sistemas Web - HTML5 - Introdução
Desenvolvimento de Sistemas Web - HTML5 - IntroduçãoDesenvolvimento de Sistemas Web - HTML5 - Introdução
Desenvolvimento de Sistemas Web - HTML5 - Introdução
 
Aula 05 - Java Script Básico
Aula 05 -  Java Script BásicoAula 05 -  Java Script Básico
Aula 05 - Java Script Básico
 
Programação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte IIProgramação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte II
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - I
 
Aula Tratamento de Exceções
Aula Tratamento de ExceçõesAula Tratamento de Exceções
Aula Tratamento de Exceções
 
Curso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTMLCurso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTML
 
Desenvolvimento de Jogos - Mercado Parte 2
Desenvolvimento de Jogos - Mercado Parte 2Desenvolvimento de Jogos - Mercado Parte 2
Desenvolvimento de Jogos - Mercado Parte 2
 
Aula de Desenvolvimento de Sistemas Web - CSS3
Aula de Desenvolvimento de Sistemas Web - CSS3Aula de Desenvolvimento de Sistemas Web - CSS3
Aula de Desenvolvimento de Sistemas Web - CSS3
 
Desenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game DesignDesenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game Design
 
Aula Interface Gráfica do Usuário
Aula Interface Gráfica do UsuárioAula Interface Gráfica do Usuário
Aula Interface Gráfica do Usuário
 
Aula Java Swing
Aula Java SwingAula Java Swing
Aula Java Swing
 
Desenvolvimento de Sistemas Web - Conceitos Básicos
Desenvolvimento de Sistemas Web - Conceitos BásicosDesenvolvimento de Sistemas Web - Conceitos Básicos
Desenvolvimento de Sistemas Web - Conceitos Básicos
 
Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1
 
PHP - Strings
PHP - StringsPHP - Strings
PHP - Strings
 
Curso de PHP - Objetos
Curso de PHP - ObjetosCurso de PHP - Objetos
Curso de PHP - Objetos
 

Mais de Fabio Moura Pereira

Programação Concorrente - Gerenciamento de Threads - Parte I
Programação Concorrente - Gerenciamento de Threads - Parte IProgramação Concorrente - Gerenciamento de Threads - Parte I
Programação Concorrente - Gerenciamento de Threads - Parte IFabio Moura Pereira
 
Programação Concorrente - Objetos e Concorrência
Programação Concorrente - Objetos e ConcorrênciaProgramação Concorrente - Objetos e Concorrência
Programação Concorrente - Objetos e ConcorrênciaFabio Moura Pereira
 
Programação Concorrente - Introdução
Programação Concorrente - IntroduçãoProgramação Concorrente - Introdução
Programação Concorrente - IntroduçãoFabio Moura Pereira
 
Aula - Interfaces e Estilos de Interação
Aula - Interfaces e Estilos de InteraçãoAula - Interfaces e Estilos de Interação
Aula - Interfaces e Estilos de InteraçãoFabio Moura Pereira
 
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)Fabio Moura Pereira
 

Mais de Fabio Moura Pereira (12)

Aula de Prolog 06 - Recursão
Aula de Prolog 06 - RecursãoAula de Prolog 06 - Recursão
Aula de Prolog 06 - Recursão
 
Aula Prolog 02
Aula Prolog 02Aula Prolog 02
Aula Prolog 02
 
Aula Prolog 01
Aula Prolog 01Aula Prolog 01
Aula Prolog 01
 
Programação Concorrente - Gerenciamento de Threads - Parte I
Programação Concorrente - Gerenciamento de Threads - Parte IProgramação Concorrente - Gerenciamento de Threads - Parte I
Programação Concorrente - Gerenciamento de Threads - Parte I
 
Programação Concorrente - Objetos e Concorrência
Programação Concorrente - Objetos e ConcorrênciaProgramação Concorrente - Objetos e Concorrência
Programação Concorrente - Objetos e Concorrência
 
Programação Concorrente - Introdução
Programação Concorrente - IntroduçãoProgramação Concorrente - Introdução
Programação Concorrente - Introdução
 
Aula - Interfaces e Estilos de Interação
Aula - Interfaces e Estilos de InteraçãoAula - Interfaces e Estilos de Interação
Aula - Interfaces e Estilos de Interação
 
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)
 
Padrões de Projeto de Software
Padrões de Projeto de SoftwarePadrões de Projeto de Software
Padrões de Projeto de Software
 
Curso de PHP - Arrays
Curso de PHP - ArraysCurso de PHP - Arrays
Curso de PHP - Arrays
 
PHP - Funções
PHP - FunçõesPHP - Funções
PHP - Funções
 
PHP - Introdução
PHP - IntroduçãoPHP - Introdução
PHP - Introdução
 

Aula de Prolog 08 - Unificação

  • 1. Prolog – 08 Fábio M. Pereira Baseado em Amzi! inc. – www.amzi.com
  • 2. Aventura em Prolog 2 Aventura em Prolog  Unificação  Exercícios
  • 3. Aventura em Prolog 3 Unificação  Uma das características mais poderosas de Prolog  Unificação é o algoritmo interno de Prolog para casamento de padrões  Para todos os exemplos que vimos até aqui, a unificação foi relativamente simples  Iremos agora examinar a unificação com mais detalhes
  • 4. Aventura em Prolog 4 O Processo de Unificação Variável & Qualquer termo A variável irá unificar com e ligar (binding) a qualquer termo, incluindo outra variável. Primitivo & Primitivo Dois termos primitivos (átomos ou inteiros) unificam somente se eles forem idênticos Estrutura & Estrutura Duas estruturas unificam se elas possuem o mesmo funtor e aridade e se cada par de argumentos correspondentes unificam
  • 5. Aventura em Prolog 5 Predicado Interno =/2  Utilizado para verificar unificação:  É bem sucedido quando os dois argumentos unificam  Falha se eles não unificam  Sintaxe: arg1 = arg2 ou =(arg1, arg2)  Aviso:  O sinal de igualdade (=) não causa atribuição como na maioria das linguagens, também não causa avaliação aritmética  Ele causa unificação em Prolog
  • 6. Aventura em Prolog 6 Predicado Interno =/2  A unificação entre os dois lados do sinal de igualdade (=) é exatamente a mesma unificação que ocorre quando Prolog tenta casar objetivos com as cabeças das cláusulas  No backtracking, as ligações de variáveis são desfeitas, da mesma maneira quando Prolog faz backtracking através de cláusulas
  • 7. Aventura em Prolog 7 Forma mais simples de Unificação  Entre duas estruturas sem variáveis  Se elas forem idênticas, a unificação é bem sucedida, se não, a unificação falha ?- a = a. ?- a = b. Yes No ?- local(maçã, cozinha) = ?- local(maçã, cozinha) = local(maçã, cozinha). local(pêra, cozinha). Yes No ?- a(b, c(d, e(f,g))) = ?- a(b, c(d, e(f,g))) = a(b, c(d, e(f,g))). a(b, c(d, e(g,f))). Yes No
  • 8. Aventura em Prolog 8 Unificação entre Variável e Primitivo  Outra forma simples de unificação  A variável assume o valor que faz com que a unificação seja bem sucedida ?- X = a. ?- 4 = Y. X = a Y = 4 ?- local(maçã, cozinha) = local(maçã, X). X = cozinha
  • 9. Aventura em Prolog 9 Unificação entre Variável e Primitivo  Em outros casos, múltiplas variáveis são simultaneamente atribuídas a valores ?- local(X,Y) = local(maçã, cozinha). X = maçã Y = cozinha ?- local(maçã, X) = local(Y, cozinha). X = cozinha Y = maçã
  • 10. Aventura em Prolog 10 Unificação entre Variáveis  Uma variável também pode unificar com outra  Cada instância de uma variável possui um único valor interno em Prolog  Quando duas variáveis unificam entre si, Prolog anota que elas devem possuir o mesmo valor  Nos exemplos a seguir, assumimos que Prolog usa ‘_nn’, onde ‘n’ é um dígito, para representar variáveis não ligadas (unbound)
  • 11. Aventura em Prolog 11 Unificação entre Variáveis  Exemplos: ?- X = Y. X = _01 Y = _01 ?- local(X, cozinha) = local(Y, cozinha). X = _01 Y = _01
  • 12. Aventura em Prolog 12 Unificação entre Variáveis  Variáveis Prolog são ligadas entre si, o que irá se refletir se ocorrer ligação tardia (later bound) ?- X = Y, Y = hello. X = hello Y = hello ?- X = Y, a(Z) = a(Y), X = hello. X = hello Y = hello Z = hello
  • 13. Aventura em Prolog 13 Unificação entre Variáveis  Ilustra a principal diferença entre unificação com variáveis Prolog e atribuição de variáveis encontrada na maioria das outras linguagens  Observe cuidadosamente o comportamento das consultas seguintes ?- X = Y, Y = 3, ?- X = Y, gosto_ruim(X), write(X). write(Y). 3 brócolis X = 3 X = brócolis Y = 3 Y = brócolis
  • 14. Aventura em Prolog 14 Unificação entre Estruturas  Quando duas estruturas com variáveis unificam, as variáveis tomam os valores que tornam as duas estruturas idênticas  Note que uma estrutura ligada a uma variável pode ela mesma conter variáveis ?- X = a(b,c). ?- a(b,X) = a(b, c(d,e)). X = a(b,c) X = c(d,e) ?- a(b,X) = a(b, c(Y,e)). X = c(_01, e) Y = _01
  • 15. Aventura em Prolog 15 Unificação entre Estruturas  Mesmo em exemplos mais complexos, os relacionamentos entre variáveis são lembrados e atualizados assim que uma nova ligação à variável ocorrer ?- a(b,X) = a(b, c(Y,e)), Y=hello. X = c(hello, e) Y = hello ?- alimento(X,Y) = Z, write(Z), nl, gosto_ruim(X), comestivel(Y), write(Z). alimento(_01, _02) alimento(brócolis, maçã) X = brócolis Y = maçã Z = alimento(brócolis, maçã)
  • 16. Aventura em Prolog 16 Unificação entre Estruturas  Se um novo valor é atribuído a uma variável em uma ligação tardia, em conflito com um padrão estabelecido anteriormente, o objetivo falha ?- a(b,X) = a(b, c(Y,e)), X = hello. No ?- a(b,X) = a(b, c(Y,e)), X = c(hello, e). X = c(hello, e) Y = hello
  • 17. Aventura em Prolog 17 Unificação entre Estruturas  Se não existir valores possíveis para a variável, a unificação falha ?- a(X) = a(b,c). ?- a(b,c,d) = a(X,X,d). No No ?- a(c,X,X) = a(Y,Y,b). No  A variável anônima (_) não se liga a nenhum valor  Múltiplas ocorrências dela não indicam valores iguais ?- a(c,X,X) = a(_,_,b). X = b
  • 18. Aventura em Prolog 18 Exercícios  Qual o resultado dessas consultas de unificação? ?- a(b,c) = a(X,Y). ?- a(X, c(d,X)) = a(2, c(d,Y)). ?- a(X,Y) = a( b (c,Y), Z). ?- tree(left, root, Right) = tree(left, root, tree(a, b, tree(c, d, e))).
  • 19. Aventura em Prolog 19 O que vem a seguir?  Listas  Operadores  ...