空排序'a :: {}和一种“type”,'a :: type之间的区别是什么

时间:2014-09-12 15:41:19

标签: isabelle

下面,注释显示了term命令的输出:

declare[[show_sorts]]

term "x"

(* "x::'a::{}" :: "'a::{}" *)

term "x::'a"

(* "x::'a::type" :: "'a::type" *)

在关于类型类的节标题中,我使用短语“nat to type”,当我的意思是“nat to”a“(我不使用,因为单词在标题中通常效果更好)

我需要简明扼要,但如果我也合理,技术上正确,那就更好了。

更新:在这里,我试着澄清一下我在问什么。我想我是这样说的:

我很困惑。命令term "x"显示x的类型为'a,而'a的类型为{}。特别是事后看来,与term "x::'a"相比,某种{}并不是我对'a所期望的。在这里,好像很多次,我会向软件寻求答案,当它告诉我'a x没有任何排序时,这让我感到奇怪。

因此,我最少给x类型'a,这导致'a排序type。这种答案对我有意义。并非'a必须排序type,但'a至少应该排序,尽管我最初的动机是确保自己'a类型class是排序type

从Lars的回答中,我想到类型推理引擎尽可能广泛地解释了一种类型,所以我认为这是其中的核心。

更新2

从Lars的附加评论中可以看出,至少在我看来,理解'a::{}的关键词是“排序约束”,“排序约束”中的“约束”赋予{{{ 1}}。

对于那些有兴趣研究类型和种类语言的微妙之处的人来说,这里有一些资料来源:

{}

1 个答案:

答案 0 :(得分:1)

排序是类型类的交集。因此,最常见的排序是完整排序,写为{}(即空交集)。如果排序仅包含单个类,则省略花括号。

在Isabelle / HOL中,type是一种HOL类型(与逻辑框架的类型相反,最明显的是命题类型prop。所以,你通常使用的所有类型with(boolnatint,对,列表,使用typedef或datatype定义的类型)将具有排序type

这保证了对象逻辑类型(例如,HOL)和逻辑框架(即Isabelle / Pure)之间的分离:逻辑框架的运算符可用于组成HOL表达式,但不能在HOL内部发生表达式。

因此,在Isabelle / HOL中工作时,您几乎总是希望表达式排序type,因此type被声明为默认排序,这意味着如果没有给出额外的约束,类型推断将使用它而不是空排序。

然而,由于类型推断设置的缺点(?),在一些罕见的情况下,类型推断仍然推断出空排序。这可能会产生令人惊讶的错误。