From 97960adb8426e5270fe16b027e82a2c61674f821 Mon Sep 17 00:00:00 2001 From: Marcos Magueta Date: Mon, 27 Apr 2026 23:24:19 -0300 Subject: Foreign call PRL (#67) --- lib/prelude/catalog.ml | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/prelude/standard.ml | 5 +++++ 2 files changed, 61 insertions(+) (limited to 'lib/prelude') diff --git a/lib/prelude/catalog.ml b/lib/prelude/catalog.ml index 743d397..4b89b4a 100644 --- a/lib/prelude/catalog.ml +++ b/lib/prelude/catalog.ml @@ -18,6 +18,8 @@ let branch_rel_name = catalog_prefix ^ "branch" let head_rel_name = catalog_prefix ^ "head" let multigroup_rel_name = catalog_prefix ^ "multigroup" let schema_rel_name = catalog_prefix ^ "schema" +let function_predicate_rel_name = catalog_prefix ^ "function_predicate" +let loaded_library_rel_name = catalog_prefix ^ "loaded_library" (** Relations present in every multigroup's catalog. *) let catalog_relation_names = @@ -29,6 +31,8 @@ let catalog_relation_names = on_rel_name; timing_rel_name; schema_rel_name; + function_predicate_rel_name; + loaded_library_rel_name; ] (** Relations exclusive to the sakura meta-multigroup. *) @@ -56,6 +60,16 @@ let timing_schema : Schema.t = Schema.empty |> Schema.add "timing" "string" let multigroup_schema : Schema.t = Schema.empty |> Schema.add "name" "string" let schema_schema : Schema.t = Schema.empty |> Schema.add "name" "string" +let function_predicate_schema : Schema.t = + Schema.empty + |> Schema.add "name" "string" + |> Schema.add "symbol" "string" + |> Schema.add "cardinality" "string" + |> Schema.add "purity" "string" + +let loaded_library_schema : Schema.t = + Schema.empty |> Schema.add "path" "string" + (** Definitions seeded into every multigroup. *) let catalog_definitions = [ @@ -66,6 +80,8 @@ let catalog_definitions = (on_rel_name, on_schema); (timing_rel_name, timing_schema); (schema_rel_name, schema_schema); + (function_predicate_rel_name, function_predicate_schema); + (loaded_library_rel_name, loaded_library_schema); ] (** Extra definitions seeded only into the sakura meta-multigroup. *) @@ -149,3 +165,43 @@ let build_schema_tuple schema_name : Tuple.materialized = { Attribute.value = Obj.magic schema_name }; } +let purity_to_string p = + Sexplib.Sexp.to_string (Conventions.Purity.sexp_of_t p) + +let purity_of_string s = + match Conventions.Purity.t_of_sexp (Sexplib.Sexp.of_string s) with + | p -> Some p + | exception _ -> None + +let cardinality_to_string c = + Sexplib.Sexp.to_string (Conventions.Cardinality.sexp_of_t c) + +let cardinality_of_string s = + match Conventions.Cardinality.t_of_sexp (Sexplib.Sexp.of_string s) with + | c -> Some c + | exception _ -> None + +let build_function_predicate_tuple ~name ~symbol ~cardinality ~purity : + Tuple.materialized = + { + Tuple.relation = function_predicate_rel_name; + attributes = + Tuple.AttributeMap.of_list + [ + ("name", { Attribute.value = Obj.magic name }); + ("symbol", { Attribute.value = Obj.magic symbol }); + ("cardinality", + { Attribute.value = Obj.magic (cardinality_to_string cardinality) }); + ("purity", + { Attribute.value = Obj.magic (purity_to_string purity) }); + ]; + } + +let build_loaded_library_tuple path : Tuple.materialized = + { + Tuple.relation = loaded_library_rel_name; + attributes = + Tuple.AttributeMap.singleton "path" + { Attribute.value = Obj.magic path }; + } + diff --git a/lib/prelude/standard.ml b/lib/prelude/standard.ml index 2a507e5..b4f5834 100644 --- a/lib/prelude/standard.ml +++ b/lib/prelude/standard.ml @@ -31,6 +31,7 @@ let make_comparison ~name ~domain_name ~pred ~cardinality ~generator = ~cardinality ~generator:(Some generator) ~membership_criteria ~provenance:(Relation.Provenance.Base name) ~lineage:(Relation.Lineage.Base name) + () (** Enumerate pairs (a, b) where a < b using triangular indexing. *) let pair_of_nat_lt n = @@ -197,6 +198,7 @@ let plus_natural : Relation.t = ~generator:(Some generator) ~membership_criteria ~provenance:(Relation.Provenance.Base "plus") ~lineage:(Relation.Lineage.Base "plus") + () let times_natural : Relation.t = let schema = @@ -236,6 +238,7 @@ let times_natural : Relation.t = ~generator:(Some generator) ~membership_criteria ~provenance:(Relation.Provenance.Base "times") ~lineage:(Relation.Lineage.Base "times") + () let minus_natural : Relation.t = let schema = @@ -277,6 +280,7 @@ let minus_natural : Relation.t = ~generator:(Some generator) ~membership_criteria ~provenance:(Relation.Provenance.Base "minus") ~lineage:(Relation.Lineage.Base "minus") + () let divide_natural : Relation.t = let schema = @@ -328,6 +332,7 @@ let divide_natural : Relation.t = ~generator:(Some generator) ~membership_criteria ~provenance:(Relation.Provenance.Base "divide") ~lineage:(Relation.Lineage.Base "divide") + () let prelude_relations = [ less_than_natural -- cgit v1.2.3