En matemáticas , la codificación de Church es una forma de representar varios tipos de datos en el cálculo lambda . En el cálculo lambda sin tipos, el único tipo de dato primiti...
Hispanopedia WikiContenido en espanolLectura gratuita
En el cálculo lambda sin tipos, el único tipo de dato primitivo son las funciones, representadas por términos de abstracción lambda. Los tipos que normalmente se consideran primitivos en otras notaciones (como enteros , booleanos , pares, listas y uniones etiquetadas ) no están presentes de forma nativa.
De ahí surge la necesidad de contar con formas de representar los datos de estos distintos tipos mediante términos lambda, es decir, mediante funciones que toman funciones como argumentos y devuelven funciones como resultados.
Los numerales de Church son una representación de los números naturales mediante la notación lambda. El método recibe su nombre de Alonzo Church , quien fue el primero en codificar datos en el cálculo lambda de esta manera. También puede extenderse para representar otros tipos de datos con un enfoque similar.
Este artículo utiliza ocasionalmente la sintaxis alternativa para los términos de abstracción lambda, donde λ x .λ y .λ z . N se abrevia como λ xyz . N , así como los dos combinadores estándar,y, según sea necesario.
Pares de iglesias
Los pares de Church son la codificación de Church del tipo par ( tupla de dos ). Tener dos cosas significa poder proporcionárselas a cualquier observador que espere dos cosas. El par se representa, por lo tanto, como una función que toma un argumento de función. El par en sí no decide qué hacer con los elementos de la tupla. Cuando se le da su argumento, lo aplica a los dos componentes del par. La definición del constructor de pares , las funciones de selección del primer elemento y de selección del segundo elemento en el cálculo lambda son:
Por ejemplo,
Booleanos de la Iglesia
Las expresiones booleanas de Church codifican los valores booleanos verdadero y falso. Algunos lenguajes de programación las utilizan como modelo de implementación para la aritmética booleana; ejemplos de ello son Smalltalk y Pico.
La lógica booleana implica una elección entre dos alternativas. Por lo tanto, las codificaciones de Church para verdadero y falso son funciones de dos parámetros:
verdadero elige el primer parámetro ;
falso elige el segundo parámetro.
Las dos definiciones en cálculo lambda son:
Estas definiciones permiten que los predicados (es decir, funciones que devuelven valores lógicos ) actúen directamente como cláusulas condicionales , de modo que el operador `if` sea simplemente una función identidad y, por lo tanto, pueda omitirse. Cada valor lógico ya actúa como un `if` , realizando una elección entre sus dos argumentos. Un valor booleano aplicado a dos valores devuelve el primero o el segundo. La expresión
Devuelve la cláusula then si la cláusula test es verdadera , y la cláusula else si la cláusula test es falsa .
Dado que los valores lógicos como verdadero y falso eligen su primer o segundo argumento, pueden combinarse para proporcionar operadores lógicos. Generalmente, son posibles varias implementaciones, ya sea manipulando directamente los parámetros o reduciéndolos a los valores lógicos más básicos. A continuación, se presentan las definiciones, utilizando la notación abreviada mencionada al inicio del artículo ( p y q son predicados; a y b son valores generales):
Algunos ejemplos:
Numerales de la iglesia
Los numerales de la Iglesia son las representaciones de los números naturales bajo la codificación de la Iglesia. La función de orden superior que representa el número natural n es una función que asigna cualquier funcióna su composición n -ésima . En términos más sencillos, un numeral representa el número aplicando cualquier función dada esa cantidad de veces en secuencia, comenzando desde cualquier valor inicial dado:
La codificación de Church es, por lo tanto, una codificación unaria de números naturales, [ 1 ] que corresponde al conteo simple . Cada numeral de Church logra esto por construcción.
Todos los numerales de Church son funciones que toman dos parámetros. Los numerales de Church 0 , 1 , 2 , ..., se definen de la siguiente manera en el cálculo lambda :
Comenzando con 0, sin aplicar la función en absoluto, proceda con 1 , aplicando la función una vez; 2 , aplicando la función dos veces seguidas; 3, aplicando la función tres veces seguidas, etc .:
El numeral 3 de Church es una cadena de tres aplicaciones de una función dada en secuencia, comenzando con un valor determinado. La función se aplica primero a un argumento dado y luego sucesivamente a su propio resultado. El resultado final no es el número 3 (a menos que el parámetro dado sea 0 y la función sea una función sucesora ). La función en sí, y no su resultado final, es el numeral 3 de Church . El numeral 3 de Church significa simplemente hacer algo tres veces. Es una demostración ostensiva de lo que se entiende por "tres veces".
Cálculo con numerales eclesiásticos
Las operaciones aritméticas con números producen números como resultado. En la codificación de Church, estas operaciones se representan mediante abstracciones lambda que, al aplicarse a los numerales de Church que representan los operandos, se reducen beta a los numerales de Church que representan los resultados.
Representación de la iglesia de la adición,, utiliza la identidad:
La operación sucesora,, se obtiene mediante la β-reducción de la expresión "":
Multiplicación,, utiliza la identidad:
De este modoy y así, en virtud de la codificación de Church que expresa la composición n -ésima, la operación de exponenciaciónes dado por
La operación predecesoraes un poco más complicado. Necesitamos idear una operación que, cuando se repitalos tiempos resultarán enaplicaciones de la función dadaEsto se logra utilizando la función identidad en su lugar, solo una vez, y luego volviendo a cambiar a:
Como se mencionó anteriormente,es la función identidad,. El nombre de la variableSe elige como mnemotecnia para "resultado recursivo". Esta definición emplea un argumento adicional para usar el paradigma de paso de estado, ya que el cálculo lambda carece de mutación (por lo que nada se puede cambiar, solo reemplazar). Véase a continuación la explicación detallada.
Esto sugiere implementar, por ejemplo, funciones de división por la mitad y factoriales de manera similar al paso de estados.
Por ejemplo,beta-reduce a,beta-reduce a, y beta-reduce a.
Sustracción,, se expresa mediante la aplicación repetida de la operación predecesora un número determinado de veces, al igual que la suma se puede expresar mediante la aplicación repetida de la operación sucesora un número determinado de veces, etc.:
De forma similar a la definición factorial anterior, la tetración también puede definirse utilizando las propiedades intrínsecas de la codificación de Church, creando la expresión de "código" para ella y dejando que los propios numerales de Church hagan el resto:
Aquí, de nuevo,.
Resta y división directas
Así como la suma como sucesión repetida tiene su contraparte en el estilo directo, la resta también puede expresarse de forma directa y más eficiente:
Por ejemplo,se reduce a un equivalente de.
Esto también proporciona otra versión predecesora, reductora de beta.:
La definición directa de división se da de manera bastante similar a como
La solicitud paralogra la resta mediantemientras crea un ciclo de acciones que emiten repetidamente undespuéspasos.
En lugar de,También puede utilizarse en cada una de las tres definiciones anteriores.
Esta codificación utiliza esencialmente la identidad
o
Una explicación de pred
La idea es la siguiente. Lo único conocido por la Iglesia numerales el numeralmismo. Dados dos argumentosy, como de costumbre, lo único que puede hacer es aplicar ese numeral a los dos argumentos, modificado de alguna manera para que la cadena de aplicaciones de n de largo creada así tenga uno (específicamente, el de más a la izquierda)en la cadena reemplazada por la función identidad:
Aquíes el modificado, yes el modificado. Desdeen sí mismo no se puede cambiar, su comportamiento solo se puede modificar a través de un argumento adicional,.
El objetivo se logra, entonces, al pasar ese argumento adicional.desde afuera hacia adentro , modificándolo según sea necesario, con las definiciones
Que es exactamente lo que tenemos en elexpresión lambda de la definición.
Ahora es bastante fácil ver que
es decir, por contracción eta y luego por inducción, sostiene que
etcétera.
Definir el depredador mediante pares
La identidad anterior puede codificarse con el uso explícito de pares. Esto puede hacerse de varias maneras, por ejemplo:
La expansión paraes:
Esta es una definición más sencilla de idear, pero conduce a una expresión lambda más compleja.
En el cálculo lambda, los pares son esencialmente argumentos adicionales, ya sea pasándolos de adentro hacia afuera como aquí, o de afuera hacia adentro como en el original.definición. Otra codificación sigue directamente la segunda variante de la identidad del predecesor,
De esta forma ya está bastante cerca del original, "de afuera hacia adentro".definición, creando también la cadena dees como lo hace, solo que de una manera un poco más derrochadora. Pero es mucho menos derrochador que el anterior,definición aquí. De hecho, si seguimos su ejecución llegamos a la nueva definición, aún más simplificada, pero totalmente equivalente.
lo que deja completamente claro y evidente que todo esto se trata simplemente de modificación y paso de argumentos. Su reducción procede como
mostrando claramente lo que está sucediendo. Aun así, el originales mucho preferible ya que funciona de arriba hacia abajo y, por lo tanto, puede detenerse inmediatamente si la función proporcionada por el usuarioes un cortocircuito. El enfoque de arriba hacia abajo también se utiliza con otras definiciones como
División mediante recursión general
La división de números naturales puede implementarse mediante [ 3 ].
Calculadorconrequiere muchas reducciones beta. A menos que se haga la reducción a mano, esto no importa demasiado, pero es preferible no tener que hacer este cálculo dos veces (a menos que se use la definición de resta directa, ver más arriba). El predicado más simple para probar números es IsZero, así que considere la condición.
Pero esta condición es equivalente a, no. Si se utiliza esta expresión, entonces la definición matemática de división dada anteriormente se traduce en una función sobre los numerales de la Iglesia como,
Como se deseaba, esta definición tiene una sola llamada aSin embargo, el resultado es que esta fórmula da el valor de.
Este problema puede corregirse sumando 1 a n antes de llamar a divide . La definición de divide es entonces:
divide1 es una definición recursiva. El combinador Y puede usarse para implementar la recursión. Crea una nueva función llamada div by;
En el lado izquierdo
En el lado derecho
Llegar,
Entonces,
dónde,
Da,
O como texto, usando \ para λ ,
dividir = (\n.((\f.(\xx x) (\xf (xx))) (\c.\n.\m.\f.\x.(\d.(\nn (\x.(\a.\bb)) (\a.\ba)) d ((\f.\xx) fx) (f (cdmfx))) ((\m.\nn (\n.\f.\xn (\g.\hh (gf)) (\ux) (\uu)) m) nm))) ((\n.\f.\x. f (nfx)) n))
Utilizando una calculadora de cálculo lambda, la expresión anterior se reduce a 3, utilizando el orden normal.
\f.\xf (f (f (x)))
Predicados
Un predicado es una función que devuelve un valor booleano. El predicado más fundamental sobre los numerales de la Iglesia es, que regresasi su argumento es el numeral de la Iglesia, yde lo contrario:
El siguiente predicado comprueba si el primer argumento es menor o igual que el segundo:
Debido a la identidad
La prueba de igualdad se puede implementar como
En lenguajes de programación
La mayoría de los lenguajes de programación del mundo real admiten enteros nativos de máquina; las funciones ` church` y `unchurch` convierten entre enteros no negativos y sus numerales de Church correspondientes. Estas funciones se presentan aquí en Haskell , donde `<sup>c</sup>` \corresponde a la λ del cálculo lambda. Las implementaciones en otros lenguajes son similares.
tipo Iglesia a = ( a -> a ) -> a -> aiglesia :: Entero -> Iglesia Entero iglesia 0 = \ f -> \ x -> x iglesia n = \ f -> \ x -> f ( iglesia ( n - 1 ) f x )unchurch :: Iglesia Entero -> Entero unchurch cn = cn ( + 1 ) 0
Números firmados
Un método sencillo para extender los numerales de Church a números con signo consiste en utilizar un par de Church, que contiene numerales de Church que representan un valor positivo y uno negativo. [ 4 ] El valor entero es la diferencia entre los dos numerales de Church.
Un número natural se convierte en un número con signo mediante:
La negación se realiza intercambiando los valores.
El valor entero se representa de forma más natural si uno de los elementos del par es cero. La función OneZero logra esta condición.
La recursión puede implementarse utilizando el combinador Y,
Más y menos
La suma se define matemáticamente en el par mediante:
La última expresión se traduce al cálculo lambda como,
De manera similar se define la resta,
donación,
Multiplicar y dividir
La multiplicación puede definirse mediante:
La última expresión se traduce al cálculo lambda como,
Aquí se ofrece una definición similar para la división, con la salvedad de que, en esta definición, uno de los valores de cada par debe ser cero (véase OneZero más arriba). La función divZ nos permite ignorar el valor que tiene un componente cero.
Luego se usa divZ en la siguiente fórmula, que es la misma que para la multiplicación, pero con mult reemplazado por divZ .
Números racionales y reales
Los números reales racionales y computables también pueden codificarse en el cálculo lambda. Los números racionales pueden codificarse como un par de números con signo. Los números reales computables pueden codificarse mediante un proceso de limitación que garantiza que la diferencia con el valor real difiera en un número que puede hacerse tan pequeño como sea necesario. [ 5 ] [ 6 ] Las referencias dadas describen software que, en teoría, podría traducirse al cálculo lambda. Una vez definidos los números reales, los números complejos se codifican naturalmente como un par de números reales.
Los tipos de datos y las funciones descritas anteriormente demuestran que cualquier tipo de dato o cálculo puede codificarse en el cálculo lambda. Esta es la tesis de Church-Turing .
Codificaciones de lista
Una lista contiene algunos elementos en orden. Las operaciones básicas sobre listas son:
Una representación de listas debería proporcionar formas de implementar estas operaciones.
La representación arquetípica de listas en el cálculo lambda es la codificación de listas de Church. Representa las listas como pliegues derechos , es decir, como funciones que devuelven el resultado de plegar la lista con argumentos proporcionados por el usuario.
Sigue el paradigma de que "una cosa es el resultado de su observación". Independientemente de la implementación concreta, al plegar una lista de valores se obtiene el mismo resultado. Esto proporciona una visión abstracta de lo que es una lista. La codificación de listas de Church es un ejemplo de este mecanismo.
Por otro lado, visto de forma más concreta, las listas pueden representarse como una secuencia de nodos de lista enlazados .
A continuación se presentan cuatro representaciones diferentes de listas:
Listas de iglesias: representación del pliegue derecho
Esta es la codificación original de Church para listas. Una lista se representa mediante una función binaria que, al recibir dos argumentos (una "función de combinación" y un "valor centinela"), realiza el pliegue derecho de la lista codificada utilizando dichos argumentos.
Para una lista vacía, el valor centinela se devuelve como resultado del plegado. El resultado de plegar una lista no vacía con cabeza h y cola t es el resultado de combinar, mediante la función proporcionada, la cabeza h con el resultado de plegar la cola t con los dos argumentos proporcionados. Por lo tanto, los dos argumentos de la función de combinación son, conceptualmente, el elemento actual y el resultado de plegar el resto de la lista.
Por ejemplo, una lista de tres elementos x, y y z está representada por un término que, al aplicarse a c y n, devuelve cx (cy (czn)). De forma equivalente, es una aplicación de la cadena de composiciones funcionales () de aplicaciones parciales, ((cx)(cy)(cz)) n.
Estas definiciones siguen la siguiente lógica: las ecuaciones
dóndedenota la representación de la lista de la iglesia.
Dado que la lista codificada de Church es su propia función de plegado, plegarla simplemente significa aplicar esa función a los argumentos proporcionados.
Esta representación de lista se puede tipificar en System F.
La evidente correspondencia con los numerales de la Iglesia no es casual, ya que puede verse como una codificación unaria, con los números naturales representados por listas de valores unitarios (es decir, no importantes), por ejemplo [() () ()], donde la longitud de la lista sirve como representación del número natural. El plegado a la derecha sobre dichas listas utiliza funciones que necesariamente ignoran el valor del elemento, y es equivalente a la composición funcional encadenada, es decir ( (c ())(c ())(c ()) ) n = (fFf) n, como se usa en los numerales eclesiásticos.
Dos pares como nodo de lista
Una lista no vacía puede representarse mediante un par de Church, donde
primero contiene el encabezado de la lista
El segundo contiene la cola de la lista.
Sin embargo, esto no proporciona una representación de la lista vacía, ya que no existe un puntero "nulo". Para representar el valor nulo, el par se puede envolver en otro par, lo que da como resultado tres valores:
Primero , el indicador de lista nula (un valor booleano).
primero de segundo contiene la cabeza ( coche ).
segundo de segundo contiene la cola ( cdr ).
Utilizando esta idea, las operaciones básicas de lista se pueden definir de esta manera: [ 7 ]
En un nodo nulo , nunca se accede al segundo elemento , siempre que head y tail solo se apliquen a listas no vacías.
donde las definiciones como la última siguen todas el mismo patrón general para el uso seguro de una lista, conyrefiriéndose al principio y al final de la lista, ysiendo desechado, como un dispositivo artificial:
Otras operaciones en esta codificación son:
Scott enumera
La codificación Scott para tipos de datos sigue su sintaxis superficial sin tener en cuenta la recursión en el tipo de dato. En el estilo de definición de tipos de datos algebraicos de disyunción de conjunciones o suma de productos, representa un dato dado como una función que espera tantos argumentos como alternativas haya en su definición de tipo de dato, donde se espera que cada uno de dichos argumentos sea una función "manejadora" que debe ser capaz de manejar la cantidad dada de argumentos de datos que corresponderán a los campos de datos para esa alternativa.
Dados todos los manejadores como argumentos, la función de representación de datos llamará al manejador apropiado con los datos internos correspondientes. Por lo tanto, se puede decir que los valores codificados en Scott incorporan el manejo de casos de coincidencia de patrones para su tipo de datos.
Para las listas, significa la definición del tipo de datos.
y listas representadas como
Las operaciones recursivas en listas de Scott normalmente requieren el uso explícito de recursión, por ejemplo, utilizandoCombinador o definiciones de autoaplicación explícitas. Un ejemplo de ello es foldr , a diferencia de la operación nula que representa bajo la codificación Church. Sin embargo, tail está disponible de inmediato, por lo que su definición es mucho más sencilla en este caso. Consulte la codificación Scott para obtener más información.
La codificación Scott puede considerarse como el uso de la idea de continuaciones , lo que puede conducir a un código más simple [ 9 ] . En este enfoque, utilizamos el hecho de que las listas pueden observarse mediante expresiones de coincidencia de patrones . Por ejemplo, utilizando la notación de Scala , si listdenota un valor de tipo Listcon una lista vacía Nily un constructor, Cons(h, t)podemos inspeccionar la lista y calcular nilCodeen caso de que la lista esté vacía y consCode(h, t)cuando la lista no esté vacía:
lista coincidencia { caso Nil => nilCode caso Cons ( h , t ) => consCode ( h , t ) }
El listvalor viene dado por cómo actúa sobre nilCodey consCode. Por lo tanto, definimos una lista como una función que acepta tales nilCodey consCodecomo argumentos, de modo que en lugar de la coincidencia de patrones anterior podemos simplemente escribir:
Denotemos por nel parámetro correspondiente a nilCodey por cel parámetro correspondiente a consCode. La lista vacía es entonces la que devuelve el argumento nulo:
La lista no vacía con cabeza hy cola tviene dada por
De forma más general, un tipo de datos algebraicos conLas alternativas se convierten en una función conparámetros, cada uno de los cuales es una función observadora/manejadora para su alternativa correspondiente. Cuando elEl constructor de la alternativa tieneargumentos, la función controladora correspondiente tomaargumentos también.
La codificación de Scott se puede realizar en el cálculo lambda sin tipos, mientras que su uso con tipos requiere un sistema de tipos con recursión y polimorfismo de tipos. Una lista con tipo de elemento E en esta representación que se utiliza para calcular valores de tipo C tendría la siguiente definición de tipo recursiva, donde '=>' denota el tipo de función :
tipo Lista = C => // argumento nulo ( E => Lista => C ) => // argumento cons C // resultado de la coincidencia de patrones
Una lista que se puede usar para calcular tipos arbitrarios tendría un tipo que cuantifica sobre C. Una lista genérica en Etambién tomaría Ecomo argumento de tipo.
Observaciones generales
Una implementación sencilla de la codificación de Church ralentiza algunas operaciones de acceso.a, dóndees el tamaño de la estructura de datos , lo que hace que la codificación de Church sea impracticable. [ 10 ] La investigación ha demostrado que esto puede abordarse mediante optimizaciones dirigidas, pero la mayoría de los lenguajes de programación funcional en su lugar expanden sus representaciones intermedias para contener tipos de datos algebraicos . [ 11 ] No obstante, la codificación de Church se usa a menudo en argumentos teóricos, ya que es una representación natural para la evaluación parcial y la demostración de teoremas. [ 10 ] Las operaciones pueden tipificarse usando tipos de rango superior , [ 12 ] y la recursión primitiva es fácilmente accesible. [ 10 ] La suposición de que las funciones son los únicos tipos de datos primitivos simplifica muchas demostraciones.
La codificación de Church es completa, pero solo representacionalmente. Se necesitan funciones adicionales para traducir la representación a tipos de datos comunes, para su visualización. En general, no es posible determinar si dos funciones son extensionalmente iguales debido a la indecidibilidad de la equivalencia según el teorema de Church . La traducción puede aplicar la función de alguna manera para recuperar el valor que representa, o buscar su valor como un término lambda literal. El cálculo lambda se suele interpretar como el uso de la igualdad intensional . Existen posibles problemas con la interpretación de los resultados debido a la diferencia entre la definición intensional y la extensional de igualdad.
↑ Jansen, Jan Martin (2013), "Programación en el cálculo λ: de Church a Scott y viceversa", The Beauty of Functional Code , Lecture Notes in Computer Science, vol. 8106, Springer-Verlag, pp. 168–180 , doi : 10.1007/978-3-642-40355-2_12 , ISBN978-3-642-40354-5.
↑ Dan Doel ( https://math.stackexchange.com/users/590896/dan-doel ), ¿ Tetración de los numerales de Church? , URL (versión: 2026-02-27): https://math.stackexchange.com/q/4601054
↑ Tromp, John (2007). "14. Cálculo lambda binario y lógica combinatoria" . En Calude, Cristian S (ed.). Aleatoriedad y complejidad, de Leibniz a Chaitin . World Scientific. pp. 237–262 . ISBN978-981-4474-39-9.Como PDF: Tromp, John (14 de mayo de 2014). "Cálculo lambda binario y lógica combinatoria" (PDF) . Recuperado el 24 de noviembre de 2017 .
↑ Jansen, Jan Martin (2013). "Programación en el cálculo lambda: De Church a Scott y viceversa". En Achten, Peter; Koopman, Pieter WM (eds.). La belleza del código funcional: ensayos dedicados a Rinus Plasmeijer con motivo de su 61.º cumpleaños . Lecture Notes in Computer Science. Vol. 8106. Springer. pp. 168–180 . doi : 10.1007/978-3-642-40355-2_12 . ISBN978-3-642-40354-5.
1 2 3 Trancón y Widemann, Baltasar; Parnas, David Lorge (2008). "Expresiones tabulares y programación funcional total". En Olaf Chitil; Zoltán Horváth; Viktória Zsók (eds.). Implementación y aplicación de lenguajes funcionales . 19.º Taller Internacional, IFL 2007, Friburgo, Alemania, 27-29 de septiembre de 2007. Artículos seleccionados revisados. Lecture Notes in Computer Science. Vol. 5083. pp. 228-229 . doi : 10.1007/978-3-540-85373-2_13 . ISBN978-3-540-85372-5.
↑ Jansen, Jan Martin; Koopman, Pieter WM; Plasmeijer, Marinus J. (2006). "Interpretación eficiente mediante la transformación de tipos de datos y patrones en funciones". En Nilsson, Henrik (ed.). Tendencias en programación funcional. Volumen 7. Bristol: Intellect. pp. 73–90 . CiteSeerX 10.1.1.73.9841 . ISBN978-1-84150-188-8.
↑ "Los predecesores y las listas no son representables en el cálculo lambda simplemente tipado" . Cálculo lambda y calculadoras lambda . okmij.org.
Cartwright, Robert. "Números eclesiásticos y booleanos explicados" (PDF) . Comp 311 — Revisión 2. Universidad Rice .
Kemp, Colin (2007). "§2.4.1 Church Naturals, §2.4.2 Church Booleans, Cap. 5 Técnicas de derivación para TFP" . Fundamentos teóricos para la 'programación totalmente funcional' práctica.(PhD). Escuela de Tecnología de la Información e Ingeniería Eléctrica, Universidad de Queensland. pp. 14–17 , 93–145 . CiteSeerX 10.1.1.149.3505 . Todo sobre la Iglesia y otras codificaciones similares, incluyendo cómo derivarlas y las operaciones que se realizan sobre ellas, desde los primeros principios.
Algunos ejemplos interactivos de numerales eclesiásticos
Tutorial en vivo de cálculo lambda: álgebra booleana
Categoría :
Cálculo lambda
Categorías ocultas:
Artículos con breve descripción
La descripción breve es diferente de Wikidata.
Artículos de Wikipedia que necesitan aclaración desde diciembre de 2019