isabelle - 如何在 Isabelle 的归纳类型规范中添加其他类型变量?
问题描述
我定义了一个这样的归纳类型:
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
。虽然这不是我最初的意图,但我很想看到我的归纳谓词的更一般定义,并看看它会产生什么 iduct 定理。
2) 如何用 Isabelle 想要的任意类型定义我的归纳谓词?我在哪里'a
和'b
定义?如果我不这样做会发生什么?
解决方案
为了限制我的规则中的类型,我可以修饰归纳定义中的类型I
:
inductive I :: "tau ⇒ bool" where
rule0: "I C0" |
rule1: "I x" |
rule2: "Q x ⟹ I x" |
rule3: "Q (x::tau) ⟹ I x'" |
rule4: "Q x ⟹ I (C1 x)" |
rule5: "Q (C1 x) ⟹ I x" |
rule6: "Q (C1 x) ⟹ I x'" |
rule7: "Q (x::tau) ⟹ I (C2 x' x'')"
现在的定理是这样的:
thm I.induct
⟦I ?x; ?P C0; ⋀x. ?P x; ⋀Q x. Q x ⟹ ?P x; ⋀Q x x'. Q x ⟹ ?P x'; ⋀Q x. Q x ⟹ ?P (C1 x); ⋀Q x. Q (C1 x) ⟹ ?P x; ⋀Q x x'. Q (C1 x) ⟹ ?P x'; ⋀Q x x' x''. Q x ⟹ ?P (C2 x' x'')⟧ ⟹ ?P ?x
谢谢曼努埃尔·埃伯尔!
推荐阅读
- python - Python 和 WebSockets - 如何在不阻塞的情况下从服务器发送到客户端?
- api-gateway - 指向 DigitalOcean 域的 AWS API 网关
- python - 两个连续 3d 向量之间的角度
- chunks - fastboot flash 系统失败:写入“系统”失败(远程:“Malloc 失败:CHUNK_TYPE_FILL”)
- rabbitmq - 使用 CELERY 消费者时 Rabbitmq 中的高消息准备就绪
- python-3.x - 收到此错误: (psycopg2.errors.NumericValueOutOfRange) 整数超出范围但未插入 Bigint
- celery - 带有 AWS SQS 队列的 Celery 突然无法连接
- python-3.x - 为什么 np.std() 和 pivot_table(aggfunc=np.std) 返回不同的结果
- mysql - mysql 权限无法正常工作
- webrtc - 如何使用 simpleWebRTC SDK 增加 channelMessage 最大大小