I am trying to use the rule linordered_field_class.frac_le
in an Isar proof. Here is the code snippet (it may depend on the previous parts of the proof, but that is unlikely). n
is of type 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)
I think I have applied the rule correctly, but it complains 'Failed to finish proof'. I thought it might be a type error, hence the overkill with :: real
, but I couldn't fix it. Does anyone know what might be the problem, and how to fix it? Or just an alternative way to prove that sort of statement.
If you look at the rule
frac_le
, the third premise is of the form0 < ?w
, but the fact that you chain in in the third position is0 ≤ 2
. If you replace that with0 < 2
, it works fine.Note that you can save a lot of these tedious manual steps by just writing
auto intro: frac_le
or evensimp add: divide_simps
orsimp add: field_simps
. Algebraic reasoning in Isabelle tends to be very tedious unless you make good use of the existing automation.