You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Isabelle中下标式可实例化定义的用法及资料查询

Isabelle 中带后缀的 datatype 定义详解

核心本质:参数化容器绑定

你看到的_fs后缀并非单纯命名装饰,它是Isabelle/HOL中参数化数据类型结合特定容器类型的惯用写法,核心是通过后缀明确数据类型依赖的容器实现(这里fs对应fset有限集合类型),本质是利用Isabelle的类型系统实现可替换的容器实例化。

详细信息获取渠道

  • 你参考的《(Co)datatype定义教程》后续章节(第3章及以后):专门讲解了递归类型、参数化datatype与容器类型的结合规则,包含这类后缀式实例化的具体实现逻辑。
  • Isabelle/HOL标准库源码:查看~~/src/HOL/Library/FSet.thy文件,里面有大量_fs后缀的类型定义,能直接看到这类绑定的实际写法。
  • 《Programming and Proving in Isabelle/HOL》教程:其中递归类型与抽象容器的章节,有分步的实例化示例。

如何使用这类下标式定义

1. 基础绑定:直接关联容器类型

以tree_fs为例,它是将树的子节点集合绑定到fset的实例,写法拆解:

datatype 'a tree_fs = Node_fs (lbl_fs:'a) (sub_fs: "'a tree_fs fset")

若要替换为其他容器(比如普通列表list),只需修改后缀和容器类型:

datatype 'a tree_list = Node_list (lbl_list:'a) (sub_list: "'a tree_list list")

2. 类型类实现通用定义

如果需要避免重复写datatype定义,可通过类型类约束实现通用树类型,再为不同容器做实例化:

class container = fixes empty :: "'a" and insert :: "'b ⇒ 'a ⇒ 'a"
datatype 'a tree = Node (lbl:'a) (sub: "'a tree :: container")

为fset、list等容器实现container类型类的实例后,即可自动适配对应的树类型。

3. 局部化(Locale)封装实例

局部化是Isabelle实现参数化实例的常用方式,通过Locale绑定容器类型和操作,再生成对应的数据类型:

locale tree_container =
  fixes container_type :: "'a ⇒ 'b"
  fixes empty_container :: "'b"
begin
datatype 'a tree = Node (lbl:'a) (sub: "'a tree container_type")
end

(* 实例化到fset *)
interpretation tree_fset: tree_container "λx. x fset" "{}"
(* 此时得到tree_fset.tree,对应之前的tree_fs *)

关键注意事项

  • 后缀是社区约定而非语法强制,统一后缀能提升代码可读性,明确类型依赖的容器。
  • 递归类型与容器结合时,需确保容器支持递归类型实例化(比如fset支持递归,部分简单容器可能不允许)。

内容的提问来源于stack exchange,提问作者alagris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:35:26