[isabelle-dev] Problem with simproc enat_eq_cancel
Andreas Lochbihler
andreas.lochbihler at inf.ethz.ch
Fri Mar 1 15:10:05 CET 2013
Dear all,
in the repository (8a635bf2c86c) and in Isabelle2013, there seems to be
something wrong with the enat_eq_cancel simproc in Extended_Nat. Can
someone please look into this? Here's a minimal example:
theory Scratch imports
"~~/src/HOL/Library/Extended_Nat"
begin
definition epred :: "enat => enat"
where "epred n = n - 1"
lemma epred_iadd1: "a ~= 0 ==> epred (a + b) = epred a + b"
apply(simp add: epred_def)
I would have expected that the call to simp at least unfolds epred_def,
but it raises the following error:
*** Proof failed.
*** (a + b - 1 = a - 1 + b) = (a + (b + - 1) = a + (- 1 + b))
*** 1. (a + b - 1 = b + (a - 1)) = (a + (b + - 1) = a + (b + - 1))
*** The error(s) above occurred for the goal statement:
*** (a + b - 1 = a - 1 + b) = (a + (b + - 1) = a + (- 1 + b))
*** At command "apply"
The simp trace with simp_debug enabled ends as follows:
[1]Trying procedure "Extended_Nat.enat_eq_cancel" on:
a + b - 1 = a - 1 + b
simp_trace_depth_limit exceeded!
When I disable the simproc, I am able to prove the lemma:
using [[simproc del:enat_eq_cancel]]
apply(cases a b rule: enat.exhaust[case_product enat.exhaust])
apply(simp_all add: epred_def eSuc_def one_enat_def zero_enat_def split:
enat.splits)
done
By the way, why does the failure in the simproc yield a proof error at
all? Usually, simp does not raise "Proof failed" if it gets stuck somewhere.
Best,
Andreas
More information about the isabelle-dev
mailing list