伊莎贝尔:用量词评估公式

时间:2013-09-16 01:51:14

标签: isabelle

为什么以下工作:

fun f :: "nat ⇒ bool" where
  "f _ = (True ∨ (∀x. x))"

但这失败了

fun g :: "nat ⇒ bool" where
  "g _ = (True ∨ (∀a. True))"

Additional type variable(s) in specification of "g_graph": 'a 
Specification depends on extra type variables: "'a"
The error(s) above occurred in "test.g_sumC_def"
The error(s) above occurred in definition "g_sumC_def":
  "g_sumC ≡ λx. THE_default undefined (g_graph TYPE('a) x)"

同样,以下成功,

value "True ∨ (∀x. x)"

但是失败了

value "True ∨ (∀x. True)"

Wellsortedness error:
Type 'a not of sort enum
Cannot derive subsort relation {} < enum

2 个答案:

答案 0 :(得分:3)

简短的回答是:在您的第一个函数定义中,类型推断很容易推断x的类型为bool,而在第二个定义中,绑定变量{{ 1}}在其他任何地方都没有使用,因此它的类型是任意的(a)。这是规范中的附加类型变量... 表示的内容。

如果明确约束'a的类型,例如

a

接受函数定义。

更长的回答:由于fun g :: "nat ⇒ bool" where "g _ = (True ∨ (∀a::bool. True))" 的定义不是递归的,您可以将其转换为使用g而不是definition。然后你的第一次尝试不会完全失败,但结果可能会让你大吃一惊。之后

fun

definition g :: "nat ⇒ bool" where "g _ = (True ∨ (∀a. True))" 的类型为g,而不是预期的'a itself => nat => bool。原因与之前nat => bool的失败相同。由于fun是任意类型,因此必须以a的类型记录此附加类型,这是通过引入另一个伪参数来完成的,该参数仅显式声明此附加类型。这里g是一种类型,其构造函数'a itself - 以类型作为参数 - 允许我们对术语级别的类型信息进行编码。如,

TYPE(...)

然后TYPE('a) :: 'a itself TYPE(bool) :: bool itself TYPE(nat) :: nat itself g TYPE(nat)的版本,其中g被修复为a类型。

关于你的nat陈述,第二个失败的原因与上述内容无关。在第一个语句中,通用量词绑定类型为value的变量,其值可以显式枚举,因此可以通过考虑所有这些值来计算。相反,在第二个语句中,绑定变量bool具有任意类型x,其值无法显式枚举。

答案 1 :(得分:1)

以下失败:

fun f where "f _ = (∀a. True)"

因为a的类型有隐藏多态(即函数体内有一个类型变量,函数的类型签名中没有),这会扰乱函数包的内部证据。

如果您明确指定a类型:

fun f where "f _ = (∀a::bool. True)"

或者你是否给a一个同样在函数类型签名中的类型,如下所示:

fun f where "f _ = (∀a::bool. True)"

函数定义成功。你的例子:

fun f where "f _ = (∀x. x)"

成功,因为x被强制为bool类型。

对于您的value命令,Isabelle尝试为您的表达式生成可执行代码,因此不仅需要了解for-all语句的类型,还需要能够枚举它的所有可能值,以便它可以测试它们。诸如bool之类的类型可以正常工作,但类型变量(如'a)或无限类型(如nat)不可枚举,因此Isabelle无法为它们生成代码。