diff options
| author | Marcos Magueta <maguetamarcos@gmail.com> | 2026-05-11 23:10:27 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-05-11 23:10:27 -0300 |
| commit | e3d3e20dfea253de291d5b31059cd55c0eaabf02 (patch) | |
| tree | 82cf0d46ea3768171c8a87630cab5011d1ccf2a1 /lib/drl/gate.ml | |
| parent | 4fdf3392868c72ff4c33b70d165a177e97f2fece (diff) | |
| download | Sakura-e3d3e20dfea253de291d5b31059cd55c0eaabf02.tar.gz Sakura-e3d3e20dfea253de291d5b31059cd55c0eaabf02.zip | |
Multigroup unified reference for hierarchical access
Diffstat (limited to 'lib/drl/gate.ml')
| -rw-r--r-- | lib/drl/gate.ml | 79 |
1 files changed, 0 insertions, 79 deletions
diff --git a/lib/drl/gate.ml b/lib/drl/gate.ml deleted file mode 100644 index a314bce..0000000 --- a/lib/drl/gate.ml +++ /dev/null @@ -1,79 +0,0 @@ -(** Finiteness gate for DRL queries. - - Converts Sakura types to Coq-extracted types and calls the verified - [predicted_finite] function. Rejects queries whose result cannot be - statically proven finite. *) - -(* -- string -> char list impedance --------------------------------- *) - -let string_to_chars (s : string) : char list = - List.init (String.length s) (String.get s) - -(* -- Sakura AST -> extracted AST ----------------------------------- *) - -let rec query_of_ast : Ast.query -> Drl_verified.query = function - | Ast.Base name -> Drl_verified.Base (string_to_chars name) - | Ast.Const pairs -> - Drl_verified.Const - (List.map - (fun (k, v) -> (string_to_chars k, value_of_ast_value v)) - pairs) - | Ast.Select (filter, source) -> - Drl_verified.Select (query_of_ast filter, query_of_ast source) - | Ast.Join (attrs, q1, q2) -> - Drl_verified.Join - (List.map string_to_chars attrs, query_of_ast q1, query_of_ast q2) - | Ast.Cartesian (q1, q2) -> - Drl_verified.Cartesian (query_of_ast q1, query_of_ast q2) - | Ast.Project (attrs, q) -> - Drl_verified.Project (List.map string_to_chars attrs, query_of_ast q) - | Ast.Rename (renames, q) -> - Drl_verified.Rename - ( List.map (fun (o, n) -> (string_to_chars o, string_to_chars n)) renames, - query_of_ast q ) - | Ast.Union (q1, q2) -> Drl_verified.Union (query_of_ast q1, query_of_ast q2) - | Ast.Diff (q1, q2) -> Drl_verified.Diff (query_of_ast q1, query_of_ast q2) - | Ast.Take (n, q) -> Drl_verified.Take (n, query_of_ast q) - -and value_of_ast_value : Ast.value -> Drl_verified.literal = function - | Ast.Int n -> Drl_verified.LitInt n - (* The Coq model has no float literal. This truncation is harmless: - the finiteness gate inspects only relation names and query structure, - never literal values. *) - | Ast.Float f -> Drl_verified.LitInt (int_of_float f) - | Ast.Str s -> Drl_verified.LitStr (string_to_chars s) - | Ast.Bool b -> Drl_verified.LitBool b - -(* -- database snapshot --------------------------------------------- *) - -let is_finite (c : Conventions.Cardinality.t) : bool = - match c with - | Conventions.Cardinality.Finite _ | Conventions.Cardinality.ConstrainedFinite - -> - true - | Conventions.Cardinality.AlephZero | Conventions.Cardinality.Continuum -> - false - -let database_snapshot (db : Management.Database.t) : Drl_verified.database = - Management.Database.RelationMap.fold - (fun name (rel : Relation.t) acc -> - let entry : Drl_verified.relation = - { - rel_name = string_to_chars name; - rel_finite = is_finite rel.cardinality; - } - in - (string_to_chars name, entry) :: acc) - db.relations [] - -(* -- public interface ---------------------------------------------- *) - -let admit (db : Management.Database.t) (ast : Ast.query) : (unit, string) result - = - let vdb = database_snapshot db in - let vq = query_of_ast ast in - match Drl_verified.predicted_finite vdb vq with - | Some true -> Ok () - | Some false -> - Error "query produces potentially infinite result; use Take to bound it" - | None -> Error "referenced relation not found in finiteness check" |
