eyeling 1.32.1 → 1.33.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 (626) hide show
  1. package/README.md +86 -15
  2. package/bin/eyeling.cjs +56 -4
  3. package/dist/browser/eyeling.browser.js +1 -0
  4. package/examples/eyelang/INTEGRATION.md +13 -0
  5. package/examples/eyelang/README.md +628 -0
  6. package/examples/eyelang/SPEC.md +684 -0
  7. package/examples/eyelang/access-control-policy.pl +52 -0
  8. package/examples/eyelang/ackermann.pl +46 -0
  9. package/examples/eyelang/age.pl +28 -0
  10. package/examples/eyelang/aliases-and-namespaces.pl +22 -0
  11. package/examples/eyelang/alignment-demo.pl +44 -0
  12. package/examples/eyelang/allen-interval-calculus.pl +64 -0
  13. package/examples/eyelang/ancestor.pl +21 -0
  14. package/examples/eyelang/animal.pl +21 -0
  15. package/examples/eyelang/annotation-rdf12.ttl +12 -0
  16. package/examples/eyelang/annotation.pl +34 -0
  17. package/examples/eyelang/auroracare.pl +309 -0
  18. package/examples/eyelang/backward.pl +12 -0
  19. package/examples/eyelang/basic-monadic.pl +10018 -0
  20. package/examples/eyelang/bayes-diagnosis.pl +108 -0
  21. package/examples/eyelang/bayes-therapy.pl +182 -0
  22. package/examples/eyelang/beam-deflection.pl +50 -0
  23. package/examples/eyelang/blocks-world-planning.pl +75 -0
  24. package/examples/eyelang/bmi.pl +232 -0
  25. package/examples/eyelang/braking-safety-worlds.pl +69 -0
  26. package/examples/eyelang/buck-converter-design.pl +78 -0
  27. package/examples/eyelang/cache-performance.pl +54 -0
  28. package/examples/eyelang/canary-release.pl +49 -0
  29. package/examples/eyelang/cat-koko.pl +24 -0
  30. package/examples/eyelang/clinical-trial-screening.pl +92 -0
  31. package/examples/eyelang/collatz-1000.pl +14 -0
  32. package/examples/eyelang/combinatorics-findall-sort.pl +37 -0
  33. package/examples/eyelang/competitive-enzyme-kinetics.pl +78 -0
  34. package/examples/eyelang/complex-matrix-stability.pl +45 -0
  35. package/examples/eyelang/complex.pl +121 -0
  36. package/examples/eyelang/composition-of-injective-functions-is-injective.pl +50 -0
  37. package/examples/eyelang/context-association.pl +53 -0
  38. package/examples/eyelang/control-system.pl +72 -0
  39. package/examples/eyelang/cryptarithmetic-send-more-money.pl +49 -0
  40. package/examples/eyelang/cyclic-path.pl +16 -0
  41. package/examples/eyelang/d3-group.pl +100 -0
  42. package/examples/eyelang/dairy-energy-balance.pl +65 -0
  43. package/examples/eyelang/data-negotiation.pl +39 -0
  44. package/examples/eyelang/deep-taxonomy-10.pl +115 -0
  45. package/examples/eyelang/deep-taxonomy-100.pl +385 -0
  46. package/examples/eyelang/deep-taxonomy-1000.pl +3085 -0
  47. package/examples/eyelang/deep-taxonomy-10000.pl +30094 -0
  48. package/examples/eyelang/deep-taxonomy-100000.pl +300184 -0
  49. package/examples/eyelang/delfour.pl +281 -0
  50. package/examples/eyelang/dense-hamiltonian-cycle.pl +92 -0
  51. package/examples/eyelang/deontic-logic.pl +52 -0
  52. package/examples/eyelang/derived-backward-rule.pl +30 -0
  53. package/examples/eyelang/derived-rule.pl +27 -0
  54. package/examples/eyelang/diamond-property.pl +38 -0
  55. package/examples/eyelang/dijkstra-findall-sort.pl +44 -0
  56. package/examples/eyelang/dijkstra-risk-path.pl +86 -0
  57. package/examples/eyelang/dijkstra.pl +46 -0
  58. package/examples/eyelang/dining-philosophers.pl +140 -0
  59. package/examples/eyelang/directional-language.ttl +9 -0
  60. package/examples/eyelang/dog.pl +25 -0
  61. package/examples/eyelang/drone-corridor-planner.pl +51 -0
  62. package/examples/eyelang/easter-computus.pl +89 -0
  63. package/examples/eyelang/electrical-rc-filter.pl +36 -0
  64. package/examples/eyelang/epidemic-policy.pl +67 -0
  65. package/examples/eyelang/equivalence-classes-overlap-implies-same-class.pl +27 -0
  66. package/examples/eyelang/eulerian-path.pl +85 -0
  67. package/examples/eyelang/ev-range-worlds.pl +82 -0
  68. package/examples/eyelang/exact-cover-sudoku.pl +113 -0
  69. package/examples/eyelang/existential-rule.pl +18 -0
  70. package/examples/eyelang/exoplanet-validation-worlds.pl +88 -0
  71. package/examples/eyelang/expression-eval.pl +43 -0
  72. package/examples/eyelang/eyeling-ackermann.n3 +41 -0
  73. package/examples/eyelang/eyeling-age-threshold.n3 +12 -0
  74. package/examples/eyelang/eyeling-alignment-demo.n3 +11 -0
  75. package/examples/eyelang/eyeling-allen-interval-calculus-small.n3 +13 -0
  76. package/examples/eyelang/eyeling-backward-recursion.n3 +11 -0
  77. package/examples/eyelang/eyeling-backward.n3 +10 -0
  78. package/examples/eyelang/eyeling-basic-monadic-small.n3 +11 -0
  79. package/examples/eyelang/eyeling-bmi.n3 +10 -0
  80. package/examples/eyelang/eyeling-cat-koko.n3 +15 -0
  81. package/examples/eyelang/eyeling-collatz-small.n3 +11 -0
  82. package/examples/eyelang/eyeling-collection.n3 +11 -0
  83. package/examples/eyelang/eyeling-complex-arithmetic.n3 +10 -0
  84. package/examples/eyelang/eyeling-context-association.n3 +11 -0
  85. package/examples/eyelang/eyeling-control-system-small.n3 +11 -0
  86. package/examples/eyelang/eyeling-crypto-builtins-extra.n3 +10 -0
  87. package/examples/eyelang/eyeling-crypto-builtins.n3 +8 -0
  88. package/examples/eyelang/eyeling-deep-taxonomy-10.n3 +18 -0
  89. package/examples/eyelang/eyeling-derived-backward-rule-flat.n3 +10 -0
  90. package/examples/eyelang/eyeling-derived-rule-flat.n3 +9 -0
  91. package/examples/eyelang/eyeling-digital-product-passport-small.n3 +11 -0
  92. package/examples/eyelang/eyeling-dijkstra-tiny.n3 +14 -0
  93. package/examples/eyelang/eyeling-dog-license.n3 +13 -0
  94. package/examples/eyelang/eyeling-drone-corridor-planner-small.n3 +13 -0
  95. package/examples/eyelang/eyeling-equals.n3 +8 -0
  96. package/examples/eyelang/eyeling-equivalence-classes.n3 +11 -0
  97. package/examples/eyelang/eyeling-euler-identity.n3 +9 -0
  98. package/examples/eyelang/eyeling-existential-rule.n3 +9 -0
  99. package/examples/eyelang/eyeling-expression-eval.n3 +11 -0
  100. package/examples/eyelang/eyeling-family-cousins-extended.n3 +12 -0
  101. package/examples/eyelang/eyeling-fastpow.n3 +10 -0
  102. package/examples/eyelang/eyeling-fibonacci.n3 +44 -0
  103. package/examples/eyelang/eyeling-french-cities-reachability.n3 +22 -0
  104. package/examples/eyelang/eyeling-goldbach-small.n3 +22 -0
  105. package/examples/eyelang/eyeling-good-cobbler.n3 +9 -0
  106. package/examples/eyelang/eyeling-list-builtins.n3 +10 -0
  107. package/examples/eyelang/eyeling-list-collection-extra.n3 +9 -0
  108. package/examples/eyelang/eyeling-math-builtins.n3 +9 -0
  109. package/examples/eyelang/eyeling-string-builtins-extra.n3 +9 -0
  110. package/examples/eyelang/eyeling-string-builtins.n3 +10 -0
  111. package/examples/eyelang/eyeling-time-builtins.n3 +11 -0
  112. package/examples/eyelang/eyeling-time-components-extra.n3 +10 -0
  113. package/examples/eyelang/eyeling-witch.n3 +10 -0
  114. package/examples/eyelang/family-cousins.n3 +17 -0
  115. package/examples/eyelang/family-cousins.pl +65 -0
  116. package/examples/eyelang/fastpow.pl +53 -0
  117. package/examples/eyelang/fft8-numeric.pl +83 -0
  118. package/examples/eyelang/fibonacci.pl +53 -0
  119. package/examples/eyelang/field-nitrogen-balance.pl +70 -0
  120. package/examples/eyelang/flandor.pl +296 -0
  121. package/examples/eyelang/floating-point.pl +23 -0
  122. package/examples/eyelang/four-color-map.pl +127 -0
  123. package/examples/eyelang/fundamental-theorem-arithmetic.pl +113 -0
  124. package/examples/eyelang/gcd-bezout-identity.pl +48 -0
  125. package/examples/eyelang/gd-step-certified.pl +158 -0
  126. package/examples/eyelang/gdpr-compliance.pl +69 -0
  127. package/examples/eyelang/goldbach-1000.pl +185 -0
  128. package/examples/eyelang/good-cobbler.pl +14 -0
  129. package/examples/eyelang/gps.pl +152 -0
  130. package/examples/eyelang/graph-reachability.pl +36 -0
  131. package/examples/eyelang/gray-code-counter.pl +48 -0
  132. package/examples/eyelang/greatest-lower-bound-uniqueness.pl +28 -0
  133. package/examples/eyelang/group-inverse-uniqueness.pl +34 -0
  134. package/examples/eyelang/hamiltonian-cycle.pl +55 -0
  135. package/examples/eyelang/hamiltonian-path.pl +49 -0
  136. package/examples/eyelang/hamming-code.pl +105 -0
  137. package/examples/eyelang/hanoi.pl +20 -0
  138. package/examples/eyelang/heat-loss.pl +51 -0
  139. package/examples/eyelang/heron-theorem.pl +36 -0
  140. package/examples/eyelang/ideal-gas-law.pl +37 -0
  141. package/examples/eyelang/illegitimate-reasoning.pl +88 -0
  142. package/examples/eyelang/kaprekar.pl +32 -0
  143. package/examples/eyelang/law-of-cosines.pl +31 -0
  144. package/examples/eyelang/least-squares-regression.pl +81 -0
  145. package/examples/eyelang/list-collection.pl +33 -0
  146. package/examples/eyelang/lldm.pl +78 -0
  147. package/examples/eyelang/manufacturing-quality-control.pl +73 -0
  148. package/examples/eyelang/matrix.pl +296 -0
  149. package/examples/eyelang/microgrid-dispatch.pl +85 -0
  150. package/examples/eyelang/monkey-bananas.pl +45 -0
  151. package/examples/eyelang/n-queens.pl +23 -0
  152. package/examples/eyelang/n3-builtins.n3 +28 -0
  153. package/examples/eyelang/network-sla.pl +48 -0
  154. package/examples/eyelang/newton-raphson.pl +49 -0
  155. package/examples/eyelang/nixon-diamond.pl +37 -0
  156. package/examples/eyelang/odrl-dpv-healthcare-risk-ranked.pl +266 -0
  157. package/examples/eyelang/odrl-dpv-risk-ranked.pl +320 -0
  158. package/examples/eyelang/orbital-transfer-design.pl +113 -0
  159. package/examples/eyelang/output/access-control-policy.pl +2 -0
  160. package/examples/eyelang/output/ackermann.pl +12 -0
  161. package/examples/eyelang/output/age.pl +2 -0
  162. package/examples/eyelang/output/aliases-and-namespaces.pl +5 -0
  163. package/examples/eyelang/output/alignment-demo.pl +32 -0
  164. package/examples/eyelang/output/allen-interval-calculus.pl +154 -0
  165. package/examples/eyelang/output/ancestor.pl +6 -0
  166. package/examples/eyelang/output/animal.pl +4 -0
  167. package/examples/eyelang/output/annotation-rdf12.ttl +1 -0
  168. package/examples/eyelang/output/annotation.pl +4 -0
  169. package/examples/eyelang/output/auroracare.pl +117 -0
  170. package/examples/eyelang/output/backward.pl +1 -0
  171. package/examples/eyelang/output/basic-monadic.pl +1518 -0
  172. package/examples/eyelang/output/bayes-diagnosis.pl +13 -0
  173. package/examples/eyelang/output/bayes-therapy.pl +23 -0
  174. package/examples/eyelang/output/beam-deflection.pl +5 -0
  175. package/examples/eyelang/output/blocks-world-planning.pl +4 -0
  176. package/examples/eyelang/output/bmi.pl +32 -0
  177. package/examples/eyelang/output/braking-safety-worlds.pl +18 -0
  178. package/examples/eyelang/output/buck-converter-design.pl +6 -0
  179. package/examples/eyelang/output/cache-performance.pl +4 -0
  180. package/examples/eyelang/output/canary-release.pl +5 -0
  181. package/examples/eyelang/output/cat-koko.pl +3 -0
  182. package/examples/eyelang/output/clinical-trial-screening.pl +9 -0
  183. package/examples/eyelang/output/collatz-1000.pl +1000 -0
  184. package/examples/eyelang/output/combinatorics-findall-sort.pl +2 -0
  185. package/examples/eyelang/output/competitive-enzyme-kinetics.pl +6 -0
  186. package/examples/eyelang/output/complex-matrix-stability.pl +5 -0
  187. package/examples/eyelang/output/complex.pl +1 -0
  188. package/examples/eyelang/output/composition-of-injective-functions-is-injective.pl +2 -0
  189. package/examples/eyelang/output/context-association.pl +3 -0
  190. package/examples/eyelang/output/control-system.pl +6 -0
  191. package/examples/eyelang/output/cryptarithmetic-send-more-money.pl +6 -0
  192. package/examples/eyelang/output/cyclic-path.pl +16 -0
  193. package/examples/eyelang/output/d3-group.pl +2 -0
  194. package/examples/eyelang/output/dairy-energy-balance.pl +13 -0
  195. package/examples/eyelang/output/data-negotiation.pl +1 -0
  196. package/examples/eyelang/output/deep-taxonomy-10.pl +16 -0
  197. package/examples/eyelang/output/deep-taxonomy-100.pl +16 -0
  198. package/examples/eyelang/output/deep-taxonomy-1000.pl +16 -0
  199. package/examples/eyelang/output/deep-taxonomy-10000.pl +16 -0
  200. package/examples/eyelang/output/deep-taxonomy-100000.pl +16 -0
  201. package/examples/eyelang/output/delfour.pl +31 -0
  202. package/examples/eyelang/output/dense-hamiltonian-cycle.pl +4 -0
  203. package/examples/eyelang/output/deontic-logic.pl +4 -0
  204. package/examples/eyelang/output/derived-backward-rule.pl +3 -0
  205. package/examples/eyelang/output/derived-rule.pl +2 -0
  206. package/examples/eyelang/output/diamond-property.pl +4 -0
  207. package/examples/eyelang/output/dijkstra-findall-sort.pl +2 -0
  208. package/examples/eyelang/output/dijkstra-risk-path.pl +29 -0
  209. package/examples/eyelang/output/dijkstra.pl +16 -0
  210. package/examples/eyelang/output/dining-philosophers.pl +350 -0
  211. package/examples/eyelang/output/directional-language.ttl +1 -0
  212. package/examples/eyelang/output/dog.pl +1 -0
  213. package/examples/eyelang/output/drone-corridor-planner.pl +17 -0
  214. package/examples/eyelang/output/easter-computus.pl +30 -0
  215. package/examples/eyelang/output/electrical-rc-filter.pl +3 -0
  216. package/examples/eyelang/output/epidemic-policy.pl +14 -0
  217. package/examples/eyelang/output/equivalence-classes-overlap-implies-same-class.pl +18 -0
  218. package/examples/eyelang/output/eulerian-path.pl +3 -0
  219. package/examples/eyelang/output/ev-range-worlds.pl +19 -0
  220. package/examples/eyelang/output/exact-cover-sudoku.pl +3 -0
  221. package/examples/eyelang/output/existential-rule.pl +2 -0
  222. package/examples/eyelang/output/exoplanet-validation-worlds.pl +22 -0
  223. package/examples/eyelang/output/expression-eval.pl +1 -0
  224. package/examples/eyelang/output/eyeling-ackermann.n3 +12 -0
  225. package/examples/eyelang/output/eyeling-age-threshold.n3 +4 -0
  226. package/examples/eyelang/output/eyeling-alignment-demo.n3 +1 -0
  227. package/examples/eyelang/output/eyeling-allen-interval-calculus-small.n3 +3 -0
  228. package/examples/eyelang/output/eyeling-backward-recursion.n3 +9 -0
  229. package/examples/eyelang/output/eyeling-backward.n3 +1 -0
  230. package/examples/eyelang/output/eyeling-basic-monadic-small.n3 +8 -0
  231. package/examples/eyelang/output/eyeling-bmi.n3 +2 -0
  232. package/examples/eyelang/output/eyeling-cat-koko.n3 +3 -0
  233. package/examples/eyelang/output/eyeling-collatz-small.n3 +3 -0
  234. package/examples/eyelang/output/eyeling-collection.n3 +1 -0
  235. package/examples/eyelang/output/eyeling-complex-arithmetic.n3 +5 -0
  236. package/examples/eyelang/output/eyeling-context-association.n3 +4 -0
  237. package/examples/eyelang/output/eyeling-control-system-small.n3 +4 -0
  238. package/examples/eyelang/output/eyeling-crypto-builtins-extra.n3 +3 -0
  239. package/examples/eyelang/output/eyeling-crypto-builtins.n3 +2 -0
  240. package/examples/eyelang/output/eyeling-deep-taxonomy-10.n3 +32 -0
  241. package/examples/eyelang/output/eyeling-derived-backward-rule-flat.n3 +4 -0
  242. package/examples/eyelang/output/eyeling-derived-rule-flat.n3 +2 -0
  243. package/examples/eyelang/output/eyeling-digital-product-passport-small.n3 +3 -0
  244. package/examples/eyelang/output/eyeling-dijkstra-tiny.n3 +9 -0
  245. package/examples/eyelang/output/eyeling-dog-license.n3 +1 -0
  246. package/examples/eyelang/output/eyeling-drone-corridor-planner-small.n3 +5 -0
  247. package/examples/eyelang/output/eyeling-equals.n3 +1 -0
  248. package/examples/eyelang/output/eyeling-equivalence-classes.n3 +2 -0
  249. package/examples/eyelang/output/eyeling-euler-identity.n3 +3 -0
  250. package/examples/eyelang/output/eyeling-existential-rule.n3 +4 -0
  251. package/examples/eyelang/output/eyeling-expression-eval.n3 +3 -0
  252. package/examples/eyelang/output/eyeling-family-cousins-extended.n3 +6 -0
  253. package/examples/eyelang/output/eyeling-fastpow.n3 +4 -0
  254. package/examples/eyelang/output/eyeling-fibonacci.n3 +6 -0
  255. package/examples/eyelang/output/eyeling-french-cities-reachability.n3 +25 -0
  256. package/examples/eyelang/output/eyeling-goldbach-small.n3 +2 -0
  257. package/examples/eyelang/output/eyeling-good-cobbler.n3 +2 -0
  258. package/examples/eyelang/output/eyeling-list-builtins.n3 +6 -0
  259. package/examples/eyelang/output/eyeling-list-collection-extra.n3 +5 -0
  260. package/examples/eyelang/output/eyeling-math-builtins.n3 +5 -0
  261. package/examples/eyelang/output/eyeling-string-builtins-extra.n3 +3 -0
  262. package/examples/eyelang/output/eyeling-string-builtins.n3 +4 -0
  263. package/examples/eyelang/output/eyeling-time-builtins.n3 +4 -0
  264. package/examples/eyelang/output/eyeling-time-components-extra.n3 +5 -0
  265. package/examples/eyelang/output/eyeling-witch.n3 +2 -0
  266. package/examples/eyelang/output/family-cousins.n3 +8 -0
  267. package/examples/eyelang/output/family-cousins.pl +28 -0
  268. package/examples/eyelang/output/fastpow.pl +6 -0
  269. package/examples/eyelang/output/fft8-numeric.pl +4 -0
  270. package/examples/eyelang/output/fibonacci.pl +6 -0
  271. package/examples/eyelang/output/field-nitrogen-balance.pl +21 -0
  272. package/examples/eyelang/output/flandor.pl +43 -0
  273. package/examples/eyelang/output/floating-point.pl +9 -0
  274. package/examples/eyelang/output/four-color-map.pl +3 -0
  275. package/examples/eyelang/output/fundamental-theorem-arithmetic.pl +9 -0
  276. package/examples/eyelang/output/gcd-bezout-identity.pl +36 -0
  277. package/examples/eyelang/output/gd-step-certified.pl +79 -0
  278. package/examples/eyelang/output/gdpr-compliance.pl +6 -0
  279. package/examples/eyelang/output/goldbach-1000.pl +667 -0
  280. package/examples/eyelang/output/good-cobbler.pl +1 -0
  281. package/examples/eyelang/output/gps.pl +21 -0
  282. package/examples/eyelang/output/graph-reachability.pl +3 -0
  283. package/examples/eyelang/output/gray-code-counter.pl +1 -0
  284. package/examples/eyelang/output/greatest-lower-bound-uniqueness.pl +2 -0
  285. package/examples/eyelang/output/group-inverse-uniqueness.pl +2 -0
  286. package/examples/eyelang/output/hamiltonian-cycle.pl +4 -0
  287. package/examples/eyelang/output/hamiltonian-path.pl +121 -0
  288. package/examples/eyelang/output/hamming-code.pl +6 -0
  289. package/examples/eyelang/output/hanoi.pl +1 -0
  290. package/examples/eyelang/output/heat-loss.pl +5 -0
  291. package/examples/eyelang/output/heron-theorem.pl +4 -0
  292. package/examples/eyelang/output/ideal-gas-law.pl +3 -0
  293. package/examples/eyelang/output/illegitimate-reasoning.pl +15 -0
  294. package/examples/eyelang/output/kaprekar.pl +8 -0
  295. package/examples/eyelang/output/law-of-cosines.pl +3 -0
  296. package/examples/eyelang/output/least-squares-regression.pl +5 -0
  297. package/examples/eyelang/output/list-collection.pl +3 -0
  298. package/examples/eyelang/output/lldm.pl +6 -0
  299. package/examples/eyelang/output/manufacturing-quality-control.pl +6 -0
  300. package/examples/eyelang/output/matrix.pl +10 -0
  301. package/examples/eyelang/output/microgrid-dispatch.pl +6 -0
  302. package/examples/eyelang/output/monkey-bananas.pl +5 -0
  303. package/examples/eyelang/output/n-queens.pl +93 -0
  304. package/examples/eyelang/output/n3-builtins.n3 +6 -0
  305. package/examples/eyelang/output/network-sla.pl +4 -0
  306. package/examples/eyelang/output/newton-raphson.pl +3 -0
  307. package/examples/eyelang/output/nixon-diamond.pl +5 -0
  308. package/examples/eyelang/output/odrl-dpv-healthcare-risk-ranked.pl +42 -0
  309. package/examples/eyelang/output/odrl-dpv-risk-ranked.pl +120 -0
  310. package/examples/eyelang/output/orbital-transfer-design.pl +7 -0
  311. package/examples/eyelang/output/path-discovery.pl +3 -0
  312. package/examples/eyelang/output/peano-arithmetic.pl +3 -0
  313. package/examples/eyelang/output/peasant.pl +10 -0
  314. package/examples/eyelang/output/pendulum-period.pl +4 -0
  315. package/examples/eyelang/output/polynomial.pl +14 -0
  316. package/examples/eyelang/output/project-portfolio-optimization.pl +6 -0
  317. package/examples/eyelang/output/proof-contrapositive.pl +3 -0
  318. package/examples/eyelang/output/quadratic-formula.pl +6 -0
  319. package/examples/eyelang/output/quine-mccluskey.pl +3 -0
  320. package/examples/eyelang/output/radioactive-decay.pl +5 -0
  321. package/examples/eyelang/output/resilient-city-orchestration.pl +67 -0
  322. package/examples/eyelang/output/riemann-hypothesis.pl +12 -0
  323. package/examples/eyelang/output/sat-dpll.pl +5 -0
  324. package/examples/eyelang/output/security-incident-correlation.pl +3 -0
  325. package/examples/eyelang/output/service-impact.pl +11 -0
  326. package/examples/eyelang/output/sieve.pl +1 -0
  327. package/examples/eyelang/output/skolem-functions.pl +16 -0
  328. package/examples/eyelang/output/socket-age.pl +1 -0
  329. package/examples/eyelang/output/socket-family.pl +3 -0
  330. package/examples/eyelang/output/socrates.n3 +1 -0
  331. package/examples/eyelang/output/socrates.pl +2 -0
  332. package/examples/eyelang/output/statistics-summary.pl +4 -0
  333. package/examples/eyelang/output/sudoku.pl +2 -0
  334. package/examples/eyelang/output/superdense-coding.pl +6 -0
  335. package/examples/eyelang/output/traveling-salesman.pl +1 -0
  336. package/examples/eyelang/output/triple-term.n3 +2 -0
  337. package/examples/eyelang/output/turing.pl +12 -0
  338. package/examples/eyelang/output/vector-similarity.pl +4 -0
  339. package/examples/eyelang/output/witch.pl +7 -0
  340. package/examples/eyelang/output/wolf-goat-cabbage.pl +3 -0
  341. package/examples/eyelang/output/zebra.pl +3 -0
  342. package/examples/eyelang/path-discovery.pl +44998 -0
  343. package/examples/eyelang/peano-arithmetic.pl +31 -0
  344. package/examples/eyelang/peasant.pl +30 -0
  345. package/examples/eyelang/pendulum-period.pl +50 -0
  346. package/examples/eyelang/polynomial.pl +124 -0
  347. package/examples/eyelang/project-portfolio-optimization.pl +101 -0
  348. package/examples/eyelang/proof/age.pl +71 -0
  349. package/examples/eyelang/proof/aliases-and-namespaces.pl +78 -0
  350. package/examples/eyelang/proof/ancestor.pl +140 -0
  351. package/examples/eyelang/proof/animal.pl +68 -0
  352. package/examples/eyelang/proof/annotation.pl +80 -0
  353. package/examples/eyelang/proof/backward.pl +22 -0
  354. package/examples/eyelang/proof/cat-koko.pl +86 -0
  355. package/examples/eyelang/proof/data-negotiation.pl +76 -0
  356. package/examples/eyelang/proof/derived-rule.pl +43 -0
  357. package/examples/eyelang/proof/dog.pl +31 -0
  358. package/examples/eyelang/proof/electrical-rc-filter.pl +105 -0
  359. package/examples/eyelang/proof/existential-rule.pl +40 -0
  360. package/examples/eyelang/proof/floating-point.pl +160 -0
  361. package/examples/eyelang/proof/good-cobbler.pl +16 -0
  362. package/examples/eyelang/proof/group-inverse-uniqueness.pl +84 -0
  363. package/examples/eyelang/proof/list-collection.pl +52 -0
  364. package/examples/eyelang/proof/proof-contrapositive.pl +78 -0
  365. package/examples/eyelang/proof/socket-age.pl +32 -0
  366. package/examples/eyelang/proof/socket-family.pl +59 -0
  367. package/examples/eyelang/proof/socrates.pl +38 -0
  368. package/examples/eyelang/proof-contrapositive.pl +27 -0
  369. package/examples/eyelang/quadratic-formula.pl +54 -0
  370. package/examples/eyelang/quine-mccluskey.pl +143 -0
  371. package/examples/eyelang/radioactive-decay.pl +56 -0
  372. package/examples/eyelang/resilient-city-orchestration.pl +303 -0
  373. package/examples/eyelang/riemann-hypothesis.pl +110 -0
  374. package/examples/eyelang/sat-dpll.pl +80 -0
  375. package/examples/eyelang/security-incident-correlation.pl +69 -0
  376. package/examples/eyelang/service-impact.pl +41 -0
  377. package/examples/eyelang/sieve.pl +20 -0
  378. package/examples/eyelang/skolem-functions.pl +52 -0
  379. package/examples/eyelang/socket-age.pl +39 -0
  380. package/examples/eyelang/socket-family.pl +28 -0
  381. package/examples/eyelang/socrates.n3 +11 -0
  382. package/examples/eyelang/socrates.pl +19 -0
  383. package/examples/eyelang/statistics-summary.pl +54 -0
  384. package/examples/eyelang/sudoku.pl +20 -0
  385. package/examples/eyelang/superdense-coding.pl +84 -0
  386. package/examples/eyelang/traveling-salesman.pl +64 -0
  387. package/examples/eyelang/triple-term.n3 +9 -0
  388. package/examples/eyelang/turing.pl +67 -0
  389. package/examples/eyelang/vector-similarity.pl +56 -0
  390. package/examples/eyelang/witch.pl +38 -0
  391. package/examples/eyelang/wolf-goat-cabbage.pl +56 -0
  392. package/examples/eyelang/zebra.pl +44 -0
  393. package/eyelang.d.ts +92 -0
  394. package/eyeling.js +1 -0
  395. package/index.d.ts +50 -2
  396. package/index.js +95 -1
  397. package/lib/cli.js +1 -0
  398. package/lib/eyelang/bin.js +7 -0
  399. package/lib/eyelang/builtins/aggregation.mjs +81 -0
  400. package/lib/eyelang/builtins/alphametic.mjs +144 -0
  401. package/lib/eyelang/builtins/arithmetic.mjs +197 -0
  402. package/lib/eyelang/builtins/control.mjs +22 -0
  403. package/lib/eyelang/builtins/core.mjs +78 -0
  404. package/lib/eyelang/builtins/formula.mjs +42 -0
  405. package/lib/eyelang/builtins/lists.mjs +149 -0
  406. package/lib/eyelang/builtins/matrix.mjs +226 -0
  407. package/lib/eyelang/builtins/n3.mjs +483 -0
  408. package/lib/eyelang/builtins/number-theory.mjs +114 -0
  409. package/lib/eyelang/builtins/portfolio.mjs +73 -0
  410. package/lib/eyelang/builtins/registry.mjs +54 -0
  411. package/lib/eyelang/builtins/search.mjs +579 -0
  412. package/lib/eyelang/builtins/strings.mjs +41 -0
  413. package/lib/eyelang/builtins/sudoku.mjs +141 -0
  414. package/lib/eyelang/cli.mjs +192 -0
  415. package/lib/eyelang/explain.mjs +324 -0
  416. package/lib/eyelang/hash.mjs +294 -0
  417. package/lib/eyelang/index.mjs +48 -0
  418. package/lib/eyelang/parser.mjs +428 -0
  419. package/lib/eyelang/program.mjs +244 -0
  420. package/lib/eyelang/rdf.mjs +747 -0
  421. package/lib/eyelang/solver.mjs +237 -0
  422. package/lib/eyelang/term.mjs +328 -0
  423. package/package.json +12 -3
  424. package/test/eyelang/conformance/README.md +45 -0
  425. package/test/eyelang/conformance/cases/core/001_fact_output.pl +4 -0
  426. package/test/eyelang/conformance/cases/core/001_fact_query.query +1 -0
  427. package/test/eyelang/conformance/cases/core/002_rule_recursion.pl +7 -0
  428. package/test/eyelang/conformance/cases/core/002_rule_recursion.query +1 -0
  429. package/test/eyelang/conformance/cases/core/003_terms_and_readback.pl +16 -0
  430. package/test/eyelang/conformance/cases/core/003_terms_and_readback.query +1 -0
  431. package/test/eyelang/conformance/cases/core/004_conjunction_and_parentheses.pl +5 -0
  432. package/test/eyelang/conformance/cases/core/004_conjunction_and_parentheses.query +1 -0
  433. package/test/eyelang/conformance/cases/core/005_list_deconstruction.pl +6 -0
  434. package/test/eyelang/conformance/cases/core/005_list_deconstruction.query +1 -0
  435. package/test/eyelang/conformance/cases/core/006_comma_formula_data.pl +4 -0
  436. package/test/eyelang/conformance/cases/core/006_comma_formula_data.query +1 -0
  437. package/test/eyelang/conformance/cases/core/007_anonymous_variables.pl +5 -0
  438. package/test/eyelang/conformance/cases/core/007_anonymous_variables.query +1 -0
  439. package/test/eyelang/conformance/cases/core/008_graphic_atoms.pl +6 -0
  440. package/test/eyelang/conformance/cases/core/008_graphic_atoms.query +1 -0
  441. package/test/eyelang/conformance/cases/core/009_comments_and_whitespace.pl +5 -0
  442. package/test/eyelang/conformance/cases/core/009_comments_and_whitespace.query +1 -0
  443. package/test/eyelang/conformance/cases/core/010_variable_scope_and_reuse.pl +8 -0
  444. package/test/eyelang/conformance/cases/core/010_variable_scope_and_reuse.query +1 -0
  445. package/test/eyelang/conformance/cases/core/011_predicate_arity.pl +6 -0
  446. package/test/eyelang/conformance/cases/core/011_predicate_arity.query +1 -0
  447. package/test/eyelang/conformance/cases/core/012_nested_compound_unification.pl +5 -0
  448. package/test/eyelang/conformance/cases/core/012_nested_compound_unification.query +1 -0
  449. package/test/eyelang/conformance/cases/core/013_multiple_clauses_order.pl +6 -0
  450. package/test/eyelang/conformance/cases/core/013_multiple_clauses_order.query +1 -0
  451. package/test/eyelang/conformance/cases/core/014_failure_filters_answers.pl +7 -0
  452. package/test/eyelang/conformance/cases/core/014_failure_filters_answers.query +1 -0
  453. package/test/eyelang/conformance/cases/core/015_improper_list_unification.pl +6 -0
  454. package/test/eyelang/conformance/cases/core/015_improper_list_unification.query +1 -0
  455. package/test/eyelang/conformance/cases/core/016_zero_arity_compound.pl +4 -0
  456. package/test/eyelang/conformance/cases/core/016_zero_arity_compound.query +1 -0
  457. package/test/eyelang/conformance/cases/core/017_three_step_recursion.pl +8 -0
  458. package/test/eyelang/conformance/cases/core/017_three_step_recursion.query +1 -0
  459. package/test/eyelang/conformance/cases/core/018_quoted_atom_readback.pl +6 -0
  460. package/test/eyelang/conformance/cases/core/018_quoted_atom_readback.query +1 -0
  461. package/test/eyelang/conformance/cases/core/019_parenthesized_three_conjuncts.pl +7 -0
  462. package/test/eyelang/conformance/cases/core/019_parenthesized_three_conjuncts.query +1 -0
  463. package/test/eyelang/conformance/cases/core/020_nested_list_terms.pl +5 -0
  464. package/test/eyelang/conformance/cases/core/020_nested_list_terms.query +1 -0
  465. package/test/eyelang/conformance/cases/core/021_repeated_variable_head.pl +7 -0
  466. package/test/eyelang/conformance/cases/core/022_rule_head_structure.pl +5 -0
  467. package/test/eyelang/conformance/cases/core/023_quoted_escapes_readback.pl +5 -0
  468. package/test/eyelang/conformance/cases/core/024_numeric_literal_readback.pl +6 -0
  469. package/test/eyelang/conformance/cases/core/025_body_parentheses_with_formula_data.pl +5 -0
  470. package/test/eyelang/conformance/cases/core/026_underscore_named_variable_reuse.pl +5 -0
  471. package/test/eyelang/conformance/cases/extension/001_default_derived_output.pl +5 -0
  472. package/test/eyelang/conformance/cases/extension/002_materialize_focus.pl +5 -0
  473. package/test/eyelang/conformance/cases/extension/003_arithmetic_and_comparison.pl +12 -0
  474. package/test/eyelang/conformance/cases/extension/003_arithmetic_and_comparison.query +1 -0
  475. package/test/eyelang/conformance/cases/extension/004_strings_and_atoms.pl +6 -0
  476. package/test/eyelang/conformance/cases/extension/004_strings_and_atoms.query +1 -0
  477. package/test/eyelang/conformance/cases/extension/005_lists_aggregation_ordering.pl +10 -0
  478. package/test/eyelang/conformance/cases/extension/005_lists_aggregation_ordering.query +1 -0
  479. package/test/eyelang/conformance/cases/extension/006_formula_terms.pl +5 -0
  480. package/test/eyelang/conformance/cases/extension/006_formula_terms.query +1 -0
  481. package/test/eyelang/conformance/cases/extension/007_negation_once_generators.pl +7 -0
  482. package/test/eyelang/conformance/cases/extension/007_negation_once_generators.query +1 -0
  483. package/test/eyelang/conformance/cases/extension/008_equality_and_inequality.pl +6 -0
  484. package/test/eyelang/conformance/cases/extension/008_equality_and_inequality.query +1 -0
  485. package/test/eyelang/conformance/cases/extension/009_list_relations.pl +6 -0
  486. package/test/eyelang/conformance/cases/extension/009_list_relations.query +1 -0
  487. package/test/eyelang/conformance/cases/extension/010_append_splits.pl +3 -0
  488. package/test/eyelang/conformance/cases/extension/010_append_splits.query +1 -0
  489. package/test/eyelang/conformance/cases/extension/011_matching_and_comparison.pl +7 -0
  490. package/test/eyelang/conformance/cases/extension/011_matching_and_comparison.query +1 -0
  491. package/test/eyelang/conformance/cases/extension/012_memoize_declaration.pl +8 -0
  492. package/test/eyelang/conformance/cases/extension/012_memoize_declaration.query +1 -0
  493. package/test/eyelang/conformance/cases/extension/013_numeric_functions.pl +9 -0
  494. package/test/eyelang/conformance/cases/extension/013_numeric_functions.query +1 -0
  495. package/test/eyelang/conformance/cases/extension/014_between_enumeration.pl +3 -0
  496. package/test/eyelang/conformance/cases/extension/014_between_enumeration.query +1 -0
  497. package/test/eyelang/conformance/cases/extension/015_smallest_divisor.pl +3 -0
  498. package/test/eyelang/conformance/cases/extension/015_smallest_divisor.query +1 -0
  499. package/test/eyelang/conformance/cases/extension/016_negation_filter.pl +7 -0
  500. package/test/eyelang/conformance/cases/extension/016_negation_filter.query +1 -0
  501. package/test/eyelang/conformance/cases/extension/017_once_user_predicate.pl +5 -0
  502. package/test/eyelang/conformance/cases/extension/017_once_user_predicate.query +1 -0
  503. package/test/eyelang/conformance/cases/extension/018_findall_user_goal.pl +6 -0
  504. package/test/eyelang/conformance/cases/extension/018_findall_user_goal.query +1 -0
  505. package/test/eyelang/conformance/cases/extension/019_sort_deduplicates_atoms.pl +3 -0
  506. package/test/eyelang/conformance/cases/extension/019_sort_deduplicates_atoms.query +1 -0
  507. package/test/eyelang/conformance/cases/extension/020_append_bound_prefix_suffix.pl +4 -0
  508. package/test/eyelang/conformance/cases/extension/020_append_bound_prefix_suffix.query +1 -0
  509. package/test/eyelang/conformance/cases/extension/021_nth0_index_generation.pl +3 -0
  510. package/test/eyelang/conformance/cases/extension/021_nth0_index_generation.query +1 -0
  511. package/test/eyelang/conformance/cases/extension/022_set_nth0_edges.pl +4 -0
  512. package/test/eyelang/conformance/cases/extension/022_set_nth0_edges.query +1 -0
  513. package/test/eyelang/conformance/cases/extension/023_select_duplicate_occurrences.pl +3 -0
  514. package/test/eyelang/conformance/cases/extension/023_select_duplicate_occurrences.query +1 -0
  515. package/test/eyelang/conformance/cases/extension/024_not_member_filter.pl +6 -0
  516. package/test/eyelang/conformance/cases/extension/024_not_member_filter.query +1 -0
  517. package/test/eyelang/conformance/cases/extension/025_is_list_filter.pl +5 -0
  518. package/test/eyelang/conformance/cases/extension/025_is_list_filter.query +1 -0
  519. package/test/eyelang/conformance/cases/extension/026_nested_formula_terms.pl +5 -0
  520. package/test/eyelang/conformance/cases/extension/026_nested_formula_terms.query +1 -0
  521. package/test/eyelang/conformance/cases/extension/027_materialize_excludes_source_fact.pl +6 -0
  522. package/test/eyelang/conformance/cases/extension/028_numeric_and_lexical_comparison.pl +5 -0
  523. package/test/eyelang/conformance/cases/extension/028_numeric_and_lexical_comparison.query +1 -0
  524. package/test/eyelang/conformance/cases/extension/029_string_matching_filters.pl +6 -0
  525. package/test/eyelang/conformance/cases/extension/029_string_matching_filters.query +1 -0
  526. package/test/eyelang/conformance/cases/extension/030_string_and_atom_concat.pl +4 -0
  527. package/test/eyelang/conformance/cases/extension/030_string_and_atom_concat.query +1 -0
  528. package/test/eyelang/conformance/cases/extension/031_countall_empty_and_nonempty.pl +4 -0
  529. package/test/eyelang/conformance/cases/extension/031_countall_empty_and_nonempty.query +1 -0
  530. package/test/eyelang/conformance/cases/extension/032_sumall_numeric_template.pl +5 -0
  531. package/test/eyelang/conformance/cases/extension/032_sumall_numeric_template.query +1 -0
  532. package/test/eyelang/conformance/cases/extension/033_aggregate_min_template.pl +5 -0
  533. package/test/eyelang/conformance/cases/extension/033_aggregate_min_template.query +1 -0
  534. package/test/eyelang/conformance/cases/extension/034_aggregate_max_compound_key.pl +5 -0
  535. package/test/eyelang/conformance/cases/extension/034_aggregate_max_compound_key.query +1 -0
  536. package/test/eyelang/conformance/cases/extension/035_date_difference.pl +4 -0
  537. package/test/eyelang/conformance/cases/extension/036_extended_gcd.pl +3 -0
  538. package/test/eyelang/conformance/cases/extension/037_collatz_trajectory.pl +3 -0
  539. package/test/eyelang/conformance/cases/extension/038_kaprekar_steps.pl +3 -0
  540. package/test/eyelang/conformance/cases/extension/039_goldbach_pair.pl +3 -0
  541. package/test/eyelang/conformance/cases/extension/040_matrix_operations.pl +5 -0
  542. package/test/eyelang/conformance/cases/extension/041_atom_range_generators.pl +5 -0
  543. package/test/eyelang/conformance/cases/extension/042_n_queens_small.pl +3 -0
  544. package/test/eyelang/conformance/cases/extension/043_cnf_model.pl +3 -0
  545. package/test/eyelang/conformance/cases/extension/044_cover9_filter.pl +6 -0
  546. package/test/eyelang/conformance/cases/extension/045_alphametic_sum_small.pl +3 -0
  547. package/test/eyelang/conformance/cases/extension/046_bounded_subset.pl +4 -0
  548. package/test/eyelang/conformance/expected/core/001_fact_output.out +1 -0
  549. package/test/eyelang/conformance/expected/core/002_rule_recursion.out +2 -0
  550. package/test/eyelang/conformance/expected/core/003_terms_and_readback.out +13 -0
  551. package/test/eyelang/conformance/expected/core/004_conjunction_and_parentheses.out +1 -0
  552. package/test/eyelang/conformance/expected/core/005_list_deconstruction.out +2 -0
  553. package/test/eyelang/conformance/expected/core/006_comma_formula_data.out +1 -0
  554. package/test/eyelang/conformance/expected/core/007_anonymous_variables.out +1 -0
  555. package/test/eyelang/conformance/expected/core/008_graphic_atoms.out +3 -0
  556. package/test/eyelang/conformance/expected/core/009_comments_and_whitespace.out +2 -0
  557. package/test/eyelang/conformance/expected/core/010_variable_scope_and_reuse.out +2 -0
  558. package/test/eyelang/conformance/expected/core/011_predicate_arity.out +2 -0
  559. package/test/eyelang/conformance/expected/core/012_nested_compound_unification.out +2 -0
  560. package/test/eyelang/conformance/expected/core/013_multiple_clauses_order.out +2 -0
  561. package/test/eyelang/conformance/expected/core/014_failure_filters_answers.out +1 -0
  562. package/test/eyelang/conformance/expected/core/015_improper_list_unification.out +3 -0
  563. package/test/eyelang/conformance/expected/core/016_zero_arity_compound.out +1 -0
  564. package/test/eyelang/conformance/expected/core/017_three_step_recursion.out +3 -0
  565. package/test/eyelang/conformance/expected/core/018_quoted_atom_readback.out +3 -0
  566. package/test/eyelang/conformance/expected/core/019_parenthesized_three_conjuncts.out +1 -0
  567. package/test/eyelang/conformance/expected/core/020_nested_list_terms.out +2 -0
  568. package/test/eyelang/conformance/expected/core/021_repeated_variable_head.out +2 -0
  569. package/test/eyelang/conformance/expected/core/022_rule_head_structure.out +2 -0
  570. package/test/eyelang/conformance/expected/core/023_quoted_escapes_readback.out +2 -0
  571. package/test/eyelang/conformance/expected/core/024_numeric_literal_readback.out +3 -0
  572. package/test/eyelang/conformance/expected/core/025_body_parentheses_with_formula_data.out +1 -0
  573. package/test/eyelang/conformance/expected/core/026_underscore_named_variable_reuse.out +1 -0
  574. package/test/eyelang/conformance/expected/extension/001_default_derived_output.out +3 -0
  575. package/test/eyelang/conformance/expected/extension/002_materialize_focus.out +1 -0
  576. package/test/eyelang/conformance/expected/extension/003_arithmetic_and_comparison.out +10 -0
  577. package/test/eyelang/conformance/expected/extension/004_strings_and_atoms.out +4 -0
  578. package/test/eyelang/conformance/expected/extension/005_lists_aggregation_ordering.out +9 -0
  579. package/test/eyelang/conformance/expected/extension/006_formula_terms.out +4 -0
  580. package/test/eyelang/conformance/expected/extension/007_negation_once_generators.out +2 -0
  581. package/test/eyelang/conformance/expected/extension/008_equality_and_inequality.out +4 -0
  582. package/test/eyelang/conformance/expected/extension/009_list_relations.out +5 -0
  583. package/test/eyelang/conformance/expected/extension/010_append_splits.out +3 -0
  584. package/test/eyelang/conformance/expected/extension/011_matching_and_comparison.out +5 -0
  585. package/test/eyelang/conformance/expected/extension/012_memoize_declaration.out +2 -0
  586. package/test/eyelang/conformance/expected/extension/013_numeric_functions.out +7 -0
  587. package/test/eyelang/conformance/expected/extension/014_between_enumeration.out +3 -0
  588. package/test/eyelang/conformance/expected/extension/015_smallest_divisor.out +1 -0
  589. package/test/eyelang/conformance/expected/extension/016_negation_filter.out +2 -0
  590. package/test/eyelang/conformance/expected/extension/017_once_user_predicate.out +1 -0
  591. package/test/eyelang/conformance/expected/extension/018_findall_user_goal.out +1 -0
  592. package/test/eyelang/conformance/expected/extension/019_sort_deduplicates_atoms.out +1 -0
  593. package/test/eyelang/conformance/expected/extension/020_append_bound_prefix_suffix.out +2 -0
  594. package/test/eyelang/conformance/expected/extension/021_nth0_index_generation.out +1 -0
  595. package/test/eyelang/conformance/expected/extension/022_set_nth0_edges.out +2 -0
  596. package/test/eyelang/conformance/expected/extension/023_select_duplicate_occurrences.out +2 -0
  597. package/test/eyelang/conformance/expected/extension/024_not_member_filter.out +1 -0
  598. package/test/eyelang/conformance/expected/extension/025_is_list_filter.out +1 -0
  599. package/test/eyelang/conformance/expected/extension/026_nested_formula_terms.out +6 -0
  600. package/test/eyelang/conformance/expected/extension/027_materialize_excludes_source_fact.out +1 -0
  601. package/test/eyelang/conformance/expected/extension/028_numeric_and_lexical_comparison.out +3 -0
  602. package/test/eyelang/conformance/expected/extension/029_string_matching_filters.out +2 -0
  603. package/test/eyelang/conformance/expected/extension/030_string_and_atom_concat.out +2 -0
  604. package/test/eyelang/conformance/expected/extension/031_countall_empty_and_nonempty.out +1 -0
  605. package/test/eyelang/conformance/expected/extension/032_sumall_numeric_template.out +1 -0
  606. package/test/eyelang/conformance/expected/extension/033_aggregate_min_template.out +1 -0
  607. package/test/eyelang/conformance/expected/extension/034_aggregate_max_compound_key.out +1 -0
  608. package/test/eyelang/conformance/expected/extension/035_date_difference.out +2 -0
  609. package/test/eyelang/conformance/expected/extension/036_extended_gcd.out +1 -0
  610. package/test/eyelang/conformance/expected/extension/037_collatz_trajectory.out +1 -0
  611. package/test/eyelang/conformance/expected/extension/038_kaprekar_steps.out +1 -0
  612. package/test/eyelang/conformance/expected/extension/039_goldbach_pair.out +2 -0
  613. package/test/eyelang/conformance/expected/extension/040_matrix_operations.out +3 -0
  614. package/test/eyelang/conformance/expected/extension/041_atom_range_generators.out +8 -0
  615. package/test/eyelang/conformance/expected/extension/042_n_queens_small.out +2 -0
  616. package/test/eyelang/conformance/expected/extension/043_cnf_model.out +1 -0
  617. package/test/eyelang/conformance/expected/extension/044_cover9_filter.out +2 -0
  618. package/test/eyelang/conformance/expected/extension/045_alphametic_sum_small.out +4 -0
  619. package/test/eyelang/conformance/expected/extension/046_bounded_subset.out +5 -0
  620. package/test/eyelang/run-all.mjs +20 -0
  621. package/test/eyelang/run-conformance.mjs +80 -0
  622. package/test/eyelang/run-examples.mjs +126 -0
  623. package/test/eyelang/run-regression.mjs +640 -0
  624. package/test/eyelang/test-style.mjs +91 -0
  625. package/test/eyelang.test.js +58 -0
  626. package/test/run.js +1 -0
@@ -0,0 +1,237 @@
1
+ // Depth-first eyelang solver with builtin dispatch, memoization, and guarded recursion handling.
2
+ // Most semantic decisions still flow through unification; optimizations only select candidates earlier.
3
+ import { COMPOUND, Env, flattenConjunction, freshTerm, termToString, unify, variantTerms } from './term.mjs';
4
+ import { createDefaultRegistry } from './builtins/registry.mjs';
5
+ import { selectClauseCandidates } from './program.mjs';
6
+
7
+ let freshCounter = 0;
8
+
9
+ export function nextFreshId() {
10
+ return ++freshCounter;
11
+ }
12
+
13
+ export class Solver {
14
+ constructor(program, options = {}) {
15
+ this.program = program;
16
+ this.registry = options.registry ?? createDefaultRegistry();
17
+ this.maxDepth = options.maxDepth ?? 100000;
18
+ this.solutionLimit = options.solutionLimit ?? 10000000;
19
+ this.solutionsSeen = 0;
20
+ this.active = [];
21
+ this.memo = new Map();
22
+ this.stats = {
23
+ completed_goal_lists: 0,
24
+ solve_goals_calls: 0,
25
+ solve_one_goal_calls: 0,
26
+ unify_calls: 0,
27
+ max_depth: 0,
28
+ max_goal_count: 0,
29
+ deterministic_builtin_successes: 0,
30
+ deterministic_builtin_failures: 0,
31
+ };
32
+ }
33
+
34
+ cloneForInnerGoal(solutionLimit = this.solutionLimit) {
35
+ const solver = new Solver(this.program, { registry: this.registry, maxDepth: this.maxDepth, solutionLimit });
36
+ solver.memo = this.memo;
37
+ return solver;
38
+ }
39
+
40
+ *solve(goals, env = new Env(), depth = 0) {
41
+ this.stats.solve_goals_calls++;
42
+ this.stats.max_depth = Math.max(this.stats.max_depth, depth);
43
+ this.stats.max_goal_count = Math.max(this.stats.max_goal_count, goals.length);
44
+ if (depth > this.maxDepth || this.solutionsSeen >= this.solutionLimit) return;
45
+ if (!Array.isArray(goals)) goals = [goals];
46
+
47
+ if (goals.length === 0) {
48
+ this.solutionsSeen++;
49
+ this.stats.completed_goal_lists++;
50
+ yield env;
51
+ return;
52
+ }
53
+
54
+ // eyelang normally solves left-to-right, but ready deterministic builtins can
55
+ // be run early as pure filters. This gives large pruning wins without
56
+ // reordering user predicates or nondeterministic generators.
57
+ const selectedIndex = selectReadyDeterministicBuiltin(goals, env, this.registry);
58
+ const goal = goals[selectedIndex];
59
+ const rest = selectedIndex === 0 ? goals.slice(1) : [...goals.slice(0, selectedIndex), ...goals.slice(selectedIndex + 1)];
60
+ if (goal.type === COMPOUND && goal.name === ',' && goal.arity === 2) {
61
+ yield* this.solve([...flattenConjunction(goal), ...rest], env, depth + 1);
62
+ return;
63
+ }
64
+
65
+ const def = goal.type === COMPOUND ? this.registry.get(goal.name, goal.arity) : null;
66
+ if (def && builtinIsReadyOrAuthoritative(def, this, goal, env)) {
67
+ let produced = false;
68
+ for (const next of def.handler({ solver: this, goal, env })) {
69
+ produced = true;
70
+ yield* this.solve(rest, next, depth + 1);
71
+ if (this.solutionsSeen >= this.solutionLimit) return;
72
+ }
73
+ if (def.deterministic) {
74
+ if (produced) this.stats.deterministic_builtin_successes++;
75
+ else this.stats.deterministic_builtin_failures++;
76
+ }
77
+ return;
78
+ }
79
+
80
+ yield* this.solveUserGoal(goal, rest, env, depth);
81
+ }
82
+
83
+ activeVariant(goal, env) {
84
+ return this.active.some((entry) => variantTerms(goal, env, entry.goal, entry.env));
85
+ }
86
+
87
+ *solveUserGoal(goal, rest, env, depth) {
88
+ this.stats.solve_one_goal_calls++;
89
+ if (depth > this.maxDepth || this.solutionsSeen >= this.solutionLimit) return;
90
+ if (goal.type !== COMPOUND) return;
91
+ const group = this.program.findGroup(goal.name, goal.arity);
92
+ if (!group) return;
93
+ if (group.memoized) {
94
+ yield* this.solveMemoizedGoal(group, goal, rest, env, depth);
95
+ return;
96
+ }
97
+ yield* this.solveUserGoalUncached(group, goal, rest, env, depth);
98
+ }
99
+
100
+ *solveMemoizedGoal(group, goal, rest, env, depth) {
101
+ // Memoization only pays off when at least one argument is bound. A fully
102
+ // open call would require storing the entire relation and can mask useful
103
+ // goal-ordering behavior, so it falls back to the normal path.
104
+ const key = memoKey(goal, env);
105
+ if (!key.hasBound) {
106
+ yield* this.solveUserGoalUncached(group, goal, rest, env, depth);
107
+ return;
108
+ }
109
+ const mapKey = `${goal.name}/${goal.arity}:${key.text}`;
110
+ let entry = this.memo.get(mapKey);
111
+ if (!entry) {
112
+ entry = { computing: false, complete: false, answers: [] };
113
+ this.memo.set(mapKey, entry);
114
+ }
115
+ if (!entry.complete && !entry.computing) {
116
+ entry.computing = true;
117
+ const collector = this.cloneForInnerGoal();
118
+ for (const answerEnv of collector.solveUserGoalUncached(group, goal, [], env.clone(), depth)) {
119
+ entry.answers.push(goal.args.map((arg) => importResolved(arg, answerEnv)));
120
+ }
121
+ entry.computing = false;
122
+ entry.complete = true;
123
+ }
124
+ if (!entry.complete && entry.computing) {
125
+ yield* this.solveUserGoalUncached(group, goal, rest, env, depth);
126
+ return;
127
+ }
128
+ for (const answerArgs of entry.answers) {
129
+ const next = env.clone();
130
+ let ok = true;
131
+ for (let i = 0; i < goal.arity; i++) {
132
+ this.stats.unify_calls++;
133
+ if (!unify(goal.args[i], answerArgs[i], next)) { ok = false; break; }
134
+ }
135
+ if (ok) yield* this.solve(rest, next, depth + 1);
136
+ if (this.solutionsSeen >= this.solutionLimit) return;
137
+ }
138
+ }
139
+
140
+ *solveUserGoalUncached(group, goal, rest, env, depth) {
141
+ if (this.activeVariant(goal, env)) return;
142
+ // Program indexes provide candidate clauses, but every candidate is still
143
+ // freshened and unified below. The index is a performance hint, not a
144
+ // semantic shortcut.
145
+ const candidates = selectClauseCandidates(group, goal, env);
146
+ for (const pass of [candidates.primary, candidates.fallback]) {
147
+ for (const clause of pass) {
148
+ if (headCannotMatch(goal, clause.head, env)) continue;
149
+ const id = nextFreshId();
150
+ const freshHead = freshTerm(clause.head, id);
151
+ const freshBody = clause.body.map((term) => freshTerm(term, id));
152
+ const next = env.clone();
153
+ this.stats.unify_calls++;
154
+ if (!unify(goal, freshHead, next)) continue;
155
+ if (freshBody.length === 0) {
156
+ yield* this.solve(rest, next, depth + 1);
157
+ } else {
158
+ yield* this.solveRuleBodyThenRest(goal, env, freshBody, rest, next, depth);
159
+ }
160
+ if (this.solutionsSeen >= this.solutionLimit) return;
161
+ }
162
+ }
163
+ }
164
+ *solveRuleBodyThenRest(goal, goalEnv, body, rest, env, depth) {
165
+ // Match the C engine's active-call lifetime: the active guard protects
166
+ // expansion of the current rule body, but it must be released before
167
+ // the caller's remaining goals are solved. Keeping the goal active
168
+ // through rest goals over-prunes valid transitive/recursive derivations.
169
+ this.active.push({ goal, env: goalEnv });
170
+ for (const bodyEnv of this.solve(body, env, depth + 1)) {
171
+ if (this.solutionsSeen > 0) this.solutionsSeen--;
172
+ this.active.pop();
173
+ yield* this.solve(rest, bodyEnv, depth + 1);
174
+ this.active.push({ goal, env: goalEnv });
175
+ if (this.solutionsSeen >= this.solutionLimit) break;
176
+ }
177
+ this.active.pop();
178
+ }
179
+
180
+ }
181
+
182
+
183
+ function builtinIsReadyOrAuthoritative(def, solver, goal, env) {
184
+ if (typeof def.shouldUse === 'function' && !def.shouldUse({ solver, goal, env })) return false;
185
+ if (typeof def.ready !== 'function') return true;
186
+ if (def.ready(goal, env)) return true;
187
+ return !def.fallbackWhenNotReady;
188
+ }
189
+
190
+ function selectReadyDeterministicBuiltin(goals, env, registry) {
191
+ for (let i = 0; i < goals.length; i++) {
192
+ const goal = goals[i];
193
+ if (goal.type !== COMPOUND) continue;
194
+ const def = registry.get(goal.name, goal.arity);
195
+ if (!def?.deterministic || typeof def.ready !== 'function') continue;
196
+ if (typeof def.shouldUse === 'function') continue;
197
+ if (def.ready(goal, env)) return i;
198
+ }
199
+ return 0;
200
+ }
201
+
202
+ function headCannotMatch(goal, head, env) {
203
+ if (goal.type !== COMPOUND || head.type !== COMPOUND) return false;
204
+ if (goal.name !== head.name || goal.arity !== head.arity) return true;
205
+ for (let i = 0; i < goal.arity; i++) {
206
+ const a = goal.args[i];
207
+ const b = head.args[i];
208
+ // Keep this only as a cheap scalar rejection. unify() remains authoritative.
209
+ const da = derefForLocal(a, env);
210
+ if (da.args?.length === 0 && ['atom', 'string', 'number'].includes(da.type) && ['atom', 'string', 'number'].includes(b.type) && da.name !== b.name) return true;
211
+ }
212
+ return false;
213
+ }
214
+
215
+ function derefForLocal(term, env) {
216
+ let current = term;
217
+ while (current.type === 'var' && env.has(current.name)) current = env.get(current.name);
218
+ return current;
219
+ }
220
+
221
+ function memoKey(goal, env) {
222
+ let hasBound = false;
223
+ const parts = goal.args.map((arg) => {
224
+ const value = derefForLocal(arg, env);
225
+ if (value.type !== 'var') hasBound = true;
226
+ return value.type === 'var' ? '_' : termToString(value, env, true);
227
+ });
228
+ return { hasBound, text: parts.join('|') };
229
+ }
230
+
231
+ function importResolved(term, env) {
232
+ const { copyResolved } = termModuleCache;
233
+ return copyResolved(term, env);
234
+ }
235
+
236
+ // Avoid circular import surprises in older Node loaders.
237
+ import * as termModuleCache from './term.mjs';
@@ -0,0 +1,328 @@
1
+ // Term model, environments, unification, readback, and ordering helpers.
2
+ // This file is intentionally dependency-free because nearly every other module imports it.
3
+ export const VAR = 'var';
4
+ export const ATOM = 'atom';
5
+ export const STRING = 'string';
6
+ export const NUMBER = 'number';
7
+ export const COMPOUND = 'compound';
8
+
9
+ export class Term {
10
+ constructor(type, name, args = []) {
11
+ this.type = type;
12
+ this.name = String(name ?? '');
13
+ this.args = args;
14
+ }
15
+ get arity() {
16
+ return this.args.length;
17
+ }
18
+ }
19
+
20
+ export const variable = (name) => new Term(VAR, name);
21
+ export const atom = (name) => new Term(ATOM, name);
22
+ export const stringTerm = (value) => new Term(STRING, value);
23
+ export const numberTerm = (value) => new Term(NUMBER, value);
24
+ export const compound = (name, args = []) => new Term(COMPOUND, name, args);
25
+ export const emptyList = () => atom('[]');
26
+ export const cons = (head, tail) => compound('.', [head, tail]);
27
+
28
+ export class Env {
29
+ constructor(bindings) {
30
+ this.bindings = bindings ? new Map(bindings) : new Map();
31
+ }
32
+ clone() {
33
+ return new Env(this.bindings);
34
+ }
35
+ has(name) {
36
+ return this.bindings.has(name);
37
+ }
38
+ get(name) {
39
+ return this.bindings.get(name);
40
+ }
41
+ bind(name, term) {
42
+ this.bindings.set(name, term);
43
+ }
44
+ }
45
+
46
+ export function deref(term, env) {
47
+ // Follow variable bindings until a non-variable term is reached. The seen set
48
+ // protects readback from accidental cycles in partially constructed terms.
49
+ let current = term;
50
+ const seen = new Set();
51
+ while (current?.type === VAR && env?.has(current.name)) {
52
+ if (seen.has(current.name)) break;
53
+ seen.add(current.name);
54
+ current = env.get(current.name);
55
+ }
56
+ return current;
57
+ }
58
+
59
+ export function isScalar(term) {
60
+ return term && (term.type === ATOM || term.type === STRING || term.type === NUMBER);
61
+ }
62
+
63
+ export function isEmptyList(term) {
64
+ return term?.type === ATOM && term.name === '[]';
65
+ }
66
+
67
+ export function isCons(term) {
68
+ return term?.type === COMPOUND && term.name === '.' && term.arity === 2;
69
+ }
70
+
71
+ export function isConjunction(term) {
72
+ return term?.type === COMPOUND && term.name === ',' && term.arity === 2;
73
+ }
74
+
75
+ export function unify(left, right, env) {
76
+ // Iterative unification avoids deep JavaScript recursion on long lists or
77
+ // deeply nested compounds. Bindings are written into the supplied Env.
78
+ const stack = [[left, right]];
79
+ while (stack.length) {
80
+ let [a, b] = stack.pop();
81
+ a = deref(a, env);
82
+ b = deref(b, env);
83
+
84
+ if (a.type === VAR && b.type === VAR && a.name === b.name) continue;
85
+ if (a.type === VAR) {
86
+ env.bind(a.name, b);
87
+ continue;
88
+ }
89
+ if (b.type === VAR) {
90
+ env.bind(b.name, a);
91
+ continue;
92
+ }
93
+
94
+ if (a.type !== b.type) {
95
+ if (isScalar(a) && isScalar(b) && a.name === b.name) continue;
96
+ return false;
97
+ }
98
+
99
+ if (isScalar(a)) {
100
+ if (a.name !== b.name) return false;
101
+ continue;
102
+ }
103
+
104
+ if (a.type === COMPOUND) {
105
+ if (a.name !== b.name || a.arity !== b.arity) return false;
106
+ for (let i = a.arity - 1; i >= 0; i--) stack.push([a.args[i], b.args[i]]);
107
+ continue;
108
+ }
109
+
110
+ return false;
111
+ }
112
+ return true;
113
+ }
114
+
115
+ export function cloneTerm(term) {
116
+ return new Term(term.type, term.name, term.args.map(cloneTerm));
117
+ }
118
+
119
+ export function freshTerm(term, suffix) {
120
+ if (term.type === VAR) return variable(`${term.name}#${suffix}`);
121
+ return new Term(term.type, term.name, term.args.map((arg) => freshTerm(arg, suffix)));
122
+ }
123
+
124
+ export function copyResolved(term, env) {
125
+ const resolved = deref(term, env);
126
+ if (resolved.type === VAR) return variable(resolved.name);
127
+ return new Term(resolved.type, resolved.name, resolved.args.map((arg) => copyResolved(arg, env)));
128
+ }
129
+
130
+ export function termIsGround(term, env = new Env()) {
131
+ const resolved = deref(term, env);
132
+ if (resolved.type === VAR) return false;
133
+ return resolved.args.every((arg) => termIsGround(arg, env));
134
+ }
135
+
136
+ const graphicAtomChars = new Set('#$&*+-/<=>?@^~\\'.split(''));
137
+
138
+ function atomNeedsQuotes(name) {
139
+ if (!name) return true;
140
+ if (name === '[]') return false;
141
+ if (/^[a-z][A-Za-z0-9_]*$/.test(name)) return false;
142
+ for (const ch of name) if (!graphicAtomChars.has(ch)) return true;
143
+ return false;
144
+ }
145
+
146
+ function quoteAtom(name) {
147
+ let out = "'";
148
+ for (const ch of name) {
149
+ if (ch === "'") out += "''";
150
+ else if (ch === '\\') out += '\\\\';
151
+ else if (ch === '\n') out += '\\n';
152
+ else if (ch === '\t') out += '\\t';
153
+ else out += ch;
154
+ }
155
+ return out + "'";
156
+ }
157
+
158
+ function writeAtom(name) {
159
+ return atomNeedsQuotes(name) ? quoteAtom(name) : name;
160
+ }
161
+
162
+ function writeString(value, quoteStrings) {
163
+ if (!quoteStrings) return value;
164
+ let out = '"';
165
+ for (const ch of value) {
166
+ if (ch === '"' || ch === '\\') out += `\\${ch}`;
167
+ else if (ch === '\n') out += '\\n';
168
+ else out += ch;
169
+ }
170
+ return out + '"';
171
+ }
172
+
173
+ function writeList(term, env) {
174
+ const parts = [];
175
+ let cursor = term;
176
+ while (true) {
177
+ cursor = deref(cursor, env);
178
+ if (isEmptyList(cursor)) return `[${parts.join(', ')}]`;
179
+ if (!isCons(cursor)) {
180
+ if (parts.length) return `[${parts.join(', ')} | ${termToString(cursor, env, true)}]`;
181
+ return `[${termToString(cursor, env, true)}]`;
182
+ }
183
+ parts.push(termToString(cursor.args[0], env, true));
184
+ cursor = cursor.args[1];
185
+ }
186
+ }
187
+
188
+ export function termToString(term, env = new Env(), quoteStrings = true) {
189
+ const resolved = deref(term, env);
190
+ if (resolved.type === VAR) return resolved.name;
191
+ if (isCons(resolved)) return writeList(resolved, env);
192
+ if (resolved.type === STRING) return writeString(resolved.name, quoteStrings);
193
+ if (resolved.type === ATOM) return writeAtom(resolved.name);
194
+ if (resolved.type === NUMBER) return resolved.name;
195
+ if (isConjunction(resolved)) {
196
+ const parts = [];
197
+ let cursor = resolved;
198
+ while (true) {
199
+ cursor = deref(cursor, env);
200
+ if (isConjunction(cursor)) {
201
+ parts.push(termToString(cursor.args[0], env, true));
202
+ cursor = cursor.args[1];
203
+ } else {
204
+ parts.push(termToString(cursor, env, true));
205
+ break;
206
+ }
207
+ }
208
+ return `(${parts.join(', ')})`;
209
+ }
210
+ return `${writeAtom(resolved.name)}(${resolved.args.map((arg) => termToString(arg, env, true)).join(', ')})`;
211
+ }
212
+
213
+ export function lexicalValue(term, env) {
214
+ const resolved = deref(term, env);
215
+ if (resolved.type === VAR) return null;
216
+ if (resolved.type === ATOM || resolved.type === STRING || resolved.type === NUMBER) return resolved.name;
217
+ return termToString(resolved, env, true);
218
+ }
219
+
220
+ export function properListItems(list, env) {
221
+ const items = [];
222
+ let cursor = deref(list, env);
223
+ while (isCons(cursor)) {
224
+ items.push(cursor.args[0]);
225
+ cursor = deref(cursor.args[1], env);
226
+ }
227
+ if (!isEmptyList(cursor)) return null;
228
+ return items;
229
+ }
230
+
231
+ export function listFromItems(items, start = 0, end = items.length, tail = emptyList()) {
232
+ let result = tail;
233
+ for (let i = end - 1; i >= start; i--) result = cons(items[i], result);
234
+ return result;
235
+ }
236
+
237
+ export function flattenConjunction(goal) {
238
+ const out = [];
239
+ const stack = [goal];
240
+ while (stack.length) {
241
+ const current = stack.pop();
242
+ if (isConjunction(current)) {
243
+ stack.push(current.args[1], current.args[0]);
244
+ } else {
245
+ out.push(current);
246
+ }
247
+ }
248
+ return out;
249
+ }
250
+
251
+ export function termSignature(term) {
252
+ return term?.type === COMPOUND ? `${term.name}/${term.arity}` : null;
253
+ }
254
+
255
+ export function variantTerms(left, leftEnv, right, rightEnv, pairs = new Map(), reverse = new Map()) {
256
+ left = deref(left, leftEnv);
257
+ right = deref(right, rightEnv);
258
+ if (left.type === VAR || right.type === VAR) {
259
+ if (left.type !== VAR || right.type !== VAR) return false;
260
+ if (pairs.has(left.name) || reverse.has(right.name)) {
261
+ return pairs.get(left.name) === right.name && reverse.get(right.name) === left.name;
262
+ }
263
+ pairs.set(left.name, right.name);
264
+ reverse.set(right.name, left.name);
265
+ return true;
266
+ }
267
+ if (left.type !== right.type || left.name !== right.name || left.arity !== right.arity) return false;
268
+ for (let i = 0; i < left.arity; i++) {
269
+ if (!variantTerms(left.args[i], leftEnv, right.args[i], rightEnv, pairs, reverse)) return false;
270
+ }
271
+ return true;
272
+ }
273
+
274
+ export function compareTerms(left, right) {
275
+ const rank = (term) => ({ [VAR]: 0, [NUMBER]: 1, [ATOM]: 2, [STRING]: 3, [COMPOUND]: 4 })[term.type];
276
+ left = deref(left, new Env());
277
+ right = deref(right, new Env());
278
+ const lr = rank(left);
279
+ const rr = rank(right);
280
+ if (lr !== rr) return lr < rr ? -1 : 1;
281
+ if (left.type === NUMBER) return compareNumberText(left.name, right.name);
282
+ if (left.type === VAR || left.type === ATOM || left.type === STRING) return left.name < right.name ? -1 : left.name > right.name ? 1 : 0;
283
+ if (left.name !== right.name) return left.name < right.name ? -1 : 1;
284
+ if (left.arity !== right.arity) return left.arity < right.arity ? -1 : 1;
285
+ for (let i = 0; i < left.arity; i++) {
286
+ const cmp = compareTerms(left.args[i], right.args[i]);
287
+ if (cmp) return cmp;
288
+ }
289
+ return 0;
290
+ }
291
+
292
+ export function isDecimalInteger(text) {
293
+ return /^-?\d+$/.test(text ?? '');
294
+ }
295
+
296
+ export function compareIntegerText(left, right) {
297
+ const a = BigInt(left);
298
+ const b = BigInt(right);
299
+ return a < b ? -1 : a > b ? 1 : 0;
300
+ }
301
+
302
+ export function parseFiniteNumber(text) {
303
+ if (text == null || text === '') return null;
304
+ if (!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(text)) return null;
305
+ const n = Number(text);
306
+ return Number.isFinite(n) ? n : null;
307
+ }
308
+
309
+ export function numberTextFromDouble(value) {
310
+ if (!Number.isFinite(value)) return null;
311
+ if (Object.is(value, -0)) value = 0;
312
+ let text = Number(value).toPrecision(17);
313
+ if (text.includes('e') || text.includes('E')) {
314
+ text = text.replace(/(\.\d*?[1-9])0+(e[+-]?\d+)$/i, '$1$2').replace(/\.0+(e[+-]?\d+)$/i, '$1');
315
+ } else if (text.includes('.')) {
316
+ text = text.replace(/0+$/, '').replace(/\.$/, '');
317
+ }
318
+ if (!/[.eE]/.test(text)) text += '.0';
319
+ return text;
320
+ }
321
+
322
+ export function compareNumberText(left, right) {
323
+ if (isDecimalInteger(left) && isDecimalInteger(right)) return compareIntegerText(left, right);
324
+ const a = parseFiniteNumber(left);
325
+ const b = parseFiniteNumber(right);
326
+ if (a != null && b != null) return a < b ? -1 : a > b ? 1 : 0;
327
+ return left < right ? -1 : left > right ? 1 : 0;
328
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eyeling",
3
- "version": "1.32.1",
3
+ "version": "1.33.0",
4
4
  "description": "A minimal Notation3 (N3) reasoner in JavaScript.",
5
5
  "main": "./index.js",
6
6
  "keywords": [
@@ -26,6 +26,7 @@
26
26
  "index.js",
27
27
  "index.d.ts",
28
28
  "browser.d.ts",
29
+ "eyelang.d.ts",
29
30
  "bin",
30
31
  "dist",
31
32
  "lib",
@@ -59,7 +60,10 @@
59
60
  "test:package": "node test/package.test.js",
60
61
  "test": "node test/run.js",
61
62
  "preversion": "npm test",
62
- "postversion": "git push origin HEAD --follow-tags"
63
+ "postversion": "git push origin HEAD --follow-tags",
64
+ "test:eyelang": "node test/eyelang.test.js && node test/eyelang/run-all.mjs",
65
+ "test:eyelang:integration": "node test/eyelang.test.js",
66
+ "test:eyelang:corpus": "node test/eyelang/run-all.mjs"
63
67
  },
64
68
  "dependencies": {
65
69
  "@rdfjs/types": "^2.0.1"
@@ -80,7 +84,12 @@
80
84
  "default": "./dist/browser/index.mjs"
81
85
  },
82
86
  "./eyeling.js": "./eyeling.js",
83
- "./package.json": "./package.json"
87
+ "./package.json": "./package.json",
88
+ "./eyelang": {
89
+ "types": "./eyelang.d.ts",
90
+ "import": "./lib/eyelang/index.mjs",
91
+ "default": "./lib/eyelang/index.mjs"
92
+ }
84
93
  },
85
94
  "typesVersions": {
86
95
  "*": {
@@ -0,0 +1,45 @@
1
+ # eyelang conformance suite
2
+
3
+ This directory contains the executable conformance cases for the eyelang language and reference engine. The normative language description is in [`../SPEC.md`](../SPEC.md).
4
+
5
+ The suite is intentionally file-based so another implementation can run the same programs and compare exact standard output. A case consists of:
6
+
7
+ - `conformance/cases/<profile>/<name>.pl` — input program;
8
+ - `conformance/expected/<profile>/<name>.out` — exact expected standard output.
9
+
10
+ The current runner compares standard output from normal execution. Proof explanations are opt-in in the CLI and are not part of these conformance goldens. Standard error, performance, and resource limits are outside this suite.
11
+
12
+ ## Running the suite
13
+
14
+ Run all tests, including conformance, regression, examples, and style checks:
15
+
16
+ ```sh
17
+ npm test
18
+ ```
19
+
20
+ Run only the conformance suite:
21
+
22
+ ```sh
23
+ npm run test:conformance
24
+ ```
25
+
26
+ Run a single conformance profile directly:
27
+
28
+ ```sh
29
+ node test/run-conformance.js core
30
+ node test/run-conformance.js extension
31
+ ```
32
+
33
+ The runner executes materialized programs in-process through the public JavaScript API so small conformance cases avoid measuring Node startup overhead.
34
+
35
+ ## Profiles
36
+
37
+ `core` covers the portable core language profile from `../SPEC.md`: lexical syntax, facts, definite clauses, first-order terms, lists, conjunction, structured unification through user predicates, left-to-right goal-directed proof search, materialized output, and read-back printing.
38
+
39
+ `extension` covers the standard built-in and host behavior exercised by the current reference implementation: arithmetic, comparison, strings, list relations, aggregation, formula-term helpers, number-theory helpers, finite-search helpers, matrix helpers, `memoize/2`, `materialize/2`, and default derived output.
40
+
41
+ The profile name `extension` is a test-suite grouping name. It does not mean that these cases are outside the eyelang specification; most of them correspond to the standard built-in profile and standard host profile in `../SPEC.md`.
42
+
43
+ ## Updating expected output
44
+
45
+ There is no committed auto-accept mode. To update an expected file, run the matching case with the conformance runner, inspect the result, and replace the corresponding file under `conformance/expected/<profile>/` deliberately.
@@ -0,0 +1,4 @@
1
+ % SPEC 6, 7, 11: facts can be exposed through a materialized derived predicate.
2
+ materialize(parent, 2).
3
+ base_parent(pat, jan).
4
+ parent(X, Y) :- base_parent(X, Y).
@@ -0,0 +1 @@
1
+ parent(pat, X)
@@ -0,0 +1,7 @@
1
+ % SPEC 6, 7: definite clauses, conjunction, and recursive proof search.
2
+ materialize(ancestor, 2).
3
+ parent(pat, jan).
4
+ parent(jan, emma).
5
+ ancestor_any(X, Y) :- parent(X, Y).
6
+ ancestor_any(X, Z) :- parent(X, Y), ancestor_any(Y, Z).
7
+ ancestor(pat, Y) :- ancestor_any(pat, Y).
@@ -0,0 +1,16 @@
1
+ % SPEC 3, 5, 11: scalars, compounds, lists, and read-back printing.
2
+ materialize(value, 2).
3
+ raw_value(atom, pat).
4
+ raw_value(quoted_atom, 'atom with spaces').
5
+ raw_value(quoted_quote, 'needs''quote').
6
+ raw_value(empty_atom, '').
7
+ raw_value(string, "line\nquote: \"ok\"").
8
+ raw_value(integer, -42).
9
+ raw_value(decimal, 0.25).
10
+ raw_value(scientific, 1.25e-3).
11
+ raw_value(compound, pair(3, nested(atom, [x, y]))).
12
+ raw_value(zero_arity, nil()).
13
+ raw_value(empty_list, []).
14
+ raw_value(proper_list, [a, b, c]).
15
+ raw_value(improper_list, [a, b | tail]).
16
+ value(K, V) :- raw_value(K, V).