如何在Isabelle/HOL中伪造存在类型?

如何在Isabelle/HOL中伪造存在类型?,isabelle,existential-type,Isabelle,Existential Type,考虑以下简单过程语言的Isabelle/HOL定义: typedecl channel datatype process = Put channel char process | Get "char ⇒ process" | Stop 这种语言支持通过通道发送和接收字符 现在我想要有类型化的频道。通道类型应具有可作为参数传输的值类型: typedecl 'a channel Put和Get数据构造函数应具有以下(多态)类型: 然而,这需要支持数据类型中的存在量化,而Isabelle/HOL

考虑以下简单过程语言的Isabelle/HOL定义:

typedecl channel

datatype process = Put channel char process | Get "char ⇒ process" | Stop
这种语言支持通过通道发送和接收字符

现在我想要有类型化的频道。
通道
类型应具有可作为参数传输的值类型:

typedecl 'a channel
Put
Get
数据构造函数应具有以下(多态)类型:

然而,这需要支持数据类型中的存在量化,而Isabelle/HOL没有

我试图伪造存在量化,并提出以下尝试:

typedecl put
axiomatization put :: "['a channel, 'a] ⇒ put" where
  put_inject: "put a x = put b y ⟷ a = b ∧ x = y"

bnf_axiomatization 'r get
axiomatization get :: "['a channel, 'a ⇒ 'r] ⇒ 'r get" where
  get_inject: "get a f = get b g ⟷ a = b ∧ f = g"

datatype process = Put put process | Get "process get" | Stop
不幸的是,这会导致以下错误消息:

Type definition with open dependencies, use "typedef (overloaded)" or enable configuration option "typedef_overloaded" in the context.
  Type:  process
  Deps:
  map_get(process.process_IITN_process
          ⇒ (process_pre_process_bdT + process_pre_process_bdT process_pre_process) set ⇒ bool,
           (process_pre_process_bdT + process_pre_process_bdT process_pre_process) set ⇒ bool),
  bd_get,
  set_get(process.process_IITN_process
          ⇒ (process_pre_process_bdT + process_pre_process_bdT process_pre_process) set ⇒ bool)
The error(s) above occurred in typedef "process"

我的尝试是否合理?如果合理,我如何解决这个问题?有更好的解决方案吗?

事实上,
get
的公理与
bnf\u公理化不一致。但是,如果您将自己限制为可数类型
'a
,则存在此类类型。一旦你修正了这样一个基数界限,你甚至不必恢复到公理化。然后,可以在HOL中使用通用域的编码和解码函数模拟存在类型

例如,对于可数类型,自然数可以用作通用域。例如,在
命令式\u-HOL
中,它被用来对可以存储类型化值的堆进行建模,请参阅。哈夫曼也为伊莎贝尔的领域理论库做了类似的事情


有了这样的编码,您可以使用非类型化通道构造进程的数据类型,然后根据需要使用编码和解码函数在数据类型上创建一个类型安全视图。

同时,我发现,内射函数
get
的存在使得
get
类型成为一个与该语句相矛盾的无界函子它是一个有界自然函子(BNF)。因此,此代码应引入逻辑不一致性。然而,这应该通过限制
'a
的基数来解决,例如,通过要求
'a
可数的
的实例。
Type definition with open dependencies, use "typedef (overloaded)" or enable configuration option "typedef_overloaded" in the context.
  Type:  process
  Deps:
  map_get(process.process_IITN_process
          ⇒ (process_pre_process_bdT + process_pre_process_bdT process_pre_process) set ⇒ bool,
           (process_pre_process_bdT + process_pre_process_bdT process_pre_process) set ⇒ bool),
  bd_get,
  set_get(process.process_IITN_process
          ⇒ (process_pre_process_bdT + process_pre_process_bdT process_pre_process) set ⇒ bool)
The error(s) above occurred in typedef "process"