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

时间:2018-07-18 19:26:14

标签: isabelle existential-type

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

typedecl channel

datatype process = Put channel char process | Get "char ⇒ process" | Stop

该语言支持通过通道发送和接收字符。

现在我想输入频道。 channel类型应具有可以作为参数传输的值的类型:

typedecl 'a channel

PutGet数据构造函数应具有以下(多态)类型:

Put :: "['a channel, 'a, process] ⇒ process"
Get :: "['a channel, 'a ⇒ process] ⇒ process"

但是,这需要支持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"

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

1 个答案:

答案 0 :(得分:2)

实际上,get的公理与bnf_axiomatization不一致。但是,如果将自己限制为可计数的类型'a,则该类型存在。一旦解决了这样的基数约束,您甚至不必重新进行公理化。然后可以使用通用域中的编码和解码功能在HOL中模拟现有类型。

例如,对于可数类型,自然数可以用作通用域。例如,在Imperative_HOL中已使用它来建模可以存储类型化值的堆,请参见the paper from 2008。霍夫曼(Huffman)为伊莎贝尔(Isabelle)的领域理论库HOLCF做了类似的事情。

使用适当的编码后,您将使用无类型通道构造进程的数据类型,然后根据需要使用编码和解码功能在该数据类型上创建类型安全视图。