你能否建议如何证明这个简单的引理?
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 x
或IVal 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)
但在第一个引理中,x
和y
都不等于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"
但是如果这些引理不能保持,那么它们必须有一个反例吗?你能提供吗?
答案 0 :(得分:1)
你试图证明的东西根本不成立。 the None
未指明 - 实质上,您可以证明这一点并非无关紧要。因此,说"它永远不会等于the None
"是空洞的,因为你不知道int x = -7;
Calendar cal = GregorianCalendar.getInstance();
cal.add( Calendar.DAY_OF_YEAR, x);
Date sevenDaysAgo = cal.getTime();
是什么。