open Sexplib.Std type binding_expr = | Var of string | Const of Drl.Ast.value (** reuse DRL value for literals *) [@@deriving sexp] type constraint_body = | MemberOf of { target: string; binding: (string * binding_expr) list } | Not of { body: constraint_body; universe: string } | And of constraint_body list | Or of constraint_body list | Exists of { variable: string; quantifier: string; body: constraint_body } | Forall of { variable: string; quantifier: string; body: constraint_body } [@@deriving sexp] type statement = | RegisterConstraint of { constraint_name: string; relation_name: string; body: constraint_body; } [@@deriving sexp]