有以下理论:
theory BitVector
imports Main
begin
datatype bitvector = BTM | BITV bool bitvector
lemma "∀ x1 x2 y1 y2. (BITV x1 x2 = BITV y1 y2) = (x1=y1) ∧ (x2=y2)"
我得到以下证明状态:
proof (prove): step 0
goal (1 subgoal):
1. ∀x1 x2 y1 y2. (BITV x1 x2 = BITV y1 y2) = (x1 = y1) ∧ x2 = y2
Auto Quickcheck found a counterexample:
x1 = False
x2 = BITV True BTM
y1 = False
y2 = BTM
这是什么样的平等?很明显,它不是标准ML的结构平等。或者,这种形式化存在错误吗?
答案 0 :(得分:1)
注意布尔类型表达式的相等性。由于运算符优先级,引理的命题实际上如下:
lemma "∀ x1 x2 y1 y2. ((BITV x1 x2 = BITV y1 y2) = (x1=y1)) ∧ (x2=y2)"
这显然是错误的。你应该写的是:
lemma "∀ x1 x2 y1 y2. (BITV x1 x2 = BITV y1 y2) = ((x1=y1) ∧ (x2=y2))"
事实上,由于这些运算符优先级问题,我更喜欢使用⟷
来表示布尔表达式的相等性:
lemma "∀ x1 x2 y1 y2. BITV x1 x2 = BITV y1 y2 ⟷ x1 = y1 ∧ x2 = y2"
此外,人们通常会在没有HOL通用量词的情况下编写这样的引理,而是使用以下内容,这是等效的:
lemma "BITV x1 x2 = BITV y1 y2 ⟷ x1 = y1 ∧ x2 = y2"
所有这些引理都很容易通过简化器证明,因为它们是由datatype
命令自动提供的注入性引理的直接结果。
我还应该提到,您可能希望在src/HOL/Word
中使用预定义的位向量形式化,而不是自己定义位向量。 src/HOL/Word/Examples
中存在一些示例。