synalog 2.2.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.
Files changed (204) hide show
  1. synalog-2.4.0/Cargo.lock +491 -0
  2. {synalog-2.2.0 → synalog-2.4.0}/Cargo.toml +5 -8
  3. {synalog-2.2.0 → synalog-2.4.0}/PKG-INFO +10 -7
  4. {synalog-2.2.0 → synalog-2.4.0}/README.md +9 -6
  5. synalog-2.4.0/docs/benchmark/results.json +259239 -0
  6. synalog-2.4.0/docs/benchmark/speedup_by_engine.png +0 -0
  7. synalog-2.4.0/docs/benchmark/speedup_distribution.png +0 -0
  8. synalog-2.4.0/docs/benchmark/summary.md +18 -0
  9. synalog-2.4.0/docs/benchmark/summary.png +0 -0
  10. synalog-2.4.0/docs/benchmark/time_comparison.png +0 -0
  11. synalog-2.4.0/docs/benchmark/verify_by_engine.png +0 -0
  12. {synalog-2.2.0 → synalog-2.4.0}/docs/cli.md +1 -1
  13. {synalog-2.2.0 → synalog-2.4.0}/docs/development.md +23 -3
  14. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/aggregation.log +8 -8
  15. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/directives.log +2 -2
  16. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/functions.log +6 -6
  17. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/functors.log +8 -8
  18. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/getting_started.log +2 -2
  19. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/knowledge_graphs.log +14 -14
  20. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/recursion.log +4 -4
  21. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/syntax.log +11 -11
  22. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/temporal.log +8 -8
  23. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/temporal_graph.log +11 -11
  24. {synalog-2.2.0 → synalog-2.4.0}/docs/language/functions.md +4 -0
  25. {synalog-2.2.0 → synalog-2.4.0}/docs/language/recursion.md +1 -1
  26. {synalog-2.2.0 → synalog-2.4.0}/docs/verification.md +29 -2
  27. {synalog-2.2.0 → synalog-2.4.0}/pyproject.toml +1 -1
  28. {synalog-2.2.0 → synalog-2.4.0}/python/synalog/__init__.py +2 -0
  29. {synalog-2.2.0 → synalog-2.4.0}/python/synalog/cli.py +1 -1
  30. {synalog-2.2.0 → synalog-2.4.0}/python/synalog/introspect.py +3 -3
  31. {synalog-2.2.0 → synalog-2.4.0}/python/synalog/runners.py +1 -1
  32. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/SKILL.md +1 -1
  33. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/annotations.rs +12 -9
  34. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/annotations_test.rs +4 -4
  35. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/dialects.rs +28 -27
  36. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/expr_translate.rs +14 -7
  37. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/expr_translate_test.rs +5 -5
  38. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/functors.rs +29 -26
  39. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/functors_test.rs +20 -0
  40. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/mod.rs +2 -4
  41. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/rule_translate.rs +3 -3
  42. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/rule_translate_test.rs +1 -1
  43. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/type_inference/builder.rs +5 -5
  44. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/type_inference/built_in.rs +14 -14
  45. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/type_inference/edge.rs +9 -9
  46. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/type_inference/inference.rs +1 -1
  47. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/type_inference/mod.rs +2 -2
  48. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/type_inference/types.rs +2 -2
  49. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/universe.rs +92 -112
  50. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/universe_test.rs +155 -132
  51. {synalog-2.2.0 → synalog-2.4.0}/src/errors.rs +4 -0
  52. {synalog-2.2.0 → synalog-2.4.0}/src/parser/parse.rs +2 -2
  53. {synalog-2.2.0 → synalog-2.4.0}/src/parser/parse_test.rs +1 -1
  54. {synalog-2.2.0 → synalog-2.4.0}/src/python.rs +62 -14
  55. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/arity.rs +83 -40
  56. synalog-2.4.0/src/verifier/cast.rs +146 -0
  57. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/contradiction.rs +28 -26
  58. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/mod.rs +10 -0
  59. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/positional.rs +5 -5
  60. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/recursion.rs +9 -29
  61. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/reserved.rs +1 -1
  62. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/safety.rs +131 -71
  63. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/stratification.rs +119 -122
  64. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/undefined.rs +73 -38
  65. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/vars.rs +8 -8
  66. {synalog-2.2.0 → synalog-2.4.0}/src/wasm.rs +3 -3
  67. synalog-2.4.0/uv.lock +3470 -0
  68. synalog-2.4.0/verified/Cargo.toml +18 -0
  69. synalog-2.4.0/verified/src/arity.rs +73 -0
  70. synalog-2.4.0/verified/src/cast.rs +153 -0
  71. synalog-2.4.0/verified/src/contradiction.rs +220 -0
  72. synalog-2.4.0/verified/src/lib.rs +686 -0
  73. synalog-2.4.0/verified/src/membership.rs +157 -0
  74. synalog-2.4.0/verified/src/page.rs +112 -0
  75. synalog-2.4.0/verified/src/plan.rs +707 -0
  76. synalog-2.4.0/verified/src/quote.rs +546 -0
  77. synalog-2.4.0/verified/src/recursion.rs +33 -0
  78. synalog-2.4.0/verified/src/safety.rs +158 -0
  79. synalog-2.4.0/verified/src/strata.rs +248 -0
  80. synalog-2.4.0/verified/src/types.rs +815 -0
  81. synalog-2.2.0/Cargo.lock +0 -3315
  82. synalog-2.2.0/docs/benchmark/results.json +0 -4575
  83. synalog-2.2.0/docs/benchmark/speedup_by_engine.png +0 -0
  84. synalog-2.2.0/docs/benchmark/speedup_distribution.png +0 -0
  85. synalog-2.2.0/docs/benchmark/summary.md +0 -18
  86. synalog-2.2.0/docs/benchmark/summary.png +0 -0
  87. synalog-2.2.0/docs/benchmark/time_comparison.png +0 -0
  88. synalog-2.2.0/docs/benchmark/verify_by_engine.png +0 -0
  89. synalog-2.2.0/src/compiler/concertina.rs +0 -787
  90. synalog-2.2.0/src/compiler/program.rs +0 -617
  91. synalog-2.2.0/src/compiler/program_test.rs +0 -519
  92. synalog-2.2.0/uv.lock +0 -2447
  93. {synalog-2.2.0 → synalog-2.4.0}/.gitignore +0 -0
  94. {synalog-2.2.0 → synalog-2.4.0}/LICENSE +0 -0
  95. {synalog-2.2.0 → synalog-2.4.0}/NOTICE +0 -0
  96. {synalog-2.2.0 → synalog-2.4.0}/docs/assertions.md +0 -0
  97. {synalog-2.2.0 → synalog-2.4.0}/docs/assets/synalog-dark.svg +0 -0
  98. {synalog-2.2.0 → synalog-2.4.0}/docs/assets/synalog-light.svg +0 -0
  99. {synalog-2.2.0 → synalog-2.4.0}/docs/assets/synalog_favicon.png +0 -0
  100. {synalog-2.2.0 → synalog-2.4.0}/docs/benchmark.md +0 -0
  101. {synalog-2.2.0 → synalog-2.4.0}/docs/differences-datalog.md +0 -0
  102. {synalog-2.2.0 → synalog-2.4.0}/docs/differences.md +0 -0
  103. {synalog-2.2.0 → synalog-2.4.0}/docs/engines.md +0 -0
  104. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/aggregation.l +0 -0
  105. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/directives.l +0 -0
  106. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/functions.l +0 -0
  107. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/functors.l +0 -0
  108. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/getting_started.l +0 -0
  109. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/knowledge_graphs.l +0 -0
  110. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/recursion.l +0 -0
  111. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/run.py +0 -0
  112. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/shop/concepts/customer.l +0 -0
  113. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/shop/concepts/order_status.l +0 -0
  114. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/shop/data/orders.csv +0 -0
  115. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/shop/layer.toml +0 -0
  116. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/shop/rules/customer_revenue.l +0 -0
  117. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/shop/rules/orders_by_status.l +0 -0
  118. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/shop/rules/top_customers.l +0 -0
  119. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/shop/tables/orders.l +0 -0
  120. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/shop.log +0 -0
  121. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/smoke/concepts/device.l +0 -0
  122. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/smoke/concepts/test_status.l +0 -0
  123. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/smoke/data/smoke_tests.csv +0 -0
  124. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/smoke/layer.toml +0 -0
  125. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/smoke/rules/failures_by_device.l +0 -0
  126. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/smoke/rules/runs_per_day.l +0 -0
  127. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/smoke/tables/smoke_tests.l +0 -0
  128. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/smoke.log +0 -0
  129. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/syntax.l +0 -0
  130. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/temporal.l +0 -0
  131. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/temporal_graph.l +0 -0
  132. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/verification.l +0 -0
  133. {synalog-2.2.0 → synalog-2.4.0}/docs/examples/verification.log +0 -0
  134. {synalog-2.2.0 → synalog-2.4.0}/docs/getting-started.md +0 -0
  135. {synalog-2.2.0 → synalog-2.4.0}/docs/index.md +0 -0
  136. {synalog-2.2.0 → synalog-2.4.0}/docs/javascripts/playground.js +0 -0
  137. {synalog-2.2.0 → synalog-2.4.0}/docs/javascripts/summarize.js +0 -0
  138. {synalog-2.2.0 → synalog-2.4.0}/docs/javascripts/synalog-highlight.js +0 -0
  139. {synalog-2.2.0 → synalog-2.4.0}/docs/knowledge-graphs.md +0 -0
  140. {synalog-2.2.0 → synalog-2.4.0}/docs/language/aggregation.md +0 -0
  141. {synalog-2.2.0 → synalog-2.4.0}/docs/language/directives.md +0 -0
  142. {synalog-2.2.0 → synalog-2.4.0}/docs/language/functors.md +0 -0
  143. {synalog-2.2.0 → synalog-2.4.0}/docs/language/index.md +0 -0
  144. {synalog-2.2.0 → synalog-2.4.0}/docs/language/syntax.md +0 -0
  145. {synalog-2.2.0 → synalog-2.4.0}/docs/language/temporal.md +0 -0
  146. {synalog-2.2.0 → synalog-2.4.0}/docs/playground/vendor/codemirror.js +0 -0
  147. {synalog-2.2.0 → synalog-2.4.0}/docs/playground.md +0 -0
  148. {synalog-2.2.0 → synalog-2.4.0}/docs/python-api.md +0 -0
  149. {synalog-2.2.0 → synalog-2.4.0}/docs/stylesheets/extra.css +0 -0
  150. {synalog-2.2.0 → synalog-2.4.0}/docs/why.md +0 -0
  151. {synalog-2.2.0 → synalog-2.4.0}/img/synalog-dark.svg +0 -0
  152. {synalog-2.2.0 → synalog-2.4.0}/img/synalog-light.svg +0 -0
  153. {synalog-2.2.0 → synalog-2.4.0}/python/synalog/__main__.py +0 -0
  154. {synalog-2.2.0 → synalog-2.4.0}/python/synalog/checking.py +0 -0
  155. {synalog-2.2.0 → synalog-2.4.0}/python/synalog/config.py +0 -0
  156. {synalog-2.2.0 → synalog-2.4.0}/python/synalog/execution.py +0 -0
  157. {synalog-2.2.0 → synalog-2.4.0}/python/synalog/project.py +0 -0
  158. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/company/concepts/department.l +0 -0
  159. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/company/concepts/person.l +0 -0
  160. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/company/concepts/works_in.l +0 -0
  161. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/company/data/departments.csv +0 -0
  162. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/company/data/employees.csv +0 -0
  163. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/company/layer.toml +0 -0
  164. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/company/rules/team_mate.l +0 -0
  165. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/company/tables/departments.l +0 -0
  166. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/company/tables/employees.l +0 -0
  167. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/org/concepts/all_managers.l +0 -0
  168. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/org/data/employees.csv +0 -0
  169. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/org/layer.toml +0 -0
  170. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/org/tables/employees.l +0 -0
  171. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/sales/concepts/region.l +0 -0
  172. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/sales/data/sales.csv +0 -0
  173. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/sales/layer.toml +0 -0
  174. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/sales/rules/monthly_sales.l +0 -0
  175. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/sales/rules/top_region.l +0 -0
  176. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/sales/rules/total_by_region.l +0 -0
  177. {synalog-2.2.0 → synalog-2.4.0}/skills/synalog/examples/sales/tables/sales.l +0 -0
  178. {synalog-2.2.0 → synalog-2.4.0}/src/assertion/mod.rs +0 -0
  179. {synalog-2.2.0 → synalog-2.4.0}/src/assertion/parse.rs +0 -0
  180. {synalog-2.2.0 → synalog-2.4.0}/src/assertion/report.rs +0 -0
  181. {synalog-2.2.0 → synalog-2.4.0}/src/assertion/translate.rs +0 -0
  182. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/dialects_test.rs +0 -0
  183. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/type_inference/expression.rs +0 -0
  184. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/type_inference/graph.rs +0 -0
  185. {synalog-2.2.0 → synalog-2.4.0}/src/compiler/type_inference/intersection.rs +0 -0
  186. {synalog-2.2.0 → synalog-2.4.0}/src/lib.rs +0 -0
  187. {synalog-2.2.0 → synalog-2.4.0}/src/parser/json.rs +0 -0
  188. {synalog-2.2.0 → synalog-2.4.0}/src/parser/json_test.rs +0 -0
  189. {synalog-2.2.0 → synalog-2.4.0}/src/parser/mod.rs +0 -0
  190. {synalog-2.2.0 → synalog-2.4.0}/src/parser/names.rs +0 -0
  191. {synalog-2.2.0 → synalog-2.4.0}/src/parser/rewrite.rs +0 -0
  192. {synalog-2.2.0 → synalog-2.4.0}/src/parser/rewrite_test.rs +0 -0
  193. {synalog-2.2.0 → synalog-2.4.0}/src/parser/span.rs +0 -0
  194. {synalog-2.2.0 → synalog-2.4.0}/src/parser/span_test.rs +0 -0
  195. {synalog-2.2.0 → synalog-2.4.0}/src/parser/traverse.rs +0 -0
  196. {synalog-2.2.0 → synalog-2.4.0}/src/parser/traverse_test.rs +0 -0
  197. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/assertions.rs +0 -0
  198. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/dependencies.rs +0 -0
  199. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/directives.rs +0 -0
  200. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/front_matter.rs +0 -0
  201. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/functors.rs +0 -0
  202. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/orderby.rs +0 -0
  203. {synalog-2.2.0 → synalog-2.4.0}/src/verifier/sqlexpr.rs +0 -0
  204. {synalog-2.2.0 → synalog-2.4.0}/zensical.toml +0 -0
@@ -0,0 +1,491 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "aho-corasick"
7
+ version = "1.1.4"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
10
+ dependencies = [
11
+ "memchr",
12
+ ]
13
+
14
+ [[package]]
15
+ name = "anyhow"
16
+ version = "1.0.102"
17
+ source = "registry+https://github.com/rust-lang/crates.io-index"
18
+ checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
19
+
20
+ [[package]]
21
+ name = "arraydeque"
22
+ version = "0.5.1"
23
+ source = "registry+https://github.com/rust-lang/crates.io-index"
24
+ checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236"
25
+
26
+ [[package]]
27
+ name = "bumpalo"
28
+ version = "3.20.2"
29
+ source = "registry+https://github.com/rust-lang/crates.io-index"
30
+ checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
31
+
32
+ [[package]]
33
+ name = "cfg-if"
34
+ version = "1.0.4"
35
+ source = "registry+https://github.com/rust-lang/crates.io-index"
36
+ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
37
+
38
+ [[package]]
39
+ name = "convert_case"
40
+ version = "0.4.0"
41
+ source = "registry+https://github.com/rust-lang/crates.io-index"
42
+ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
43
+
44
+ [[package]]
45
+ name = "equivalent"
46
+ version = "1.0.2"
47
+ source = "registry+https://github.com/rust-lang/crates.io-index"
48
+ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
49
+
50
+ [[package]]
51
+ name = "foldhash"
52
+ version = "0.2.0"
53
+ source = "registry+https://github.com/rust-lang/crates.io-index"
54
+ checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
55
+
56
+ [[package]]
57
+ name = "hashbrown"
58
+ version = "0.16.1"
59
+ source = "registry+https://github.com/rust-lang/crates.io-index"
60
+ checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
61
+
62
+ [[package]]
63
+ name = "hashbrown"
64
+ version = "0.17.1"
65
+ source = "registry+https://github.com/rust-lang/crates.io-index"
66
+ checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
67
+ dependencies = [
68
+ "foldhash",
69
+ ]
70
+
71
+ [[package]]
72
+ name = "hashlink"
73
+ version = "0.12.2"
74
+ source = "registry+https://github.com/rust-lang/crates.io-index"
75
+ checksum = "a596f1b20ed2cc5ecac41a164aaebc7258057060f06c0cf7a2ba3991ee7990fb"
76
+ dependencies = [
77
+ "hashbrown 0.17.1",
78
+ ]
79
+
80
+ [[package]]
81
+ name = "heck"
82
+ version = "0.5.0"
83
+ source = "registry+https://github.com/rust-lang/crates.io-index"
84
+ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
85
+
86
+ [[package]]
87
+ name = "indexmap"
88
+ version = "2.13.0"
89
+ source = "registry+https://github.com/rust-lang/crates.io-index"
90
+ checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
91
+ dependencies = [
92
+ "equivalent",
93
+ "hashbrown 0.16.1",
94
+ ]
95
+
96
+ [[package]]
97
+ name = "itoa"
98
+ version = "1.0.17"
99
+ source = "registry+https://github.com/rust-lang/crates.io-index"
100
+ checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
101
+
102
+ [[package]]
103
+ name = "libc"
104
+ version = "0.2.191"
105
+ source = "registry+https://github.com/rust-lang/crates.io-index"
106
+ checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a"
107
+
108
+ [[package]]
109
+ name = "memchr"
110
+ version = "2.8.0"
111
+ source = "registry+https://github.com/rust-lang/crates.io-index"
112
+ checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
113
+
114
+ [[package]]
115
+ name = "once_cell"
116
+ version = "1.21.3"
117
+ source = "registry+https://github.com/rust-lang/crates.io-index"
118
+ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
119
+
120
+ [[package]]
121
+ name = "portable-atomic"
122
+ version = "1.13.1"
123
+ source = "registry+https://github.com/rust-lang/crates.io-index"
124
+ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
125
+
126
+ [[package]]
127
+ name = "proc-macro2"
128
+ version = "1.0.106"
129
+ source = "registry+https://github.com/rust-lang/crates.io-index"
130
+ checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
131
+ dependencies = [
132
+ "unicode-ident",
133
+ ]
134
+
135
+ [[package]]
136
+ name = "pyo3"
137
+ version = "0.29.0"
138
+ source = "registry+https://github.com/rust-lang/crates.io-index"
139
+ checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c"
140
+ dependencies = [
141
+ "libc",
142
+ "once_cell",
143
+ "portable-atomic",
144
+ "pyo3-build-config",
145
+ "pyo3-ffi",
146
+ "pyo3-macros",
147
+ ]
148
+
149
+ [[package]]
150
+ name = "pyo3-build-config"
151
+ version = "0.29.0"
152
+ source = "registry+https://github.com/rust-lang/crates.io-index"
153
+ checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078"
154
+ dependencies = [
155
+ "target-lexicon",
156
+ ]
157
+
158
+ [[package]]
159
+ name = "pyo3-ffi"
160
+ version = "0.29.0"
161
+ source = "registry+https://github.com/rust-lang/crates.io-index"
162
+ checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b"
163
+ dependencies = [
164
+ "libc",
165
+ "pyo3-build-config",
166
+ ]
167
+
168
+ [[package]]
169
+ name = "pyo3-macros"
170
+ version = "0.29.0"
171
+ source = "registry+https://github.com/rust-lang/crates.io-index"
172
+ checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771"
173
+ dependencies = [
174
+ "proc-macro2",
175
+ "pyo3-macros-backend",
176
+ "quote",
177
+ "syn 2.0.117",
178
+ ]
179
+
180
+ [[package]]
181
+ name = "pyo3-macros-backend"
182
+ version = "0.29.0"
183
+ source = "registry+https://github.com/rust-lang/crates.io-index"
184
+ checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362"
185
+ dependencies = [
186
+ "heck",
187
+ "proc-macro2",
188
+ "quote",
189
+ "syn 2.0.117",
190
+ ]
191
+
192
+ [[package]]
193
+ name = "quote"
194
+ version = "1.0.45"
195
+ source = "registry+https://github.com/rust-lang/crates.io-index"
196
+ checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
197
+ dependencies = [
198
+ "proc-macro2",
199
+ ]
200
+
201
+ [[package]]
202
+ name = "regex"
203
+ version = "1.12.3"
204
+ source = "registry+https://github.com/rust-lang/crates.io-index"
205
+ checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
206
+ dependencies = [
207
+ "aho-corasick",
208
+ "memchr",
209
+ "regex-automata",
210
+ "regex-syntax",
211
+ ]
212
+
213
+ [[package]]
214
+ name = "regex-automata"
215
+ version = "0.4.14"
216
+ source = "registry+https://github.com/rust-lang/crates.io-index"
217
+ checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
218
+ dependencies = [
219
+ "aho-corasick",
220
+ "memchr",
221
+ "regex-syntax",
222
+ ]
223
+
224
+ [[package]]
225
+ name = "regex-syntax"
226
+ version = "0.8.10"
227
+ source = "registry+https://github.com/rust-lang/crates.io-index"
228
+ checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
229
+
230
+ [[package]]
231
+ name = "rustversion"
232
+ version = "1.0.22"
233
+ source = "registry+https://github.com/rust-lang/crates.io-index"
234
+ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
235
+
236
+ [[package]]
237
+ name = "serde"
238
+ version = "1.0.228"
239
+ source = "registry+https://github.com/rust-lang/crates.io-index"
240
+ checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
241
+ dependencies = [
242
+ "serde_core",
243
+ "serde_derive",
244
+ ]
245
+
246
+ [[package]]
247
+ name = "serde_core"
248
+ version = "1.0.228"
249
+ source = "registry+https://github.com/rust-lang/crates.io-index"
250
+ checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
251
+ dependencies = [
252
+ "serde_derive",
253
+ ]
254
+
255
+ [[package]]
256
+ name = "serde_derive"
257
+ version = "1.0.228"
258
+ source = "registry+https://github.com/rust-lang/crates.io-index"
259
+ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
260
+ dependencies = [
261
+ "proc-macro2",
262
+ "quote",
263
+ "syn 2.0.117",
264
+ ]
265
+
266
+ [[package]]
267
+ name = "serde_json"
268
+ version = "1.0.149"
269
+ source = "registry+https://github.com/rust-lang/crates.io-index"
270
+ checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
271
+ dependencies = [
272
+ "itoa",
273
+ "memchr",
274
+ "serde",
275
+ "serde_core",
276
+ "zmij",
277
+ ]
278
+
279
+ [[package]]
280
+ name = "syn"
281
+ version = "2.0.117"
282
+ source = "registry+https://github.com/rust-lang/crates.io-index"
283
+ checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
284
+ dependencies = [
285
+ "proc-macro2",
286
+ "quote",
287
+ "unicode-ident",
288
+ ]
289
+
290
+ [[package]]
291
+ name = "syn"
292
+ version = "3.0.9"
293
+ source = "registry+https://github.com/rust-lang/crates.io-index"
294
+ checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b"
295
+ dependencies = [
296
+ "proc-macro2",
297
+ "quote",
298
+ "unicode-ident",
299
+ ]
300
+
301
+ [[package]]
302
+ name = "synalog"
303
+ version = "2.4.0"
304
+ dependencies = [
305
+ "anyhow",
306
+ "indexmap",
307
+ "pyo3",
308
+ "regex",
309
+ "serde",
310
+ "serde_json",
311
+ "synalog-verified",
312
+ "thiserror",
313
+ "wasm-bindgen",
314
+ "yaml-rust2",
315
+ ]
316
+
317
+ [[package]]
318
+ name = "synalog-verified"
319
+ version = "2.4.0"
320
+ dependencies = [
321
+ "vstd",
322
+ ]
323
+
324
+ [[package]]
325
+ name = "synstructure"
326
+ version = "0.13.2"
327
+ source = "registry+https://github.com/rust-lang/crates.io-index"
328
+ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
329
+ dependencies = [
330
+ "proc-macro2",
331
+ "quote",
332
+ "syn 2.0.117",
333
+ ]
334
+
335
+ [[package]]
336
+ name = "target-lexicon"
337
+ version = "0.13.5"
338
+ source = "registry+https://github.com/rust-lang/crates.io-index"
339
+ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
340
+
341
+ [[package]]
342
+ name = "thiserror"
343
+ version = "2.0.18"
344
+ source = "registry+https://github.com/rust-lang/crates.io-index"
345
+ checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
346
+ dependencies = [
347
+ "thiserror-impl",
348
+ ]
349
+
350
+ [[package]]
351
+ name = "thiserror-impl"
352
+ version = "2.0.18"
353
+ source = "registry+https://github.com/rust-lang/crates.io-index"
354
+ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
355
+ dependencies = [
356
+ "proc-macro2",
357
+ "quote",
358
+ "syn 2.0.117",
359
+ ]
360
+
361
+ [[package]]
362
+ name = "unicode-ident"
363
+ version = "1.0.24"
364
+ source = "registry+https://github.com/rust-lang/crates.io-index"
365
+ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
366
+
367
+ [[package]]
368
+ name = "verus_builtin"
369
+ version = "0.0.0-2026-10-11-0230"
370
+ source = "registry+https://github.com/rust-lang/crates.io-index"
371
+ checksum = "d2e5d0972903f31da5271f50645c402122804a4e5292e1694706977ce18cbe67"
372
+
373
+ [[package]]
374
+ name = "verus_builtin_macros"
375
+ version = "0.0.0-2026-10-18-0147"
376
+ source = "registry+https://github.com/rust-lang/crates.io-index"
377
+ checksum = "c420824c5f3528bc29892c12c9083c03e8abe09119456e0ffe98ec3fb16ee5b8"
378
+ dependencies = [
379
+ "convert_case",
380
+ "proc-macro2",
381
+ "quote",
382
+ "syn 2.0.117",
383
+ "synstructure",
384
+ "verus_prettyplease",
385
+ "verus_syn",
386
+ ]
387
+
388
+ [[package]]
389
+ name = "verus_prettyplease"
390
+ version = "0.0.0-2026-09-06-0133"
391
+ source = "registry+https://github.com/rust-lang/crates.io-index"
392
+ checksum = "71956c0dcf55f57fd5a5335fff16981f7e0912d2e887914518c5a64fe36c063c"
393
+ dependencies = [
394
+ "proc-macro2",
395
+ "verus_syn",
396
+ ]
397
+
398
+ [[package]]
399
+ name = "verus_state_machines_macros"
400
+ version = "0.0.0-2026-10-18-0147"
401
+ source = "registry+https://github.com/rust-lang/crates.io-index"
402
+ checksum = "999032b29d28518b813f7b474adbb958a2f41c606d72d84e986546309469eeef"
403
+ dependencies = [
404
+ "indexmap",
405
+ "proc-macro2",
406
+ "quote",
407
+ "verus_syn",
408
+ ]
409
+
410
+ [[package]]
411
+ name = "verus_syn"
412
+ version = "0.0.0-2026-09-06-0133"
413
+ source = "registry+https://github.com/rust-lang/crates.io-index"
414
+ checksum = "7d8b53574934e1f608dfccd809ce17f3733d6eb99c14ce8220326121929e1637"
415
+ dependencies = [
416
+ "proc-macro2",
417
+ "quote",
418
+ "unicode-ident",
419
+ ]
420
+
421
+ [[package]]
422
+ name = "vstd"
423
+ version = "0.0.0-2026-10-18-0147"
424
+ source = "registry+https://github.com/rust-lang/crates.io-index"
425
+ checksum = "eb200973a51d678d3432092ce692c110bf262e281d7ffd55ec028708be84d676"
426
+ dependencies = [
427
+ "verus_builtin",
428
+ "verus_builtin_macros",
429
+ "verus_state_machines_macros",
430
+ ]
431
+
432
+ [[package]]
433
+ name = "wasm-bindgen"
434
+ version = "0.2.129"
435
+ source = "registry+https://github.com/rust-lang/crates.io-index"
436
+ checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409"
437
+ dependencies = [
438
+ "cfg-if",
439
+ "once_cell",
440
+ "rustversion",
441
+ "wasm-bindgen-macro",
442
+ "wasm-bindgen-shared",
443
+ ]
444
+
445
+ [[package]]
446
+ name = "wasm-bindgen-macro"
447
+ version = "0.2.129"
448
+ source = "registry+https://github.com/rust-lang/crates.io-index"
449
+ checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535"
450
+ dependencies = [
451
+ "quote",
452
+ "wasm-bindgen-macro-support",
453
+ ]
454
+
455
+ [[package]]
456
+ name = "wasm-bindgen-macro-support"
457
+ version = "0.2.129"
458
+ source = "registry+https://github.com/rust-lang/crates.io-index"
459
+ checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7"
460
+ dependencies = [
461
+ "bumpalo",
462
+ "proc-macro2",
463
+ "quote",
464
+ "syn 3.0.9",
465
+ "wasm-bindgen-shared",
466
+ ]
467
+
468
+ [[package]]
469
+ name = "wasm-bindgen-shared"
470
+ version = "0.2.129"
471
+ source = "registry+https://github.com/rust-lang/crates.io-index"
472
+ checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6"
473
+ dependencies = [
474
+ "unicode-ident",
475
+ ]
476
+
477
+ [[package]]
478
+ name = "yaml-rust2"
479
+ version = "0.13.0"
480
+ source = "registry+https://github.com/rust-lang/crates.io-index"
481
+ checksum = "57e5b818a27a4cd30884ea380857a5e56f7ec3ba24a3990a3cc0b95af3238e18"
482
+ dependencies = [
483
+ "arraydeque",
484
+ "hashlink",
485
+ ]
486
+
487
+ [[package]]
488
+ name = "zmij"
489
+ version = "1.0.21"
490
+ source = "registry+https://github.com/rust-lang/crates.io-index"
491
+ checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "synalog"
3
- version = "2.2.0"
3
+ version = "2.4.0"
4
4
  edition = "2024"
5
5
  description = "Logic programming for AI agents: Datalog-family language compiling to optimized SQL"
6
6
  license = "Apache-2.0"
@@ -18,11 +18,12 @@ python = ["dep:pyo3"]
18
18
  # Browser playground: compiles the parser + compiler to wasm via wasm-bindgen.
19
19
  # Build with: --no-default-features --features wasm
20
20
  wasm = ["dep:wasm-bindgen"]
21
- run = ["rusqlite", "duckdb", "postgres-db", "bigquery-db"]
22
- postgres-db = ["postgres"]
23
- bigquery-db = ["reqwest"]
21
+
22
+ [workspace]
23
+ members = ["verified"]
24
24
 
25
25
  [dependencies]
26
+ synalog-verified = { path = "verified" }
26
27
  indexmap = "2"
27
28
  regex = "1.12.3"
28
29
  serde = { version = "1", features = ["derive"] }
@@ -31,10 +32,6 @@ thiserror = "2"
31
32
  anyhow = "1"
32
33
  pyo3 = { version = "0.29", optional = true, features = ["extension-module", "abi3-py310"] }
33
34
  wasm-bindgen = { version = "0.2", optional = true }
34
- rusqlite = { version = "0.34", optional = true, features = ["bundled"] }
35
- duckdb = { version = "1.2", optional = true, features = ["bundled"] }
36
- postgres = { version = "0.19", optional = true }
37
- reqwest = { version = "0.12", optional = true, features = ["blocking", "json"] }
38
35
  yaml-rust2 = { version = "0.13.0", default-features = false }
39
36
 
40
37
  [dev-dependencies]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synalog
3
- Version: 2.2.0
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 **~86.7x faster** and compilation **~13.7x faster** than the original Python implementation, so validating and compiling a program is effectively instant.
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 (504 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:
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 | 13.4 s | 0.15 s | **87x** |
584
- | Compile | 61.3 s | 5.2 s | **13x** |
585
- | Verify | n/a | 0.16 s | Rust-only |
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 ~85x to ~88x faster; compilation ranges from ~11x (trino, presto) to ~19x (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`.
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
 
@@ -605,6 +605,8 @@ Unlike Logica, which lets the database raise errors at execution time, Synalog e
605
605
  | **Reserved names** | Rules that redefine a built-in library predicate (`Num`, `Str`, `ArgMin`, `Today`, `Now`, ...) |
606
606
  | **Unsafe `SqlExpr`** | User rules that reach for the raw-SQL escape hatch |
607
607
 
608
+ The algorithms behind the stratification and recursion checks, the compiler's unfolding of mutual recursion, the order a compiled program's tables run in, the contradiction warning, pagination, the quoting of text into SQL and the `Cast` type-name check are proved correct with [Verus](https://github.com/verus-lang/verus). See [Verification](https://synalinks.github.io/synalog/verification/).
609
+
608
610
  ```python
609
611
  errors, warnings = synalog.check(bad_source)
610
612
  for e in errors:
@@ -654,6 +656,7 @@ cargo test --test compiler_tests # compiler golden tests (all engines)
654
656
  cargo test --test parser_tests # parser golden tests (all engines)
655
657
  cargo test --test verifier_tests # verifier tests (all engines)
656
658
  cargo test --test search_tests # search feature tests (all engines)
659
+ cargo test --test verus_proofs # the Verus proofs of verified/ (shell/install-verus.sh installs Verus)
657
660
  ```
658
661
 
659
662
  ### Tests
@@ -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 **~86.7x faster** and compilation **~13.7x faster** than the original Python implementation, so validating and compiling a program is effectively instant.
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 (504 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:
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 | 13.4 s | 0.15 s | **87x** |
542
- | Compile | 61.3 s | 5.2 s | **13x** |
543
- | Verify | n/a | 0.16 s | Rust-only |
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 ~85x to ~88x faster; compilation ranges from ~11x (trino, presto) to ~19x (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`.
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
 
@@ -563,6 +563,8 @@ Unlike Logica, which lets the database raise errors at execution time, Synalog e
563
563
  | **Reserved names** | Rules that redefine a built-in library predicate (`Num`, `Str`, `ArgMin`, `Today`, `Now`, ...) |
564
564
  | **Unsafe `SqlExpr`** | User rules that reach for the raw-SQL escape hatch |
565
565
 
566
+ The algorithms behind the stratification and recursion checks, the compiler's unfolding of mutual recursion, the order a compiled program's tables run in, the contradiction warning, pagination, the quoting of text into SQL and the `Cast` type-name check are proved correct with [Verus](https://github.com/verus-lang/verus). See [Verification](https://synalinks.github.io/synalog/verification/).
567
+
566
568
  ```python
567
569
  errors, warnings = synalog.check(bad_source)
568
570
  for e in errors:
@@ -612,6 +614,7 @@ cargo test --test compiler_tests # compiler golden tests (all engines)
612
614
  cargo test --test parser_tests # parser golden tests (all engines)
613
615
  cargo test --test verifier_tests # verifier tests (all engines)
614
616
  cargo test --test search_tests # search feature tests (all engines)
617
+ cargo test --test verus_proofs # the Verus proofs of verified/ (shell/install-verus.sh installs Verus)
615
618
  ```
616
619
 
617
620
  ### Tests