- From: Wang Zhen (Selina) <zwang@cs.hku.hk>
- Date: Sun, 01 Oct 2006 22:57:39 +0800
- To: "public-qt-comments@w3.org" <public-qt-comments@w3.org>
To Who It May Concern, I try to use an simple example to test the static typing of XQuery expression, but find something strange. I think the typing rule for Let Expression is not precise in some way. statEnv |- Expr1 : Type1 Type0 = [ SequenceType ]sequencetype statEnv |- Type1 <: Type0 statEnv |- VarName1 of var expands to Variable1 statEnv + varType(Variable1 => Type0 ) |- Expr2 : Type2 -------------------------------------------------------------------------------- statEnv |- let $VarName1 as SequenceType := Expr1 return Expr2 : Type2 I think the Type0 as above should be Type1. For example, if we look at this expression: doc("Catalogue.xml")/catalogue (The XML file and schema file is as attached.) According to "XQuery 1.0 and XPath 2.0 Formal Semantics", it should be "normalized" into Core Grammar, as fs:apply-ordering-mode ( fs:distinct-doc-order-or-atomic-sequence ( let $fs:sequence as node()* :=doc("Catalogue.xml") return let $fs:last := fn:count($fs:sequence) return for $fs:dot at $fs:position in $fs:sequence return child::catalogueExpr )) When we try to type the underlined part, we will first get that "doc("Catalogue.xml")" is of type "document{element catalogue of type Catalogue}" And we using the typing rule for Let Expression, like this: statEnv |- doc("Catalogue.xml") : Type1 Type1 = document{element catalogue of type Catalogue} Type0 = [ node()* ]sequencetype= ((element * of type xs:anyType | attribute * of type xs:anySimpleType | text | document { (element * of type xs:anyType | text | comment | processing-instruction)* } | comment | processing-instruction))* statEnv |- Type1 <: Type0 statEnv |- $fs:sequence of var expands to Variable1 statEnv + varType(Variable1 => Type0 ) |- for $fs:dot at $fs:position in $fs:sequence return child::catalogue : Type2 -------------------------------------------------------------------------------- statEnv |- let $fs:sequence as node()* := doc("Catalogue.xml") return for $fs:dot at $fs:position in $fs:sequence return child::catalogue: Type2 Then we try to type "for $fs:dot at $fs:position in $fs:sequence return child::catalogue" using the typing rule for For Expression: statEnv |- Expr1 : Type1 statEnv |- VarName1 of var expands to Variable1 statEnv |- VarNamepos of var expands to Variablepos statEnv + varType(Variable1 => prime(Type1);Variablepos => xs:integer) |- Expr2 : Type2 -------------------------------------------------------------------------------- statEnv |- for $VarName1 at $VarNamepos in Expr1 return Expr2 : Type2 · quantifier(Type1) So, we will get statEnv + varType(Variable1 => Type0 )|- $fs:sequence : Type0 statEnv + varType(Variable1 => Type0 )|- $fs:dot of var expands to Variable2 statEnv + varType(Variable1 => Type0 )|- $fs:position of var expands to Variablepos statEnv + varType(Variable1 => Type0 )+ varType(Variable2 => prime(Type0);Variablepos => xs:integer) |- child::catalogue: Type2 where Type0= ((element * of type xs:anyType | attribute * of type xs:anySimpleType | text | document { (element * of type xs:anyType | text | comment | processing-instruction)* } | comment | processing-instruction))* prime(Type0)= (element * of type xs:anyType | attribute * of type xs:anySimpleType | text | document { (element * of type xs:anyType | text | comment | processing-instruction)* } | comment | processing-instruction) -------------------------------------------------------------------------------- statEnv + varType(Variable1 => Type0 ) |- for $fs:dot at $fs:position in $fs:sequence return child::catalogue : Type2 Actually, we need to decide Type2: statEnv + varType(Variable1 => Type0 )+ varType(Variable2 => prime(Type0);Variablepos => xs:integer) |- child::catalogue: Type2 Since $fs:dot is of type prime(Type0)= (element * of type xs:anyType | attribute * of type xs:anySimpleType | text | document { (element * of type xs:anyType | text | comment | processing-instruction)* } | comment | processing-instruction) We can easily get Type2 to be something like (element catalogue of type xs:anyType)* But it is not the case! If what I mentioned at the beginning is right, Type0 should be "document{element catalogue of type Catalogue}". Since $fs:dot is of type prime(Type0)= document{element catalogue of type Catalogue}, then Type2 is "element catalogue of type Catalogue" I just would like to make sure whether it is correct about my thinking. Thank you, Selina
Received on Monday, 2 October 2006 11:31:53 UTC