在Isabelle中,我想定义采用谓词'a => bool
的运算符,并根据谓词的"归纳结构修改它们"。例如,可能想要在这些谓词上计算Disjunctive Normal Form(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)
。
答案 0 :(得分:1)
HOL函数无法查看其参数的语法表示。原因是替换公理,即逻辑上相等的术语可以在任何上下文中被替换。否则,可以定义满足D
和D (λ 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
,就没有办法引入语法,正如你所建议的数据类型一样。