调用顺序记录操作时Isabelle证明错误

时间:2015-12-07 18:34:02

标签: isabelle

我对Isabelle非常陌生并且有证明义务,而且我目前正在翻译我使用的“Dots and Boxes'''游戏(为我们提供了基本的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)"

Error I'm experiencing

我知道不变量可能比这个错误更糟糕,但据我从错误中可以看出它对记录字段的多次调用有问题;即将dot_a传递给pos_x而不是dot_a m的结果。我能想到的唯一解决方案是操纵操作顺序,但我不确定如何实现这一点pos_x dot_a m = pos_x (dot_a m)

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

功能应用程序的关联性是另一种方式:pos_x dot_a m = (pos_x dot_a) m。试试pos_x (dot_a m)