¿Cuál es la diferencia entre un producto cartesiano y una unión disjunta? (Con respecto a los lenguajes de programación)

Creo que puedo ver una analogía que las diapositivas intentaban hacer (y sospecho que este es, de hecho, el concepto que intentaban explicar porque está en el contexto de la teoría del lenguaje de programación):

Los tipos de productos algebraicos son como productos cartesianos , ya que su valor puede ser cualquier combinación de los tipos de los que están compuestos.
Por ejemplo, puede enumerar todos los valores posibles que puede tener una estructura C que contiene un int y un char tomando el Producto cartesiano de los valores que puede tomar cada tipo:
int : -2147483648, -2147483647,…, -1, 0, 1,…, 2147483646, 2147483647
char : '\0' , '\1' , …, 'a' , 'b' , …, '\254' , '\255'
struct { int; char; } struct { int; char; } : { -2147483648, '\0' } , { -2147483648, '\1' } ,…, { 2147483647, '\254' } , { 2147483647, '\255' }

Los tipos de suma algebraica son como uniones disjuntas (es decir, uniones de valores disjuntos), ya que su valor puede ser cualquiera de un conjunto de valores mutuamente excluyentes.
Si bien no está del todo claro en un lenguaje como Java, se podría pensar en una superclase abstracta como un tipo de suma. Por ejemplo, si tiene alguna clase abstracta de Java llamada Coin que es heredada por las clases Quarter , Dime , Nickel y Penny , puede pensar en una variable de tipo Coin como una que almacena una (y solo una) de Quarter , Dime , Nickel o Penny . Estos cuatro niños son mutuamente excluyentes, por ejemplo, si es un Quarter entonces no es necesariamente ninguno de los otros tres.
La forma en que una clase puede ser un tipo de suma se vuelve mucho más clara si aprende sobre las clases de casos Scala. De lo contrario, el ejemplo de una clase como un tipo de suma es un poco complicado por el hecho de que las clases tienden a tener colecciones de campos y de esa manera actúan también como tipos de productos.

Creo que estos podrían ser más claros si utilizamos un lenguaje de programación funcional que los implemente, como OCaml.

En OCaml, un tipo de producto también se denomina “registro” y es bastante similar a una estructura.
Su definición se parece a esto:
type student = { name: string, gpa: float, year: int }
Y su uso se parece a esto:
let s = { name = "Foo Barson"; gpa = 3.7; year = 2 }
Es bastante sencillo.

Un tipo de suma en OCaml se ve un poco diferente. Tiende a ser un concepto nuevo para la mayoría de los programadores y estudiantes de CS porque a menudo no aparece explícitamente en los lenguajes de programación imperativos.
Siguiendo el ejemplo de nuestro estudiante para los tipos de productos, más arriba, consideremos una definición alternativa del campo del year como un tipo de suma en lugar de un entero:

 type year = | Freshman | Sophomore | Junior | Senior | SuperSenior 

Esto dice que una variable de tipo year tiene exactamente uno de estos valores mutuamente excluyentes; estos cinco forman el conjunto completo de valores para este tipo.
Los tipos de suma son muy útiles para la coincidencia de mayúsculas y minúsculas (por ejemplo, declaraciones de switch ). Por ejemplo, aquí hay una función que devuelve true si un estudiante es elegible para tomar una clase que requiere una posición mínima junior (aunque esto es innecesariamente detallado para OCaml del mundo real):

 let eligible (student_year: year): bool = match student_year with | Freshman -> false | Sophomore -> false | Junior -> true | Senior -> true | SuperSenior -> true 

La asociación con una Unión disjunta podría ser más clara si considera que los tipos de valores para un tipo de suma podrían ser tipos de suma. Aquí hay un ejemplo más complicado. Avísame si te he perdido.

 type literal = | Integer of int | Float of float | String of string type operator = | Plus | Minus | Times | Division type expr = | Literal of literal | UnaryOp of (operator, expr) | BinaryOp of (operator, expr, expr) type stmt = | Assignment of (string, expr) | VoidExpression of expr type line = | Statement of stmt | Expression of expr 

Al considerar el conjunto de valores posibles del tipo expr , debemos tener en cuenta los conjuntos de valores posibles de sus miembros. Específicamente, UnaryOp y BinaryOp tienen conjuntos de valores complejos por sí mismos (para operator y expr ).
Los posibles valores para un expr es la unión de todos los conjuntos disjuntos que describen sus posibles valores.
Y así ocurre con los tipos stmt y line : el conjunto de valores posibles para cada uno se determina tomando la unión de los conjuntos de valores posibles de los valores.

Estos conceptos son matemáticos, no creo que haya ningún CS específico en ellos.

Si tiene los dos conjuntos disjuntos A = {a, b, c} y N = {1, 2}, la unión disjunta es simplemente unirlos a A + N = {a, b, c, 1, 2}. Si los dos conjuntos se superponen, debe etiquetar los elementos de commen con el conjunto del que fueron tomados, haciéndolos distintos de esa manera.

El producto cartesiano es el conjunto de todos los pares posibles con el componente izquierdo de un conjunto y el derecho del otro, entonces A x N = {(a, 1), (a, 2), (b, 1), (b , 2), (c, 1), (c, 2)}

Puede ver fácilmente que la cantidad de elementos de la unión disjunta es solo la suma de la cantidad de elementos de los conjuntos originales; El número de elementos del producto cartesiano es el producto del número de elementos de los conjuntos originales.

Usted ve, diferentes construcciones, diferentes conjuntos resultantes.

More Interesting

Proyectos teóricos de informática o desarrollo de aplicaciones, ¿qué le sugerirías a los estudiantes de primer año de informática?

Si tengo una prueba potencial de que P = NP, ¿con quién puedo compartirla para que no me juzguen?

¿Por qué la suma, pero no la resta, es asociativa?

¿Cuáles son algunas aplicaciones comunes de la topología algebraica en informática?

¿Cuáles son algunos ejemplos de principios teóricos?

¿Ser bueno en matemáticas me ayudaría a ser un mejor programador?

¿Qué haría como programador (específicamente un ingeniero de software) que implicaría un conocimiento matemático sólido?

¿Cuáles son los cursos / libros matemáticos útiles para SRM de TopCoder?

¿Es cierto que al menos uno de los dos términos en [math] Rad (p) - 1, Rad (p) + 1 [/ math] es un número primo, donde [math] Rad (p) [/ math] es el producto de todos los números primos menores o iguales que [math] p [/ math]?

Intuitivamente, ¿qué es una función computable?

¿Cuál es la mejor complejidad de tiempo que se puede lograr para las operaciones (suma, resta, multiplicación, división) en números grandes (1000 dígitos) en C ++?

¿Necesitaríamos resolver P vs. NP como prerrequisito en el diseño de inteligencia general artificial?

¿Cuáles son las habilidades matemáticas esenciales necesarias para ser un buen programador?

¿Qué es la skolemización?

En algoritmos, proporcione una matriz incremental del entero (-200, ... 0, ... 500) y quite un número. ¿Cuál es el algoritmo eficiente para encontrar el número que falta?