Tipos dependientes vs tipos de refinamiento

58

¿Alguien podría explicar la diferencia entre los tipos dependientes y los tipos de refinamiento? Según tengo entendido, un tipo de refinamiento contiene todos los valores de un tipo que cumple un predicado. ¿Existe una característica de los tipos dependientes que los distingue?

Si ayuda, me encontré con tipos refinados a través del proyecto Liquid Haskell, y tipos dependientes a través de Coq y Agda. Dicho esto, estoy buscando una explicación de cómo difieren las teorías.

jmite
fuente

Respuestas:

33

Las principales diferencias son a lo largo de dos dimensiones: en la teoría subyacente y en cómo se pueden usar. Vamos a centrarnos en lo último.

Como usuario, la "lógica" de las especificaciones en LiquidHaskell y los sistemas de tipo de refinamiento en general, se restringe a fragmentos decidibles para que la verificación (e inferencia) sea completamente automática, lo que significa que uno no requiere "términos de prueba" del tipo necesario en su totalidad entorno dependiente Esto lleva a una automatización significativa. Por ejemplo, compare el orden de inserción en LH:

http://ucsd-progsys.github.io/lh-workshop/04-case-study-insertsort.html#/ordered-lists

vs. en Idris

https://github.com/davidfstr/idris-insertion-sort/blob/master/InsertionSort.idr

Sin embargo, la automatización tiene un precio. No se pueden usar funciones arbitrarias como especificaciones como se puede en el mundo totalmente dependiente, lo que restringe la clase de propiedades que uno puede escribir.

Por lo tanto, un objetivo de los sistemas de refinamiento es extender la clase de lo que se puede especificar, mientras que la de los sistemas totalmente dependientes es automatizar lo que se puede probar. ¡Quizás haya un lugar de encuentro feliz donde podamos obtener lo mejor de ambos mundos!

Ranjit Jhala
fuente
¿Hay alguna manera de mapear de alguna manera mecánicamente desde especificaciones basadas en tipos de refinamiento a especificaciones basadas en tipos dependientes? ¿O tal "isomorfismo" aún no se ha estudiado lo suficiente?
Erik Allik
1
AFAIK tal "isomorfismo" no se ha estudiado mucho. Sin embargo, hay algunos trabajos recientes, ver: "Formalización de tipos de refinamiento simples en Coq" de Lehmann y Tanter (que aparecerá pronto ... aquí hay un repositorio de GH: github.com/pleiad/Refinements )
Ranjit Jhala
¿Qué hay de los tipos dependientes de ruta en Scala?
Yang Bo
1
@RanjitJhala ¿Creo que accidentalmente conseguiste tus objetivos en el párrafo final al revés?
Noldorin
1
@Noldorin Diría que Ranjit acertó su último párrafo. "tipo de refinamiento ... restringido a fragmentos decidibles para que la verificación (e inferencia) sea completamente automática" vs "términos de prueba ... necesarios en ... [tipos] dependientes". Por lo tanto, las personas que trabajan en tipos de refinamiento intentan ampliar la cantidad que se puede especificar en un tipo de refinamiento sin dejar de ser automáticamente irrevocable / verificable, mientras que los que trabajan en tipos dependientes intentan automatizar la generación de términos de prueba.
Raiph
22

TPAGST

{v:TPAGS(v)}
T .

{X:T1T2PAGS} [1]. Tenga en cuenta que los tipos totalmente dependientes (como los tipos sigma) no están permitidos.

El sistema de tipo líquido, descrito en [1], es decidible y Liquid Haskell utiliza solucionadores SMT. Sin embargo, Liquid Haskell también requiere términos de prueba (o valores, como se los llama en un lenguaje de tipo no dependiente): si te sientas a escribir un programa de Liquid Haskell, escribes tus propias funciones, no solo los tipos.

[1] http://goto.ucsd.edu/~rjhala/liquid/liquid_types.pdf

Daniil
fuente
1
sigma se puede codificar con pi utilizando una codificación similar a una iglesia, pero los tipos de función de refinamiento de haskell líquido AFAIK no son tipos pi (función dependiente).
fread2281
15

Los tipos dependientes son tipos que dependen de los valores de cualquier manera. Un ejemplo clásico es "el tipo de vectores de longitud n", donde nes un valor. Los tipos de refinamiento, como usted dice en la pregunta, consisten en todos los valores de un tipo dado que satisfacen un predicado dado. Por ejemplo, el tipo de números positivos. Estos conceptos no están particularmente relacionados (que yo sepa). Por supuesto, también puede razonablemente tener tipos de refinamiento dependientes, como "tipo de todos los números mayores que n".

Alexey Romanov
fuente
3
¿Es uno un subconjunto del otro? Los tipos de refinamiento parecen resolverse con SMT, pero los tipos dependientes requieren sus propios términos de prueba ...
jmite
44
"¿Uno es un subconjunto del otro?" No. Por eso di los ejemplos de un tipo de refinamiento que no es dependiente y un tipo dependiente que no es un refinamiento.
Alexey Romanov
8
¿no se pueden codificar los tipos de refinamiento con sigma?
fread2281
3
Su ejemplo no parece demostrar su punto. Los números positivos se definen como aquellos números mayores que 0. ¿Esto no significa que "el tipo de números positivos" es precisamente "el tipo de todos los números mayores que 0"?
akdom
2
¿No es posible que haya un predicado de refinamiento que también imponga la longitud del vector?
CMCDragonkai