如何证明具有部分功能的引理?

时间:2017-07-19 08:07:15

标签: isabelle

你能否建议如何证明这个简单的引理?

datatype val = BVal bool | IVal int

lemma the_unif:
"the (x :: val option) = the (y :: val option) ⟹ x = y"
  apply (induct x; induct y)
  apply simp

我试图通过归纳来证明这一点,但我坚持使用案例⋀option. the None = the (Some option) ⟹ None = Some option

option可能与BVal xIVal x相同。它永远不会等于the None。因此,在这种情况下,假设总是有假值。

更新

我可以证明以下问题:

lemma the_none_ne_the_some:
  "x ≠ the None ⟹ the None ≠ the (Some x)"
  by simp

所以我想,第一个引理也可以证明。

一般的引理无法得到证实,因为它确实无法实现:

lemma the_unif:
  "the x = the y ⟹ x = y"

一个反例:

x = None
y = Some (the None)

但在第一个引理中,xy都不等于Some (the None)。所以我找不到第一个引理的反例。

哦,我已经明白了,我可以证明以下问题:

lemma the_unif:
  "x ≠ Some (the None) ⟹ y ≠ Some (the None) ⟹ the x = the y ⟹ x = y"
  by (induct x; induct y; simp)

但如何证明x :: val option暗示x ≠ Some (the None)

更新2:

似乎无法证明:

lemma val_not_the_none:
  "x = BVal b ∨ x = IVal i ⟹ x ≠ the None"

但是如果这些引理不能保持,那么它们必须有一个反例吗?你能提供吗?

1 个答案:

答案 0 :(得分:1)

你试图证明的东西根本不成立。 the None未指明 - 实质上,您可以证明这一点并非无关紧要。因此,说"它永远不会等于the None"是空洞的,因为你不知道int x = -7; Calendar cal = GregorianCalendar.getInstance(); cal.add( Calendar.DAY_OF_YEAR, x); Date sevenDaysAgo = cal.getTime(); 是什么。