如何对" booleans"进行归纳定义?在伊莎贝尔

时间:2018-01-31 16:33:43

标签: types boolean predicate definition isabelle

在Isabelle中,我想定义采用谓词'a => bool的运算符,并根据谓词的"归纳结构修改它们"。例如,可能想要在这些谓词上计算Disjunctive Normal Form(DNF),例如D (λ x. P x --> Q x) = (λ x. ¬ P x \/ Q x)

这里的问题是bool不是归纳数据类型。我想到了两种可能的解决方案:

  1. 创建一个归纳数据类型,允许我在其上定义我的运算符。为此数据类型提供谓词(P::'a => bool)语义,然后使用它来证明我要检查的词条。
  2. 证明每个可能的归纳案例的定理。然后显示使用所有先前规则的一般情况。
  3. 作为第三种选择,我(希望)希望更有经验的Isabelle用户可以使用秘密函数/ typedef来启发我的方法,以避免这种"归纳问题"。所以这里的问题是:

    还有其他更简单的选择吗?如果是的话,哪些?如果没有,我的任何方法是否都有缺陷或注定要失败?

    警告:作为一个例子,我给出了DNF,但是,操作员不一定保留谓词真值的一般情况对我更感兴趣,例如: D可以执行此操作:D (λ x. P x /\ Q x) = (λ x. P x \/ Q x)

1 个答案:

答案 0 :(得分:1)

HOL函数无法查看其参数的语法表示。原因是替换公理,即逻辑上相等的术语可以在任何上下文中被替换。否则,可以定义满足DD (λ x. P x) = True的函数D (λ x. P x & True) = False,从而得到False的证明。

对于像转换为DNF这样的函数,其在HOL中的语义不依赖于参数的语法,人们仍然可以定义这样的转换。对于DNF转换,语义操作是标识,即

definition DNF :: "('a => bool) => ('a => bool)" where "D = id"

然后,您可以派生实际执行转换的重写规则。例如,

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,就没有办法引入语法,正如你所建议的数据类型一样。