Isabelle 简化器引入了 if 语句的大小写区分(为什么?何时?)

标签 isabelle

如果我将 simp 方法应用于包含 if 表达式的目标,则简化器会自动引入大小写区分:

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

这给出了目标:

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

我的问题是:如何告诉简化器这样做?我可以找到一个简化规则来判断是否会导致这种行为,也可以找到一个简化规则。如何为其他类似 if 的常量获得类似的行为?

最佳答案

该功能由分离器启用。简化器本身是一个大循环,不仅执行重写,而且在再次开始重写之前执行各种其他操作。

对于 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 小节更详细地解释了简化器(尽管不可否认,有关简化器的许多知识基本上都是“古老的智慧”)。

关于Isabelle 简化器引入了 if 语句的大小写区分(为什么?何时?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47123240/

相关文章:

isabelle - Isabelle 中除了 HOL 之外的其他理论的自动化支持是什么?

java - 从外部软件(Java、Scheme)调用 Isabelle

isabelle - 如何定义type_synonym的类实例?

isabelle - 从 'value' 到 'lemma'

isabelle - 使用 Isabelle 简化器重写非相等等价关系

typeclass - 在语言环境上下文中实例化类型类

isabelle - 在 Isabelle 中将集合转换为列表

isabelle - 从 Isabelle/HOL 到 HOL 的自动翻译

isabelle - 在 Isabelle 中引入类型缩写

isabelle - 什么样的函数保留闭包的属性?