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
中有一些示例,谢谢,这只是一个练习,不是任何严肃的开发。