who school runescape owns old news jagex community types lambda-calculus agda

types - school - ¿Por qué(Set-> Set) no puede tener el tipo Set?



steam runescape (2)

En Agda, el tipo de forall se determina de tal manera que todos los siguientes tienen el tipo Set1 (donde Set1 es el tipo de Set y A tiene el tipo Set ):

Set → A A → Set Set → Set

Sin embargo, lo siguiente tiene tipo Set :

A → A

Entiendo que si Set tuviera el tipo Set , habría contradicciones, pero no veo cómo, si alguno de los tres términos anteriores tuviera el tipo Set , tendríamos contradicciones. ¿Se pueden usar para probar lo falso? ¿Se pueden usar para mostrar ese Set : Set ?


Creo que la mejor manera de entender esto es considerar cómo son estas cosas como conjuntos teóricos de conjuntos, a diferencia de Set Agda. supongamos que tienes A = {a,b,c} . Un ejemplo de una función f : A → A es un conjunto de pares, digamos f = { (a,a) , (b,b) , (c,c) } que satisface algunas propiedades que no importan para esto discusión. Es decir, los elementos de f son el mismo tipo de cosas que los elementos de A: son solo valores, o pares de valores, nada demasiado "grande".

Ahora considere la función a F : A → Set . También es un conjunto de pares, pero sus pares se ven diferentes: F = { (a,A) , (b,Nat) , (c,Bool) } digamos. El primer elemento de cada par es solo un elemento de A , así que es bastante simple, ¡pero el segundo elemento de cada par es un Set ! Es decir, el segundo elemento es en sí mismo un tipo de cosa "grande". Por lo tanto, es posible que A → Set no se pueda configurar, porque si lo fuera, entonces deberíamos poder tener algo de G : A → Set que se parece a G = { (a,G) , ... } . Tan pronto como podamos tener esto, podemos obtener la paradoja de Russell. Así que decimos A → Set : Set1 lugar.

Esto también aborda la cuestión de si Set → A también debe estar en Set1 en lugar de Set , porque las funciones en Set → A son como las funciones en A → Set , excepto que los A s están a la derecha, y Set s están a la izquierda, de los pares.


Está claro que Set : Set causaría una contradicción, como la paradoja de Russell .

Ahora considere () -> Set donde () es un tipo de unidad . Esto es claramente isomorfo para Set . Así que si () -> Set : Set entonces Set : Set . De hecho, si para cualquier A habitada teníamos A -> Set : Set entonces podríamos ajustar Set en A -> Set usando una función constante:

wrap1 : {A : Set} -> Set -> (A -> Set) wrap1 v = /_ -> v

y obtener el valor cuando sea necesario como

unwrap1 : {A : Set}(anyInhabitant : A) -> (A -> Set) -> Set unwrap1 anyInhabitant f = f anyInhabitant

Así podríamos reconstruir la paradoja de Russell como si tuviéramos Set : Set .

Lo mismo se aplica para Set -> Set , podríamos ajustar Set en Set -> Set :

data Void : Set where unwrap2 : (Set -> Set) -> Set unwrap2 f = f Void wrap2 : Set -> (Set -> Set) wrap2 v = /_ -> v

Aquí podríamos usar cualquier tipo de Set lugar de Void .

No estoy seguro de cómo hacer algo similar con Set -> A , pero intuitivamente esto parece ser un tipo aún más problemático que los otros, tal vez alguien más lo sepa.