open Sexplib.Std type attr_value = string * Drl.Ast.value [@@deriving sexp] type statement = | InsertTuple of { relation : string; attributes : attr_value list } | InsertTuples of { relation : string; tuples : attr_value list list } | DeleteTuple of { relation : string; attributes : attr_value list } | Assign of { target : string; body : Drl.Ast.query } | InsertFrom of { target : string; source : Drl.Ast.query } | DeleteWhere of { target : string; predicate : Drl.Ast.query } (** Binds an unqualified name to a session-scoped ephemeral relation. The body is recomputed on each scan and never materialized; the binding lives until [DropDefine] or a session close. In contrast, [Assign] drains the body into an existing stored relation. *) | Define of { target : string; body : Drl.Ast.query } (** Drops a [Define] binding, releasing its session-ownership pin. *) | DropDefine of { target : string } [@@deriving sexp]