[isabelle-dev] find_theorems raises UnequalLengths exception
Lawrence Paulson
lp15 at cam.ac.uk
Fri Nov 19 12:37:53 CET 2010
This is not my code, and I'm not certain that I understand it, but I don't believe that there is a direct connection between my correction of the unification code and the exception. It is raised from the single occurrence of the ~~ operator in the code below.
fun match thy (po as (pat,obj)) envir =
let
(* Pre: pat and obj have same type *)
fun mtch binders (pat,obj) (env as (iTs,itms)) =
case pat of
Abs(ns,Ts,ts) =>
(case obj of
Abs(nt,Tt,tt) => mtch ((nt,Tt)::binders) (ts,tt) env
| _ => let val Tt = Envir.subst_type iTs Ts
in mtch((ns,Tt)::binders) (ts,(incr obj)$Bound(0)) env end)
| _ => (case obj of
Abs(nt,Tt,tt) =>
mtch((nt,Tt)::binders) ((incr pat)$Bound(0),tt) env
| _ => cases(binders,env,pat,obj))
and cases(binders,env as (iTs,itms),pat,obj) =
let val (ph,pargs) = strip_comb pat
fun rigrig1(iTs,oargs) = fold (mtch binders) (pargs~~oargs) (iTs,itms)
fun rigrig2((a:string,Ta),(b,Tb),oargs) =
if a <> b then raise MATCH
else rigrig1(typ_match thy (Ta,Tb) iTs, oargs)
in case ph of
Var(ixn,T) =>
let val is = ints_of pargs
in case Envir.lookup' (itms, (ixn, T)) of
NONE => (iTs,match_bind(itms,binders,ixn,T,is,obj))
| SOME u => if obj aeconv (red u is []) then env
else raise MATCH
end
| _ =>
let val (oh,oargs) = strip_comb obj
in case (ph,oh) of
(Const c,Const d) => rigrig2(c,d,oargs)
| (Free f,Free g) => rigrig2(f,g,oargs)
| (Bound i,Bound j) => if i<>j then raise MATCH
else rigrig1(iTs,oargs)
| (Abs _, _) => raise Pattern
| (_, Abs _) => raise Pattern
| _ => raise MATCH
end
end;
And the use of this operator seems to embody an assumption that the number of arguments in the pattern necessarily equals the number of arguments in the object. Presumably type checking enforces this much of the time, but with eta contraction I could imagine it could fail. It obviously does fail, as the exception proves. I would be tempted to insert the line
handle UnequalLengths => raise MATCH
(With appropriate parentheses) immediately after the call to rigrig1(iTs,oargs).
Can anybody comment who is more familiar with this code?
Larry
On 18 Nov 2010, at 17:03, Brian Huffman wrote:
> On Thu, Nov 18, 2010 at 8:25 AM, Lawrence Paulson <lp15 at cam.ac.uk> wrote:
>> That is certainly my change, but I don't understand why preventing self-referential type instantiations should affect the find_theorems function. Can you get a full trace back from the exception?
>
> Here's what I get from turning on the debugging flag in Proof General:
>
> Exception trace for exception - UnequalLengths
> Library.~~(2)
> Pattern.match(3)cases(5)rigrig1(2)
> Pattern.match(3)cases(5)
> Pattern.match(3)mtch(4)
> Pattern.match(3)
> Pattern.matches_subterm(3)msub(2)
> Pattern.matches_subterm(3)msub(2)
> Pattern.matches_subterm(3)
> Find_Theorems.filter_pattern(2)check(3)
> Find_Theorems.filter_pattern(2)check(1)
> o(2)(1)
> Find_Theorems.app_filters(1)app(3)
> List.mapPartial(2)
> List.mapPartial(2)
> List.mapPartial(2)
> List.mapPartial(2)
> List.mapPartial(2)
> List.mapPartial(2)
> List.mapPartial(2)
> List.mapPartial(2)
> Find_Theorems.sorted_filter(2)
> Find_Theorems.find_theorems(5)find_all(2)
> Find_Theorems.find_theorems(5)find_all(1)
> Find_Theorems.print_theorems(5)
> Toplevel.apply_tr(3)(1)
> Runtime.debugging(2)(1)
> End of trace
>
> *** exception UnequalLengths raised
> *** At command "find_theorems"
>>
>
>>
>> Larry
>>
>> On 18 Nov 2010, at 16:03, Brian Huffman wrote:
>>
>>> Hello everyone,
>>>
>>> Recently I noticed that in HOLCF, whenever I do a theorem search for
>>> theorems containing the constant "UU" (i.e. bottom), the search fails
>>> with an UnequalLengths exception. I tracked the problem down to this
>>> specific theorem from Fun_Cpo.thy: Before this point, find_theorems
>>> "UU" succeeds, and afterward it causes an error.
>>>
>>> lemma app_strict: "UU x = UU"
>>>
>>> I found that I can also reproduce the problem directly in HOL:
>>>
>>> theory Scratch
>>> imports Orderings
>>> begin
>>>
>>> find_theorems "bot"
>>>
>>> lemma bot_apply: "bot x = bot"
>>> by (simp only: bot_fun_eq)
>>>
>>> find_theorems "bot"
>>>
>>> *** exception UnequalLengths raised
>>> *** At command "find_theorems"
>>>
>>> After doing "hg bisect", I traced the origin of the problem:
>>>
>>> http://isabelle.in.tum.de/repos/isabelle/rev/b654fa27fbc4
>>>
>>> Can anyone figure this out?
>>>
>>> - Brian
>>> _______________________________________________
>>> Isabelle-dev mailing list
>>> Isabelle-dev at mailbroy.informatik.tu-muenchen.de
>>> https://mailmanbroy.informatik.tu-muenchen.de/mailman/listinfo/isabelle-dev
>>
>>
More information about the isabelle-dev
mailing list