如何分析假设中的 if 表达式?
How to analyze if-expressions in assumptions?
我试图证明以下引理:
lemma if_assumption: "(if a = 1 then 2 else 3) = 2 ⟹ a = 1"
apply (cases "a = 1")
apply simp_all
化简后得到如下公式:
3 = 2 ⟹ a ≠ 1 ⟹ False
if 表达式的结果等于 2 当且仅当 a
等于 1。所以,我想我可以以某种方式推断出这个事实。
如何证明这个引理?
你写的陈述不正确。 Isabelle 中的数字默认是多态的(您可以通过按住 Ctrl 的同时将鼠标悬停在数字上来检查)。可能有一个数字类型 3 = 2
成立(例如有限域 {0,1,2}
)。在那种情况下,a
可能不等于 1
.
如果改为固定号码类型:
lemma if_assumption: "(if a = 1 then 2 else 3) = (2::nat) ⟹ a = 1"
你写的证明脚本通过了。或更短:
apply (auto split: if_splits)
... 告诉系统将 if _ then _ else _
分成两个子目标。
我试图证明以下引理:
lemma if_assumption: "(if a = 1 then 2 else 3) = 2 ⟹ a = 1"
apply (cases "a = 1")
apply simp_all
化简后得到如下公式:
3 = 2 ⟹ a ≠ 1 ⟹ False
if 表达式的结果等于 2 当且仅当 a
等于 1。所以,我想我可以以某种方式推断出这个事实。
如何证明这个引理?
你写的陈述不正确。 Isabelle 中的数字默认是多态的(您可以通过按住 Ctrl 的同时将鼠标悬停在数字上来检查)。可能有一个数字类型 3 = 2
成立(例如有限域 {0,1,2}
)。在那种情况下,a
可能不等于 1
.
如果改为固定号码类型:
lemma if_assumption: "(if a = 1 then 2 else 3) = (2::nat) ⟹ a = 1"
你写的证明脚本通过了。或更短:
apply (auto split: if_splits)
... 告诉系统将 if _ then _ else _
分成两个子目标。