【发布时间】:2020-05-21 16:08:28
【问题描述】:
我定义了一个这样的归纳类型:
inductive I :: "tau ⇒ bool" where
rule0: "I C0" |
rule1: "I x" |
rule2: "Q x ⟹ I x" |
rule3: "Q x ⟹ I x'" |
rule4: "Q x ⟹ I (C1 x)" |
rule5: "Q (C1 x) ⟹ I x" |
rule6: "Q (C1 x) ⟹ I x'" |
rule7: "Q x ⟹ I (C2 x' x'')"
我认为这已经足够了,但伊莎贝尔抱怨/警告我:
Additional type variable(s) in specification of "I": 'a, 'b
我不明白这是什么意思。我知道这是说我应该把归纳谓词放在某个地方接受任何两种类型(如类型变量'a 和'b 所示)。但这不是我想做的。我只希望输入始终为tau 类型,即:
datatype tau =
C0 |
C1 tau |
C2 tau tau
显然,这些定义是虚构的,并不是真的要证明什么。我只是想检查一下它使用这些定义生成的定理(特别是归纳法)。
1) 我如何让它停止抱怨我的变量是任意类型并让它们始终是 tau 类型?
另外,我真的很好奇投诉的含义以及如何使用'a 和'b 语法修复它,这是建议。虽然这不是我最初的意图,但我很想看看我的归纳谓词的更一般定义,看看它会产生什么归纳定理。
2) 我如何用 Isabelle 想要的任意类型定义我的归纳谓词?我在哪里把'a 和'b 放在定义中?如果我不这样做会怎样?
【问题讨论】:
-
这是规则 4 和 7 的原因。左侧包含一个变量
x,它没有出现在右侧。而且,你还没有说Q是什么。它是一个变量吗?是参数吗?它的类型是什么?目前,Isabelle 只是认为Q可以是任何谓词,因此仅通过规则 3,您就可以证明I x对所有x都是正确的。这也是额外类型变量的来源。您的定义中没有任何内容限制规则 3 和 7 中x的类型,因此 Isabelle 推断这些可以具有任何类型。 -
@ManuelEberl Isabelle 正确推断
Q是任何谓词。我认为它这样做是因为它在元含义的 LHS 上,所以这是理解它的一种方式(也许是唯一的方式)。我知道for r where成语。我认为这是以某种方式修复谓词。也许我可以在那里输入它的类型。我还没有彻底玩过它,所以我不是 100% 会发生什么。感谢您指出这一点。 -
@ManuelEberl 是通过说出
Q的类型来约束它们的唯一方法?我希望Q他 any 类型为tau => bool的谓词(但不固定)。