synalog 2.3.0__tar.gz → 2.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {synalog-2.3.0 → synalog-2.4.0}/Cargo.lock +2 -2
- {synalog-2.3.0 → synalog-2.4.0}/Cargo.toml +1 -1
- {synalog-2.3.0 → synalog-2.4.0}/PKG-INFO +7 -7
- {synalog-2.3.0 → synalog-2.4.0}/README.md +6 -6
- synalog-2.4.0/docs/benchmark/results.json +259239 -0
- synalog-2.4.0/docs/benchmark/speedup_by_engine.png +0 -0
- synalog-2.4.0/docs/benchmark/speedup_distribution.png +0 -0
- synalog-2.4.0/docs/benchmark/summary.md +18 -0
- synalog-2.4.0/docs/benchmark/summary.png +0 -0
- synalog-2.4.0/docs/benchmark/time_comparison.png +0 -0
- synalog-2.4.0/docs/benchmark/verify_by_engine.png +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/pyproject.toml +1 -1
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/functors.rs +3 -2
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/arity.rs +83 -40
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/safety.rs +128 -68
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/stratification.rs +47 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/undefined.rs +73 -38
- {synalog-2.3.0 → synalog-2.4.0}/uv.lock +113 -113
- {synalog-2.3.0 → synalog-2.4.0}/verified/Cargo.toml +1 -1
- synalog-2.4.0/verified/src/arity.rs +73 -0
- {synalog-2.3.0 → synalog-2.4.0}/verified/src/lib.rs +54 -1
- synalog-2.4.0/verified/src/membership.rs +157 -0
- synalog-2.4.0/verified/src/recursion.rs +33 -0
- synalog-2.4.0/verified/src/safety.rs +158 -0
- synalog-2.4.0/verified/src/strata.rs +248 -0
- {synalog-2.3.0 → synalog-2.4.0}/verified/src/types.rs +190 -0
- synalog-2.3.0/docs/benchmark/results.json +0 -4575
- synalog-2.3.0/docs/benchmark/speedup_by_engine.png +0 -0
- synalog-2.3.0/docs/benchmark/speedup_distribution.png +0 -0
- synalog-2.3.0/docs/benchmark/summary.md +0 -18
- synalog-2.3.0/docs/benchmark/summary.png +0 -0
- synalog-2.3.0/docs/benchmark/time_comparison.png +0 -0
- synalog-2.3.0/docs/benchmark/verify_by_engine.png +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/.gitignore +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/LICENSE +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/NOTICE +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/assertions.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/assets/synalog-dark.svg +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/assets/synalog-light.svg +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/assets/synalog_favicon.png +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/benchmark.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/cli.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/development.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/differences-datalog.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/differences.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/engines.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/aggregation.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/aggregation.log +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/directives.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/directives.log +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/functions.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/functions.log +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/functors.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/functors.log +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/getting_started.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/getting_started.log +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/knowledge_graphs.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/knowledge_graphs.log +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/recursion.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/recursion.log +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/run.py +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/shop/concepts/customer.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/shop/concepts/order_status.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/shop/data/orders.csv +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/shop/layer.toml +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/shop/rules/customer_revenue.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/shop/rules/orders_by_status.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/shop/rules/top_customers.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/shop/tables/orders.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/shop.log +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/smoke/concepts/device.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/smoke/concepts/test_status.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/smoke/data/smoke_tests.csv +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/smoke/layer.toml +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/smoke/rules/failures_by_device.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/smoke/rules/runs_per_day.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/smoke/tables/smoke_tests.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/smoke.log +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/syntax.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/syntax.log +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/temporal.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/temporal.log +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/temporal_graph.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/temporal_graph.log +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/verification.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/examples/verification.log +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/getting-started.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/index.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/javascripts/playground.js +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/javascripts/summarize.js +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/javascripts/synalog-highlight.js +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/knowledge-graphs.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/language/aggregation.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/language/directives.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/language/functions.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/language/functors.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/language/index.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/language/recursion.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/language/syntax.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/language/temporal.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/playground/vendor/codemirror.js +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/playground.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/python-api.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/stylesheets/extra.css +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/verification.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/docs/why.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/img/synalog-dark.svg +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/img/synalog-light.svg +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/python/synalog/__init__.py +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/python/synalog/__main__.py +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/python/synalog/checking.py +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/python/synalog/cli.py +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/python/synalog/config.py +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/python/synalog/execution.py +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/python/synalog/introspect.py +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/python/synalog/project.py +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/python/synalog/runners.py +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/SKILL.md +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/company/concepts/department.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/company/concepts/person.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/company/concepts/works_in.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/company/data/departments.csv +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/company/data/employees.csv +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/company/layer.toml +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/company/rules/team_mate.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/company/tables/departments.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/company/tables/employees.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/org/concepts/all_managers.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/org/data/employees.csv +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/org/layer.toml +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/org/tables/employees.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/sales/concepts/region.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/sales/data/sales.csv +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/sales/layer.toml +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/sales/rules/monthly_sales.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/sales/rules/top_region.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/sales/rules/total_by_region.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/skills/synalog/examples/sales/tables/sales.l +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/assertion/mod.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/assertion/parse.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/assertion/report.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/assertion/translate.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/annotations.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/annotations_test.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/dialects.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/dialects_test.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/expr_translate.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/expr_translate_test.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/functors_test.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/mod.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/rule_translate.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/rule_translate_test.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/type_inference/builder.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/type_inference/built_in.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/type_inference/edge.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/type_inference/expression.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/type_inference/graph.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/type_inference/inference.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/type_inference/intersection.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/type_inference/mod.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/type_inference/types.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/universe.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/compiler/universe_test.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/errors.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/lib.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/parser/json.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/parser/json_test.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/parser/mod.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/parser/names.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/parser/parse.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/parser/parse_test.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/parser/rewrite.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/parser/rewrite_test.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/parser/span.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/parser/span_test.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/parser/traverse.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/parser/traverse_test.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/python.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/assertions.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/cast.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/contradiction.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/dependencies.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/directives.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/front_matter.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/functors.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/mod.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/orderby.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/positional.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/recursion.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/reserved.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/sqlexpr.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/verifier/vars.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/src/wasm.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/verified/src/cast.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/verified/src/contradiction.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/verified/src/page.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/verified/src/plan.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/verified/src/quote.rs +0 -0
- {synalog-2.3.0 → synalog-2.4.0}/zensical.toml +0 -0
|
@@ -300,7 +300,7 @@ dependencies = [
|
|
|
300
300
|
|
|
301
301
|
[[package]]
|
|
302
302
|
name = "synalog"
|
|
303
|
-
version = "2.
|
|
303
|
+
version = "2.4.0"
|
|
304
304
|
dependencies = [
|
|
305
305
|
"anyhow",
|
|
306
306
|
"indexmap",
|
|
@@ -316,7 +316,7 @@ dependencies = [
|
|
|
316
316
|
|
|
317
317
|
[[package]]
|
|
318
318
|
name = "synalog-verified"
|
|
319
|
-
version = "2.
|
|
319
|
+
version = "2.4.0"
|
|
320
320
|
dependencies = [
|
|
321
321
|
"vstd",
|
|
322
322
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: synalog
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.0
|
|
4
4
|
Classifier: Programming Language :: Rust
|
|
5
5
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
6
6
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -62,7 +62,7 @@ Project-URL: Repository, https://github.com/synalinks/synalog
|
|
|
62
62
|
# Synalog
|
|
63
63
|
## Logic programming for AI agents: Datalog-family language compiling to optimized SQL
|
|
64
64
|
|
|
65
|
-
Synalog is a logic programming language from the [Datalog](https://en.wikipedia.org/wiki/Datalog) family, a fork of [Logica](https://logica.dev/) with the entire engine (parser, compiler and verifier) **rewritten in Rust**. It compiles to optimized **SQL** and ships as a Python package built on [PyO3](https://pyo3.rs/): parsing is **~
|
|
65
|
+
Synalog is a logic programming language from the [Datalog](https://en.wikipedia.org/wiki/Datalog) family, a fork of [Logica](https://logica.dev/) with the entire engine (parser, compiler and verifier) **rewritten in Rust**. It compiles to optimized **SQL** and ships as a Python package built on [PyO3](https://pyo3.rs/): parsing is **~52x faster** and compilation **~51x faster** than the original Python implementation, so validating and compiling a program is effectively instant.
|
|
66
66
|
|
|
67
67
|
Synalog was built for the AI agents era. The main idea is to give an agent a **dynamic semantic layer** over its data: a layer of named concepts and rules that the agent both reads from *and writes to* at inference time. Unlike a traditional BI semantic layer, which is modeled once by humans and frozen, Synalog's layer is authored on the fly: the agent extracts entities and relationships into **knowledge graphs**, derives meaning with composable **logical rules**, and reasons over time with **temporal reasoning**: accumulating all of it as structured, reusable memory.
|
|
68
68
|
|
|
@@ -576,19 +576,19 @@ Each engine has its own SQL dialect for string literals, array syntax, GROUP BY
|
|
|
576
576
|
|
|
577
577
|
## Benchmark
|
|
578
578
|
|
|
579
|
-
The Rust core is benchmarked against the original Python Logica implementation on every program of the compiler test suite (
|
|
579
|
+
The Rust core is benchmarked against the original Python Logica implementation on every program of the compiler test suite (28,614 programs across 6 engines). Both run **in-process**: Synalog through the same PyO3 extension that `pip install synalog` ships, so the numbers measure exactly what a Python caller gets:
|
|
580
580
|
|
|
581
581
|
| | Python Logica | Synalog (Rust) | Speedup |
|
|
582
582
|
|---|---|---|---|
|
|
583
|
-
| Parse |
|
|
584
|
-
| Compile |
|
|
585
|
-
| Verify | n/a |
|
|
583
|
+
| Parse | 230.5 s | 4.1 s | **52x** |
|
|
584
|
+
| Compile | 1117.7 s | 25.7 s | **51x** |
|
|
585
|
+
| Verify | n/a | 12.1 s | Rust-only |
|
|
586
586
|
|
|
587
587
|
<p align="center">
|
|
588
588
|
<img src="https://raw.githubusercontent.com/synalinks/synalog/main/docs/benchmark/speedup_by_engine.png" alt="Synalog vs Python Logica: speedup by SQL engine" width="820">
|
|
589
589
|
</p>
|
|
590
590
|
|
|
591
|
-
Speedup is the geometric mean of per-program speedups (every program weighted equally). Parsing is uniformly ~
|
|
591
|
+
Speedup is the geometric mean of per-program speedups (every program weighted equally). Parsing is uniformly ~52x faster; compilation ranges from ~38x (trino, presto) to ~102x (duckdb). Verification (safety, stratification, recursion and reserved-name checks) is a Synalog-specific pass with no standalone Python equivalent. Per-engine tables and methodology are on the [Benchmark](https://synalinks.github.io/synalog/benchmark/) page; reproduce with `python3 benchmark.py`.
|
|
592
592
|
|
|
593
593
|
## Verification
|
|
594
594
|
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
# Synalog
|
|
21
21
|
## Logic programming for AI agents: Datalog-family language compiling to optimized SQL
|
|
22
22
|
|
|
23
|
-
Synalog is a logic programming language from the [Datalog](https://en.wikipedia.org/wiki/Datalog) family, a fork of [Logica](https://logica.dev/) with the entire engine (parser, compiler and verifier) **rewritten in Rust**. It compiles to optimized **SQL** and ships as a Python package built on [PyO3](https://pyo3.rs/): parsing is **~
|
|
23
|
+
Synalog is a logic programming language from the [Datalog](https://en.wikipedia.org/wiki/Datalog) family, a fork of [Logica](https://logica.dev/) with the entire engine (parser, compiler and verifier) **rewritten in Rust**. It compiles to optimized **SQL** and ships as a Python package built on [PyO3](https://pyo3.rs/): parsing is **~52x faster** and compilation **~51x faster** than the original Python implementation, so validating and compiling a program is effectively instant.
|
|
24
24
|
|
|
25
25
|
Synalog was built for the AI agents era. The main idea is to give an agent a **dynamic semantic layer** over its data: a layer of named concepts and rules that the agent both reads from *and writes to* at inference time. Unlike a traditional BI semantic layer, which is modeled once by humans and frozen, Synalog's layer is authored on the fly: the agent extracts entities and relationships into **knowledge graphs**, derives meaning with composable **logical rules**, and reasons over time with **temporal reasoning**: accumulating all of it as structured, reusable memory.
|
|
26
26
|
|
|
@@ -534,19 +534,19 @@ Each engine has its own SQL dialect for string literals, array syntax, GROUP BY
|
|
|
534
534
|
|
|
535
535
|
## Benchmark
|
|
536
536
|
|
|
537
|
-
The Rust core is benchmarked against the original Python Logica implementation on every program of the compiler test suite (
|
|
537
|
+
The Rust core is benchmarked against the original Python Logica implementation on every program of the compiler test suite (28,614 programs across 6 engines). Both run **in-process**: Synalog through the same PyO3 extension that `pip install synalog` ships, so the numbers measure exactly what a Python caller gets:
|
|
538
538
|
|
|
539
539
|
| | Python Logica | Synalog (Rust) | Speedup |
|
|
540
540
|
|---|---|---|---|
|
|
541
|
-
| Parse |
|
|
542
|
-
| Compile |
|
|
543
|
-
| Verify | n/a |
|
|
541
|
+
| Parse | 230.5 s | 4.1 s | **52x** |
|
|
542
|
+
| Compile | 1117.7 s | 25.7 s | **51x** |
|
|
543
|
+
| Verify | n/a | 12.1 s | Rust-only |
|
|
544
544
|
|
|
545
545
|
<p align="center">
|
|
546
546
|
<img src="https://raw.githubusercontent.com/synalinks/synalog/main/docs/benchmark/speedup_by_engine.png" alt="Synalog vs Python Logica: speedup by SQL engine" width="820">
|
|
547
547
|
</p>
|
|
548
548
|
|
|
549
|
-
Speedup is the geometric mean of per-program speedups (every program weighted equally). Parsing is uniformly ~
|
|
549
|
+
Speedup is the geometric mean of per-program speedups (every program weighted equally). Parsing is uniformly ~52x faster; compilation ranges from ~38x (trino, presto) to ~102x (duckdb). Verification (safety, stratification, recursion and reserved-name checks) is a Synalog-specific pass with no standalone Python equivalent. Per-engine tables and methodology are on the [Benchmark](https://synalinks.github.io/synalog/benchmark/) page; reproduce with `python3 benchmark.py`.
|
|
550
550
|
|
|
551
551
|
## Verification
|
|
552
552
|
|