[Ur] Incompatible kinds

Karn Kallio tierpluspluslists at gmail.com
Thu Dec 2 10:23:26 EST 2010


Hello,

Last night I thought to use the System F embedded at the Ur/Web type/kind 
level to Girard encode some basic datatypes.  From the Ur Reference Manual I 
think we write polymorphic "pi types" with -->, so that in the Boolean case pi 
t. t -> t -> t we write B --> B -> B -> B in Ur/Web and that we write 
polymorphic abstraction ( upper case lambda = \\ , lower case lambda = \ ) \\t 
. \x : t . x as K ==> fn ( x :: K ) => x in Ur/Web. 

However, this does not compile:

con btrue = K ==> fn ( x :: K ) ( y :: K ) => x
con bfalse = K ==> fn ( x :: K ) ( y :: K ) => y

con bnot = fn ( b :: (B --> B -> B -> B) ) => K ==> fn ( x :: K ) ( y :: K ) 
=> b y x

con bnottrue = bnot btrue

giving error message

 Wrong kind
Constructor:  (fn x :: <UNIF:U116> => (fn y :: <UNIF:U116> => x))
  Have kind:  <UNIF:U116> -> <UNIF:U116> -> <UNIF:U116>
  Need kind:  B --> B -> B -> B
Incompatible kinds
Kind 1:  <UNIF:U116> -> <UNIF:U116> -> <UNIF:U116>
Kind 2:  B --> B -> B -> B

From the error message ( incompatible kinds when as I understand it they 
should be compatible ) I think this is an example of incompleteness in the 
kind unification.  But I am not sure I am properly writing bnot in Ur/Web ... 
I am trying to write bnot = \b : Bool . \\t . \x : t . \y : t . b [t] y x  
where Bool is pi t. t -> t -> t and the \\, \ are uppercase, lowercase lambda.

Is this unification incompleteness or am I doing something wrong?




More information about the Ur mailing list