# [isabelle-dev] [isabelle] Odd failure to match local statement with pending goal.

Lawrence Paulson lp15 at cam.ac.uk
Wed Aug 3 12:34:08 CEST 2011

```Many thanks for your analysis. It looks like an interaction involving "fix" and bound variables.

But we need to move the discussion to isabelle-dev at mailbroy.informatik.tu-muenchen.de.

Larry

On 2 Aug 2011, at 22:55, Brian Huffman wrote:

> On Tue, Aug 2, 2011 at 2:10 PM, Bertram Felgenhauer
>> Hi,
>>
>>> As Larry stated, this is indeed a strange problem. I tried to find a
>>> minimal example; here is what I came up with:
>>>
>>> -------------------
>>> lemma
>>>  shows  "⋀c d. d ∈ Z ⟹ x = c ⟹
>>>        ∃e. e ∈ {_. ∃e. e ∈ Z ∧ y = e}"
>>>  apply (unfold mem_Collect_eq)
>>> proof -
>>>  fix s t
>>>  assume "x = s" and "t ∈ Z"
>>>  then show "∃s t. t ∈ Z ∧ y = t"
>>>    sorry
>>> qed
>>> -------------------
>>> The show statement fails with
>> [...]
>>
>> So do we know whether this is an obscure feature or possibly a bug?
>> (If it's a feature I'd love to hear the underlying story.)
>
> It certainly looks like a bug to me. I don't have an idea yet of why
> it happens, but I found an even smaller example. I constrained
> everything to type "nat" just to rule out any weirdness with
> polymorphism. Note the repeated bound variable name in the goal (the
> argument to Q is the second "c", which pretty-prints as "ca"). This
> seems to be necessary to make the error happen.
>
> lemma
>  shows "⋀(a::nat) (b::nat). P a b ⟹ ∀(c::nat) (c::nat). Q c"
> proof -
>  fix s t :: nat assume "P s t"
>  thus "∀(s::nat) (t::nat). Q t" (* Local statement will fail to refine... *)
>
> Swapping the order of the bound variable names in the conclusion also
> gives the same error:
>
>  thus "∀(t::nat) (s::nat). Q s"
>
> Just about any other modification to the lemma or proof that I could
> think of seems to make it work again.
>
> - Brian
>

```