- From: <bugzilla@wiggum.w3.org>
- Date: Sun, 17 Jul 2005 22:17:21 +0000
- To: public-qt-comments@w3.org
- Cc:
http://www.w3.org/Bugs/Public/show_bug.cgi?id=1693 Summary: [FS] lack of quantification and double subscripting is seriously wrong Product: XPath / XQuery / XSLT Version: Last Call drafts Platform: PC OS/Version: Windows 2000 Status: NEW Severity: major Priority: P2 Component: Formal Semantics AssignedTo: simeon@us.ibm.com ReportedBy: fred.zemke@oracle.com QAContact: public-qt-comments@w3.org 4.1.5 Function calls Under "dynamic errors", the second error condition considered is when some argument cannot be promoted to the type of its formal parameter in any eligible signature. The prose description is "If, for all possible function signatures, the evaluation of some actual argument yields a value that cannot be promoted to the corresponding formal type of the parameter, the function call raises a type error." The logical structure of this sentence is: If (for all possible function signatures FS) (there exists an actual argument AA) (AA can not be promoted to the formal type of the corresponding parameter of FS) then raise a type error. I agree with this rule. However, I think that the formalization of it is incorrect. I think your formal inference expresses the following (incorrect) rule: If (there exists an actual argument AA) (for all possible function signatures FS) (AA can not be promoted to the formal type of the corresponding parameter of FS) then raise a type error. For example, the incorrect rule just given cannot detect the type error in fs:eq ($a, $b) when $a is an xs:double and $b is an xs:boolean. According to appendix B.2 "Mapping of overloaded internal functions", there is a signature of fs:eq for which the first argument is acceptable, and there is a different signature of fs:eq for which the second argument is acceptable, but there is no signature for which both arguments are acceptable. It is very hard to be sure what the inference means because your inferences do not have explicit quantification (a major no-no in my book). Let me explain why I think the inference as stated expresses the incorrect rule rather than the correct one. In the first premise, expanded-QName is a free variable which must have existential quantification. Similarly for m and FuncDecl1 through FuncDeclm in the second premise. The third premise admirably ends with "for all 1 <= j <= m", though "for all j, 1 <= j <= m" would be better (m is not actually a free variable; it is bound by being the number of function declarations in the preceding premise, so you cannot mean "for all j, m, 1 <= j <= m"). However, the third premise also has variables n, Type1, ... Typen, and Type, which all need quantification. n is just the arity of the function, which is essentially bound by the conclusion of the inference. This leaves Type1 through Typen, plus Type, to quantify. My working hypothesis is that variables introduced in the premises have existential quantification by default. Then the next issue is whether this quantification occurs before or after the "for all j, 1 <= j <= m". If we read it (there exists Type1, ... Typen, Type) (for all j, 1 <= j <= m) FuncDecln = define function expanded-QName(Type1, ... Typen) as Type this won't work because it is saying that every FuncDecl has the same list of parameter types. Thus it must be (for all j, 1 <= j <= m) (there exists Type1, ... Typen, Type) FuncDecln = define function expanded-QName(Type1, ... Typen) as Type Probably the rule would be better stated using double subscripts on the Type's. In the next premise, "dynEnv |- Expri => Valuei", the subscript i is a free variable. I think you mean existential quantification on i, that is, "if there exists an i such that yada-yada, then raise typeError". However, the last premise ends with the cryptic "1 <= i <= n". You don't state whether this is existential or universal quantification. The earlier line with "for all 1 <= j <= m" suggests that you simply forgot to include "for all" on this one, but on the other hand, the preceding premise seems to require existential quantification of i. So perhaps your convention is that you write universal quantification explicitly but omit the existential quantifiers. And indeed the logic of the situation for this premise also inclines toward existential quantification: you only need one i such that Valuei does not promote in order to have a type error. Seen in this light, the last two premises are linked, and the value of i must be the same in both. For that matter, the Type1, ... Typen introduced in the third premise must have the same values in the last premise. In addition, it seems clear that the Valuei' in the final premise has existential quantification. The conclusion I come to is that the last three premises are interpreted as: (for all j, 1 <= j <= m) (there exists FuncDeclj, Type1, ... Typen, Type) [ FuncDeclj = define function expanded-QName(Type1, ... Typen) as Type and (there exists i, 1 <= i <= n) (there exists Valuei, Valuei') [ dynEnv |- Expri => Valuei and statEnv |- not (Valuei against Typei promotes to Valuei') ] ] Thus the rules seem to say: there exists a single function declaration FuncDeclj and a single argument number i such that the i-th argument does not promote the the i-th parameter type. And of course this is not good enough.
Received on Sunday, 17 July 2005 22:17:24 UTC