Types & Constants
Constants are supported in three types, String, Numbers, and Boolean. Whereas some definitions of
Datalog introduce an additional Identifier type, ASDI treats these as short strings that can
safely be expressed without quotes; therefore, the values xerces
and "xerces"
are equivalent.
constant
::= string | number | boolean ;
Strings
Strings are described in both the identifier and quoted form in the string
rule.
Strings MUST NOT contain characters from the Unicode category Cc (Control) except #x09
tab, #x0A
line feed, and #x0D
carriage return.
Additionally, strings MUST NOT contain characters from the Unicode categories Cf (format), Co (Private Use), or Cs (Surrogate).
These characters and any other non-printable characters MUST be included using the escape format: \"
, \t
, \n
, \r
, \u{XXXX}
, or \u{XXXXXXXX}
.
string ::= identifier-string | literal-string ;
An identifier-string
is a string of characters that looks much like a predicate hello
, or a namespaced predicate message:hello
. This allows for simple string values to be specified without quoting, and a syntax that is closer to the original Prolog form. The introduction of the “:” and trailing string part is an addition in DATALOG-TEXT that allows for larger programs to naturally introduce namespaces for symbols.
In some Datalog literature and implementations there is a
symbol
type with a similar grammar production topredicate
. In some implementations a symbol type is supported, but it’s value is the string representation of the predicate. This can lead to API confusion here a symbol can be created but is manipulated as a string.
identifier-string
::= predicate ( ":" ALPHA ( ALPHA | DIGIT | UNDERSCORE )* )? ;
Literal strings are enclosed in double quote characters '"'
and use the backslash escaping for quotes \"
, tab \t
, new-line \n
, and carriage return \r
.
literal-string
::= DQUOTE ( string-escape | [^#x22] )* DQUOTE ;
The escape form also allows for the escaping of Unicode characters either in 4 or 8 character hexadecimal format.
string-escape
::= "\\" ( DQUOTE | [tnr] )
| "\u{" HEXDIGIT HEXDIGIT HEXDIGIT HEXDIGIT
( HEXDIGIT HEXDIGIT HEXDIGIT HEXDIGIT )? "}" ;
Errors
ERR_INVALID_VALUE_FOR_TYPE
– invalid characters present within a string value.
Numbers
A conforming DATALOG-TEXT processor MUST provide the data type integer
, and MAY provide the data types decimal
and float
if the feature extended_numerics
is enabled. Any use of these types when the corresponding feature is not enabled should signal the error ERR_FEATURE_NOT_ENABLED
.
number ::= float # Optional
| decimal # Optional
| integer ; # Required
Integers
While this specification does not require a specific number of bits for integer values a conforming DATALOG-TEXT processor MUST provide at least 64-bit signed values $\small -2^{64} < v < 2^{64}$.
integer ::= ( "+" | "-" )? DIGIT+
Fixed-Point Decimals
Fixed-Point Decimal values MUST BE a 128-bit representation of a fixed-precision decimal number. The finite set of values of type decimal
are of the form $\small m / 10^e$, where $\small m$ is an integer such that $\small -2^{96} < m < 2^{96}$, and $\small e$ is an integer between $\small 0$ and $\small 28$ inclusive.
decimal ::= integer "." DIGIT+
Floating-Point
DATALOG-TEXT floating point values are patterned after the XMLSCHEMA-2 double
type which in turn is patterned on the IEEE double-precision 64-bit floating point type IEEE754.
From XMLSCHEMA-2:
This datatype differs from that of IEEE754 in that there is only one NaN and only one zero. This makes the equality and ordering of values in the data space differ from that of IEEE754 only in that for schema purposes
NaN = NaN
.
The DATALOG-TEXT production uses the R7RS Scheme notation for infinities and not-a-number.
float ::= ( decimal ( "e" | "E" ) integer )
| "+inf.0"
| "-inf.0"
| "+nan.0" ;
Errors
ERR_INVALID_VALUE_FOR_TYPE
– a constant value is too large for the implementation type.
Examples
age(plato, 2400.0). %% ==> ERR_FEATURE_NOT_ENABLED
.pragma extended_numerics.
age(plato, 2400.0).
Booleans
Boolean values are represented simply as either true
or false
.
boolean ::= "true" | "false" ;