eyelang 1.6.1 → 1.7.0

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 (1072) hide show
  1. package/README.md +39 -602
  2. package/bin/eyelang.js +7 -0
  3. package/docs/guide.md +591 -0
  4. package/docs/language-reference.md +763 -0
  5. package/examples/access-control-policy.eye +52 -0
  6. package/examples/ackermann.eye +47 -0
  7. package/examples/age.eye +26 -0
  8. package/examples/aliases-and-namespaces.eye +20 -0
  9. package/examples/alignment-demo.eye +44 -0
  10. package/examples/allen-interval-calculus.eye +64 -0
  11. package/examples/ancestor.eye +22 -0
  12. package/examples/animal.eye +21 -0
  13. package/examples/annotation.eye +34 -0
  14. package/examples/auroracare.eye +309 -0
  15. package/examples/backward.eye +11 -0
  16. package/examples/basic-monadic.eye +10032 -0
  17. package/examples/bayes-diagnosis.eye +108 -0
  18. package/examples/bayes-therapy.eye +189 -0
  19. package/examples/beam-deflection.eye +48 -0
  20. package/examples/binomial-vandermonde.eye +49 -0
  21. package/examples/blocks-world-planning.eye +77 -0
  22. package/examples/bmi.eye +232 -0
  23. package/examples/braking-safety-worlds.eye +69 -0
  24. package/examples/buck-converter-design.eye +83 -0
  25. package/examples/cache-performance.eye +56 -0
  26. package/examples/canary-release.eye +51 -0
  27. package/examples/cat-koko.eye +24 -0
  28. package/examples/catalan-convolution.eye +37 -0
  29. package/examples/chart-parser.eye +65 -0
  30. package/examples/clinical-trial-screening.eye +97 -0
  31. package/examples/collatz-1000.eye +45 -0
  32. package/examples/combinatorics-findall-sort.eye +38 -0
  33. package/examples/competitive-enzyme-kinetics.eye +78 -0
  34. package/examples/complex.eye +133 -0
  35. package/examples/composition-of-injective-functions-is-injective.eye +50 -0
  36. package/examples/context-association.eye +53 -0
  37. package/examples/context-schema-audit.eye +46 -0
  38. package/examples/continued-fraction-sqrt2.eye +36 -0
  39. package/examples/control-system.eye +76 -0
  40. package/examples/critical-path-schedule.eye +82 -0
  41. package/examples/cyclic-path.eye +18 -0
  42. package/examples/d3-group.eye +99 -0
  43. package/examples/dairy-energy-balance.eye +66 -0
  44. package/examples/data-negotiation.eye +38 -0
  45. package/examples/deep-taxonomy-10.eye +115 -0
  46. package/examples/deep-taxonomy-100.eye +385 -0
  47. package/examples/deep-taxonomy-1000.eye +3085 -0
  48. package/examples/deep-taxonomy-10000.eye +30094 -0
  49. package/examples/deep-taxonomy-100000.eye +300184 -0
  50. package/examples/delfour.eye +281 -0
  51. package/examples/deontic-logic.eye +52 -0
  52. package/examples/derived-backward-rule.eye +30 -0
  53. package/examples/derived-rule.eye +27 -0
  54. package/examples/diamond-property.eye +38 -0
  55. package/examples/dijkstra-findall-sort.eye +43 -0
  56. package/examples/dijkstra-risk-path.eye +87 -0
  57. package/examples/dijkstra.eye +50 -0
  58. package/examples/dining-philosophers.eye +147 -0
  59. package/examples/dog.eye +25 -0
  60. package/examples/dpv-odrl-purpose-mapping.eye +48 -0
  61. package/examples/drone-corridor-planner.eye +48 -0
  62. package/examples/easter-computus.eye +88 -0
  63. package/examples/electrical-rc-filter.eye +37 -0
  64. package/examples/epidemic-policy.eye +66 -0
  65. package/examples/equivalence-classes-overlap-implies-same-class.eye +27 -0
  66. package/examples/eulerian-path.eye +87 -0
  67. package/examples/ev-range-worlds.eye +87 -0
  68. package/examples/existential-rule.eye +21 -0
  69. package/examples/exoplanet-validation-worlds.eye +94 -0
  70. package/examples/expression-eval.eye +45 -0
  71. package/examples/family-cousins.eye +67 -0
  72. package/examples/fastpow.eye +61 -0
  73. package/examples/fft8-numeric.eye +85 -0
  74. package/examples/fibonacci.eye +60 -0
  75. package/examples/field-nitrogen-balance.eye +73 -0
  76. package/examples/flandor.eye +296 -0
  77. package/examples/floating-point.eye +28 -0
  78. package/examples/four-color-map.eye +133 -0
  79. package/examples/fundamental-theorem-arithmetic.eye +119 -0
  80. package/examples/gd-step-certified.eye +162 -0
  81. package/examples/gdpr-compliance.eye +69 -0
  82. package/examples/good-cobbler.eye +16 -0
  83. package/examples/gps.eye +146 -0
  84. package/examples/graph-reachability.eye +33 -0
  85. package/examples/graph.eye +35 -0
  86. package/examples/gray-code-counter.eye +47 -0
  87. package/examples/greatest-lower-bound-uniqueness.eye +30 -0
  88. package/examples/group-inverse-uniqueness.eye +36 -0
  89. package/examples/hamiltonian-path.eye +51 -0
  90. package/examples/hamming-code.eye +109 -0
  91. package/examples/hanoi.eye +19 -0
  92. package/examples/heat-loss.eye +56 -0
  93. package/examples/heron-theorem.eye +42 -0
  94. package/examples/ideal-gas-law.eye +39 -0
  95. package/examples/illegitimate-reasoning.eye +88 -0
  96. package/examples/integer-partitions.eye +35 -0
  97. package/examples/intuitionistic-logic-kripke.eye +69 -0
  98. package/examples/job-shop-scheduling.eye +48 -0
  99. package/examples/knapsack-optimization.eye +46 -0
  100. package/examples/knowledge-engineering-alignment-flow.eye +46 -0
  101. package/examples/language.eye +25 -0
  102. package/examples/law-of-cosines.eye +37 -0
  103. package/examples/least-squares-regression.eye +85 -0
  104. package/examples/linear-logic-resources.eye +51 -0
  105. package/examples/list-collection.eye +35 -0
  106. package/examples/lldm.eye +80 -0
  107. package/examples/manufacturing-quality-control.eye +73 -0
  108. package/examples/matrix-chain-order.eye +79 -0
  109. package/examples/microgrid-dispatch.eye +89 -0
  110. package/examples/missionaries-cannibals.eye +53 -0
  111. package/examples/modal-logic-kripke.eye +45 -0
  112. package/examples/modular-exponentiation.eye +35 -0
  113. package/examples/monkey-bananas.eye +45 -0
  114. package/examples/n-queens-8.eye +35 -0
  115. package/examples/network-sla.eye +48 -0
  116. package/examples/newton-raphson.eye +48 -0
  117. package/examples/nixon-diamond.eye +37 -0
  118. package/examples/observability-log-correlation.eye +40 -0
  119. package/examples/odrl-dpv-fpv-trust-flow.eye +51 -0
  120. package/examples/odrl-dpv-healthcare-risk-ranked.eye +270 -0
  121. package/examples/odrl-dpv-risk-ranked.eye +320 -0
  122. package/examples/orbital-transfer-design.eye +116 -0
  123. package/examples/output/basic-monadic.eye +1518 -0
  124. package/examples/output/binomial-vandermonde.eye +4 -0
  125. package/examples/output/catalan-convolution.eye +4 -0
  126. package/examples/output/chart-parser.eye +6 -0
  127. package/examples/output/collatz-1000.eye +1000 -0
  128. package/examples/output/complex.eye +6 -0
  129. package/examples/output/context-schema-audit.eye +12 -0
  130. package/examples/output/continued-fraction-sqrt2.eye +4 -0
  131. package/examples/output/critical-path-schedule.eye +19 -0
  132. package/examples/output/dpv-odrl-purpose-mapping.eye +18 -0
  133. package/examples/output/graph.eye +21 -0
  134. package/examples/output/integer-partitions.eye +4 -0
  135. package/examples/output/intuitionistic-logic-kripke.eye +5 -0
  136. package/examples/output/job-shop-scheduling.eye +3 -0
  137. package/examples/output/knapsack-optimization.eye +4 -0
  138. package/examples/output/knowledge-engineering-alignment-flow.eye +17 -0
  139. package/examples/output/language.eye +6 -0
  140. package/examples/output/linear-logic-resources.eye +2 -0
  141. package/examples/output/matrix-chain-order.eye +4 -0
  142. package/examples/output/missionaries-cannibals.eye +3 -0
  143. package/examples/output/modal-logic-kripke.eye +4 -0
  144. package/examples/output/modular-exponentiation.eye +4 -0
  145. package/examples/output/n-queens-8.eye +1 -0
  146. package/examples/output/observability-log-correlation.eye +28 -0
  147. package/examples/output/odrl-dpv-fpv-trust-flow.eye +9 -0
  148. package/examples/output/path-discovery.eye +3 -0
  149. package/examples/output/pell-equation.eye +4 -0
  150. package/examples/output/reusable-builtins.eye +5 -0
  151. package/examples/output/send-more-money.eye +3 -0
  152. package/examples/output/stable-marriage.eye +2 -0
  153. package/examples/output/stirling-bell-numbers.eye +4 -0
  154. package/examples/output/sudoku-4x4.eye +2 -0
  155. package/examples/output/term-tools.eye +6 -0
  156. package/examples/output/totient-summatory.eye +4 -0
  157. package/examples/output/trust-flow-provenance-threshold.eye +6 -0
  158. package/examples/output/vulnerability-impact.eye +20 -0
  159. package/examples/output/web-names.eye +10 -0
  160. package/examples/output/weighted-interval-scheduling.eye +5 -0
  161. package/examples/path-discovery.eye +45013 -0
  162. package/examples/peano-arithmetic.eye +33 -0
  163. package/examples/peasant.eye +29 -0
  164. package/examples/pell-equation.eye +34 -0
  165. package/examples/pendulum-period.eye +50 -0
  166. package/examples/polynomial.eye +124 -0
  167. package/examples/proof/access-control-policy.eye +158 -0
  168. package/examples/proof/age.eye +71 -0
  169. package/examples/proof/aliases-and-namespaces.eye +78 -0
  170. package/examples/proof/ancestor.eye +140 -0
  171. package/examples/proof/animal.eye +68 -0
  172. package/examples/proof/annotation.eye +80 -0
  173. package/examples/proof/backward.eye +22 -0
  174. package/examples/proof/bayes-diagnosis.eye +208 -0
  175. package/examples/proof/beam-deflection.eye +227 -0
  176. package/examples/proof/cache-performance.eye +310 -0
  177. package/examples/proof/canary-release.eye +172 -0
  178. package/examples/proof/cat-koko.eye +86 -0
  179. package/examples/proof/chart-parser.eye +474 -0
  180. package/examples/proof/clinical-trial-screening.eye +389 -0
  181. package/examples/proof/composition-of-injective-functions-is-injective.eye +258 -0
  182. package/examples/proof/context-association.eye +78 -0
  183. package/examples/proof/data-negotiation.eye +76 -0
  184. package/examples/proof/deontic-logic.eye +109 -0
  185. package/examples/proof/derived-backward-rule.eye +74 -0
  186. package/examples/proof/derived-rule.eye +43 -0
  187. package/examples/proof/diamond-property.eye +307 -0
  188. package/examples/proof/dog.eye +31 -0
  189. package/examples/proof/dpv-odrl-purpose-mapping.eye +348 -0
  190. package/examples/proof/electrical-rc-filter.eye +105 -0
  191. package/examples/proof/epidemic-policy.eye +774 -0
  192. package/examples/proof/equivalence-classes-overlap-implies-same-class.eye +1098 -0
  193. package/examples/proof/existential-rule.eye +40 -0
  194. package/examples/proof/expression-eval.eye +105 -0
  195. package/examples/proof/floating-point.eye +160 -0
  196. package/examples/proof/gdpr-compliance.eye +199 -0
  197. package/examples/proof/good-cobbler.eye +16 -0
  198. package/examples/proof/graph-reachability.eye +151 -0
  199. package/examples/proof/greatest-lower-bound-uniqueness.eye +150 -0
  200. package/examples/proof/group-inverse-uniqueness.eye +84 -0
  201. package/examples/proof/hanoi.eye +185 -0
  202. package/examples/proof/heat-loss.eye +228 -0
  203. package/examples/proof/ideal-gas-law.eye +151 -0
  204. package/examples/proof/intuitionistic-logic-kripke.eye +133 -0
  205. package/examples/proof/linear-logic-resources.eye +205 -0
  206. package/examples/proof/list-collection.eye +52 -0
  207. package/examples/proof/modal-logic-kripke.eye +125 -0
  208. package/examples/proof/nixon-diamond.eye +181 -0
  209. package/examples/proof/proof-contrapositive.eye +78 -0
  210. package/examples/proof/reusable-builtins.eye +124 -0
  211. package/examples/proof/security-incident-correlation.eye +270 -0
  212. package/examples/proof/socket-age.eye +32 -0
  213. package/examples/proof/socket-family.eye +59 -0
  214. package/examples/proof/socrates.eye +38 -0
  215. package/examples/proof/term-tools.eye +95 -0
  216. package/examples/proof/witch.eye +216 -0
  217. package/examples/proof-contrapositive.eye +27 -0
  218. package/examples/quadratic-formula.eye +56 -0
  219. package/examples/radioactive-decay.eye +58 -0
  220. package/examples/reusable-builtins.eye +36 -0
  221. package/examples/riemann-hypothesis.eye +110 -0
  222. package/examples/security-incident-correlation.eye +69 -0
  223. package/examples/send-more-money.eye +71 -0
  224. package/examples/service-impact.eye +41 -0
  225. package/examples/sieve.eye +20 -0
  226. package/examples/skolem-functions.eye +52 -0
  227. package/examples/socket-age.eye +39 -0
  228. package/examples/socket-family.eye +28 -0
  229. package/examples/socrates.eye +19 -0
  230. package/examples/stable-marriage.eye +92 -0
  231. package/examples/statistics-summary.eye +56 -0
  232. package/examples/stirling-bell-numbers.eye +32 -0
  233. package/examples/sudoku-4x4.eye +54 -0
  234. package/examples/superdense-coding.eye +84 -0
  235. package/examples/term-tools.eye +32 -0
  236. package/examples/totient-summatory.eye +33 -0
  237. package/examples/trust-flow-provenance-threshold.eye +47 -0
  238. package/examples/turing.eye +69 -0
  239. package/examples/vector-similarity.eye +60 -0
  240. package/examples/vulnerability-impact.eye +69 -0
  241. package/examples/web-names.eye +83 -0
  242. package/examples/weighted-interval-scheduling.eye +81 -0
  243. package/examples/witch.eye +38 -0
  244. package/examples/wolf-goat-cabbage.eye +56 -0
  245. package/examples/zebra.eye +45 -0
  246. package/index.d.ts +230 -0
  247. package/index.js +4 -0
  248. package/package.json +23 -17
  249. package/playground.html +1065 -1201
  250. package/src/bin.js +7 -0
  251. package/src/builtins/arithmetic.js +19 -8
  252. package/src/builtins/context.js +42 -0
  253. package/src/builtins/control.js +12 -0
  254. package/src/builtins/lists.js +144 -10
  255. package/src/builtins/registry.js +3 -9
  256. package/src/builtins/strings.js +207 -14
  257. package/src/builtins/terms.js +68 -0
  258. package/src/cli.js +20 -16
  259. package/src/explain.js +1 -1
  260. package/src/hash.js +2 -2
  261. package/src/index.js +0 -1
  262. package/src/parser.js +101 -33
  263. package/src/program.js +222 -19
  264. package/src/solver.js +163 -35
  265. package/src/term.js +14 -1
  266. package/test/conformance/README.md +43 -0
  267. package/test/conformance/cases/001_fact_output.eye +4 -0
  268. package/test/conformance/cases/002_rule_recursion.eye +7 -0
  269. package/test/conformance/cases/002_rule_recursion.query +1 -0
  270. package/test/conformance/cases/003_terms_and_readback.eye +16 -0
  271. package/test/conformance/cases/003_terms_and_readback.query +1 -0
  272. package/test/conformance/cases/004_conjunction_and_parentheses.eye +5 -0
  273. package/test/conformance/cases/004_conjunction_and_parentheses.query +1 -0
  274. package/test/conformance/cases/005_list_deconstruction.eye +6 -0
  275. package/test/conformance/cases/005_list_deconstruction.query +1 -0
  276. package/test/conformance/cases/006_comma_formula_data.eye +4 -0
  277. package/test/conformance/cases/006_comma_formula_data.query +1 -0
  278. package/test/conformance/cases/007_anonymous_variables.eye +5 -0
  279. package/test/conformance/cases/007_anonymous_variables.query +1 -0
  280. package/test/conformance/cases/008_graphic_atoms.eye +6 -0
  281. package/test/conformance/cases/008_graphic_atoms.query +1 -0
  282. package/test/conformance/cases/009_comments_and_whitespace.eye +5 -0
  283. package/test/conformance/cases/009_comments_and_whitespace.query +1 -0
  284. package/test/conformance/cases/010_variable_scope_and_reuse.eye +8 -0
  285. package/test/conformance/cases/010_variable_scope_and_reuse.query +1 -0
  286. package/test/conformance/cases/011_predicate_arity.eye +6 -0
  287. package/test/conformance/cases/011_predicate_arity.query +1 -0
  288. package/test/conformance/cases/012_nested_compound_unification.eye +5 -0
  289. package/test/conformance/cases/012_nested_compound_unification.query +1 -0
  290. package/test/conformance/cases/013_multiple_clauses_order.eye +6 -0
  291. package/test/conformance/cases/013_multiple_clauses_order.query +1 -0
  292. package/test/conformance/cases/014_failure_filters_answers.eye +7 -0
  293. package/test/conformance/cases/014_failure_filters_answers.query +1 -0
  294. package/test/conformance/cases/015_improper_list_unification.eye +6 -0
  295. package/test/conformance/cases/015_improper_list_unification.query +1 -0
  296. package/test/conformance/cases/016_arity_zero_atom.eye +4 -0
  297. package/test/conformance/cases/017_three_step_recursion.eye +8 -0
  298. package/test/conformance/cases/017_three_step_recursion.query +1 -0
  299. package/test/conformance/cases/018_quoted_atom_readback.eye +6 -0
  300. package/test/conformance/cases/018_quoted_atom_readback.query +1 -0
  301. package/test/conformance/cases/019_parenthesized_three_conjuncts.eye +7 -0
  302. package/test/conformance/cases/019_parenthesized_three_conjuncts.query +1 -0
  303. package/test/conformance/cases/020_nested_list_terms.eye +5 -0
  304. package/test/conformance/cases/020_nested_list_terms.query +1 -0
  305. package/test/conformance/cases/021_repeated_variable_head.eye +7 -0
  306. package/test/conformance/cases/022_rule_head_structure.eye +5 -0
  307. package/test/conformance/cases/023_quoted_escapes_readback.eye +5 -0
  308. package/test/conformance/cases/024_numeric_literal_readback.eye +6 -0
  309. package/test/conformance/cases/025_body_parentheses_with_formula_data.eye +5 -0
  310. package/test/conformance/cases/026_question_underscore_named_variable_reuse.eye +5 -0
  311. package/test/conformance/cases/027_default_derived_output.eye +5 -0
  312. package/test/conformance/cases/028_materialize_focus.eye +5 -0
  313. package/test/conformance/cases/029_arithmetic_and_comparison.eye +11 -0
  314. package/test/conformance/cases/029_arithmetic_and_comparison.query +1 -0
  315. package/test/conformance/cases/030_strings_and_atoms.eye +4 -0
  316. package/test/conformance/cases/030_strings_and_atoms.query +1 -0
  317. package/test/conformance/cases/031_lists_aggregation_ordering.eye +10 -0
  318. package/test/conformance/cases/031_lists_aggregation_ordering.query +1 -0
  319. package/test/conformance/cases/032_holds_parts.eye +4 -0
  320. package/test/conformance/cases/033_negation_once_generators.eye +7 -0
  321. package/test/conformance/cases/033_negation_once_generators.query +1 -0
  322. package/test/conformance/cases/034_equality_and_inequality.eye +6 -0
  323. package/test/conformance/cases/034_equality_and_inequality.query +1 -0
  324. package/test/conformance/cases/035_list_relations.eye +5 -0
  325. package/test/conformance/cases/035_list_relations.query +1 -0
  326. package/test/conformance/cases/036_append_splits.eye +3 -0
  327. package/test/conformance/cases/036_append_splits.query +1 -0
  328. package/test/conformance/cases/037_matching_and_comparison.eye +7 -0
  329. package/test/conformance/cases/037_matching_and_comparison.query +1 -0
  330. package/test/conformance/cases/038_table_declaration.eye +8 -0
  331. package/test/conformance/cases/038_table_declaration.query +1 -0
  332. package/test/conformance/cases/039_numeric_functions.eye +9 -0
  333. package/test/conformance/cases/039_numeric_functions.query +1 -0
  334. package/test/conformance/cases/040_between_enumeration.eye +3 -0
  335. package/test/conformance/cases/040_between_enumeration.query +1 -0
  336. package/test/conformance/cases/041_smallest_divisor.eye +3 -0
  337. package/test/conformance/cases/041_smallest_divisor.query +1 -0
  338. package/test/conformance/cases/042_negation_filter.eye +7 -0
  339. package/test/conformance/cases/042_negation_filter.query +1 -0
  340. package/test/conformance/cases/043_once_user_predicate.eye +5 -0
  341. package/test/conformance/cases/043_once_user_predicate.query +1 -0
  342. package/test/conformance/cases/044_findall_user_goal.eye +6 -0
  343. package/test/conformance/cases/044_findall_user_goal.query +1 -0
  344. package/test/conformance/cases/045_sort_deduplicates_atoms.eye +3 -0
  345. package/test/conformance/cases/045_sort_deduplicates_atoms.query +1 -0
  346. package/test/conformance/cases/046_append_bound_prefix_suffix.eye +4 -0
  347. package/test/conformance/cases/046_append_bound_prefix_suffix.query +1 -0
  348. package/test/conformance/cases/047_nth0_index_generation.eye +3 -0
  349. package/test/conformance/cases/047_nth0_index_generation.query +1 -0
  350. package/test/conformance/cases/048_set_nth0_edges.eye +4 -0
  351. package/test/conformance/cases/048_set_nth0_edges.query +1 -0
  352. package/test/conformance/cases/049_select_duplicate_occurrences.eye +3 -0
  353. package/test/conformance/cases/049_select_duplicate_occurrences.query +1 -0
  354. package/test/conformance/cases/050_not_member_filter.eye +6 -0
  355. package/test/conformance/cases/050_not_member_filter.query +1 -0
  356. package/test/conformance/cases/051_nested_holds_parts.eye +4 -0
  357. package/test/conformance/cases/052_holds_member.eye +3 -0
  358. package/test/conformance/cases/053_materialize_excludes_source_fact.eye +6 -0
  359. package/test/conformance/cases/054_numeric_and_lexical_comparison.eye +5 -0
  360. package/test/conformance/cases/054_numeric_and_lexical_comparison.query +1 -0
  361. package/test/conformance/cases/055_string_matching_filters.eye +6 -0
  362. package/test/conformance/cases/055_string_matching_filters.query +1 -0
  363. package/test/conformance/cases/056_string_and_atom_concat.eye +3 -0
  364. package/test/conformance/cases/056_string_and_atom_concat.query +1 -0
  365. package/test/conformance/cases/057_countall_empty_and_nonempty.eye +4 -0
  366. package/test/conformance/cases/057_countall_empty_and_nonempty.query +1 -0
  367. package/test/conformance/cases/058_sumall_numeric_template.eye +5 -0
  368. package/test/conformance/cases/058_sumall_numeric_template.query +1 -0
  369. package/test/conformance/cases/059_aggregate_min_template.eye +5 -0
  370. package/test/conformance/cases/059_aggregate_min_template.query +1 -0
  371. package/test/conformance/cases/060_aggregate_max_compound_key.eye +5 -0
  372. package/test/conformance/cases/060_aggregate_max_compound_key.query +1 -0
  373. package/test/conformance/cases/061_date_difference.eye +4 -0
  374. package/test/conformance/cases/062_reusable_numeric_builtins.eye +10 -0
  375. package/test/conformance/cases/063_reusable_list_builtins.eye +11 -0
  376. package/test/conformance/cases/064_reusable_string_builtins.eye +12 -0
  377. package/test/conformance/cases/065_reusable_term_control_builtins.eye +11 -0
  378. package/test/conformance/cases/066_numeric_edges.eye +14 -0
  379. package/test/conformance/cases/067_list_edges.eye +10 -0
  380. package/test/conformance/cases/068_list_generation_order.eye +7 -0
  381. package/test/conformance/cases/069_list_summaries_and_sets.eye +9 -0
  382. package/test/conformance/cases/070_matches_named_captures.eye +13 -0
  383. package/test/conformance/cases/071_string_edges.eye +10 -0
  384. package/test/conformance/cases/072_string_conversions.eye +10 -0
  385. package/test/conformance/cases/073_term_introspection_edges.eye +11 -0
  386. package/test/conformance/cases/074_forall_edges.eye +10 -0
  387. package/test/conformance/cases/075_aggregation_edges.eye +12 -0
  388. package/test/conformance/cases/076_composed_reusable_builtins.eye +8 -0
  389. package/test/conformance/cases/077_recursive_path_with_lists.eye +10 -0
  390. package/test/conformance/cases/078_mutual_recursion_with_arithmetic.eye +7 -0
  391. package/test/conformance/cases/079_big_integer_arithmetic.eye +8 -0
  392. package/test/conformance/cases/080_rounding_modes.eye +10 -0
  393. package/test/conformance/cases/081_zero_safe_numeric_functions.eye +9 -0
  394. package/test/conformance/cases/082_comparison_semantics.eye +10 -0
  395. package/test/conformance/cases/083_between_modes_and_empty_ranges.eye +8 -0
  396. package/test/conformance/cases/084_append_and_select_composition.eye +7 -0
  397. package/test/conformance/cases/085_nth_and_update_edges.eye +8 -0
  398. package/test/conformance/cases/086_slicing_pipeline.eye +10 -0
  399. package/test/conformance/cases/087_sort_reverse_length.eye +8 -0
  400. package/test/conformance/cases/088_list_summaries_failures.eye +8 -0
  401. package/test/conformance/cases/089_string_split_join_pipeline.eye +7 -0
  402. package/test/conformance/cases/090_string_substring_replace_edges.eye +9 -0
  403. package/test/conformance/cases/091_string_case_and_trim.eye +7 -0
  404. package/test/conformance/cases/092_scalar_string_conversions.eye +9 -0
  405. package/test/conformance/cases/093_regex_named_captures_context.eye +8 -0
  406. package/test/conformance/cases/094_context_holds_enumeration.eye +7 -0
  407. package/test/conformance/cases/095_term_introspection_roundtrip.eye +8 -0
  408. package/test/conformance/cases/096_functor_scalar_edges.eye +8 -0
  409. package/test/conformance/cases/097_control_negation_once_forall.eye +13 -0
  410. package/test/conformance/cases/098_aggregation_nested_templates.eye +11 -0
  411. package/test/conformance/cases/099_materialize_multiple_arities.eye +8 -0
  412. package/test/conformance/cases/100_reusable_builtin_workflow.eye +10 -0
  413. package/test/conformance/cases/101_question_mark_variables.eye +7 -0
  414. package/test/conformance/cases/102_table_declaration.eye +11 -0
  415. package/test/conformance/cases/103_angle_iri_atoms.eye +7 -0
  416. package/test/conformance/cases/104_mode_determinism_declarations.eye +11 -0
  417. package/test/conformance/expected/003_terms_and_readback.eye +13 -0
  418. package/test/conformance/expected/016_arity_zero_atom.eye +1 -0
  419. package/test/conformance/expected/029_arithmetic_and_comparison.eye +9 -0
  420. package/test/conformance/expected/030_strings_and_atoms.eye +2 -0
  421. package/test/conformance/expected/032_holds_parts.eye +3 -0
  422. package/test/conformance/expected/035_list_relations.eye +4 -0
  423. package/test/conformance/expected/051_nested_holds_parts.eye +3 -0
  424. package/test/conformance/expected/052_holds_member.eye +2 -0
  425. package/test/conformance/expected/056_string_and_atom_concat.eye +1 -0
  426. package/test/conformance/expected/062_reusable_numeric_builtins.eye +8 -0
  427. package/test/conformance/expected/063_reusable_list_builtins.eye +9 -0
  428. package/test/conformance/expected/064_reusable_string_builtins.eye +10 -0
  429. package/test/conformance/expected/065_reusable_term_control_builtins.eye +6 -0
  430. package/test/conformance/expected/066_numeric_edges.eye +12 -0
  431. package/test/conformance/expected/067_list_edges.eye +8 -0
  432. package/test/conformance/expected/068_list_generation_order.eye +10 -0
  433. package/test/conformance/expected/069_list_summaries_and_sets.eye +7 -0
  434. package/test/conformance/expected/070_matches_named_captures.eye +1 -0
  435. package/test/conformance/expected/071_string_edges.eye +8 -0
  436. package/test/conformance/expected/072_string_conversions.eye +8 -0
  437. package/test/conformance/expected/073_term_introspection_edges.eye +9 -0
  438. package/test/conformance/expected/074_forall_edges.eye +5 -0
  439. package/test/conformance/expected/075_aggregation_edges.eye +7 -0
  440. package/test/conformance/expected/076_composed_reusable_builtins.eye +5 -0
  441. package/test/conformance/expected/077_recursive_path_with_lists.eye +3 -0
  442. package/test/conformance/expected/078_mutual_recursion_with_arithmetic.eye +7 -0
  443. package/test/conformance/expected/079_big_integer_arithmetic.eye +6 -0
  444. package/test/conformance/expected/080_rounding_modes.eye +8 -0
  445. package/test/conformance/expected/081_zero_safe_numeric_functions.eye +7 -0
  446. package/test/conformance/expected/082_comparison_semantics.eye +8 -0
  447. package/test/conformance/expected/083_between_modes_and_empty_ranges.eye +8 -0
  448. package/test/conformance/expected/084_append_and_select_composition.eye +10 -0
  449. package/test/conformance/expected/085_nth_and_update_edges.eye +8 -0
  450. package/test/conformance/expected/086_slicing_pipeline.eye +7 -0
  451. package/test/conformance/expected/087_sort_reverse_length.eye +6 -0
  452. package/test/conformance/expected/088_list_summaries_failures.eye +6 -0
  453. package/test/conformance/expected/089_string_split_join_pipeline.eye +4 -0
  454. package/test/conformance/expected/090_string_substring_replace_edges.eye +7 -0
  455. package/test/conformance/expected/091_string_case_and_trim.eye +5 -0
  456. package/test/conformance/expected/092_scalar_string_conversions.eye +7 -0
  457. package/test/conformance/expected/093_regex_named_captures_context.eye +5 -0
  458. package/test/conformance/expected/094_context_holds_enumeration.eye +8 -0
  459. package/test/conformance/expected/095_term_introspection_roundtrip.eye +6 -0
  460. package/test/conformance/expected/096_functor_scalar_edges.eye +6 -0
  461. package/test/conformance/expected/097_control_negation_once_forall.eye +5 -0
  462. package/test/conformance/expected/098_aggregation_nested_templates.eye +5 -0
  463. package/test/conformance/expected/099_materialize_multiple_arities.eye +4 -0
  464. package/test/conformance/expected/100_reusable_builtin_workflow.eye +6 -0
  465. package/test/conformance/expected/101_question_mark_variables.eye +3 -0
  466. package/test/conformance/expected/102_table_declaration.eye +6 -0
  467. package/test/conformance/expected/103_angle_iri_atoms.eye +3 -0
  468. package/test/conformance/expected/104_mode_determinism_declarations.eye +4 -0
  469. package/test/run-all.mjs +20 -0
  470. package/test/run-conformance.mjs +78 -0
  471. package/test/run-examples.mjs +155 -0
  472. package/test/run-regression.mjs +1215 -0
  473. package/test/test-style.mjs +94 -0
  474. package/SPEC.md +0 -684
  475. package/bin/eyelang +0 -7
  476. package/conformance/README.md +0 -45
  477. package/conformance/cases/core/001_fact_output.pl +0 -4
  478. package/conformance/cases/core/001_fact_query.query +0 -1
  479. package/conformance/cases/core/002_rule_recursion.pl +0 -7
  480. package/conformance/cases/core/002_rule_recursion.query +0 -1
  481. package/conformance/cases/core/003_terms_and_readback.pl +0 -16
  482. package/conformance/cases/core/003_terms_and_readback.query +0 -1
  483. package/conformance/cases/core/004_conjunction_and_parentheses.pl +0 -5
  484. package/conformance/cases/core/004_conjunction_and_parentheses.query +0 -1
  485. package/conformance/cases/core/005_list_deconstruction.pl +0 -6
  486. package/conformance/cases/core/005_list_deconstruction.query +0 -1
  487. package/conformance/cases/core/006_comma_formula_data.pl +0 -4
  488. package/conformance/cases/core/006_comma_formula_data.query +0 -1
  489. package/conformance/cases/core/007_anonymous_variables.pl +0 -5
  490. package/conformance/cases/core/007_anonymous_variables.query +0 -1
  491. package/conformance/cases/core/008_graphic_atoms.pl +0 -6
  492. package/conformance/cases/core/008_graphic_atoms.query +0 -1
  493. package/conformance/cases/core/009_comments_and_whitespace.pl +0 -5
  494. package/conformance/cases/core/009_comments_and_whitespace.query +0 -1
  495. package/conformance/cases/core/010_variable_scope_and_reuse.pl +0 -8
  496. package/conformance/cases/core/010_variable_scope_and_reuse.query +0 -1
  497. package/conformance/cases/core/011_predicate_arity.pl +0 -6
  498. package/conformance/cases/core/011_predicate_arity.query +0 -1
  499. package/conformance/cases/core/012_nested_compound_unification.pl +0 -5
  500. package/conformance/cases/core/012_nested_compound_unification.query +0 -1
  501. package/conformance/cases/core/013_multiple_clauses_order.pl +0 -6
  502. package/conformance/cases/core/013_multiple_clauses_order.query +0 -1
  503. package/conformance/cases/core/014_failure_filters_answers.pl +0 -7
  504. package/conformance/cases/core/014_failure_filters_answers.query +0 -1
  505. package/conformance/cases/core/015_improper_list_unification.pl +0 -6
  506. package/conformance/cases/core/015_improper_list_unification.query +0 -1
  507. package/conformance/cases/core/016_zero_arity_compound.pl +0 -4
  508. package/conformance/cases/core/016_zero_arity_compound.query +0 -1
  509. package/conformance/cases/core/017_three_step_recursion.pl +0 -8
  510. package/conformance/cases/core/017_three_step_recursion.query +0 -1
  511. package/conformance/cases/core/018_quoted_atom_readback.pl +0 -6
  512. package/conformance/cases/core/018_quoted_atom_readback.query +0 -1
  513. package/conformance/cases/core/019_parenthesized_three_conjuncts.pl +0 -7
  514. package/conformance/cases/core/019_parenthesized_three_conjuncts.query +0 -1
  515. package/conformance/cases/core/020_nested_list_terms.pl +0 -5
  516. package/conformance/cases/core/020_nested_list_terms.query +0 -1
  517. package/conformance/cases/core/021_repeated_variable_head.pl +0 -7
  518. package/conformance/cases/core/022_rule_head_structure.pl +0 -5
  519. package/conformance/cases/core/023_quoted_escapes_readback.pl +0 -5
  520. package/conformance/cases/core/024_numeric_literal_readback.pl +0 -6
  521. package/conformance/cases/core/025_body_parentheses_with_formula_data.pl +0 -5
  522. package/conformance/cases/core/026_underscore_named_variable_reuse.pl +0 -5
  523. package/conformance/cases/extension/001_default_derived_output.pl +0 -5
  524. package/conformance/cases/extension/002_materialize_focus.pl +0 -5
  525. package/conformance/cases/extension/003_arithmetic_and_comparison.pl +0 -12
  526. package/conformance/cases/extension/003_arithmetic_and_comparison.query +0 -1
  527. package/conformance/cases/extension/004_strings_and_atoms.pl +0 -6
  528. package/conformance/cases/extension/004_strings_and_atoms.query +0 -1
  529. package/conformance/cases/extension/005_lists_aggregation_ordering.pl +0 -10
  530. package/conformance/cases/extension/005_lists_aggregation_ordering.query +0 -1
  531. package/conformance/cases/extension/006_formula_terms.pl +0 -5
  532. package/conformance/cases/extension/006_formula_terms.query +0 -1
  533. package/conformance/cases/extension/007_negation_once_generators.pl +0 -7
  534. package/conformance/cases/extension/007_negation_once_generators.query +0 -1
  535. package/conformance/cases/extension/008_equality_and_inequality.pl +0 -6
  536. package/conformance/cases/extension/008_equality_and_inequality.query +0 -1
  537. package/conformance/cases/extension/009_list_relations.pl +0 -6
  538. package/conformance/cases/extension/009_list_relations.query +0 -1
  539. package/conformance/cases/extension/010_append_splits.pl +0 -3
  540. package/conformance/cases/extension/010_append_splits.query +0 -1
  541. package/conformance/cases/extension/011_matching_and_comparison.pl +0 -7
  542. package/conformance/cases/extension/011_matching_and_comparison.query +0 -1
  543. package/conformance/cases/extension/012_memoize_declaration.pl +0 -8
  544. package/conformance/cases/extension/012_memoize_declaration.query +0 -1
  545. package/conformance/cases/extension/013_numeric_functions.pl +0 -9
  546. package/conformance/cases/extension/013_numeric_functions.query +0 -1
  547. package/conformance/cases/extension/014_between_enumeration.pl +0 -3
  548. package/conformance/cases/extension/014_between_enumeration.query +0 -1
  549. package/conformance/cases/extension/015_smallest_divisor.pl +0 -3
  550. package/conformance/cases/extension/015_smallest_divisor.query +0 -1
  551. package/conformance/cases/extension/016_negation_filter.pl +0 -7
  552. package/conformance/cases/extension/016_negation_filter.query +0 -1
  553. package/conformance/cases/extension/017_once_user_predicate.pl +0 -5
  554. package/conformance/cases/extension/017_once_user_predicate.query +0 -1
  555. package/conformance/cases/extension/018_findall_user_goal.pl +0 -6
  556. package/conformance/cases/extension/018_findall_user_goal.query +0 -1
  557. package/conformance/cases/extension/019_sort_deduplicates_atoms.pl +0 -3
  558. package/conformance/cases/extension/019_sort_deduplicates_atoms.query +0 -1
  559. package/conformance/cases/extension/020_append_bound_prefix_suffix.pl +0 -4
  560. package/conformance/cases/extension/020_append_bound_prefix_suffix.query +0 -1
  561. package/conformance/cases/extension/021_nth0_index_generation.pl +0 -3
  562. package/conformance/cases/extension/021_nth0_index_generation.query +0 -1
  563. package/conformance/cases/extension/022_set_nth0_edges.pl +0 -4
  564. package/conformance/cases/extension/022_set_nth0_edges.query +0 -1
  565. package/conformance/cases/extension/023_select_duplicate_occurrences.pl +0 -3
  566. package/conformance/cases/extension/023_select_duplicate_occurrences.query +0 -1
  567. package/conformance/cases/extension/024_not_member_filter.pl +0 -6
  568. package/conformance/cases/extension/024_not_member_filter.query +0 -1
  569. package/conformance/cases/extension/025_is_list_filter.pl +0 -5
  570. package/conformance/cases/extension/025_is_list_filter.query +0 -1
  571. package/conformance/cases/extension/026_nested_formula_terms.pl +0 -5
  572. package/conformance/cases/extension/026_nested_formula_terms.query +0 -1
  573. package/conformance/cases/extension/027_materialize_excludes_source_fact.pl +0 -6
  574. package/conformance/cases/extension/028_numeric_and_lexical_comparison.pl +0 -5
  575. package/conformance/cases/extension/028_numeric_and_lexical_comparison.query +0 -1
  576. package/conformance/cases/extension/029_string_matching_filters.pl +0 -6
  577. package/conformance/cases/extension/029_string_matching_filters.query +0 -1
  578. package/conformance/cases/extension/030_string_and_atom_concat.pl +0 -4
  579. package/conformance/cases/extension/030_string_and_atom_concat.query +0 -1
  580. package/conformance/cases/extension/031_countall_empty_and_nonempty.pl +0 -4
  581. package/conformance/cases/extension/031_countall_empty_and_nonempty.query +0 -1
  582. package/conformance/cases/extension/032_sumall_numeric_template.pl +0 -5
  583. package/conformance/cases/extension/032_sumall_numeric_template.query +0 -1
  584. package/conformance/cases/extension/033_aggregate_min_template.pl +0 -5
  585. package/conformance/cases/extension/033_aggregate_min_template.query +0 -1
  586. package/conformance/cases/extension/034_aggregate_max_compound_key.pl +0 -5
  587. package/conformance/cases/extension/034_aggregate_max_compound_key.query +0 -1
  588. package/conformance/cases/extension/035_date_difference.pl +0 -4
  589. package/conformance/cases/extension/036_extended_gcd.pl +0 -3
  590. package/conformance/cases/extension/037_collatz_trajectory.pl +0 -3
  591. package/conformance/cases/extension/038_kaprekar_steps.pl +0 -3
  592. package/conformance/cases/extension/039_goldbach_pair.pl +0 -3
  593. package/conformance/cases/extension/040_matrix_operations.pl +0 -5
  594. package/conformance/cases/extension/041_atom_range_generators.pl +0 -5
  595. package/conformance/cases/extension/042_n_queens_small.pl +0 -3
  596. package/conformance/cases/extension/043_cnf_model.pl +0 -3
  597. package/conformance/cases/extension/044_cover9_filter.pl +0 -6
  598. package/conformance/cases/extension/045_alphametic_sum_small.pl +0 -3
  599. package/conformance/cases/extension/046_bounded_subset.pl +0 -4
  600. package/conformance/expected/core/003_terms_and_readback.out +0 -13
  601. package/conformance/expected/core/016_zero_arity_compound.out +0 -1
  602. package/conformance/expected/extension/003_arithmetic_and_comparison.out +0 -10
  603. package/conformance/expected/extension/004_strings_and_atoms.out +0 -4
  604. package/conformance/expected/extension/006_formula_terms.out +0 -4
  605. package/conformance/expected/extension/009_list_relations.out +0 -5
  606. package/conformance/expected/extension/025_is_list_filter.out +0 -1
  607. package/conformance/expected/extension/026_nested_formula_terms.out +0 -6
  608. package/conformance/expected/extension/030_string_and_atom_concat.out +0 -2
  609. package/conformance/expected/extension/036_extended_gcd.out +0 -1
  610. package/conformance/expected/extension/037_collatz_trajectory.out +0 -1
  611. package/conformance/expected/extension/038_kaprekar_steps.out +0 -1
  612. package/conformance/expected/extension/039_goldbach_pair.out +0 -2
  613. package/conformance/expected/extension/040_matrix_operations.out +0 -3
  614. package/conformance/expected/extension/041_atom_range_generators.out +0 -8
  615. package/conformance/expected/extension/042_n_queens_small.out +0 -2
  616. package/conformance/expected/extension/043_cnf_model.out +0 -1
  617. package/conformance/expected/extension/044_cover9_filter.out +0 -2
  618. package/conformance/expected/extension/045_alphametic_sum_small.out +0 -4
  619. package/conformance/expected/extension/046_bounded_subset.out +0 -5
  620. package/examples/access-control-policy.pl +0 -52
  621. package/examples/ackermann.pl +0 -46
  622. package/examples/age.pl +0 -28
  623. package/examples/aliases-and-namespaces.pl +0 -22
  624. package/examples/alignment-demo.pl +0 -44
  625. package/examples/allen-interval-calculus.pl +0 -64
  626. package/examples/ancestor.pl +0 -21
  627. package/examples/animal.pl +0 -21
  628. package/examples/annotation-rdf12.ttl +0 -12
  629. package/examples/annotation.pl +0 -34
  630. package/examples/auroracare.pl +0 -309
  631. package/examples/backward.pl +0 -12
  632. package/examples/basic-monadic.pl +0 -10018
  633. package/examples/bayes-diagnosis.pl +0 -108
  634. package/examples/bayes-therapy.pl +0 -182
  635. package/examples/beam-deflection.pl +0 -50
  636. package/examples/blocks-world-planning.pl +0 -75
  637. package/examples/bmi.pl +0 -232
  638. package/examples/braking-safety-worlds.pl +0 -69
  639. package/examples/buck-converter-design.pl +0 -78
  640. package/examples/cache-performance.pl +0 -54
  641. package/examples/canary-release.pl +0 -49
  642. package/examples/cat-koko.pl +0 -24
  643. package/examples/clinical-trial-screening.pl +0 -92
  644. package/examples/collatz-1000.pl +0 -14
  645. package/examples/combinatorics-findall-sort.pl +0 -37
  646. package/examples/competitive-enzyme-kinetics.pl +0 -78
  647. package/examples/complex-matrix-stability.pl +0 -45
  648. package/examples/complex.pl +0 -121
  649. package/examples/composition-of-injective-functions-is-injective.pl +0 -50
  650. package/examples/context-association.pl +0 -53
  651. package/examples/control-system.pl +0 -72
  652. package/examples/cryptarithmetic-send-more-money.pl +0 -49
  653. package/examples/cyclic-path.pl +0 -16
  654. package/examples/d3-group.pl +0 -100
  655. package/examples/dairy-energy-balance.pl +0 -65
  656. package/examples/data-negotiation.pl +0 -39
  657. package/examples/deep-taxonomy-10.pl +0 -115
  658. package/examples/deep-taxonomy-100.pl +0 -385
  659. package/examples/deep-taxonomy-1000.pl +0 -3085
  660. package/examples/deep-taxonomy-10000.pl +0 -30094
  661. package/examples/deep-taxonomy-100000.pl +0 -300184
  662. package/examples/delfour.pl +0 -281
  663. package/examples/dense-hamiltonian-cycle.pl +0 -92
  664. package/examples/deontic-logic.pl +0 -52
  665. package/examples/derived-backward-rule.pl +0 -30
  666. package/examples/derived-rule.pl +0 -27
  667. package/examples/diamond-property.pl +0 -38
  668. package/examples/dijkstra-findall-sort.pl +0 -44
  669. package/examples/dijkstra-risk-path.pl +0 -86
  670. package/examples/dijkstra.pl +0 -46
  671. package/examples/dining-philosophers.pl +0 -140
  672. package/examples/directional-language.ttl +0 -9
  673. package/examples/dog.pl +0 -25
  674. package/examples/drone-corridor-planner.pl +0 -51
  675. package/examples/easter-computus.pl +0 -89
  676. package/examples/electrical-rc-filter.pl +0 -36
  677. package/examples/epidemic-policy.pl +0 -67
  678. package/examples/equivalence-classes-overlap-implies-same-class.pl +0 -27
  679. package/examples/eulerian-path.pl +0 -85
  680. package/examples/ev-range-worlds.pl +0 -82
  681. package/examples/exact-cover-sudoku.pl +0 -113
  682. package/examples/existential-rule.pl +0 -18
  683. package/examples/exoplanet-validation-worlds.pl +0 -88
  684. package/examples/expression-eval.pl +0 -43
  685. package/examples/eyeling-ackermann.n3 +0 -41
  686. package/examples/eyeling-age-threshold.n3 +0 -12
  687. package/examples/eyeling-alignment-demo.n3 +0 -11
  688. package/examples/eyeling-allen-interval-calculus-small.n3 +0 -13
  689. package/examples/eyeling-backward-recursion.n3 +0 -11
  690. package/examples/eyeling-backward.n3 +0 -10
  691. package/examples/eyeling-basic-monadic-small.n3 +0 -11
  692. package/examples/eyeling-bmi.n3 +0 -10
  693. package/examples/eyeling-cat-koko.n3 +0 -15
  694. package/examples/eyeling-collatz-small.n3 +0 -11
  695. package/examples/eyeling-collection.n3 +0 -11
  696. package/examples/eyeling-complex-arithmetic.n3 +0 -10
  697. package/examples/eyeling-context-association.n3 +0 -11
  698. package/examples/eyeling-control-system-small.n3 +0 -11
  699. package/examples/eyeling-crypto-builtins-extra.n3 +0 -10
  700. package/examples/eyeling-crypto-builtins.n3 +0 -8
  701. package/examples/eyeling-deep-taxonomy-10.n3 +0 -18
  702. package/examples/eyeling-derived-backward-rule-flat.n3 +0 -10
  703. package/examples/eyeling-derived-rule-flat.n3 +0 -9
  704. package/examples/eyeling-digital-product-passport-small.n3 +0 -11
  705. package/examples/eyeling-dijkstra-tiny.n3 +0 -14
  706. package/examples/eyeling-dog-license.n3 +0 -13
  707. package/examples/eyeling-drone-corridor-planner-small.n3 +0 -13
  708. package/examples/eyeling-equals.n3 +0 -8
  709. package/examples/eyeling-equivalence-classes.n3 +0 -11
  710. package/examples/eyeling-euler-identity.n3 +0 -9
  711. package/examples/eyeling-existential-rule.n3 +0 -9
  712. package/examples/eyeling-expression-eval.n3 +0 -11
  713. package/examples/eyeling-family-cousins-extended.n3 +0 -12
  714. package/examples/eyeling-fastpow.n3 +0 -10
  715. package/examples/eyeling-fibonacci.n3 +0 -44
  716. package/examples/eyeling-french-cities-reachability.n3 +0 -22
  717. package/examples/eyeling-goldbach-small.n3 +0 -22
  718. package/examples/eyeling-good-cobbler.n3 +0 -9
  719. package/examples/eyeling-list-builtins.n3 +0 -10
  720. package/examples/eyeling-list-collection-extra.n3 +0 -9
  721. package/examples/eyeling-math-builtins.n3 +0 -9
  722. package/examples/eyeling-string-builtins-extra.n3 +0 -9
  723. package/examples/eyeling-string-builtins.n3 +0 -10
  724. package/examples/eyeling-time-builtins.n3 +0 -11
  725. package/examples/eyeling-time-components-extra.n3 +0 -10
  726. package/examples/eyeling-witch.n3 +0 -10
  727. package/examples/family-cousins.n3 +0 -17
  728. package/examples/family-cousins.pl +0 -65
  729. package/examples/fastpow.pl +0 -53
  730. package/examples/fft8-numeric.pl +0 -83
  731. package/examples/fibonacci.pl +0 -53
  732. package/examples/field-nitrogen-balance.pl +0 -70
  733. package/examples/flandor.pl +0 -296
  734. package/examples/floating-point.pl +0 -23
  735. package/examples/four-color-map.pl +0 -127
  736. package/examples/fundamental-theorem-arithmetic.pl +0 -113
  737. package/examples/gcd-bezout-identity.pl +0 -48
  738. package/examples/gd-step-certified.pl +0 -158
  739. package/examples/gdpr-compliance.pl +0 -69
  740. package/examples/goldbach-1000.pl +0 -185
  741. package/examples/good-cobbler.pl +0 -14
  742. package/examples/gps.pl +0 -152
  743. package/examples/graph-reachability.pl +0 -36
  744. package/examples/gray-code-counter.pl +0 -48
  745. package/examples/greatest-lower-bound-uniqueness.pl +0 -28
  746. package/examples/group-inverse-uniqueness.pl +0 -34
  747. package/examples/hamiltonian-cycle.pl +0 -55
  748. package/examples/hamiltonian-path.pl +0 -49
  749. package/examples/hamming-code.pl +0 -105
  750. package/examples/hanoi.pl +0 -20
  751. package/examples/heat-loss.pl +0 -51
  752. package/examples/heron-theorem.pl +0 -36
  753. package/examples/ideal-gas-law.pl +0 -37
  754. package/examples/illegitimate-reasoning.pl +0 -88
  755. package/examples/kaprekar.pl +0 -32
  756. package/examples/law-of-cosines.pl +0 -31
  757. package/examples/least-squares-regression.pl +0 -81
  758. package/examples/list-collection.pl +0 -33
  759. package/examples/lldm.pl +0 -78
  760. package/examples/manufacturing-quality-control.pl +0 -73
  761. package/examples/matrix.pl +0 -296
  762. package/examples/microgrid-dispatch.pl +0 -85
  763. package/examples/monkey-bananas.pl +0 -45
  764. package/examples/n-queens.pl +0 -23
  765. package/examples/n3-builtins.n3 +0 -28
  766. package/examples/network-sla.pl +0 -48
  767. package/examples/newton-raphson.pl +0 -49
  768. package/examples/nixon-diamond.pl +0 -37
  769. package/examples/odrl-dpv-healthcare-risk-ranked.pl +0 -266
  770. package/examples/odrl-dpv-risk-ranked.pl +0 -320
  771. package/examples/orbital-transfer-design.pl +0 -113
  772. package/examples/output/annotation-rdf12.ttl +0 -1
  773. package/examples/output/basic-monadic.pl +0 -1518
  774. package/examples/output/collatz-1000.pl +0 -1000
  775. package/examples/output/complex-matrix-stability.pl +0 -5
  776. package/examples/output/complex.pl +0 -1
  777. package/examples/output/cryptarithmetic-send-more-money.pl +0 -6
  778. package/examples/output/dense-hamiltonian-cycle.pl +0 -4
  779. package/examples/output/directional-language.ttl +0 -1
  780. package/examples/output/exact-cover-sudoku.pl +0 -3
  781. package/examples/output/eyeling-ackermann.n3 +0 -12
  782. package/examples/output/eyeling-age-threshold.n3 +0 -4
  783. package/examples/output/eyeling-alignment-demo.n3 +0 -1
  784. package/examples/output/eyeling-allen-interval-calculus-small.n3 +0 -3
  785. package/examples/output/eyeling-backward-recursion.n3 +0 -9
  786. package/examples/output/eyeling-backward.n3 +0 -1
  787. package/examples/output/eyeling-basic-monadic-small.n3 +0 -8
  788. package/examples/output/eyeling-bmi.n3 +0 -2
  789. package/examples/output/eyeling-cat-koko.n3 +0 -3
  790. package/examples/output/eyeling-collatz-small.n3 +0 -3
  791. package/examples/output/eyeling-collection.n3 +0 -1
  792. package/examples/output/eyeling-complex-arithmetic.n3 +0 -5
  793. package/examples/output/eyeling-context-association.n3 +0 -4
  794. package/examples/output/eyeling-control-system-small.n3 +0 -4
  795. package/examples/output/eyeling-crypto-builtins-extra.n3 +0 -3
  796. package/examples/output/eyeling-crypto-builtins.n3 +0 -2
  797. package/examples/output/eyeling-deep-taxonomy-10.n3 +0 -32
  798. package/examples/output/eyeling-derived-backward-rule-flat.n3 +0 -4
  799. package/examples/output/eyeling-derived-rule-flat.n3 +0 -2
  800. package/examples/output/eyeling-digital-product-passport-small.n3 +0 -3
  801. package/examples/output/eyeling-dijkstra-tiny.n3 +0 -9
  802. package/examples/output/eyeling-dog-license.n3 +0 -1
  803. package/examples/output/eyeling-drone-corridor-planner-small.n3 +0 -5
  804. package/examples/output/eyeling-equals.n3 +0 -1
  805. package/examples/output/eyeling-equivalence-classes.n3 +0 -2
  806. package/examples/output/eyeling-euler-identity.n3 +0 -3
  807. package/examples/output/eyeling-existential-rule.n3 +0 -4
  808. package/examples/output/eyeling-expression-eval.n3 +0 -3
  809. package/examples/output/eyeling-family-cousins-extended.n3 +0 -6
  810. package/examples/output/eyeling-fastpow.n3 +0 -4
  811. package/examples/output/eyeling-fibonacci.n3 +0 -6
  812. package/examples/output/eyeling-french-cities-reachability.n3 +0 -25
  813. package/examples/output/eyeling-goldbach-small.n3 +0 -2
  814. package/examples/output/eyeling-good-cobbler.n3 +0 -2
  815. package/examples/output/eyeling-list-builtins.n3 +0 -6
  816. package/examples/output/eyeling-list-collection-extra.n3 +0 -5
  817. package/examples/output/eyeling-math-builtins.n3 +0 -5
  818. package/examples/output/eyeling-string-builtins-extra.n3 +0 -3
  819. package/examples/output/eyeling-string-builtins.n3 +0 -4
  820. package/examples/output/eyeling-time-builtins.n3 +0 -4
  821. package/examples/output/eyeling-time-components-extra.n3 +0 -5
  822. package/examples/output/eyeling-witch.n3 +0 -2
  823. package/examples/output/family-cousins.n3 +0 -8
  824. package/examples/output/gcd-bezout-identity.pl +0 -36
  825. package/examples/output/goldbach-1000.pl +0 -667
  826. package/examples/output/hamiltonian-cycle.pl +0 -4
  827. package/examples/output/kaprekar.pl +0 -8
  828. package/examples/output/matrix.pl +0 -10
  829. package/examples/output/n-queens.pl +0 -93
  830. package/examples/output/n3-builtins.n3 +0 -6
  831. package/examples/output/path-discovery.pl +0 -3
  832. package/examples/output/project-portfolio-optimization.pl +0 -6
  833. package/examples/output/quine-mccluskey.pl +0 -3
  834. package/examples/output/resilient-city-orchestration.pl +0 -67
  835. package/examples/output/sat-dpll.pl +0 -5
  836. package/examples/output/socrates.n3 +0 -1
  837. package/examples/output/sudoku.pl +0 -2
  838. package/examples/output/traveling-salesman.pl +0 -1
  839. package/examples/output/triple-term.n3 +0 -2
  840. package/examples/path-discovery.pl +0 -44998
  841. package/examples/peano-arithmetic.pl +0 -31
  842. package/examples/peasant.pl +0 -30
  843. package/examples/pendulum-period.pl +0 -50
  844. package/examples/polynomial.pl +0 -124
  845. package/examples/project-portfolio-optimization.pl +0 -101
  846. package/examples/proof/age.pl +0 -71
  847. package/examples/proof/aliases-and-namespaces.pl +0 -78
  848. package/examples/proof/ancestor.pl +0 -140
  849. package/examples/proof/animal.pl +0 -68
  850. package/examples/proof/annotation.pl +0 -80
  851. package/examples/proof/backward.pl +0 -22
  852. package/examples/proof/cat-koko.pl +0 -86
  853. package/examples/proof/data-negotiation.pl +0 -76
  854. package/examples/proof/derived-rule.pl +0 -43
  855. package/examples/proof/dog.pl +0 -31
  856. package/examples/proof/electrical-rc-filter.pl +0 -105
  857. package/examples/proof/existential-rule.pl +0 -40
  858. package/examples/proof/floating-point.pl +0 -160
  859. package/examples/proof/good-cobbler.pl +0 -16
  860. package/examples/proof/group-inverse-uniqueness.pl +0 -84
  861. package/examples/proof/list-collection.pl +0 -52
  862. package/examples/proof/proof-contrapositive.pl +0 -78
  863. package/examples/proof/socket-age.pl +0 -32
  864. package/examples/proof/socket-family.pl +0 -59
  865. package/examples/proof/socrates.pl +0 -38
  866. package/examples/proof-contrapositive.pl +0 -27
  867. package/examples/quadratic-formula.pl +0 -54
  868. package/examples/quine-mccluskey.pl +0 -143
  869. package/examples/radioactive-decay.pl +0 -56
  870. package/examples/resilient-city-orchestration.pl +0 -303
  871. package/examples/riemann-hypothesis.pl +0 -110
  872. package/examples/sat-dpll.pl +0 -80
  873. package/examples/security-incident-correlation.pl +0 -69
  874. package/examples/service-impact.pl +0 -41
  875. package/examples/sieve.pl +0 -20
  876. package/examples/skolem-functions.pl +0 -52
  877. package/examples/socket-age.pl +0 -39
  878. package/examples/socket-family.pl +0 -28
  879. package/examples/socrates.n3 +0 -11
  880. package/examples/socrates.pl +0 -19
  881. package/examples/statistics-summary.pl +0 -54
  882. package/examples/sudoku.pl +0 -20
  883. package/examples/superdense-coding.pl +0 -84
  884. package/examples/traveling-salesman.pl +0 -64
  885. package/examples/triple-term.n3 +0 -9
  886. package/examples/turing.pl +0 -67
  887. package/examples/vector-similarity.pl +0 -56
  888. package/examples/witch.pl +0 -38
  889. package/examples/wolf-goat-cabbage.pl +0 -56
  890. package/examples/zebra.pl +0 -44
  891. package/playground-worker.mjs +0 -141
  892. package/src/builtins/alphametic.js +0 -144
  893. package/src/builtins/formula.js +0 -42
  894. package/src/builtins/matrix.js +0 -226
  895. package/src/builtins/n3.js +0 -483
  896. package/src/builtins/number-theory.js +0 -114
  897. package/src/builtins/portfolio.js +0 -73
  898. package/src/builtins/search.js +0 -579
  899. package/src/builtins/sudoku.js +0 -141
  900. package/src/rdf.js +0 -747
  901. package/test/run-all.js +0 -20
  902. package/test/run-conformance.js +0 -80
  903. package/test/run-examples.js +0 -125
  904. package/test/run-regression.js +0 -655
  905. package/test/test-style.js +0 -91
  906. /package/examples/output/{access-control-policy.pl → access-control-policy.eye} +0 -0
  907. /package/examples/output/{ackermann.pl → ackermann.eye} +0 -0
  908. /package/examples/output/{age.pl → age.eye} +0 -0
  909. /package/examples/output/{aliases-and-namespaces.pl → aliases-and-namespaces.eye} +0 -0
  910. /package/examples/output/{alignment-demo.pl → alignment-demo.eye} +0 -0
  911. /package/examples/output/{allen-interval-calculus.pl → allen-interval-calculus.eye} +0 -0
  912. /package/examples/output/{ancestor.pl → ancestor.eye} +0 -0
  913. /package/examples/output/{animal.pl → animal.eye} +0 -0
  914. /package/examples/output/{annotation.pl → annotation.eye} +0 -0
  915. /package/examples/output/{auroracare.pl → auroracare.eye} +0 -0
  916. /package/examples/output/{backward.pl → backward.eye} +0 -0
  917. /package/examples/output/{bayes-diagnosis.pl → bayes-diagnosis.eye} +0 -0
  918. /package/examples/output/{bayes-therapy.pl → bayes-therapy.eye} +0 -0
  919. /package/examples/output/{beam-deflection.pl → beam-deflection.eye} +0 -0
  920. /package/examples/output/{blocks-world-planning.pl → blocks-world-planning.eye} +0 -0
  921. /package/examples/output/{bmi.pl → bmi.eye} +0 -0
  922. /package/examples/output/{braking-safety-worlds.pl → braking-safety-worlds.eye} +0 -0
  923. /package/examples/output/{buck-converter-design.pl → buck-converter-design.eye} +0 -0
  924. /package/examples/output/{cache-performance.pl → cache-performance.eye} +0 -0
  925. /package/examples/output/{canary-release.pl → canary-release.eye} +0 -0
  926. /package/examples/output/{cat-koko.pl → cat-koko.eye} +0 -0
  927. /package/examples/output/{clinical-trial-screening.pl → clinical-trial-screening.eye} +0 -0
  928. /package/examples/output/{combinatorics-findall-sort.pl → combinatorics-findall-sort.eye} +0 -0
  929. /package/examples/output/{competitive-enzyme-kinetics.pl → competitive-enzyme-kinetics.eye} +0 -0
  930. /package/examples/output/{composition-of-injective-functions-is-injective.pl → composition-of-injective-functions-is-injective.eye} +0 -0
  931. /package/examples/output/{context-association.pl → context-association.eye} +0 -0
  932. /package/examples/output/{control-system.pl → control-system.eye} +0 -0
  933. /package/examples/output/{cyclic-path.pl → cyclic-path.eye} +0 -0
  934. /package/examples/output/{d3-group.pl → d3-group.eye} +0 -0
  935. /package/examples/output/{dairy-energy-balance.pl → dairy-energy-balance.eye} +0 -0
  936. /package/examples/output/{data-negotiation.pl → data-negotiation.eye} +0 -0
  937. /package/examples/output/{deep-taxonomy-10.pl → deep-taxonomy-10.eye} +0 -0
  938. /package/examples/output/{deep-taxonomy-100.pl → deep-taxonomy-100.eye} +0 -0
  939. /package/examples/output/{deep-taxonomy-1000.pl → deep-taxonomy-1000.eye} +0 -0
  940. /package/examples/output/{deep-taxonomy-10000.pl → deep-taxonomy-10000.eye} +0 -0
  941. /package/examples/output/{deep-taxonomy-100000.pl → deep-taxonomy-100000.eye} +0 -0
  942. /package/examples/output/{delfour.pl → delfour.eye} +0 -0
  943. /package/examples/output/{deontic-logic.pl → deontic-logic.eye} +0 -0
  944. /package/examples/output/{derived-backward-rule.pl → derived-backward-rule.eye} +0 -0
  945. /package/examples/output/{derived-rule.pl → derived-rule.eye} +0 -0
  946. /package/examples/output/{diamond-property.pl → diamond-property.eye} +0 -0
  947. /package/examples/output/{dijkstra-findall-sort.pl → dijkstra-findall-sort.eye} +0 -0
  948. /package/examples/output/{dijkstra-risk-path.pl → dijkstra-risk-path.eye} +0 -0
  949. /package/examples/output/{dijkstra.pl → dijkstra.eye} +0 -0
  950. /package/examples/output/{dining-philosophers.pl → dining-philosophers.eye} +0 -0
  951. /package/examples/output/{dog.pl → dog.eye} +0 -0
  952. /package/examples/output/{drone-corridor-planner.pl → drone-corridor-planner.eye} +0 -0
  953. /package/examples/output/{easter-computus.pl → easter-computus.eye} +0 -0
  954. /package/examples/output/{electrical-rc-filter.pl → electrical-rc-filter.eye} +0 -0
  955. /package/examples/output/{epidemic-policy.pl → epidemic-policy.eye} +0 -0
  956. /package/examples/output/{equivalence-classes-overlap-implies-same-class.pl → equivalence-classes-overlap-implies-same-class.eye} +0 -0
  957. /package/examples/output/{eulerian-path.pl → eulerian-path.eye} +0 -0
  958. /package/examples/output/{ev-range-worlds.pl → ev-range-worlds.eye} +0 -0
  959. /package/examples/output/{existential-rule.pl → existential-rule.eye} +0 -0
  960. /package/examples/output/{exoplanet-validation-worlds.pl → exoplanet-validation-worlds.eye} +0 -0
  961. /package/examples/output/{expression-eval.pl → expression-eval.eye} +0 -0
  962. /package/examples/output/{family-cousins.pl → family-cousins.eye} +0 -0
  963. /package/examples/output/{fastpow.pl → fastpow.eye} +0 -0
  964. /package/examples/output/{fft8-numeric.pl → fft8-numeric.eye} +0 -0
  965. /package/examples/output/{fibonacci.pl → fibonacci.eye} +0 -0
  966. /package/examples/output/{field-nitrogen-balance.pl → field-nitrogen-balance.eye} +0 -0
  967. /package/examples/output/{flandor.pl → flandor.eye} +0 -0
  968. /package/examples/output/{floating-point.pl → floating-point.eye} +0 -0
  969. /package/examples/output/{four-color-map.pl → four-color-map.eye} +0 -0
  970. /package/examples/output/{fundamental-theorem-arithmetic.pl → fundamental-theorem-arithmetic.eye} +0 -0
  971. /package/examples/output/{gd-step-certified.pl → gd-step-certified.eye} +0 -0
  972. /package/examples/output/{gdpr-compliance.pl → gdpr-compliance.eye} +0 -0
  973. /package/examples/output/{good-cobbler.pl → good-cobbler.eye} +0 -0
  974. /package/examples/output/{gps.pl → gps.eye} +0 -0
  975. /package/examples/output/{graph-reachability.pl → graph-reachability.eye} +0 -0
  976. /package/examples/output/{gray-code-counter.pl → gray-code-counter.eye} +0 -0
  977. /package/examples/output/{greatest-lower-bound-uniqueness.pl → greatest-lower-bound-uniqueness.eye} +0 -0
  978. /package/examples/output/{group-inverse-uniqueness.pl → group-inverse-uniqueness.eye} +0 -0
  979. /package/examples/output/{hamiltonian-path.pl → hamiltonian-path.eye} +0 -0
  980. /package/examples/output/{hamming-code.pl → hamming-code.eye} +0 -0
  981. /package/examples/output/{hanoi.pl → hanoi.eye} +0 -0
  982. /package/examples/output/{heat-loss.pl → heat-loss.eye} +0 -0
  983. /package/examples/output/{heron-theorem.pl → heron-theorem.eye} +0 -0
  984. /package/examples/output/{ideal-gas-law.pl → ideal-gas-law.eye} +0 -0
  985. /package/examples/output/{illegitimate-reasoning.pl → illegitimate-reasoning.eye} +0 -0
  986. /package/examples/output/{law-of-cosines.pl → law-of-cosines.eye} +0 -0
  987. /package/examples/output/{least-squares-regression.pl → least-squares-regression.eye} +0 -0
  988. /package/examples/output/{list-collection.pl → list-collection.eye} +0 -0
  989. /package/examples/output/{lldm.pl → lldm.eye} +0 -0
  990. /package/examples/output/{manufacturing-quality-control.pl → manufacturing-quality-control.eye} +0 -0
  991. /package/examples/output/{microgrid-dispatch.pl → microgrid-dispatch.eye} +0 -0
  992. /package/examples/output/{monkey-bananas.pl → monkey-bananas.eye} +0 -0
  993. /package/examples/output/{network-sla.pl → network-sla.eye} +0 -0
  994. /package/examples/output/{newton-raphson.pl → newton-raphson.eye} +0 -0
  995. /package/examples/output/{nixon-diamond.pl → nixon-diamond.eye} +0 -0
  996. /package/examples/output/{odrl-dpv-healthcare-risk-ranked.pl → odrl-dpv-healthcare-risk-ranked.eye} +0 -0
  997. /package/examples/output/{odrl-dpv-risk-ranked.pl → odrl-dpv-risk-ranked.eye} +0 -0
  998. /package/examples/output/{orbital-transfer-design.pl → orbital-transfer-design.eye} +0 -0
  999. /package/examples/output/{peano-arithmetic.pl → peano-arithmetic.eye} +0 -0
  1000. /package/examples/output/{peasant.pl → peasant.eye} +0 -0
  1001. /package/examples/output/{pendulum-period.pl → pendulum-period.eye} +0 -0
  1002. /package/examples/output/{polynomial.pl → polynomial.eye} +0 -0
  1003. /package/examples/output/{proof-contrapositive.pl → proof-contrapositive.eye} +0 -0
  1004. /package/examples/output/{quadratic-formula.pl → quadratic-formula.eye} +0 -0
  1005. /package/examples/output/{radioactive-decay.pl → radioactive-decay.eye} +0 -0
  1006. /package/examples/output/{riemann-hypothesis.pl → riemann-hypothesis.eye} +0 -0
  1007. /package/examples/output/{security-incident-correlation.pl → security-incident-correlation.eye} +0 -0
  1008. /package/examples/output/{service-impact.pl → service-impact.eye} +0 -0
  1009. /package/examples/output/{sieve.pl → sieve.eye} +0 -0
  1010. /package/examples/output/{skolem-functions.pl → skolem-functions.eye} +0 -0
  1011. /package/examples/output/{socket-age.pl → socket-age.eye} +0 -0
  1012. /package/{conformance/expected/extension/001_default_derived_output.out → examples/output/socket-family.eye} +0 -0
  1013. /package/examples/output/{socrates.pl → socrates.eye} +0 -0
  1014. /package/examples/output/{statistics-summary.pl → statistics-summary.eye} +0 -0
  1015. /package/examples/output/{superdense-coding.pl → superdense-coding.eye} +0 -0
  1016. /package/examples/output/{turing.pl → turing.eye} +0 -0
  1017. /package/examples/output/{vector-similarity.pl → vector-similarity.eye} +0 -0
  1018. /package/examples/output/{witch.pl → witch.eye} +0 -0
  1019. /package/examples/output/{wolf-goat-cabbage.pl → wolf-goat-cabbage.eye} +0 -0
  1020. /package/examples/output/{zebra.pl → zebra.eye} +0 -0
  1021. /package/{conformance/expected/core/001_fact_output.out → test/conformance/expected/001_fact_output.eye} +0 -0
  1022. /package/{conformance/expected/core/002_rule_recursion.out → test/conformance/expected/002_rule_recursion.eye} +0 -0
  1023. /package/{conformance/expected/core/004_conjunction_and_parentheses.out → test/conformance/expected/004_conjunction_and_parentheses.eye} +0 -0
  1024. /package/{conformance/expected/core/005_list_deconstruction.out → test/conformance/expected/005_list_deconstruction.eye} +0 -0
  1025. /package/{conformance/expected/core/006_comma_formula_data.out → test/conformance/expected/006_comma_formula_data.eye} +0 -0
  1026. /package/{conformance/expected/core/007_anonymous_variables.out → test/conformance/expected/007_anonymous_variables.eye} +0 -0
  1027. /package/{conformance/expected/core/008_graphic_atoms.out → test/conformance/expected/008_graphic_atoms.eye} +0 -0
  1028. /package/{conformance/expected/core/009_comments_and_whitespace.out → test/conformance/expected/009_comments_and_whitespace.eye} +0 -0
  1029. /package/{conformance/expected/core/010_variable_scope_and_reuse.out → test/conformance/expected/010_variable_scope_and_reuse.eye} +0 -0
  1030. /package/{conformance/expected/core/011_predicate_arity.out → test/conformance/expected/011_predicate_arity.eye} +0 -0
  1031. /package/{conformance/expected/core/012_nested_compound_unification.out → test/conformance/expected/012_nested_compound_unification.eye} +0 -0
  1032. /package/{conformance/expected/core/013_multiple_clauses_order.out → test/conformance/expected/013_multiple_clauses_order.eye} +0 -0
  1033. /package/{conformance/expected/core/014_failure_filters_answers.out → test/conformance/expected/014_failure_filters_answers.eye} +0 -0
  1034. /package/{conformance/expected/core/015_improper_list_unification.out → test/conformance/expected/015_improper_list_unification.eye} +0 -0
  1035. /package/{conformance/expected/core/017_three_step_recursion.out → test/conformance/expected/017_three_step_recursion.eye} +0 -0
  1036. /package/{conformance/expected/core/018_quoted_atom_readback.out → test/conformance/expected/018_quoted_atom_readback.eye} +0 -0
  1037. /package/{conformance/expected/core/019_parenthesized_three_conjuncts.out → test/conformance/expected/019_parenthesized_three_conjuncts.eye} +0 -0
  1038. /package/{conformance/expected/core/020_nested_list_terms.out → test/conformance/expected/020_nested_list_terms.eye} +0 -0
  1039. /package/{conformance/expected/core/021_repeated_variable_head.out → test/conformance/expected/021_repeated_variable_head.eye} +0 -0
  1040. /package/{conformance/expected/core/022_rule_head_structure.out → test/conformance/expected/022_rule_head_structure.eye} +0 -0
  1041. /package/{conformance/expected/core/023_quoted_escapes_readback.out → test/conformance/expected/023_quoted_escapes_readback.eye} +0 -0
  1042. /package/{conformance/expected/core/024_numeric_literal_readback.out → test/conformance/expected/024_numeric_literal_readback.eye} +0 -0
  1043. /package/{conformance/expected/core/025_body_parentheses_with_formula_data.out → test/conformance/expected/025_body_parentheses_with_formula_data.eye} +0 -0
  1044. /package/{conformance/expected/core/026_underscore_named_variable_reuse.out → test/conformance/expected/026_question_underscore_named_variable_reuse.eye} +0 -0
  1045. /package/{examples/output/socket-family.pl → test/conformance/expected/027_default_derived_output.eye} +0 -0
  1046. /package/{conformance/expected/extension/002_materialize_focus.out → test/conformance/expected/028_materialize_focus.eye} +0 -0
  1047. /package/{conformance/expected/extension/005_lists_aggregation_ordering.out → test/conformance/expected/031_lists_aggregation_ordering.eye} +0 -0
  1048. /package/{conformance/expected/extension/007_negation_once_generators.out → test/conformance/expected/033_negation_once_generators.eye} +0 -0
  1049. /package/{conformance/expected/extension/008_equality_and_inequality.out → test/conformance/expected/034_equality_and_inequality.eye} +0 -0
  1050. /package/{conformance/expected/extension/010_append_splits.out → test/conformance/expected/036_append_splits.eye} +0 -0
  1051. /package/{conformance/expected/extension/011_matching_and_comparison.out → test/conformance/expected/037_matching_and_comparison.eye} +0 -0
  1052. /package/{conformance/expected/extension/012_memoize_declaration.out → test/conformance/expected/038_table_declaration.eye} +0 -0
  1053. /package/{conformance/expected/extension/013_numeric_functions.out → test/conformance/expected/039_numeric_functions.eye} +0 -0
  1054. /package/{conformance/expected/extension/014_between_enumeration.out → test/conformance/expected/040_between_enumeration.eye} +0 -0
  1055. /package/{conformance/expected/extension/015_smallest_divisor.out → test/conformance/expected/041_smallest_divisor.eye} +0 -0
  1056. /package/{conformance/expected/extension/016_negation_filter.out → test/conformance/expected/042_negation_filter.eye} +0 -0
  1057. /package/{conformance/expected/extension/017_once_user_predicate.out → test/conformance/expected/043_once_user_predicate.eye} +0 -0
  1058. /package/{conformance/expected/extension/018_findall_user_goal.out → test/conformance/expected/044_findall_user_goal.eye} +0 -0
  1059. /package/{conformance/expected/extension/019_sort_deduplicates_atoms.out → test/conformance/expected/045_sort_deduplicates_atoms.eye} +0 -0
  1060. /package/{conformance/expected/extension/020_append_bound_prefix_suffix.out → test/conformance/expected/046_append_bound_prefix_suffix.eye} +0 -0
  1061. /package/{conformance/expected/extension/021_nth0_index_generation.out → test/conformance/expected/047_nth0_index_generation.eye} +0 -0
  1062. /package/{conformance/expected/extension/022_set_nth0_edges.out → test/conformance/expected/048_set_nth0_edges.eye} +0 -0
  1063. /package/{conformance/expected/extension/023_select_duplicate_occurrences.out → test/conformance/expected/049_select_duplicate_occurrences.eye} +0 -0
  1064. /package/{conformance/expected/extension/024_not_member_filter.out → test/conformance/expected/050_not_member_filter.eye} +0 -0
  1065. /package/{conformance/expected/extension/027_materialize_excludes_source_fact.out → test/conformance/expected/053_materialize_excludes_source_fact.eye} +0 -0
  1066. /package/{conformance/expected/extension/028_numeric_and_lexical_comparison.out → test/conformance/expected/054_numeric_and_lexical_comparison.eye} +0 -0
  1067. /package/{conformance/expected/extension/029_string_matching_filters.out → test/conformance/expected/055_string_matching_filters.eye} +0 -0
  1068. /package/{conformance/expected/extension/031_countall_empty_and_nonempty.out → test/conformance/expected/057_countall_empty_and_nonempty.eye} +0 -0
  1069. /package/{conformance/expected/extension/032_sumall_numeric_template.out → test/conformance/expected/058_sumall_numeric_template.eye} +0 -0
  1070. /package/{conformance/expected/extension/033_aggregate_min_template.out → test/conformance/expected/059_aggregate_min_template.eye} +0 -0
  1071. /package/{conformance/expected/extension/034_aggregate_max_compound_key.out → test/conformance/expected/060_aggregate_max_compound_key.eye} +0 -0
  1072. /package/{conformance/expected/extension/035_date_difference.out → test/conformance/expected/061_date_difference.eye} +0 -0
package/README.md CHANGED
@@ -1,631 +1,68 @@
1
- # eyelang
1
+ # Eyelang
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/eyelang.svg)](https://www.npmjs.com/package/eyelang)
4
- [![DOI](https://img.shields.io/badge/DOI-10.5281%2Fzenodo.1242549108-blue.svg)](https://doi.org/10.5281/zenodo.20342331)
4
+ [![DOI](https://img.shields.io/badge/DOI-10.5281%2Fzenodo.20761726-blue.svg)](https://doi.org/10.5281/zenodo.20761726)
5
5
 
6
- eyelang is a small rule engine for Prolog-style Horn clauses over ordinary terms, lists, arithmetic, strings, and finite search. The command-line executable is `eyelang`.
6
+ Eyelang is a small logic programming language for rules, goals, answers, and proofs.
7
+ Its source syntax is Prolog-like Horn-clause syntax with deliberate eyelang choices, including `?x` variables for N3/SPARQL-style readability, explicit `table(path, 2).` declarations for tabled predicates, advisory `mode/3` declarations for host tooling, and stratified-negation diagnostics for portable `not/1` usage.
8
+ It grew out of logic-language experiments in the EYE/N3 reasoning tradition, but is packaged here as its own project.
7
9
 
8
- Programs write relations directly, for example `ancestor(pat, emma)` or `status(case1, accepted)`. eyelang output is ordinary eyelang syntax: by default, the CLI materializes selected answer facts and prints those facts only. Pass `--proof` (or `-p`) when you also want each answer followed by a `why/2` explanation fact that records the proof. Programs may add `materialize(Name, Arity).` declarations to focus output on selected predicates.
10
+ ## Install and run
9
11
 
12
+ Eyelang has no runtime npm dependencies and no build step. From a source checkout, run the CLI directly with Node.js 18 or newer:
10
13
 
11
- Try it in the [browser playground](https://eyereasoner.github.io/eyelang/playground). The playground includes run options equivalent to CLI `--stats` and `--proof`.
12
-
13
- For the normative language definition, including lexical syntax, terms, clauses, goals, built-ins, `memoize/2`, `materialize/2`, and conformance boundaries, read the [eyelang specification](SPEC.md).
14
-
15
- ## Contents
16
-
17
- 1. [Quick start](#quick-start)
18
- 2. [Running eyelang](#running-eyelang)
19
- 3. [Default output](#default-output)
20
- 4. [Writing programs](#writing-programs)
21
- 5. [Aggregation helpers](#aggregation-helpers)
22
- 6. [Formula data](#formula-data)
23
- 7. [RDF 1.2 and Notation3 compatibility](#rdf-12-and-notation3-compatibility)
24
- 8. [Example catalog](#example-catalog)
25
- 9. [Golden outputs, tests, and conformance](#golden-outputs-tests-and-conformance)
26
- 10. [Development and release](#development-and-release)
27
- 11. [Relationship to Eyeling](#relationship-to-eyeling)
28
- 12. [Performance notes](#performance-notes)
29
- 13. [Implementation limits](#implementation-limits)
30
-
31
- ## Quick start
32
-
33
- Install dependencies, if any, and run the command-line executable:
34
-
35
- ```sh
36
- npm install
37
- ```
38
-
39
- There is no build step for the CLI. Run examples, multiple inputs, stdin, or a URL:
40
-
41
- ```sh
42
- bin/eyelang --version
43
- bin/eyelang examples/ancestor.pl
44
- bin/eyelang facts.pl rules.pl
45
- printf 'works(stdin, true) :- eq(ok, ok).\n' | bin/eyelang -
46
- bin/eyelang https://raw.githubusercontent.com/eyereasoner/eyelang/refs/heads/main/examples/ancestor.pl
47
- ```
48
-
49
- The CLI runs directly on Node.js 18 or newer. The browser playground uses the same source modules through `playground-worker.mjs`; no separate browser build is required.
50
-
51
- Serve the playground locally:
52
-
53
- ```sh
54
- python3 -m http.server 8000
55
- # then open http://localhost:8000/playground.html
56
- ```
57
-
58
- ## Running eyelang
59
-
60
- Show the package version:
61
-
62
- ```sh
63
- bin/eyelang --version
64
- bin/eyelang -v
65
- ```
66
-
67
- Run a program and let eyelang print derived binary facts:
68
-
69
- ```sh
70
- bin/eyelang examples/ancestor.pl
71
- ```
72
-
73
- Enable proof explanations when you want machine-readable provenance:
74
-
75
- ```sh
76
- bin/eyelang --proof examples/ancestor.pl
77
- bin/eyelang -p examples/ancestor.pl
78
- ```
79
-
80
- eyelang-readable explanations are opt-in proof output. Each `why/2` fact contains a nested abstract proof term, and a blank line separates consecutive explanations. Using eyelang syntax for explanations keeps them in the same language as the answers themselves: they are readable by humans, parseable by eyelang, easy to test, and can be transformed or explained further like any other eyelang data. For example:
81
-
82
- ```prolog
83
- type(socrates, mortal).
84
- why(
85
- type(socrates, mortal),
86
- proof(
87
- goal(type(socrates, mortal)),
88
- by(rule("socrates.pl", clause(4))),
89
- bindings([binding("X", socrates)]),
90
- uses([
91
- proof(
92
- goal(type(socrates, man)),
93
- by(fact("socrates.pl", clause(3)))
94
- )
95
- ])
96
- )
97
- ).
98
-
99
- ```
100
-
101
- The explanation output can itself be read as eyelang input; for example, another program can materialize `why/2` facts such as `why(type(socrates, mortal), Proof)`. `--proof` adds only these explanation facts; it does not change the answers found by the solver.
102
-
103
- ### Explanation cookbook
104
-
105
- eyelang answers can carry their own provenance when proof output is enabled.
106
-
107
- Explain one derived fact:
108
-
109
- ```sh
110
- bin/eyelang --proof examples/socrates.pl
111
- ```
112
-
113
- The output contains the answer and a `why/2` fact. The proof term shows the source rule that produced the answer and the source fact used below it. Source references use `rule("file.pl", clause(N))` and `fact("file.pl", clause(N))`, where `N` is the 1-based clause number in that file.
114
-
115
- Inspect variable bindings with a small policy program:
116
-
117
- ```prolog
118
- score(case1, 95).
119
- threshold(90).
120
-
121
- status(Case, accepted) :-
122
- score(Case, Score),
123
- threshold(T),
124
- ge(Score, T).
125
- ```
126
-
127
- ```sh
128
- bin/eyelang --proof policy.pl
129
- ```
130
-
131
- The explanation contains the instantiated answer and the variables that made the rule succeed:
132
-
133
- ```prolog
134
- status(case1, accepted).
135
- why(
136
- status(case1, accepted),
137
- proof(
138
- goal(status(case1, accepted)),
139
- by(rule("policy.pl", clause(3))),
140
- bindings([binding("Case", case1), binding("Score", 95), binding("T", 90)]),
141
- uses([...])
142
- )
143
- ).
144
- ```
145
-
146
- Use the `uses([...])` list to follow the proof tree. In the policy example it contains one subproof for `score(case1, 95)`, one for `threshold(90)`, and one for the built-in comparison `ge(95, 90)`. Built-ins are shown as `builtin(Name, Arity)` because they do not come from source clauses.
147
-
148
- Reuse explanations as data:
149
-
150
- ```sh
151
- bin/eyelang --proof examples/socrates.pl > socrates.why.pl
14
+ ```bash
15
+ node bin/eyelang.js examples/ancestor.eye
16
+ node bin/eyelang.js --proof examples/socrates.eye
17
+ node bin/eyelang.js --warnings examples/policy.eye
18
+ printf 'works(stdin, true) :- eq(ok, ok).\n' | node bin/eyelang.js -
152
19
  ```
153
20
 
154
- The resulting file is ordinary eyelang syntax containing both answers and `why/2` proof facts.
155
-
156
- Compose multiple files, stdin, and URLs:
157
-
158
- ```sh
159
- bin/eyelang facts.pl rules.pl
160
- printf 'works(stdin, true) :- eq(ok, ok).\n' | bin/eyelang -
161
- bin/eyelang https://example.test/program.pl
162
- ```
163
-
164
- ## Default output
165
-
166
- eyelang programs write relation predicates directly:
167
-
168
- ```prolog
169
- parent(pat, jan).
170
- parent(jan, emma).
21
+ For one-off local CLI use from the checkout, npm can run the package bin without a manual symlink:
171
22
 
172
- ancestor(X, Y) :- parent(X, Y).
173
- ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z).
23
+ ```bash
24
+ npm exec -- eyelang --version
25
+ npm exec -- eyelang examples/ancestor.eye
174
26
  ```
175
27
 
176
- By default, eyelang asks for new ground consequences of selected output predicates, suppresses duplicates, excludes source facts, sorts the result, and prints Prolog facts:
28
+ To install the checkout's `eyelang` command on your `PATH`, use npm's package link:
177
29
 
178
- ```prolog
179
- ancestor(jan, emma).
180
- ancestor(pat, emma).
181
- ancestor(pat, jan).
30
+ ```bash
31
+ npm link
32
+ eyelang --version
182
33
  ```
183
34
 
184
- This default is intentionally output-oriented. It is not a complete bottom-up saturation engine. Built-ins and proof search remain goal-directed; use `materialize/2` declarations and small output predicates when you want a specific relation, arity, or non-binary answer.
35
+ ## JavaScript API
185
36
 
186
- ### Focusing default output
37
+ ```js
38
+ import { run, Program, Solver } from 'eyelang';
187
39
 
188
- Large examples often have internal helper predicates. Add `materialize(Name, Arity).` declarations to restrict default output to selected predicates:
189
-
190
- ```prolog
191
- materialize(answer, 2).
192
-
193
- seed(case1).
194
- helper(Case, score(95)) :- seed(Case).
195
- answer(Case, accepted) :- helper(Case, score(95)).
196
- ```
197
-
198
- The default output is then:
199
-
200
- ```prolog
201
- answer(case1, accepted).
40
+ const result = run(`
41
+ materialize(answer, 1).
42
+ answer(ok) :- eq(ok, ok).
43
+ `);
44
+ console.log(result.stdout);
202
45
  ```
203
46
 
204
- `materialize/2` is a declaration, not a logical rule to prove. It affects which predicates the CLI prints, not the meaning of the rules themselves.
205
-
206
- ## Writing programs
207
-
208
- A good eyelang program normally has three layers:
209
-
210
- 1. source facts;
211
- 2. helper predicates for calculation or search;
212
- 3. concise relation-style outputs, usually binary predicates such as `status(Case, Value)`, `reason(Case, Text)`, `ancestor(Person, Ancestor)`, or `cost(Path, Amount)`.
213
-
214
- Example:
215
-
216
- ```prolog
217
- score(case1, 95).
218
- threshold(90).
219
-
220
- accepted(Case) :-
221
- score(Case, Score),
222
- threshold(Threshold),
223
- ge(Score, Threshold).
224
-
225
- status(Case, accepted) :- accepted(Case).
226
- reason(Case, "score exceeds threshold") :- accepted(Case).
227
- ```
228
-
229
- When `status/2` and `reason/2` are derived, they appear in default output. If the program has many helper binary predicates, declare the intended output predicates:
230
-
231
- ```prolog
232
- materialize(status, 2).
233
- materialize(reason, 2).
234
- ```
235
-
236
- ### Naming
237
-
238
- Predicate names and atom constants use the same lexical form. Namespace-like names should be plain names such as `type`, `person_name`, or `odrl_permission`; colon names are not part of the language.
239
-
240
- ### Embedding remains general
241
-
242
- The CLI is output-oriented and uses `materialize/2` to decide what to print. Embedders can still use the JavaScript API and `Solver` directly for arbitrary goals and arities.
243
-
244
- Add `-s` or `--stats` when you want lightweight solver counters on stderr without changing stdout:
245
-
246
- ```sh
247
- bin/eyelang -s examples/sudoku.pl
248
- ```
249
-
250
- The playground has matching `--stats` and `--proof` checkboxes, so browser runs can show the same counters or explanations like the CLI.
251
-
252
-
253
- ### Builtins
254
-
255
- eyelang builtins are registered by name and arity in small modules under [`src/builtins`](src/builtins). This keeps the runtime portable to Node.js and the browser while giving each builtin family a clear boundary. Builtins are enabled by normal predicate calls.
256
-
257
- The core builtin families cover unification, arithmetic, comparison, dates, strings, lists, aggregation, formula terms, and search control. Additional reusable finite-search helpers are available for examples that would otherwise need large amounts of repetitive generate-and-test code. These helpers are deliberately general relations rather than shortcuts tied to a particular example name. For example:
258
-
259
- ```prolog
260
- solution(Name, Rows) :-
261
- puzzle(Name, Grid),
262
- sudoku(Grid, Rows).
263
-
264
- answer(Queens) :-
265
- n_queens(8, Queens).
266
-
267
- best(Cycle, Cost) :-
268
- cities(Cities),
269
- weighted_hamiltonian_cycle(edge, Cities, Cycle, Cost).
270
- ```
47
+ ## Documentation
271
48
 
272
- `sudoku/2` accepts either an 81-character string or a 9x9 list. Digits `1` to `9` are givens; `0`, `.`, and `_` mark blanks. It returns the solved 9x9 list.
49
+ - [Playground](https://eyereasoner.github.io/eyelang/playground)
50
+ - [Guide](docs/guide.md)
51
+ - [Language reference](docs/language-reference.md)
273
52
 
274
- The reusable search and numeric helpers include `atom_range/4`, `atom_ranges/4`, `n_queens/2`, Hamiltonian path/cycle helpers, `cnf_model/3`, Quine-McCluskey helpers, bounded subset/path helpers, number-theory helpers such as `extended_gcd/5`, matrix helpers such as `matrix_multiply/2`, and `alphametic_sum/5`. These helpers are extension builtins of this implementation; [`SPEC.md`](SPEC.md) defines the portable core and standard builtin profile.
53
+ For local browser use, serve the checkout first so the playground can load ES modules and example files:
275
54
 
276
- To add a builtin, create or extend a module with `register(registry)` and call `registry.add(name, arity, handler, options)`. The default registry is assembled in [`src/builtins/registry.js`](src/builtins/registry.js). Builtins that are only safe for specific argument modes should provide a `ready` predicate and `fallbackWhenNotReady: true`, so user-defined clauses remain visible until the builtin is applicable.
277
-
278
-
279
- ## Aggregation helpers
280
-
281
- eyelang includes goal-directed aggregation helpers for finite searches:
282
-
283
- ```prolog
284
- countall(Goal, Count).
285
- sumall(Value, Goal, Sum).
286
- aggregate_min(Key, Template, Goal, BestKey, BestTemplate).
287
- aggregate_max(Key, Template, Goal, BestKey, BestTemplate).
288
- ```
289
-
290
- Use `countall/2` for solution counts, `sumall/3` for numeric totals, and `aggregate_min/5` or `aggregate_max/5` when a search should keep only the best candidate instead of collecting and sorting every answer. The `Key` can be a number, atom constant, string, compound term, or list; normal term ordering is used, so compound keys such as `[Cost, Path]` are useful for deterministic tie-breaking.
291
-
292
- Example:
293
-
294
- ```prolog
295
- best_cycle(Cycle, Cost) :-
296
- cities(Cities),
297
- aggregate_min([Cost, Cycle], Cycle, candidate_cycle(Cities, Cycle, Cost), [Cost, Cycle], Cycle).
298
- ```
299
-
300
- ## Formula data
301
-
302
- Comma terms can be data as well as conjunctions. eyelang provides relation-oriented formula utilities.
303
-
304
- `formula_atom(Formula, Atom)` enumerates atomic formula terms inside a comma formula:
305
-
306
- ```prolog
307
- formula_atom((name(alice, "Alice"), knows(alice, bob)), X).
308
- ```
309
-
310
- `formula_binary(Formula, S, P, O)` enumerates binary terms and exposes their functor as an atom constant:
311
-
312
- ```prolog
313
- formula_binary((name(alice, "Alice"), knows(alice, bob)), S, P, O).
314
- ```
315
-
316
- This can yield `S = alice`, `P = name`, `O = "Alice"` and `S = alice`, `P = knows`, `O = bob`. The utility is useful for quoted formula data, but it does not make those formula members true in the ambient program.
317
-
318
-
319
- ## RDF 1.2 and Notation3 compatibility
320
-
321
- The core eyelang syntax remains Prolog-like, but `src/rdf.js` adds a compatibility layer for RDF 1.2 Turtle/N-Triples style data and a practical Notation3 rule subset. Use it from the CLI with `--rdf`, `--rdf12`, `--n3`, or `--input-format FORMAT`; file inputs ending in `.ttl`, `.nt`, or `.n3` are recognized when the CLI uses its default `auto` format.
322
-
323
- ```sh
324
- bin/eyelang --rdf data.ttl rules.n3
325
- printf '@prefix : <http://example.com/> .
326
- { ?x :parent ?y . } => { ?x :related ?y . } .
327
- :alice :parent :bob .
328
- ' | bin/eyelang --n3 -
329
- ```
330
-
331
- RDF triples are lowered to ordinary `rdf/3` goals:
332
-
333
- ```prolog
334
- rdf(Subject, Predicate, Object).
335
- ```
336
-
337
- RDF terms are explicit eyelang compound terms:
338
-
339
- ```prolog
340
- iri("http://example.com/alice")
341
- bnode("b0")
342
- literal("Alice", iri("http://www.w3.org/2001/XMLSchema#string"), "", "")
343
- triple(Subject, Predicate, Object)
344
- ```
345
-
346
- The layer supports `PREFIX`/`@prefix`, `BASE`/`@base`, `VERSION`/`@version`, IRIs, prefixed names, blank nodes, strings, numeric and boolean literals, language-tagged and RDF 1.2 directional language-tagged strings, RDF collections, blank-node property lists, RDF 1.2 triple terms `<<( ... )>>`, reified triple sugar `<< ... >>`, annotation blocks `{| ... |}`, N3 rules of the form `{ antecedent } => { consequent } .`, reverse rules of the form `{ consequent } <= { antecedent } .`, and N3 equality `=` as `owl:sameAs`. Reified triples and annotations are expanded through `rdf:reifies`, so this Turtle fragment:
347
-
348
- ```turtle
349
- VERSION "1.2"
350
- PREFIX : <http://example.com/>
351
- :alice :name "Alice" ~ :t {| :statedBy :bob |} .
352
- ```
353
-
354
- is made available as eyelang facts like:
355
-
356
- ```prolog
357
- rdf(iri("http://example.com/alice"), iri("http://example.com/name"), literal("Alice", iri("http://www.w3.org/2001/XMLSchema#string"), "", "")).
358
- rdf(iri("http://example.com/t"), iri("http://www.w3.org/1999/02/22-rdf-syntax-ns#reifies"), triple(iri("http://example.com/alice"), iri("http://example.com/name"), literal("Alice", iri("http://www.w3.org/2001/XMLSchema#string"), "", ""))).
359
- rdf(iri("http://example.com/t"), iri("http://example.com/statedBy"), iri("http://example.com/bob")).
360
- ```
361
-
362
- From JavaScript, use `parseRdfClauses(source, options)` when you want clause objects, or `rdfToEyelang(source, options)` when you want the lowered eyelang source text.
363
-
364
- N3 body triples whose predicates are in the common SWAP namespaces are lowered to eyelang built-ins instead of `rdf/3` goals. The practical bridge covers math comparisons and arithmetic such as `math:sum`, `math:difference`, `math:product`, `math:quotient`, `math:rounded`, and trigonometric functions, with exact BigInt-backed integer paths for large N3 arithmetic examples; string predicates such as `string:contains`, `string:startsWith`, `string:concatenation`, `string:length`, `string:replace`, and `string:scrape`; list predicates such as `list:member`, `list:append`, `list:first`, `list:rest`, `list:length`, `list:reverse`, and `list:sort`; `crypto:sha`, `crypto:md5`, `crypto:sha256`, `crypto:sha512`; simple `time:*` component extraction; and selected `log:*` helpers such as `log:equalTo`, `log:notEqualTo`, `log:uri`, `log:dtlit`, and `log:rawType`. This follows the builtin families used by eyeling while keeping eyelang's execution model small.
365
-
366
- RDF/N3 examples now live directly in [`examples/`](examples/), with golden outputs in [`examples/output/`](examples/output/), matching the existing example layout. They include eyeling-inspired `socrates.n3`, `family-cousins.n3`, and `annotation-rdf12.ttl` examples; focused RDF 1.2 triple-term and directional-language examples; `n3-builtins.n3`; and a larger `eyeling-*.n3` set adapted from the eyeling example directory. The added eyeling-style examples cover backward rules, recursive `<=`, equality, collection/list handling, Ackermann-style hyperoperations, Fibonacci numbers, dog-license, witch, Cat Koko, family/cousin, alignment, BMI, and SWAP math/string/list/crypto/time builtins. Run them with auto format detection or force the reader explicitly:
367
-
368
- ```sh
369
- bin/eyelang examples/socrates.n3
370
- bin/eyelang --rdf12 examples/annotation-rdf12.ttl
371
- bin/eyelang --n3 examples/n3-builtins.n3
372
- bin/eyelang --n3 examples/eyeling-backward-recursion.n3
373
- bin/eyelang --n3 examples/eyeling-ackermann.n3
374
- bin/eyelang --n3 examples/eyeling-fibonacci.n3
375
- ```
376
-
377
- This is a compatibility layer, not a validating W3C conformance parser. It intentionally covers the graph-oriented syntax, common RDF 1.2 constructs, and the N3 Horn-rule/builtin patterns that map cleanly to eyelang; it does not implement RDF/XML, full TriG datasets, SPARQL, scoped N3 formula built-ins such as full `log:semantics`, or every Notation3 construct.
378
-
379
- ## Example catalog
380
-
381
- The repository includes examples for recursion, graph reachability, finite search, arithmetic, list processing, optimization, policies, puzzles, N3-inspired rule chains, and applied scientific calculations. Bundled examples use relation-style output.
382
-
383
- | Input | Short description | Output |
384
- | --- | --- | --- |
385
- | [`access-control-policy.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/access-control-policy.pl) | Evaluates role and condition based access decisions. | [`output/access-control-policy.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/access-control-policy.pl) |
386
- | [`ackermann.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/ackermann.pl) | Computes Ackermann-style hyperoperation values. | [`output/ackermann.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/ackermann.pl) |
387
- | [`age.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/age.pl) | Checks whether people meet age thresholds. | [`output/age.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/age.pl) |
388
- | [`aliases-and-namespaces.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/aliases-and-namespaces.pl) | Shows ordinary predicate names for vocabulary aliases. | [`output/aliases-and-namespaces.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/aliases-and-namespaces.pl) |
389
- | [`alignment-demo.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/alignment-demo.pl) | Rolls dataset concepts up through a small alignment taxonomy. | [`output/alignment-demo.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/alignment-demo.pl) |
390
- | [`allen-interval-calculus.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/allen-interval-calculus.pl) | Classifies interval relations with integer time offsets. | [`output/allen-interval-calculus.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/allen-interval-calculus.pl) |
391
- | [`ancestor.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/ancestor.pl) | Derives ancestors from parent facts. | [`output/ancestor.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/ancestor.pl) |
392
- | [`animal.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/animal.pl) | Classifies animals from traits. | [`output/animal.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/animal.pl) |
393
- | [`annotation.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/annotation.pl) | Derives facts from quoted annotation data. | [`output/annotation.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/annotation.pl) |
394
- | [`annotation-rdf12.ttl`](https://github.com/eyereasoner/eyelang/blob/main/examples/annotation-rdf12.ttl) | Demonstrates RDF 1.2 annotation syntax lowered through `rdf:reifies`. | [`output/annotation-rdf12.ttl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/annotation-rdf12.ttl) |
395
- | [`auroracare.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/auroracare.pl) | Evaluates purpose-based medical data access scenarios. | [`output/auroracare.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/auroracare.pl) |
396
- | [`backward.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/backward.pl) | Shows a backward-rule pattern as a goal-directed numeric rule. | [`output/backward.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/backward.pl) |
397
- | [`basic-monadic.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/basic-monadic.pl) | Runs a monadic benchmark over generated inputs. | [`output/basic-monadic.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/basic-monadic.pl) |
398
- | [`bayes-diagnosis.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/bayes-diagnosis.pl) | Computes scaled Bayesian diagnosis posteriors. | [`output/bayes-diagnosis.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/bayes-diagnosis.pl) |
399
- | [`bayes-therapy.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/bayes-therapy.pl) | Ranks therapies using Bayesian disease likelihoods. | [`output/bayes-therapy.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/bayes-therapy.pl) |
400
- | [`beam-deflection.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/beam-deflection.pl) | Computes cantilever beam deflection. | [`output/beam-deflection.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/beam-deflection.pl) |
401
- | [`blocks-world-planning.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/blocks-world-planning.pl) | Searches a finite blocks-world plan. | [`output/blocks-world-planning.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/blocks-world-planning.pl) |
402
- | [`bmi.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/bmi.pl) | Normalizes BMI inputs and classifies weight. | [`output/bmi.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/bmi.pl) |
403
- | [`braking-safety-worlds.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/braking-safety-worlds.pl) | Classifies braking safety under alternative worlds. | [`output/braking-safety-worlds.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/braking-safety-worlds.pl) |
404
- | [`buck-converter-design.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/buck-converter-design.pl) | Checks buck-converter ripple design. | [`output/buck-converter-design.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/buck-converter-design.pl) |
405
- | [`cache-performance.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/cache-performance.pl) | Summarizes cache latency performance. | [`output/cache-performance.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/cache-performance.pl) |
406
- | [`canary-release.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/canary-release.pl) | Decides canary rollout or rollback. | [`output/canary-release.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/canary-release.pl) |
407
- | [`cat-koko.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/cat-koko.pl) | Demonstrates named existential witnesses from a Cat Koko rule pattern. | [`output/cat-koko.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/cat-koko.pl) |
408
- | [`clinical-trial-screening.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/clinical-trial-screening.pl) | Screens candidates for a trial. | [`output/clinical-trial-screening.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/clinical-trial-screening.pl) |
409
- | [`collatz-1000.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/collatz-1000.pl) | Computes shared Collatz trajectories. | [`output/collatz-1000.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/collatz-1000.pl) |
410
- | [`combinatorics-findall-sort.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/combinatorics-findall-sort.pl) | Collects and sorts finite combinations. | [`output/combinatorics-findall-sort.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/combinatorics-findall-sort.pl) |
411
- | [`competitive-enzyme-kinetics.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/competitive-enzyme-kinetics.pl) | Computes inhibited enzyme reaction rates. | [`output/competitive-enzyme-kinetics.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/competitive-enzyme-kinetics.pl) |
412
- | [`complex-matrix-stability.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/complex-matrix-stability.pl) | Checks stability of a 2x2 system. | [`output/complex-matrix-stability.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/complex-matrix-stability.pl) |
413
- | [`complex.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/complex.pl) | Performs arithmetic on complex pairs. | [`output/complex.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/complex.pl) |
414
- | [`composition-of-injective-functions-is-injective.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/composition-of-injective-functions-is-injective.pl) | Encodes composition and injectivity of finite functions. | [`output/composition-of-injective-functions-is-injective.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/composition-of-injective-functions-is-injective.pl) |
415
- | [`context-association.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/context-association.pl) | Associates named contexts with their contents. | [`output/context-association.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/context-association.pl) |
416
- | [`control-system.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/control-system.pl) | Evaluates control-system measurements and targets. | [`output/control-system.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/control-system.pl) |
417
- | [`cryptarithmetic-send-more-money.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/cryptarithmetic-send-more-money.pl) | Solves SEND+MORE and related puzzles. | [`output/cryptarithmetic-send-more-money.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/cryptarithmetic-send-more-money.pl) |
418
- | [`cyclic-path.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/cyclic-path.pl) | Computes paths in a cyclic graph. | [`output/cyclic-path.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/cyclic-path.pl) |
419
- | [`d3-group.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/d3-group.pl) | Enumerates subgroups of the D3 group. | [`output/d3-group.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/d3-group.pl) |
420
- | [`dairy-energy-balance.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/dairy-energy-balance.pl) | Classifies dairy cow energy balance. | [`output/dairy-energy-balance.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/dairy-energy-balance.pl) |
421
- | [`data-negotiation.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/data-negotiation.pl) | Chooses an accepted data-negotiation offer. | [`output/data-negotiation.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/data-negotiation.pl) |
422
- | [`deep-taxonomy-10.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/deep-taxonomy-10.pl) | Stress-tests recursive taxonomy depth 10. | [`output/deep-taxonomy-10.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/deep-taxonomy-10.pl) |
423
- | [`deep-taxonomy-100.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/deep-taxonomy-100.pl) | Stress-tests recursive taxonomy depth 100. | [`output/deep-taxonomy-100.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/deep-taxonomy-100.pl) |
424
- | [`deep-taxonomy-1000.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/deep-taxonomy-1000.pl) | Stress-tests recursive taxonomy depth 1000. | [`output/deep-taxonomy-1000.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/deep-taxonomy-1000.pl) |
425
- | [`deep-taxonomy-10000.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/deep-taxonomy-10000.pl) | Stress-tests recursive taxonomy depth 10000. | [`output/deep-taxonomy-10000.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/deep-taxonomy-10000.pl) |
426
- | [`deep-taxonomy-100000.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/deep-taxonomy-100000.pl) | Stress-tests recursive taxonomy depth 100000. | [`output/deep-taxonomy-100000.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/deep-taxonomy-100000.pl) |
427
- | [`delfour.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/delfour.pl) | Derives shopping and authorization recommendations. | [`output/delfour.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/delfour.pl) |
428
- | [`dense-hamiltonian-cycle.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/dense-hamiltonian-cycle.pl) | Searches a dense Hamiltonian cycle with aggregate minimization. | [`output/dense-hamiltonian-cycle.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/dense-hamiltonian-cycle.pl) |
429
- | [`deontic-logic.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/deontic-logic.pl) | Reports obligations, prohibitions, and violations. | [`output/deontic-logic.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/deontic-logic.pl) |
430
- | [`derived-backward-rule.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/derived-backward-rule.pl) | Derives an inverse-property backward rule from rule data. | [`output/derived-backward-rule.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/derived-backward-rule.pl) |
431
- | [`derived-rule.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/derived-rule.pl) | Derives conclusions from rule data. | [`output/derived-rule.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/derived-rule.pl) |
432
- | [`diamond-property.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/diamond-property.pl) | Checks the diamond property of a relation. | [`output/diamond-property.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/diamond-property.pl) |
433
- | [`dijkstra-findall-sort.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/dijkstra-findall-sort.pl) | Finds shortest paths using collected candidates. | [`output/dijkstra-findall-sort.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/dijkstra-findall-sort.pl) |
434
- | [`dijkstra-risk-path.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/dijkstra-risk-path.pl) | Ranks routes by cost and trust. | [`output/dijkstra-risk-path.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/dijkstra-risk-path.pl) |
435
- | [`dijkstra.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/dijkstra.pl) | Enumerates weighted simple paths. | [`output/dijkstra.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/dijkstra.pl) |
436
- | [`dining-philosophers.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/dining-philosophers.pl) | Simulates Chandy-Misra fork exchanges. | [`output/dining-philosophers.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/dining-philosophers.pl) |
437
- | [`dog.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/dog.pl) | Counts dogs and derives when a license is required. | [`output/dog.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/dog.pl) |
438
- | [`drone-corridor-planner.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/drone-corridor-planner.pl) | Plans bounded drone corridor routes. | [`output/drone-corridor-planner.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/drone-corridor-planner.pl) |
439
- | [`easter-computus.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/easter-computus.pl) | Computes Gregorian Easter dates. | [`output/easter-computus.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/easter-computus.pl) |
440
- | [`electrical-rc-filter.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/electrical-rc-filter.pl) | Sizes an RC low-pass filter. | [`output/electrical-rc-filter.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/electrical-rc-filter.pl) |
441
- | [`epidemic-policy.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/epidemic-policy.pl) | Chooses policies from risk and social cost. | [`output/epidemic-policy.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/epidemic-policy.pl) |
442
- | [`equivalence-classes-overlap-implies-same-class.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/equivalence-classes-overlap-implies-same-class.pl) | Packages the shared-member proof pattern for equivalence classes. | [`output/equivalence-classes-overlap-implies-same-class.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/equivalence-classes-overlap-implies-same-class.pl) |
443
- | [`eulerian-path.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/eulerian-path.pl) | Finds an Eulerian path using each edge once. | [`output/eulerian-path.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/eulerian-path.pl) |
444
- | [`ev-range-worlds.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/ev-range-worlds.pl) | Estimates electric-vehicle trip feasibility. | [`output/ev-range-worlds.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/ev-range-worlds.pl) |
445
- | [`exact-cover-sudoku.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/exact-cover-sudoku.pl) | Solves Sudoku via exact-cover-style constraints. | [`output/exact-cover-sudoku.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/exact-cover-sudoku.pl) |
446
- | [`existential-rule.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/existential-rule.pl) | Represents existential witnesses with explicit Skolem-style terms. | [`output/existential-rule.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/existential-rule.pl) |
447
- | [`exoplanet-validation-worlds.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/exoplanet-validation-worlds.pl) | Validates exoplanet candidates across worlds. | [`output/exoplanet-validation-worlds.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/exoplanet-validation-worlds.pl) |
448
- | [`expression-eval.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/expression-eval.pl) | Evaluates a small arithmetic expression tree. | [`output/expression-eval.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/expression-eval.pl) |
449
- | [`family-cousins.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/family-cousins.pl) | Derives cousin and family labels. | [`output/family-cousins.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/family-cousins.pl) |
450
- | [`fastpow.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/fastpow.pl) | Computes powers by repeated squaring. | [`output/fastpow.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/fastpow.pl) |
451
- | [`fft8-numeric.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/fft8-numeric.pl) | Runs an 8-point FFT over complex pairs. | [`output/fft8-numeric.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/fft8-numeric.pl) |
452
- | [`fibonacci.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/fibonacci.pl) | Computes large Fibonacci numbers by fast doubling. | [`output/fibonacci.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/fibonacci.pl) |
453
- | [`field-nitrogen-balance.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/field-nitrogen-balance.pl) | Classifies field nitrogen balance. | [`output/field-nitrogen-balance.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/field-nitrogen-balance.pl) |
454
- | [`floating-point.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/floating-point.pl) | Exercises floating-point arithmetic and comparisons. | [`output/floating-point.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/floating-point.pl) |
455
- | [`flandor.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/flandor.pl) | Derives a Flanders macro-insight authorization and retooling package. | [`output/flandor.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/flandor.pl) |
456
- | [`four-color-map.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/four-color-map.pl) | Checks a four-colour map assignment. | [`output/four-color-map.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/four-color-map.pl) |
457
- | [`fundamental-theorem-arithmetic.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/fundamental-theorem-arithmetic.pl) | Factors integers and reconstructs products. | [`output/fundamental-theorem-arithmetic.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/fundamental-theorem-arithmetic.pl) |
458
- | [`gcd-bezout-identity.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/gcd-bezout-identity.pl) | Computes gcd and Bézout coefficients. | [`output/gcd-bezout-identity.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/gcd-bezout-identity.pl) |
459
- | [`gd-step-certified.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/gd-step-certified.pl) | Certifies a gradient-descent step. | [`output/gd-step-certified.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/gd-step-certified.pl) |
460
- | [`gdpr-compliance.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/gdpr-compliance.pl) | Checks GDPR-style processing compliance. | [`output/gdpr-compliance.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/gdpr-compliance.pl) |
461
- | [`goldbach-1000.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/goldbach-1000.pl) | Finds Goldbach prime pairs up to 1000. | [`output/goldbach-1000.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/goldbach-1000.pl) |
462
- | [`good-cobbler.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/good-cobbler.pl) | Demonstrates term-level structure with a good-cobbler statement. | [`output/good-cobbler.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/good-cobbler.pl) |
463
- | [`gps.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/gps.pl) | Finds and verifies route paths. | [`output/gps.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/gps.pl) |
464
- | [`graph-reachability.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/graph-reachability.pl) | Derives reachable nodes in a graph. | [`output/graph-reachability.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/graph-reachability.pl) |
465
- | [`gray-code-counter.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/gray-code-counter.pl) | Generates Gray-code counter states. | [`output/gray-code-counter.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/gray-code-counter.pl) |
466
- | [`greatest-lower-bound-uniqueness.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/greatest-lower-bound-uniqueness.pl) | Shows uniqueness of greatest lower bounds in a finite order instance. | [`output/greatest-lower-bound-uniqueness.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/greatest-lower-bound-uniqueness.pl) |
467
- | [`group-inverse-uniqueness.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/group-inverse-uniqueness.pl) | Shows uniqueness of inverses in a finite group instance. | [`output/group-inverse-uniqueness.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/group-inverse-uniqueness.pl) |
468
- | [`hamiltonian-cycle.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/hamiltonian-cycle.pl) | Finds a Hamiltonian cycle. | [`output/hamiltonian-cycle.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/hamiltonian-cycle.pl) |
469
- | [`hamiltonian-path.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/hamiltonian-path.pl) | Finds a Hamiltonian path. | [`output/hamiltonian-path.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/hamiltonian-path.pl) |
470
- | [`hamming-code.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/hamming-code.pl) | Corrects a single-bit Hamming word. | [`output/hamming-code.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/hamming-code.pl) |
471
- | [`hanoi.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/hanoi.pl) | Derives the Towers of Hanoi moves. | [`output/hanoi.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/hanoi.pl) |
472
- | [`heat-loss.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/heat-loss.pl) | Computes conductive heat loss. | [`output/heat-loss.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/heat-loss.pl) |
473
- | [`heron-theorem.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/heron-theorem.pl) | Computes triangle area by Heron's theorem. | [`output/heron-theorem.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/heron-theorem.pl) |
474
- | [`ideal-gas-law.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/ideal-gas-law.pl) | Applies the ideal gas law. | [`output/ideal-gas-law.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/ideal-gas-law.pl) |
475
- | [`illegitimate-reasoning.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/illegitimate-reasoning.pl) | Detects suspect reasoning patterns. | [`output/illegitimate-reasoning.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/illegitimate-reasoning.pl) |
476
- | [`kaprekar.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/kaprekar.pl) | Iterates toward Kaprekar's constant. | [`output/kaprekar.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/kaprekar.pl) |
477
- | [`law-of-cosines.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/law-of-cosines.pl) | Computes a triangle side by cosine law. | [`output/law-of-cosines.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/law-of-cosines.pl) |
478
- | [`least-squares-regression.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/least-squares-regression.pl) | Fits a least-squares regression line. | [`output/least-squares-regression.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/least-squares-regression.pl) |
479
- | [`list-collection.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/list-collection.pl) | Demonstrates list and collection built-ins. | [`output/list-collection.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/list-collection.pl) |
480
- | [`lldm.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/lldm.pl) | Calculates leg-length discrepancy measurements. | [`output/lldm.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/lldm.pl) |
481
- | [`manufacturing-quality-control.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/manufacturing-quality-control.pl) | Evaluates process capability and quality. | [`output/manufacturing-quality-control.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/manufacturing-quality-control.pl) |
482
- | [`matrix.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/matrix.pl) | Runs matrix operations over sample inputs. | [`output/matrix.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/matrix.pl) |
483
- | [`microgrid-dispatch.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/microgrid-dispatch.pl) | Plans microgrid dispatch and reserve. | [`output/microgrid-dispatch.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/microgrid-dispatch.pl) |
484
- | [`monkey-bananas.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/monkey-bananas.pl) | Solves the monkey-and-bananas puzzle. | [`output/monkey-bananas.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/monkey-bananas.pl) |
485
- | [`n-queens.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/n-queens.pl) | Searches for N-queens placements. | [`output/n-queens.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/n-queens.pl) |
486
- | [`network-sla.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/network-sla.pl) | Checks network path SLA compliance. | [`output/network-sla.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/network-sla.pl) |
487
- | [`newton-raphson.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/newton-raphson.pl) | Finds roots by Newton-Raphson iteration. | [`output/newton-raphson.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/newton-raphson.pl) |
488
- | [`nixon-diamond.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/nixon-diamond.pl) | Reports the classic Nixon-diamond conflict. | [`output/nixon-diamond.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/nixon-diamond.pl) |
489
- | [`odrl-dpv-healthcare-risk-ranked.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/odrl-dpv-healthcare-risk-ranked.pl) | Ranks healthcare policy risks and mitigations. | [`output/odrl-dpv-healthcare-risk-ranked.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/odrl-dpv-healthcare-risk-ranked.pl) |
490
- | [`odrl-dpv-risk-ranked.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/odrl-dpv-risk-ranked.pl) | Ranks data-policy risks and mitigations. | [`output/odrl-dpv-risk-ranked.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/odrl-dpv-risk-ranked.pl) |
491
- | [`orbital-transfer-design.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/orbital-transfer-design.pl) | Designs a Hohmann orbital transfer. | [`output/orbital-transfer-design.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/orbital-transfer-design.pl) |
492
- | [`path-discovery.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/path-discovery.pl) | Discovers bounded air-route paths. | [`output/path-discovery.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/path-discovery.pl) |
493
- | [`peano-arithmetic.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/peano-arithmetic.pl) | Computes Peano addition, multiplication, and factorial. | [`output/peano-arithmetic.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/peano-arithmetic.pl) |
494
- | [`peasant.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/peasant.pl) | Performs peasant multiplication and exponentiation. | [`output/peasant.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/peasant.pl) |
495
- | [`pendulum-period.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/pendulum-period.pl) | Computes simple pendulum periods. | [`output/pendulum-period.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/pendulum-period.pl) |
496
- | [`polynomial.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/polynomial.pl) | Finds complex integer polynomial roots. | [`output/polynomial.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/polynomial.pl) |
497
- | [`project-portfolio-optimization.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/project-portfolio-optimization.pl) | Optimizes a constrained project portfolio with pruning and aggregate builtins. | [`output/project-portfolio-optimization.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/project-portfolio-optimization.pl) |
498
- | [`proof-contrapositive.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/proof-contrapositive.pl) | Models proof by contrapositive. | [`output/proof-contrapositive.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/proof-contrapositive.pl) |
499
- | [`quadratic-formula.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/quadratic-formula.pl) | Solves sample quadratic equations. | [`output/quadratic-formula.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/quadratic-formula.pl) |
500
- | [`quine-mccluskey.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/quine-mccluskey.pl) | Minimizes Boolean terms with Quine-McCluskey. | [`output/quine-mccluskey.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/quine-mccluskey.pl) |
501
- | [`radioactive-decay.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/radioactive-decay.pl) | Computes radioactive decay over time. | [`output/radioactive-decay.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/radioactive-decay.pl) |
502
- | [`resilient-city-orchestration.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/resilient-city-orchestration.pl) | Orchestrates storm-response missions from signals, policy, routes, teams, and portfolio optimization. | [`output/resilient-city-orchestration.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/resilient-city-orchestration.pl) |
503
- | [`riemann-hypothesis.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/riemann-hypothesis.pl) | Checks a finite catalogue of non-trivial zeta zeros against the Riemann-hypothesis condition. | [`output/riemann-hypothesis.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/riemann-hypothesis.pl) |
504
- | [`sat-dpll.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/sat-dpll.pl) | Solves a finite SAT instance. | [`output/sat-dpll.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/sat-dpll.pl) |
505
- | [`security-incident-correlation.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/security-incident-correlation.pl) | Correlates security incidents across signals. | [`output/security-incident-correlation.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/security-incident-correlation.pl) |
506
- | [`service-impact.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/service-impact.pl) | Analyzes service impact over cyclic dependencies. | [`output/service-impact.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/service-impact.pl) |
507
- | [`sieve.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/sieve.pl) | Enumerates primes with a sieve-style program. | [`output/sieve.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/sieve.pl) |
508
- | [`skolem-functions.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/skolem-functions.pl) | Generates deterministic functional terms. | [`output/skolem-functions.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/skolem-functions.pl) |
509
- | [`socket-age.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/socket-age.pl) | Shows socket-declared age reasoning inputs and plugs. | [`output/socket-age.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/socket-age.pl) |
510
- | [`socket-family.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/socket-family.pl) | Shows socket-declared family-source inputs and ancestry rules. | [`output/socket-family.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/socket-family.pl) |
511
- | [`socrates.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/socrates.pl) | Derives that Socrates is mortal. | [`output/socrates.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/socrates.pl) |
512
- | [`statistics-summary.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/statistics-summary.pl) | Computes population statistics for a sample. | [`output/statistics-summary.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/statistics-summary.pl) |
513
- | [`sudoku.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/sudoku.pl) | Solves generic 9x9 Sudoku strings through the sudoku/2 builtin. | [`output/sudoku.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/sudoku.pl) |
514
- | [`superdense-coding.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/superdense-coding.pl) | Models superdense-coding bit transmission. | [`output/superdense-coding.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/superdense-coding.pl) |
515
- | [`traveling-salesman.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/traveling-salesman.pl) | Finds an optimal traveling-salesman tour. | [`output/traveling-salesman.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/traveling-salesman.pl) |
516
- | [`turing.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/turing.pl) | Simulates a binary-increment Turing machine. | [`output/turing.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/turing.pl) |
517
- | [`vector-similarity.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/vector-similarity.pl) | Computes dot product, norm, and cosine similarity. | [`output/vector-similarity.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/vector-similarity.pl) |
518
- | [`witch.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/witch.pl) | Derives the classic “burn the witch” N3 rule chain. | [`output/witch.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/witch.pl) |
519
- | [`wolf-goat-cabbage.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/wolf-goat-cabbage.pl) | Solves the wolf-goat-cabbage river crossing. | [`output/wolf-goat-cabbage.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/wolf-goat-cabbage.pl) |
520
- | [`zebra.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/zebra.pl) | Solves the zebra logic puzzle. | [`output/zebra.pl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/zebra.pl) |
521
-
522
-
523
- | [`directional-language.ttl`](https://github.com/eyereasoner/eyelang/blob/main/examples/directional-language.ttl) | Demonstrates RDF 1.2 directional language-tagged strings. | [`output/directional-language.ttl`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/directional-language.ttl) |
524
- | [`n3-builtins.n3`](https://github.com/eyereasoner/eyelang/blob/main/examples/n3-builtins.n3) | Uses N3 `<=` plus `math:`, `string:`, and `list:` builtins. | [`output/n3-builtins.n3`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/n3-builtins.n3) |
525
- | [`triple-term.n3`](https://github.com/eyereasoner/eyelang/blob/main/examples/triple-term.n3) | Demonstrates RDF 1.2 triple terms in N3 data and rules. | [`output/triple-term.n3`](https://github.com/eyereasoner/eyelang/blob/main/examples/output/triple-term.n3) |
526
-
527
- ## Golden outputs, tests, and conformance
528
-
529
- Golden answer outputs live in [`examples/output`](examples/output). `npm run test:examples` covers every top-level runnable example with extension `.pl`, `.n3`, `.ttl`, or `.nt`. A curated proof-output suite for `.pl` examples lives in [`examples/proof`](examples/proof). Example tests pin `local_time/1` to `2026-05-30` so date-dependent examples stay deterministic. Regenerate them after an intentional output or explanation change:
530
-
531
- ```sh
532
- for f in examples/*.pl examples/*.n3 examples/*.ttl examples/*.nt; do
533
- [ -e "$f" ] || continue
534
- b=$(basename "$f")
535
- EYELANG_LOCAL_TIME=2026-05-30 bin/eyelang "$f" > "examples/output/$b"
536
- done
537
-
538
- for f in examples/proof/*.pl; do
539
- b=$(basename "$f")
540
- EYELANG_LOCAL_TIME=2026-05-30 bin/eyelang --proof "examples/$b" > "examples/proof/$b"
541
- done
55
+ ```bash
56
+ python3 -m http.server
57
+ # then open http://localhost:8000/playground.html
542
58
  ```
543
59
 
544
- Run the full test suite:
60
+ ## Tests
545
61
 
546
- ```sh
62
+ ```bash
547
63
  npm test
548
- ```
549
-
550
- The test suite runs in this order: Conformance, Regression/API/White-box, Examples. Each section prints its own subtotal, followed by a suite-specific grand total. The suite checks the conformance cases derived from `SPEC.md`, supplemental regression/API/white-box checks, and every runnable example against its golden output.
551
-
552
- Run only one suite when you are iterating:
553
-
554
- ```sh
555
64
  npm run test:conformance
556
- npm run test:regression
557
65
  npm run test:examples
66
+ npm run test:regression
558
67
  ```
559
68
 
560
- The conformance suite lives in [`conformance/`](conformance/) and is split into `core` and `extension` profiles matching `SPEC.md`. Each case is a small program with an exact expected stdout file, and some internal conformance cases also include a goal file for testing the embeddable solver, so other implementations can reuse the same cases. The regression suite lives in [`test/run-regression.js`](test/run-regression.js) and covers CLI regressions, the public JavaScript API, and white-box invariants for parser, unification, and indexing behavior.
561
-
562
- ## Development and release
563
-
564
- Common commands:
565
-
566
- ```sh
567
- npm test # conformance, regression/API/white-box, and examples
568
- npm run test:conformance # only the conformance suite
569
- npm run test:regression # CLI regression, API, and white-box checks
570
- npm run test:examples # every example against examples/output
571
- node bin/eyelang --help
572
- ```
573
-
574
- Useful profiling smoke test:
575
-
576
- ```sh
577
- bin/eyelang -s examples/sudoku.pl > /dev/null
578
- ```
579
-
580
- For a release:
581
-
582
- 1. update `VERSION`;
583
- 2. update `README.md` and `SPEC.md`;
584
- 3. regenerate golden outputs if behavior changed;
585
- 4. run `npm test`;
586
- 5. publish the repository with `playground.html` and `playground-worker.mjs` if publishing the playground. The playground includes controls equivalent to CLI `--stats` and `--proof`.
587
-
588
- ## Relationship to Eyeling
589
-
590
- [Eyeling](https://github.com/eyereasoner/eyeling) and eyelang share the same goal of small, inspectable rule-based reasoning in JavaScript, but they make different language and implementation trade-offs.
591
-
592
- Eyeling is the RDF/Notation3 member of the family. It reads N3-style triples, quoted formulas, forward rules written with `=>`, backward rules written with `<=`, RDF terms, RDF-JS data, and RDF-oriented streams. That makes it the better fit when data interchange with RDF/N3 tools is the main requirement.
593
-
594
- eyelang is the compact Prolog-style member of the family. It uses ordinary predicate syntax such as `parent(alice, bob).` and `ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z).` This keeps the core syntax close to the ISO-standardized Prolog tradition while deliberately staying much smaller than ISO Prolog. It is a good fit when the problem is naturally relational, goal-directed, finite, and does not need RDF graph interchange.
595
-
596
- A useful rule of thumb:
597
-
598
- | Use case | Prefer | Why |
599
- | --- | --- | --- |
600
- | RDF/N3 data, triples, prefixes, graph terms, RDF-JS, RDF message streams | Eyeling | The surface language and APIs are RDF/Notation3-native. |
601
- | Compact relational rules over ordinary terms, lists, arithmetic, and finite search | eyelang | The syntax is shorter for non-RDF relation programs and output is ordinary facts. |
602
- | Human-auditable derivations | Either | Both can emit proof explanations when requested. |
603
- | Large generated Horn-clause workloads | eyelang | The engine specializes in predicate/arity indexing, scalar argument indexes, fast fact paths, and materialized output goals. |
604
-
605
- For the deep taxonomy benchmark, eyelang is substantially faster in current local checks. On one sandbox run, `node bin/eyelang examples/deep-taxonomy-100000.pl > /dev/null` took about `1.60 sec`, while `eyeling` package version `1.28.7` on `examples/deep-taxonomy-100000.n3` took about `4.56 sec` without proof and about `5.04 sec` with proof. Treat those numbers as a smoke comparison rather than a formal benchmark: hardware, Node.js version, package version, and CLI startup all matter.
606
-
607
- The projects are therefore complementary rather than replacements for each other: Eyeling optimizes for Semantic Web interoperability and N3 expressiveness; eyelang optimizes for a small standard-looking relational rule language and fast finite goal-directed execution.
608
-
609
- ## Performance notes
610
-
611
- Use `-s` or `--stats` for a quick sanity check while optimizing solver changes. It prints counters such as `solve_goals_calls`, `unify_calls`, `deterministic_rule_expansions`, `candidate_lists_selected`, `clause_candidates_considered`, `clauses_tried`, `max_depth`, and `max_solver_call_depth` to stderr, leaving normal output stable for golden-file tests. The `max_solver_call_depth` counter is especially useful for browser regressions, where the VM call stack can be tighter than a command-line run.
612
-
613
- eyelang hashes predicate groups by name and arity, then indexes clauses by scalar argument values. It also builds two-argument composite indexes for scalar pairs and probes those composite indexes without per-lookup heap allocation. This helps both large generated programs with many predicates and selective queries such as:
614
-
615
- ```prolog
616
- edge(g1, a, X).
617
- path(a, Y).
618
- status(Case, accepted).
619
- ```
620
-
621
- Ground facts use a fast path that avoids freshening and copying a rule body. Recursive-predicate detection uses an explicit work stack, which keeps large predicate chains safer in the browser. Recursive examples use an active-call variant guard to prevent common cyclic closures from looping. Selected predicates can be memoized with:
622
-
623
- ```prolog
624
- memoize(path, 2).
625
- ```
626
-
627
- For large programs, keep helper predicates selective, bind arguments early, and declare focused output predicates with `materialize/2` when default output would otherwise solve broad helper goals.
628
-
629
- ## Implementation limits
630
-
631
- eyelang is intentionally smaller than ISO Prolog. It has no operators, cut, modules, dynamic database updates, DCGs, or complete ISO library. Negation is negation-as-failure through `not/1`. Search is goal-directed and expected to be finite for the selected output goals. Output explanations are non-normative proof printouts and do not change answer semantics. The RDF 1.2 / Notation3 reader is an implementation compatibility layer over `rdf/3`, not a normative RDF conformance profile.