为什么以下工作:
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
答案 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无法为它们生成代码。