依存类型与细化类型


57

有人可以解释依赖类型和优化类型之间的区别吗?据我了解,精简类型包含满足谓词的类型的所有值。有依赖类型的特征来区分它们吗?

如果有帮助,我通过Liquid Haskell项目遇到了精炼类型,并通过Coq和Agda遇到了依赖类型。就是说,我正在寻找有关理论差异的解释。

Answers:


33

主要区别在于两个方面-在基础理论和如何使用它们方面。让我们只关注后者。

作为用户,LiquidHaskell和精炼类型系统中的规范“逻辑”通常仅限于可确定的片段,因此验证(和推断)是完全自动的,这意味着不需要完整的“证明项”依赖设置。这导致了显着的自动化。例如,比较LH中的插入排序:

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

与伊德里斯

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

但是,自动化需要付出一定的代价。在完全依赖的世界中,不能像在完全依赖的世界中那样使用任意函数作为规范,这限制了人们可以编写的属性类别。

因此,优化系统的一个目标是扩展可以指定的类别,而完全依赖系统的目标是使 可以证明的自动化。也许有一个快乐的聚会场所,我们可以两全其美!


是否有办法以某种方式机械地将基于精化类型的规范映射到基于依存类型的规范?还是对这种“同构”还没有足够的研究?
Erik Allik '16

1
对AFAIK这样的“同构”还没有进行很多研究。不过,最近有一些工作,请参阅:Lehmann和Tanter的“在Coq中形式化简单细化类型”(很快就会出现……这是GH回购:github.com/pleiad/Refinements
Ranjit Jhala

Scala中与路径相关的类型如何?
杨波

1
@RanjitJhala我认为您不小心在最后一段中弄错了目标?
诺多林

1
@Noldorin我想说Ranjit正确理解了他的最后一段。“提炼类型……限于可判定的片段,以使验证(和推断)是完全自动的”与“……依赖于……[类型]的证明词”。因此,在细化类型中工作的人们试图扩展可以在细化类型中指定的数量,同时仍然可以自动推断/验证,而在从属类型中工作的人们则试图使证明项的生成自动化。
雷夫

22

TPT

{v:TP(v)}
T

{x:T1T2P}

[1]中描述的Liquid Type系统确实是可判定的,Liquid Haskell确实使用SMT求解器。但是,Liquid Haskell也需要证明项(或值,因为它们是用非依赖类型的语言来调用的):如果您坐下来编写Liquid Haskell程序,那么您将编写自己的函数,而不仅仅是类型。

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


1
可以使用类似于教堂的编码将sigma编码为pi,但是AFAIK Liquid Haskell的精炼函数类型不是pi(从属函数)类型。
fread2281 2015年

15

依赖类型是以任何方式依赖值的类型。一个典型的例子是“长度向量的类型n”,其中n是一个值。就像您在问题中所说的那样,精简类型由满足给定谓词的给定类型的所有值组成。例如正数的类型。这些概念并不是特别相关(据我所知)。当然,您也可以合理地具有从属细化类型,例如“大于所有数字的类型n”。


3
一个是另一个的子集吗?细化类型似乎可以使用SMT来解决,但是从属类型需要您自己的证明条件...
jmite 2014年

4
“一个是另一个的子集吗?” 不。这就是为什么我给出了不依赖于精炼类型和不依赖于精炼类型的例子。
Alexey Romanov 2014年

8
细化类型不能用sigma编码吗?
fread2281 2015年

3
您的示例似乎无法证明您的观点。正数定义为大于0的那些数字。这是否表示“正数的类型”恰好是“所有大于0”的数字的类型?
akdom

2
不可能有一个精炼谓词也强制向量的长度吗?
CMCDragonkai
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.