How to do an inductive definition over "booleans" in Isabelle
在 Isabelle 中,我想定义接受谓词 'a => bool 的运算符,并根据"谓词的归纳结构"对其进行修改。例如,人们可能想要计算这些谓词的析取范式(DNF),例如D (?? x. P x --> Q x) = (?? x. ?? P x \\/ Q x).
这里的问题是 bool 不是归纳数据类型。我想到了两种可能的解决方案:
创建一个归纳数据类型,允许我在它们上定义我的运算符。为这个数据类型提供谓词 (P::'a => bool) 语义,然后用它来证明我要检查的引理。
证明每一种可能的归纳情况的定理。然后展示一个使用所有前面规则的一般情况。
作为第三种选择,我(希望)希望更有经验的 Isabelle 用户可以用一个绕过这个"归纳问题"的秘密函数/typedef 来启发我的方法。所以这里的问题是:
还有其他更简单的选择吗?如果是,是哪些?如果没有,我的任何方法是否看起来有缺陷或注定失败?
警告:我举了一个例子,DNF,但是,运算符不一定保留谓词的真值的一般情况对我来说更感兴趣,例如D 可以这样做:D (?? x. P x /\\ Q x) = (?? x. P x \\/ Q x).
HOL 函数无法查看其参数的句法表示。原因是替换公理,即逻辑上相等的项可以在任何上下文中替换。否则,可以定义一个满足 D (?? x. P x) = True 和 D (?? x. P x & True) = False 的函数 D,从而得出 False.
的证明
对于像转换为 DNF 这样的函数,其在 HOL 中的语义不依赖于参数的语法,仍然可以定义这样的转换。对于 DNF 转换,语义操作是恒等式,即
1
| definition DNF ::"('a => bool) => ('a => bool)" where"D = id" |
然后,您可以推导出实际执行转换的重写规则。例如,
1
| lemma DNF_imp:"DNF (??x. P x --> Q x) = DNF (??x. ~ P x | Q x)" |
如果你用这样一组专用规则调用 Isabelle 的简化器,你就可以有效地转换为 DNF(尽管你永远无法在 HOL 中正式表达你的规则集在所有情况下都有效)。
很多时候,像 DNF_imp 这样的规则不足以实现这样的功能。在这种情况下,您可以在 Isabelle/ML 中编写一个 simproc,它在 DNF _ 项上触发并执行转换。由于您正在跳出逻辑,因此 simproc 可以查看参数的 HOL 语法,并在逻辑上相等的条件下表现不同。
相反,如果您确实想在逻辑中表达和推理转换函数 D,则无法像您建议的数据类型那样引入要处理的语法。
- 非常感谢安德烈亚斯启发了我对伊莎贝尔的理解。多亏了你,我会更好地尝试找到系统中的不一致之处。我只是想确保我理解你的最后两行:你是说最终我们无法推理逻辑中的"转换函数"吗?或者你是说为了做到这一点,我必须介绍语法?在上周的大部分时间里,我将其理解为第一个含义,但是,现在我正在回复,第二个含义更有意义。
-
如果您在逻辑中形式化语法,您当然可以对转换函数进行推理。所以第二个意思就是我的意思。