为什么 'linordered_field_class.frac_le' 规则不起作用? (伊莎贝尔)

Why won't the 'linordered_field_class.frac_le' rule work? (Isabelle)

我正在尝试在 Isar 证明中使用规则 linordered_field_class.frac_le。这是代码片段(它可能取决于证明的前面部分,但这不太可能)。 n 是 nat 类型。

  ...
  then have 4:"2 ≤ (2^(n+1)::real)" by simp
  have 1:"(0::real)≤(1::real)" by simp
  have 2: "1≤(1::real)" by simp
  have 3:"(0::real)≤(2::real)" by simp
  from 1 2 3 4 have "1/(2^(n+1))≤1/(2::real)" by (rule linordered_field_class.frac_le)

我认为我已正确应用该规则,但它抱怨 'Failed to finish proof'。我认为这可能是一个类型错误,因此 :: real 有点矫枉过正,但我​​无法修复它。有谁知道可能是什么问题,以及如何解决?或者只是证明这种说法的另一种方法。

如果你看一下规则frac_le,第三个前提的形式是0 < ?w,但你在第三个位置上链的事实是0 ≤ 2。如果将其替换为 0 < 2,则效果很好。

请注意,只需编写 auto intro: frac_le 甚至 simp add: divide_simpssimp add: field_simps,您就可以节省很多这些繁琐的手动步骤。 Isabelle 中的代数推理往往非常乏味,除非您充分利用现有的自动化。