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

Isabelle 高阶逻辑中的数据类型相等,isabelle,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 = BI

具有以下理论:

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中的结构等式不是。或者,这种形式化是否存在缺陷?

注意布尔型表达式的等式。由于算子优先,引理的命题实际上如下:

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

中有一些示例,谢谢,这只是一个练习,不是任何严肃的开发。