# Notación de generación de conjuntos

En teoría de conjuntos y sus aplicaciones a la lógica, las matemáticas y las ciencias de la computación, la notación de generación de conjuntos es un tipo de notación matemática que se usa para describir un conjunto enumerando sus elementos o indicando las propiedades que deben satisfacer sus miembros.
La definición de conjuntos mediante propiedades también se conoce como comprensión de conjuntos, abstracción de conjuntos o como definición de intensión de un conjunto.

## Conjuntos definidos por enumeración

Un conjunto se puede describir directamente enumerando todos sus elementos entre llaves, como en los dos ejemplos siguientes:
* $\{7,3,15,31\}$ es el conjunto que contiene los cuatro números 3, 7, 15 y 31, y nada más.
* $\{a,c,b\}=\{a,b,c\}$ es el conjunto que contiene a, b y c, y nada más (no hay orden entre los elementos de un conjunto).
Esto a veces se denomina "método de lista" para especificar un conjunto.
Cuando se desea denotar un conjunto que contiene elementos de una secuencia regular, se puede emplear una notación con puntos suspensivos, como se muestra en los siguientes ejemplos:
* $\{1,2,3,\ldots ,100\}$ es el conjunto de números enteros entre 1 y 100 inclusive.
* $\{1,2,3,\ldots \}$ es el conjunto de los números naturales.
* $\{\ldots ,-2,-1,0,1,2,\ldots \}=\{0,1,-1,2,-2,\ldots \}$ es el conjunto de todos los números enteros.
No hay orden entre los elementos de un conjunto (esto explica y valida la igualdad del último ejemplo), pero con la notación que emplea elipsis, se usa una secuencia ordenada antes (o después) de este recurso como un vehículo de notación conveniente para explicar qué elementos están en un conjunto. Se muestran los primeros elementos de la secuencia, y la elipsis indica que se debe aplicar la interpretación más simple para continuar con la secuencia. Si no aparece ningún valor final a la derecha de las elipsis, entonces la secuencia se considera ilimitada.
En general, $\{1,\dots ,n\}$ denota el conjunto de todos los números naturales $i$ tales que $1\leq i\leq n$. Otra notación para $\{1,\dots ,n\}$ es la notación entre corchetes $[n]$. Un caso especial sutil es $n=0$, en el que $[0]=\{1,\dots ,0\}$ es igual al conjunto vacío $\emptyset$. De manera similar, $\{a_{1},\dots ,a_{n}\}$ denota el conjunto de todos los $a_{i}$ tales que $1\leq i\leq n$.
En los ejemplos anteriores, cada conjunto se describe enumerando sus elementos. No todos los conjuntos se pueden describir de esta manera o, si se puede, su enumeración puede ser demasiado larga o complicada para ser útil. Por lo tanto, muchos conjuntos se definen por una propiedad que caracteriza a sus elementos. Esta caracterización se puede hacer de manera informal usando un lenguaje de carácter general, como en el siguiente ejemplo:
* Direcciones $\{$ en Pine Street $\$ es el conjunto de todas las direcciones en Pine Street.
Sin embargo, el enfoque léxico puede carecer de precisión o ser ambiguo, y por lo tanto, la notación constructora de conjuntos se utiliza a menudo con un predicado que caracteriza los elementos del conjunto que se define, tal como se describe en la siguiente sección.

## Conjuntos definidos por un predicado

La notación de creación de conjuntos se puede utilizar para describir un conjunto definido por un predicado, es decir, una fórmula lógica que se evalúa como "verdadera" para un elemento del conjunto y como "falsa" en caso contrario. En esta forma, la notación generadora de conjuntos tiene tres partes: una variable, un separador (como : o |) y un predicado. Por lo tanto, figura una variable a la izquierda del separador y una regla a la derecha del mismo. Estas tres partes están contenidas entre llaves:
    $\{x\mid \Phi (x)\}$
o
    $\{x:\Phi (x)\}.$
La barra vertical (o dos puntos) es un separador que se puede leer como "tal que", "para el cual" o "con la propiedad de que". Se dice que la fórmula Φ(x) es la "regla" o el "predicado". Todos los valores de x para los cuales el predicado se cumple (es verdadero) pertenecen al conjunto que se está definiendo. Todos los valores de x para los cuales el predicado no se cumple no pertenecen al conjunto. Por tanto, $\{x\mid \Phi (x)\}$ es el conjunto de todos los valores de x que satisfacen la fórmula Φ. Puede ser el conjunto vacío si ningún valor de x satisface la fórmula.

### Especificación del dominio

A la izquierda de la barra vertical puede aparecer un dominio E:
    $\{x\in E\mid \Phi (x)\},$
o uniéndolo al predicado:
    $\{x\mid x\in E{\text{and }}\Phi (x)\}\quad {\text{or}}\quad \{x\mid x\in E\land \Phi (x)\}.$
El símbolo ∈ aquí denota un elemento de un conjunto, mientras que el símbolo $\land$ denota el operador lógico "y", conocido como conjunción lógica. Esta notación representa el conjunto de todos los valores de x que pertenecen a algún conjunto dado E para el cual el predicado es verdadero (consúltese "Establecimiento del axioma de existencia" a continuación). Si $\Phi (x)$ es una conjunción $\Phi _{1}(x)\land \Phi _{2}(x)$, entonces $\{x\in E\mid \Phi (x)\}$ a veces se escribe $\{x\in E\mid \Phi _{1}(x),\Phi _{2}(x)\}$, usando una coma en lugar del símbolo $\land$.
En general, no es una buena idea considerar conjuntos sin definir un dominio, ya que esto representaría el subconjunto de "todas las cosas posibles que pueden existir" para las cuales el predicado es verdadero. Esto puede conducir fácilmente a contradicciones y paradojas. Por ejemplo, la paradoja de Russell muestra que la expresión $\{x~|~x\not \in x\},$, aunque aparentemente está bien formada como expresión constructora de conjuntos, no puede definir un conjunto sin producir una contradicción.
En los casos en los que el conjunto E se desprende claramente del contexto, es posible que no se especifique explícitamente. Es común en la bibliografía que un autor indique el dominio en una primera entrada y después no lo especifique de nuevo en la notación del constructor de conjuntos. Por ejemplo, un autor puede decir algo como: "A menos que se indique lo contrario, las variables deben considerarse números naturales", aunque en contextos menos formales donde se puede asumir el dominio, a menudo es innecesaria una mención escrita.

### Ejemplos

Los siguientes ejemplos ilustran conjuntos particulares definidos mediante notación de generador de conjuntos empleando predicados. En cada caso, el dominio se especifica en el lado izquierdo de la barra vertical, mientras que la regla se especifica en el lado derecho.
* $\{x\in \mathbb {R} \mid x>0\}$ es el conjunto de todos los números reales estrictamente positivos, que se pueden especificar como el intervalo $(0,\infty )$.
* $\{x\in \mathbb {R} \mid |x|=1\}$ es el conjunto $\{-1,1\}$. Este conjunto también se puede definir como $\{x\in \mathbb {R} \mid x^{2}=1\}$; consúltese Predicados equivalentes producen conjuntos iguales a continuación.
* Para cada número entero m, se puede definir $G_{m}=\{x\in \mathbb {Z} \mid x\geq m\}=\{m,m+1,m+2,\ldots \}$. Por ejemplo, $G_{3}=\{x\in \mathbb {Z} \mid x\geq 3\}=\{3,4,5,\ldots \}$ y $G_{-2}=\{-2,-1,0,\ldots \}$.
* $\{(x,y)\in \mathbb {R} \times \mathbb {R} \mid 0<y<f(x)\}$ es el conjunto de pares de números reales tales que y es mayor que 0 y menor que f(x), para una función f dada. Aquí, el producto cartesiano $\mathbb {R} \times \mathbb {R}$ denota el conjunto de pares ordenados de números reales.
* $\{n\in \mathbb {N} \mid (\exists k)[k\in \mathbb {N} \land n=2k]\}$ es el conjunto de todos los números naturales impares. El signo $\land$ significa "y", que se conoce como conjunción lógica. El símbolo ∃ significa "existe", y se conoce como cuantificador existencial. Así, por ejemplo, $(\exists x)P(x)$ se lee como "existe un x tal que P(x)".
* $\{n\mid (\exists k\in \mathbb {N} )[n=2k]\}$ es una notación alternativa para el mismo conjunto de números naturales pares. No es necesario especificar que n es un número natural, ya que así lo implica la fórmula de la derecha.
* $\{a\in \mathbb {R} \mid (\exists p\in \mathbb {Z} )(\exists q\in \mathbb {Z} )[q\not =0\land aq=p]\}$ es el conjunto de los números racionales; es decir, los números reales que se pueden escribir como la razón de dos números enteros.

## Expresiones más complejas en el lado izquierdo de la notación

Una extensión de la notación del generador de conjuntos reemplaza la variable única x por una expresión. Entonces, en lugar de $\{x\mid \Phi (x)\}$, es posible tener $\{f(x)\mid \Phi (x)\},$, que debería leerse como
    $\{f(x)\mid \Phi (x)\}=\{y\mid \exists x(y=f(x)\wedge \Phi (x))\}$.
Por ejemplo:
* $\{2n\mid n\in \mathbb {N} \}$, donde $\mathbb {N}$ es el conjunto de todos los números naturales, es el conjunto de todos los números naturales pares.
* $\{p/q\mid p,q\in \mathbb {Z} ,q\not =0\}$, donde $\mathbb {Z}$ es el conjunto de todos los números enteros, es $\mathbb {Q} ,$ el conjunto de todos los números racionales.
* $\{2t+1\mid t\in \mathbb {Z} \}$ es el conjunto de los números enteros impares.
* $\{(t,2t+1)\mid t\in \mathbb {Z} \}$ crea un conjunto de parejas de enteros, donde cada pareja incluye un número entero en correspondencia con un número entero impar.
Cuando las funciones inversas se pueden establecer explícitamente, la expresión de la izquierda se puede eliminar mediante una simple sustitución. Considérese el conjunto del ejemplo $\{2t+1\mid t\in \mathbb {Z} \}$. Realizando la sustitución $u=2t+1$, es decir $t=(u-1)/2$, y luego reemplazando t en la notación del generador de conjuntos se obtiene
    $\{2t+1\mid t\in \mathbb {Z} \}=\{u\mid (u-1)/2\in \mathbb {Z} \}.$

## Predicados equivalentes producen conjuntos iguales

Dos conjuntos son iguales si y solo si tienen los mismos elementos. Los conjuntos definidos por la notación del constructor de conjuntos son iguales si y solo si sus reglas, incluidos los especificadores de dominio, son equivalentes. Esto es,
    $\{x\in A\mid P(x)\}=\{x\in B\mid Q(x)\}$
si y solo si
    $(\forall t)[(t\in A\land P(t))\Leftrightarrow (t\in B\land Q(t))]$.
Por lo tanto, para probar la igualdad de dos conjuntos definidos por la notación constructora de conjuntos, basta con probar la equivalencia de sus predicados, incluidos los calificadores de dominio.
Por ejemplo,
    $\{x\in \mathbb {R} \mid x^{2}=1\}=\{x\in \mathbb {Q} \mid |x|=1\}$
porque los dos predicados de la regla de construcción son lógicamente equivalentes:
    $(x\in \mathbb {R} \land x^{2}=1)\Leftrightarrow (x\in \mathbb {Q} \land |x|=1).$
Esta equivalencia se cumple porque, para cualquier número real x, se tiene que $x^{2}=1$ si y solo si x es un número racional con $|x|=1$. En particular, ambos conjuntos son iguales al conjunto $\{-1,1\}$.

## Establecimiento del axioma de existencia

En muchas teorías de conjuntos formales, como los axiomas de Zermelo-Fraenkel, la notación del constructor de conjuntos no forma parte de la sintaxis formal de la teoría. En cambio, hay un esquema de axioma de existencia, que establece que si E es un conjunto y Φ(x) es una fórmula en el lenguaje de la teoría de conjuntos, entonces hay un conjunto Y cuyos miembros son exactamente los elementos de E que satisfacen Φ:
    $(\forall E)(\exists Y)(\forall x)[x\in Y\Leftrightarrow x\in E\land \Phi (x)].$
El conjunto Y obtenido de este axioma es exactamente el conjunto descrito en la notación del generador de conjuntos como $\{x\in E\mid \Phi (x)\}$.

## En lenguajes de programación

Una notación similar disponible en varios lenguaje de programación (en particular, Python y Haskell) es list comprehension, que combina las operaciones map y filter en una o más listas.
En Python, los delimitadores del constructor de conjuntos se reemplazan por corchetes, paréntesis o llaves, dando lista, generador y objetos del conjunto, respectivamente. Se utiliza una sintaxis basada en el inglés. El lenguaje Haskell reemplaza las llaves del constructor de conjuntos por corchetes, pero usa sus símbolos, incluida la barra vertical estándar del constructor de conjuntos.
Lo mismo se puede lograr en Scala usando Sequence Comprehensions, donde la palabra clave "for" devuelve una lista de las variables obtenidas usando la palabra clave "yield".
Considérense estos ejemplos de notación de creación de conjuntos en algunos lenguajes de programación:
| | Ejemplo 1 | Ejemplo 2 |
| Generador de conjuntos | $\{l\|\ l\in L\}$ | $\{(k,x)\|\ k\in K\wedge x\in X\wedge P(x)\}$ |
| Python | {l for l in L} | {(k, x) for k in K for x in X if P(x)} |
| Haskell | [l|l <- ls] | [(k, x)|k <- ks, x <- xs, p x] |
| Scala | for (l <- L) yield l | for (k <- K; x <- X if P(x)) yield (k,x) |
| C# | from l in L select l | from k in K from x in X where P(x) select (k,x) |
| SQL | SELECT l FROM L_set | SELECT k, x FROM K_set, X_set WHERE P(x) |
| Prolog | setof(L,member(L,Ls),Result) | setof((K,X),(member(K,Ks),member(X,Xs),call(P,X)),Result) |
| Ruby | L.map{|l|l} | K.product(X).select{|k,x|P(x) } |
| Erlang | [l||l <- ls] | |
| Julia | [l for l ∈ L] | [(k, x) for k ∈ K for x ∈ X if P(x)] |
La notación del generador de conjuntos y la notación de comprensión de listas son instancias de una notación más general conocida como comprensiones de mónadas, que permite operaciones tipo aplicación/filtro sobre cualquier mónada con un elemento cero.