Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 依赖类型可以证明您的代码符合规范要求。但如何证明该规范是正确的?_Haskell_Agda_Dependent Type_Idris_Type Theory - Fatal编程技术网

Haskell 依赖类型可以证明您的代码符合规范要求。但如何证明该规范是正确的?

Haskell 依赖类型可以证明您的代码符合规范要求。但如何证明该规范是正确的?,haskell,agda,dependent-type,idris,type-theory,Haskell,Agda,Dependent Type,Idris,Type Theory,依赖类型通常被宣传为一种使您能够断言程序符合规范的方法。因此,例如,您被要求编写一个对列表进行排序的代码——您可以通过将“排序”的概念编码为一个类型,并编写一个函数,例如列表a->SortedList a,来证明代码是正确的。但是如何证明规范SortedList是正确的呢?您的规范越复杂,您将该规范编码为类型的可能性就越大,这不是吗?这是任何规范语言(甚至英语)的问题,而不仅仅是依赖类型。您自己的帖子就是一个很好的例子:它包含一个非正式的“sort function”规范,只要求对结果进行排序,

依赖类型通常被宣传为一种使您能够断言程序符合规范的方法。因此,例如,您被要求编写一个对列表进行排序的代码——您可以通过将“排序”的概念编码为一个类型,并编写一个函数,例如
列表a->SortedList a
,来证明代码是正确的。但是如何证明规范SortedList是正确的呢?您的规范越复杂,您将该规范编码为类型的可能性就越大,这不是吗?

这是任何规范语言(甚至英语)的问题,而不仅仅是依赖类型。您自己的帖子就是一个很好的例子:它包含一个非正式的“sort function”规范,只要求对结果进行排序,这不是您想要的(
\xs->[]
将符合要求)。例如,参见Twan van Laarhoven的博客。

这是的静态类型系统版本

我能诚实地给出的唯一答案是,是的,您的规范越复杂和笨拙,就越有可能犯错误。你可以用类型理论的形式主义写一些东西,就像你可以把程序的描述形式化为可执行函数一样

希望您的规范足够简单和小,可以通过检查进行判断,而您的实现可能要大得多。一旦你有了一些“种子”想法,你就可以证明从这些想法中衍生出来的想法是正确的。从这个角度来看,越容易从更简单的部分机械地、可证明地派生出规范的部分,并最终从规范派生出实现,就越有可能得到正确的实现


但如何将某件事形式化还不清楚,这可能会导致你在将想法转化为形式主义时犯错误——你可能会犯错误——或者你可能会发现自己为了将想法形式化而进行类型理论研究。

我认为这是另一种方式:一个类型良好的程序不能证明是胡说八道(假设系统是一致的),而规范可能不一致或只是愚蠢。因此,问题不是“如何确保这段代码反映我的柏拉图式思想?”,而是“如何确保我的思想有意义地投射到纯语法规则的基础良好的平面上?”。如何确保你看到的鸟是一只知更鸟[对于一些提供的模仿鸟的概念]?好吧,研究鸟并提高你正确的机会。但是,就像你一样,你要100%确定

类型理论是一种通过引入形式规则(这是一篇非常相关的论文)和其他东西来缓解人类思维不完美的方法,它允许集中注意力,从而简化问题(正如布鲁沃所说:“数学只是我们思维的一部分而已”),但你不能指望任何工具使你的想法“正确”,因为没有统一的正确概念。瞧,没有办法将非正式和正式正式联系起来:非正式就像置身于
IO
monad中-没有逃避


所以这不是“这个语法反映了我非常精确的语义吗?”,而是“我能把我的原始语义附加到这个强结构语法上吗?”程序是适当的物质对象,而思想是繁琐的近似,只有通过惯例才能成为适当的物质对象。因此,我们使用惯例形成一些基础,然后我们才相信它,因为相信你众多思想中的一小部分比相信它们都要明智得多。

你如何证明这一点h是正确的?也就是说,你如何证明整数加法是计算苹果数的正确方法,或者你如何证明实数加法是增加权重的正确方法?形式/数学和非正式/实数之间总是有一个接口。找到合适的形式主义需要技巧和数学/物理品味用于解决特定问题。形式化方法无法消除这一点

形式化方法的价值有两方面:

  • 除非你知道你的程序实际上满足什么属性,否则你不会知道你的程序是否正确。在你知道你的排序例程是否“正确”之前,你首先必须知道它实际上做了什么。任何发现这一点的过程都将是一种形式化方法(甚至是单元测试!),所以拒绝使用“形式化方法”的人它们实际上只是将自己局限于可用方法的一小部分

  • 即使你知道如何找出一个程序的实际功能,人们的数学推理也会出错(我们不是理性的生物,不管某些意识形态如何宣称);因此,让一台机器检查我们是有帮助的。这与我们使用单元测试的原因相同——运行桌面检查并确保程序符合我们的要求是很好的;但是让计算机进行检查并告诉我们结果是否正确有助于防止错误。让计算机检查我们对程序行为的证明是正确的完全出于同样的原因


  • 形式化方法可以做的一件事,我认为其他人没有涉及到,就是帮助将简单的事情与更复杂的事情联系起来。您可能不知道如何确切地指定
    数据结构的行为方式,但如果您可以基于排序列表编写一个简单的版本,那么您就可以证明您的高级版本是基于balanc的ed搜索树通过
    toList
    函数与之正确关联。也就是说,您可以使用形式化方法将您对排序列表的信心转移到平衡搜索树上。

    假设您的函数不是顶级函数,而是其他人作为某个模块的一部分使用的,该模块也具有正确性p