Isabelle简化器为if语句引入了区分(为什么?当?)

时间:2017-11-05 15:24:41

标签: isabelle

如果我将simp-method应用于包含if-expression的目标,则简化器会自动引入区分大小写:

lemma "undefined (if x then True else False)"
  apply simp

这给出了目标:

(x ⟶ undefined True) ∧ (¬ x ⟶ undefined False)

我的问题是:简化器是如何做到这一点的?我可以找到一个简化规则,如果可以想象会导致这种行为,也不会简单。如何为其他类似if的常量获得类似的行为?

1 个答案:

答案 0 :(得分:2)

拆分器启用了该功能。简化器本身是一个很大的循环,它不仅可以在重新开始重写之前执行重写,还可以执行各种其他操作。

对于if,相关split规则为if_splits

?P (if ?Q then ?x else ?y) = ((?Q ⟶ ?P ?x) ∧ (¬ ?Q ⟶ ?P ?y))
?P (if ?Q then ?x else ?y) = (¬ (?Q ∧ ¬ ?P ?x ∨ ¬ ?Q ∧ ¬ ?P ?y))

第一个split规则适用于结论中if _ then _ else _的出现,后者适用于前提中的出现。 (这两条规则分别以if_splitif_split_asm提供。)

数据类型的

case常量具有类似的规则,例如bool.splits

?P (case ?bool of True ⇒ ?f1.0 | False ⇒ ?f2.0) =
  ((?bool = True ⟶ ?P ?f1.0) ∧ (?bool = False ⟶ ?P ?f2.0))
?P (case ?bool of True ⇒ ?f1.0 | False ⇒ ?f2.0) =
  (¬ (?bool = True ∧ ¬ ?P ?f1.0 ∨ ?bool = False ∧ ¬ ?P ?f2.0))

可以使用split对规则进行注释,将规则声明为[split]规则。

更多信息可以在reference manual的§9.3.1中找到。整个小节§9.3更详细地解释了简化器(虽然很多关于简化器的知识基本上都是“古老的智慧”)。