[POPLmark] Experience report with Twelf

Michael Philip Ashley-Rollman mpa at andrew.cmu.edu
Fri Aug 19 00:51:00 EDT 2005


>>> lookupClass_strengthen :
>>>   ({x:exp} lookupClass CT C (class C D FS (MT x)))
>>>     -> lookupClass CT C (class C D FS (MT unit)) -> type.
>>>
>>> However, I think this is a case where strengthening is unavoidable.
>>> The type exp is subordinate to the type methodTable, but since the
>>> methodTable MT comes from the classTable CT (which does not depend on
>>> x) in this case, it can't depend on x.
>>>
>>>
>>
>> This could be a property of the system you're formalizing, not just
>> the LF encoding.  That is, on paper, how do you *know* that the class
>> you get back doesn't mention some variable in the context?  Sometimes
>> I've glossed over things like this on paper only to have Twelf point
>> them out to me.
>>
>>
> This issue didn't come up in either the Coq version of the proof (that I
> did) or the Isabelle/HOL version
> (that two grad students here at Penn did).

This issue does not really come up in the twelf proof either. Rather than 
proving the lookupClass_strengthen or sub_strengthen lemmas, you can 
simply substitute unit in for exp for lookupClass_strengthen and any 
expression at all into sub_strengthen. A term with type (exp -> subtyping 
CT C D) is saying that for any expression, I can provide you with a proof 
of (subtyping CT C D). Thus, by providing any term with type exp, we may 
immediately get a derivation of (subtyping CT C D). Sometimes substituting 
in terms that don't matter can confuses twelf a little bit and it will 
give you an error like this:

Typing ambiguous -- unresolved constraints
C1 unit = C1 x;
CT1 unit = CT1 x;
CT1 unit = CT1 x;
CT1 unit = CT1 x.

In this case, providing the type of the term after substition usually 
resolves the issue. Thus we may change the last rule of narrowing_explist 
to this:

-:  narrowing_explist WCT TL1 SB TL2 ->
     sub_trans SB2 (SB1 unit : subtyping CT C D) SB4 ->
%%    sub_strengthen SB1 SB3 ->
      narrowing_exp WCT T1 SB T2 SB2 ->
      narrowing_explist WCT
      ([x][q] tl_cons (SB1 x) (TL1 x q) (T1 x q)) SB
      ([x][q] tl_cons SB4 (TL2 x q) (T2 x q)).

Othertimes Twelf is able to understand the substitution as in the 
narrowing_bexp cases.
 	-Michael


More information about the Poplmark mailing list