asdi 0.2.5

Another Simplistic Datalog Implementation (in Rust)
Documentation
program
        ::= assignment | expression

assignment
        ::= identifier ( "≔" | ":=" ) expression

expression
        ::=  relation-identifier
          |  union
          |  intersection
          |  difference
          |  cartesian-product
          |  selection
          |  projection
          |  rename
          |  join
          |  "(" expression ")"

/* ************************************************************************* */

union   ::= expression ( "∪" | "union" ) expression

intersection
        ::= expression ( "∩" | "intersect" ) expression

difference
        ::= expression ( "∖" | "-" | "diff" ) expression

cartesian-product
        ::= expression ( "⨯" | "×" | "product" ) expression

selection
        ::= expression
            ( "σ" | "select" ) "[" criteria ("," criteria )* "]"
            expression

criteria
        ::= ( attribute-identifier | literal )
            operation
            ( attribute-identifier | literal )

operation
        ::= "=" | "!=" "<" | "<=" | ">" | ">="

projection
        ::= expression
            ( "Π" | "π" | ""project" ) "[" attribute-identifier ("," attribute-identifier )* "]"
            expression

rename  ::= expression
            ( "ρ" | "rename" ) "[" rename-pair ("," rename-pair )* "]"
            expression

rename-pair
        ::= attribute-identifier "=" attribute-identifier

join    ::= expression
            ( natural-join | theta-join )
            expression

natural-join
        ::= "⨝" | "natural-join"

theta-join
        ::= ( "⨝" | "theta-join" ) "[" criteria  ("," criteria )* "]"

/* ************************************************************************* */

relation-identifier
        ::= ALPHA ( ALPHANUM | "_" )*

attribute-identifier
        ::= relation-identifier
            ( "." ( relation-identifier | integer ) )

/* ************************************************************************* */

literal ::= integer | string | boolean

integer ::= DIGIT+

string  ::= '"' [^\"]* '"'

boolean ::= "true" | "false"