高阶逻辑中的数据类型相等

时间:2014-06-19 14:24:06

标签: isabelle

有以下理论:

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的结构平等。或者,这种形式化存在错误吗?

1 个答案:

答案 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中存在一些示例。