Questions tagged «type-theory»

指定对象属性的形式系统

2
严格的积极性
来自这个参考文献:严格的积极性 严格的阳性条件排除了诸如 data Bad : Set where bad : (Bad → Bad) → Bad A B C -- A is in a negative position, B and C are OK 为什么A是负数?又为什么允许B?我了解为什么允许使用C。

1
自类型是否会使归纳构造的微积分过时?
自我类型是构造微积分[1]的扩展,允许语言表达通过Scott编码编码的代数数据类型。Scott编码提供了一种模式匹配功能O(1),这是在CC中包含归纳定义的主要动机之一。然而,“自我类型”却使基础理论变得更加简单和优雅,并且似乎同样强大。 从理论的角度来看,自我类型会否使CIC过时,或者在某些方面CIC相对于Self Tyes是有利的? [1] http://staff.computing.dundee.ac.uk/pengfu/document/talks/mvd-2012.pdf

5
类型理论的日常应用
我想了解类型理论,但是我首先必须知道如何应用它。除了在编程中使用类型系统之外,类型理论还会有更多非显而易见的应用吗?可以说其他应用程序,比如性格分析之类的吗?

1
类型理论中“正位置”和“负位置”的含义?
在类型理论的背景下,“处于正面位置”和“处于负面位置”是什么意思? 我从鲍勃·哈珀(Bob Harper)的博客文章中唯一了解到的是类型理论中的极性与逻辑上的极性之间存在联系,但我不知道这种联系是什么。

2
仅使用Hindley-Milner类型系统定义列表
我正在开发一个小型lambda演算编译器,该编译器具有运行正常的Hindley-Milner类型推断系统,并且现在还支持递归let(不在链接代码中),据我所知应该足以使Turing完成。 现在的问题是我不知道如何使它成为支持列表,或者它是否已经支持它们,我只需要找到一种编码它们的方法。我希望能够定义它们,而不必向类型系统中添加新规则。 我想到的一个列表的最简单方法x是将其作为null(或为空列表),或同时包含x和的列表对x。但是要做到这一点,我需要能够定义对和或,我相信它们是乘积和总和类型。 看来我可以这样定义对: pair = λabf.fab first = λp.p(λab.a) second = λp.p(λab.b) 因为pair将具有类型a -> (b -> ((a -> (b -> x)) -> x)),所以在传递一个int和一个后string,它会产生一个带有类型的东西(int -> (string -> x)) -> x,这将是一对intand 的表示string。这里令我困扰的是,如果那个代表一对,那为什么在逻辑上不等同于或暗示这个命题int and string呢?但是,等效于(((int and string) -> x) -> x),好像我只能将产品类型作为函数的参数一样。这个答案似乎解决了这个问题,但我不知道他使用的符号是什么意思。另外,如果这不能真正对产品类型进行编码,那么我对上面的对的定义无法做到的产品类型(考虑到我也可以用相同的方式定义n元组)做任何事情?如果不是,这是否与仅使用蕴涵就不能表达(AFAIK)连词的事实相矛盾? 另外,总和类型呢?我可以仅使用函数类型以某种方式对其进行编码吗?如果是这样,是否足以定义列表?否则,是否有其他方法可以定义列表而不必扩展我的类型系统?如果不是这样,如果我想使其尽可能简单,我需要进行哪些更改? 请记住,我是计算机程序员,但不是计算机科学家或数学家,并且在阅读数学符号方面相当不擅长。 编辑: 我不确定到目前为止实现的技术名称是什么,但是我所拥有的基本上只是上面链接的代码,这是一种约束生成算法,使用应用程序规则,抽象规则和变量先从Hinley-Milner算法开始,然后是获得主体类型的统一算法。例如,该表达式\a.a将产生type a -> a,并且该表达式\a.(a a)将引发一个发生检查错误。最重要的是,这里没有一个确切的let规则,但是一个函数似乎具有与您定义递归全局函数(如此伪代码)相同的作用: GetTypeOfGlobalFunction(term, globalScope, nameOfFunction) …

1
为什么Coq会在其核心语言中包含let表达式
Coq在其核心语言中包含let表达式。我们可以这样将let表达式转换为应用程序: let x : t = v in b ~> (\(x:t). b) v 我知道这并不总是可行,因为v在进行typechecking时该值不可用b。但是,可以通过特殊外壳对表单应用程序进行类型检查来轻松解决此问题(\(x:t). b) v。这使我们可以在进行类型检查时以特殊情况为代价删除let表达式。为什么Coq include仍然包含let表达式?它们是否还有其他优点(除了不需要特殊情况)?

1
类型系统可以用作外部功能的证明助手吗?
鉴于: 具有非常有表现力的类型系统的语言(例如Idris)也可以具有转义机制,例如外部函数接口/ unsafePerformIO。 有一些证明助手可以用来证明用某种语言编写的程序的某些特性,而该语言没有能够表达这些特性的类型系统。 Curry-Howard的对应关系表明,具有给定类型的函数的类型检查成功实现是该类型所表示内容的证明。 可以在母语的类型系统中表达外语代码某些属性的非平凡的证明吗? 例如,假设我有一个名为stable_qsort的C函数,该函数以非常巧妙和高效的方式对数字进行排序,同时保持已经相等的元素的顺序,还有一个Idris程序通过其FFI调用stable_qsort,但是我不相信这种相对晦涩的方法C函数。我可以证明该函数不会在我的Idris代码中对所有输入重新排序相等的元素,而不是使用单独的证明助手吗?

1
什么是超级宇宙?
我正在阅读这篇关于类型论中的宇宙的著名论文。起初,我期望与SetωAgda 类似,但事实证明,它甚至更通用。它似乎将Universe构造从普通的归纳-递归类型推广到粘合剂(类似于和)。我想问的主要问题是,它的目的是什么?ΠΠ\PiΣΣ\Sigma 以下是一些Idris代码,它们定义了通常的Tarski风格的Universe: mutual public export data U : (level : Nat) -> Type where GroundU : Ground -> U level BinderU : Binder -> (a : U level) -> (b : (x : T {level} a) -> U level) -> U level UnivU : U (S level) LiftU : …

2
在类型系统中证明分类操作
我想知道编程语言中的类型系统可以带来多大的好处。例如,我知道在依赖类型的编程语言中,我们可以创建一个Vector在类型签名中合并向量大小的类。这就像事实上的例子。我们还可以append使用这些签名编写函数,以便编译器证明结果列表的大小将是输入列表的总和。 例如,是否有一种方法可以对排序算法的类型签名进行编码,以便编译器保证结果列表是输入列表的排列?如果可能的话,如何做到这一点?

2
类型推断+重载
我正在寻找一种针对我正在开发的语言的类型推断算法,但找不到适合我需求的语言,因为它们通常是: Haskellà具有多态性,但没有临时重载 àla C ++(自动),其中有特定的重载,但函数是单态的 特别是我的类型系统是(简化)(我使用的是Haskellish语法,但这与语言无关): data Type = Int | Double | Matrix Type | Function Type Type 而且我有一个运算符*,其中有很多重载: Int -> Int -> Int (Function Int Int) -> Int -> Int Int -> (Function Int Int) -> (Function Int Int) (Function Int Int) -> (Function Int Int) -> (Function …

1
假设Type的错误命题示例
在类型理论中,如果允许类型成为其自身的一员,则会使该理论前后矛盾。我以类似于集合论中罗素的悖论来理解它,但更希望看到它以类型论来完成。类型理论中是否有一个简短的等价示例?
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.