调用顺序记录操作时的 Isabelle 证明错误
Isabelle proof error when calling sequential record operations
我对 Isabelle 和证明义务还很陌生,我目前正在翻译我用 'Dots and Boxes' 游戏制作的 VDM 模型(为我们提供了基本的 VDM 类型翻译)。
到目前为止我有两种记录类型,一个Dot
:
record Dot =
pos_x :: VDMNat1
pos_y :: VDMNat1
..和一个Move
(由两个Dot
组成):
record Move =
dot_a :: Dot
dot_b :: Dot
..但现在我正在尝试翻译那些 Move
的序列,并且遇到不变量的奇怪错误:
type_synonym Moves = "Move VDMSet"
definition inv_Moves :: "Moves ⇒ "
where "inv_Moves ms ≡
int (card ms) ≤ MAX_MOVES ∧
(∀ m . m ∈ ms ⟶
inv_Move m ∧
pos_x dot_a m > 0 ∧
pos_y dot_a m > 0 ∧
pos_x dot_b m > 0 ∧
pos_y dot_b m > 0 ∧
pos_x dot_a m ≤ BOARD_WIDTH ∧
pos_y dot_a m ≤ BOARD_HEIGHT ∧
pos_x dot_b m ≤ BOARD_WIDTH ∧
pos_y dot_b m ≤ BOARD_HEIGHT ∧
inverse_move m ∉ ms)"
我知道不变量可能比这个错误更糟糕,但据我从错误中可以看出,多次调用记录字段存在问题;即,将 dot_a
传递给 pos_x
而不是 dot_a m
的结果。我能想到的唯一解决方案是操纵操作顺序,但我不确定如何实现 pos_x dot_a m
= pos_x (dot_a m)
.
如有任何帮助,我们将不胜感激!
函数应用的结合性是相反的:pos_x dot_a m = (pos_x dot_a) m
。试试 pos_x (dot_a m)
.
我对 Isabelle 和证明义务还很陌生,我目前正在翻译我用 'Dots and Boxes' 游戏制作的 VDM 模型(为我们提供了基本的 VDM 类型翻译)。
到目前为止我有两种记录类型,一个Dot
:
record Dot =
pos_x :: VDMNat1
pos_y :: VDMNat1
..和一个Move
(由两个Dot
组成):
record Move =
dot_a :: Dot
dot_b :: Dot
..但现在我正在尝试翻译那些 Move
的序列,并且遇到不变量的奇怪错误:
type_synonym Moves = "Move VDMSet"
definition inv_Moves :: "Moves ⇒ "
where "inv_Moves ms ≡
int (card ms) ≤ MAX_MOVES ∧
(∀ m . m ∈ ms ⟶
inv_Move m ∧
pos_x dot_a m > 0 ∧
pos_y dot_a m > 0 ∧
pos_x dot_b m > 0 ∧
pos_y dot_b m > 0 ∧
pos_x dot_a m ≤ BOARD_WIDTH ∧
pos_y dot_a m ≤ BOARD_HEIGHT ∧
pos_x dot_b m ≤ BOARD_WIDTH ∧
pos_y dot_b m ≤ BOARD_HEIGHT ∧
inverse_move m ∉ ms)"
我知道不变量可能比这个错误更糟糕,但据我从错误中可以看出,多次调用记录字段存在问题;即,将 dot_a
传递给 pos_x
而不是 dot_a m
的结果。我能想到的唯一解决方案是操纵操作顺序,但我不确定如何实现 pos_x dot_a m
= pos_x (dot_a m)
.
如有任何帮助,我们将不胜感激!
函数应用的结合性是相反的:pos_x dot_a m = (pos_x dot_a) m
。试试 pos_x (dot_a m)
.