isabelle - 在 Isabelle 中计算关系运算符时如何处理“引发异常匹配”?
问题描述
refl
在 Isabelle (2020) 的 Main 中,我无法正确使用关系运算符。我假设refl
如果关系是自反的,则返回 true,与refl_on
上面的示例相同。但我仍在学习这些符号。
进一步来说:
value "refl_on {True,False} {(True,True),(False,False)}"
True
按预期给出。我认为refl
是相同的,但以下内容:
value "refl {(True,True),(False,False)}"
给出一个错误:
exception Match raised (line 39 of "generated code")
其他运营商,例如sym
似乎没问题:
value "sym {(True,True)}"
在这里使用的正确方法是什么refl
?
- 更新 -
似乎有一个类似的错误total
:
value "total {(True,True),(False,False)}"
, 这使:
exception Match raised (line 39 of "generated code")
解决方案
您不应该期望能够使用value
. 该value
命令是一个诊断命令,玩起来很有趣,有时也很有用,但 Isabelle/HOL 不是一种编程语言,如果没有额外的设置,您写下的大多数 HOL 术语都无法评估。
使评估成为可能的机制是代码生成器,它将 HOL 定义转换为可执行的 ML 代码,然后运行该代码并将结果转换回 HOL 术语。
在这种情况下,当然没有先验理由说明您不能评估该术语。当事情失败时,您可以使用export_code
查看实际为您的术语生成的代码:
definition foo where "foo = refl {(True,True),(False,False)}"
export_code foo in SML
您可以查看代码生成器使用的“代码方程式”
definition foo where "foo = refl {(True,True),(False,False)}"
code_thms foo
可能有点难以阅读,但基本上问题在于,默认情况下,集合是通过列表实现的,或者作为set xs
(列表的所有元素xs
)或作为List.coset xs
(不在列表中的所有元素xs
)并且UNIV
具有代码方程UNIV = List.coset []
。(请注意,这refl
只是 的缩写refl_on UNIV
)。
不幸的是,Ball
('for all elements x
of the set x
,P(x)
hold' 操作符)的实现不知道如何处理List.coset
.
这里的一个快速解决方法是添加(UNIV :: bool set) = {True, False}
一个code_unfold
规则,以便代码生成器使用它。有了它,它就可以工作了!
lemma UNIV_bool [code_unfold]: "UNIV = {True, False}"
by auto
推荐阅读
- excel - Excel 公式文本到分钟
- javascript - 从其他数组中按数组中的 id 查找元素
- python - 范围索引必须是整数或切片,而不是 numpy.float64
- c# - 如何从 web.config 文件中的 xml 参数中检索值?
- c - 从 C 中的套接字读取时地址错误
- python - pgpy:解密文件会生成一个压缩文件。看不到怎么解压
- python - Python:确保并发线程已完成
- docker - 为什么 Drupal 的作曲家创建项目在 WSL2 中失败?
- google-chrome-extension - 无法为 chrome 扩展设置价格或选择免费试用
- python - 是否可以将列表字典解析为 TFRecord 文件?