eyeling 1.32.1 → 1.33.1

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 (629) hide show
  1. package/README.md +87 -16
  2. package/bin/eyeling.cjs +56 -4
  3. package/dist/browser/eyeling.browser.js +2 -11
  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-builtins.ttl +1 -1
  395. package/eyeling.js +2 -11
  396. package/index.d.ts +50 -2
  397. package/index.js +95 -1
  398. package/lib/builtins.js +1 -11
  399. package/lib/cli.js +1 -0
  400. package/lib/eyelang/bin.js +7 -0
  401. package/lib/eyelang/builtins/aggregation.mjs +81 -0
  402. package/lib/eyelang/builtins/alphametic.mjs +144 -0
  403. package/lib/eyelang/builtins/arithmetic.mjs +197 -0
  404. package/lib/eyelang/builtins/control.mjs +22 -0
  405. package/lib/eyelang/builtins/core.mjs +78 -0
  406. package/lib/eyelang/builtins/formula.mjs +42 -0
  407. package/lib/eyelang/builtins/lists.mjs +149 -0
  408. package/lib/eyelang/builtins/matrix.mjs +226 -0
  409. package/lib/eyelang/builtins/n3.mjs +483 -0
  410. package/lib/eyelang/builtins/number-theory.mjs +114 -0
  411. package/lib/eyelang/builtins/portfolio.mjs +73 -0
  412. package/lib/eyelang/builtins/registry.mjs +54 -0
  413. package/lib/eyelang/builtins/search.mjs +579 -0
  414. package/lib/eyelang/builtins/strings.mjs +41 -0
  415. package/lib/eyelang/builtins/sudoku.mjs +141 -0
  416. package/lib/eyelang/cli.mjs +192 -0
  417. package/lib/eyelang/explain.mjs +324 -0
  418. package/lib/eyelang/hash.mjs +294 -0
  419. package/lib/eyelang/index.mjs +48 -0
  420. package/lib/eyelang/parser.mjs +428 -0
  421. package/lib/eyelang/program.mjs +244 -0
  422. package/lib/eyelang/rdf.mjs +747 -0
  423. package/lib/eyelang/solver.mjs +237 -0
  424. package/lib/eyelang/term.mjs +328 -0
  425. package/package.json +12 -3
  426. package/test/builtins.test.js +15 -2
  427. package/test/eyelang/conformance/README.md +45 -0
  428. package/test/eyelang/conformance/cases/core/001_fact_output.pl +4 -0
  429. package/test/eyelang/conformance/cases/core/001_fact_query.query +1 -0
  430. package/test/eyelang/conformance/cases/core/002_rule_recursion.pl +7 -0
  431. package/test/eyelang/conformance/cases/core/002_rule_recursion.query +1 -0
  432. package/test/eyelang/conformance/cases/core/003_terms_and_readback.pl +16 -0
  433. package/test/eyelang/conformance/cases/core/003_terms_and_readback.query +1 -0
  434. package/test/eyelang/conformance/cases/core/004_conjunction_and_parentheses.pl +5 -0
  435. package/test/eyelang/conformance/cases/core/004_conjunction_and_parentheses.query +1 -0
  436. package/test/eyelang/conformance/cases/core/005_list_deconstruction.pl +6 -0
  437. package/test/eyelang/conformance/cases/core/005_list_deconstruction.query +1 -0
  438. package/test/eyelang/conformance/cases/core/006_comma_formula_data.pl +4 -0
  439. package/test/eyelang/conformance/cases/core/006_comma_formula_data.query +1 -0
  440. package/test/eyelang/conformance/cases/core/007_anonymous_variables.pl +5 -0
  441. package/test/eyelang/conformance/cases/core/007_anonymous_variables.query +1 -0
  442. package/test/eyelang/conformance/cases/core/008_graphic_atoms.pl +6 -0
  443. package/test/eyelang/conformance/cases/core/008_graphic_atoms.query +1 -0
  444. package/test/eyelang/conformance/cases/core/009_comments_and_whitespace.pl +5 -0
  445. package/test/eyelang/conformance/cases/core/009_comments_and_whitespace.query +1 -0
  446. package/test/eyelang/conformance/cases/core/010_variable_scope_and_reuse.pl +8 -0
  447. package/test/eyelang/conformance/cases/core/010_variable_scope_and_reuse.query +1 -0
  448. package/test/eyelang/conformance/cases/core/011_predicate_arity.pl +6 -0
  449. package/test/eyelang/conformance/cases/core/011_predicate_arity.query +1 -0
  450. package/test/eyelang/conformance/cases/core/012_nested_compound_unification.pl +5 -0
  451. package/test/eyelang/conformance/cases/core/012_nested_compound_unification.query +1 -0
  452. package/test/eyelang/conformance/cases/core/013_multiple_clauses_order.pl +6 -0
  453. package/test/eyelang/conformance/cases/core/013_multiple_clauses_order.query +1 -0
  454. package/test/eyelang/conformance/cases/core/014_failure_filters_answers.pl +7 -0
  455. package/test/eyelang/conformance/cases/core/014_failure_filters_answers.query +1 -0
  456. package/test/eyelang/conformance/cases/core/015_improper_list_unification.pl +6 -0
  457. package/test/eyelang/conformance/cases/core/015_improper_list_unification.query +1 -0
  458. package/test/eyelang/conformance/cases/core/016_zero_arity_compound.pl +4 -0
  459. package/test/eyelang/conformance/cases/core/016_zero_arity_compound.query +1 -0
  460. package/test/eyelang/conformance/cases/core/017_three_step_recursion.pl +8 -0
  461. package/test/eyelang/conformance/cases/core/017_three_step_recursion.query +1 -0
  462. package/test/eyelang/conformance/cases/core/018_quoted_atom_readback.pl +6 -0
  463. package/test/eyelang/conformance/cases/core/018_quoted_atom_readback.query +1 -0
  464. package/test/eyelang/conformance/cases/core/019_parenthesized_three_conjuncts.pl +7 -0
  465. package/test/eyelang/conformance/cases/core/019_parenthesized_three_conjuncts.query +1 -0
  466. package/test/eyelang/conformance/cases/core/020_nested_list_terms.pl +5 -0
  467. package/test/eyelang/conformance/cases/core/020_nested_list_terms.query +1 -0
  468. package/test/eyelang/conformance/cases/core/021_repeated_variable_head.pl +7 -0
  469. package/test/eyelang/conformance/cases/core/022_rule_head_structure.pl +5 -0
  470. package/test/eyelang/conformance/cases/core/023_quoted_escapes_readback.pl +5 -0
  471. package/test/eyelang/conformance/cases/core/024_numeric_literal_readback.pl +6 -0
  472. package/test/eyelang/conformance/cases/core/025_body_parentheses_with_formula_data.pl +5 -0
  473. package/test/eyelang/conformance/cases/core/026_underscore_named_variable_reuse.pl +5 -0
  474. package/test/eyelang/conformance/cases/extension/001_default_derived_output.pl +5 -0
  475. package/test/eyelang/conformance/cases/extension/002_materialize_focus.pl +5 -0
  476. package/test/eyelang/conformance/cases/extension/003_arithmetic_and_comparison.pl +12 -0
  477. package/test/eyelang/conformance/cases/extension/003_arithmetic_and_comparison.query +1 -0
  478. package/test/eyelang/conformance/cases/extension/004_strings_and_atoms.pl +6 -0
  479. package/test/eyelang/conformance/cases/extension/004_strings_and_atoms.query +1 -0
  480. package/test/eyelang/conformance/cases/extension/005_lists_aggregation_ordering.pl +10 -0
  481. package/test/eyelang/conformance/cases/extension/005_lists_aggregation_ordering.query +1 -0
  482. package/test/eyelang/conformance/cases/extension/006_formula_terms.pl +5 -0
  483. package/test/eyelang/conformance/cases/extension/006_formula_terms.query +1 -0
  484. package/test/eyelang/conformance/cases/extension/007_negation_once_generators.pl +7 -0
  485. package/test/eyelang/conformance/cases/extension/007_negation_once_generators.query +1 -0
  486. package/test/eyelang/conformance/cases/extension/008_equality_and_inequality.pl +6 -0
  487. package/test/eyelang/conformance/cases/extension/008_equality_and_inequality.query +1 -0
  488. package/test/eyelang/conformance/cases/extension/009_list_relations.pl +6 -0
  489. package/test/eyelang/conformance/cases/extension/009_list_relations.query +1 -0
  490. package/test/eyelang/conformance/cases/extension/010_append_splits.pl +3 -0
  491. package/test/eyelang/conformance/cases/extension/010_append_splits.query +1 -0
  492. package/test/eyelang/conformance/cases/extension/011_matching_and_comparison.pl +7 -0
  493. package/test/eyelang/conformance/cases/extension/011_matching_and_comparison.query +1 -0
  494. package/test/eyelang/conformance/cases/extension/012_memoize_declaration.pl +8 -0
  495. package/test/eyelang/conformance/cases/extension/012_memoize_declaration.query +1 -0
  496. package/test/eyelang/conformance/cases/extension/013_numeric_functions.pl +9 -0
  497. package/test/eyelang/conformance/cases/extension/013_numeric_functions.query +1 -0
  498. package/test/eyelang/conformance/cases/extension/014_between_enumeration.pl +3 -0
  499. package/test/eyelang/conformance/cases/extension/014_between_enumeration.query +1 -0
  500. package/test/eyelang/conformance/cases/extension/015_smallest_divisor.pl +3 -0
  501. package/test/eyelang/conformance/cases/extension/015_smallest_divisor.query +1 -0
  502. package/test/eyelang/conformance/cases/extension/016_negation_filter.pl +7 -0
  503. package/test/eyelang/conformance/cases/extension/016_negation_filter.query +1 -0
  504. package/test/eyelang/conformance/cases/extension/017_once_user_predicate.pl +5 -0
  505. package/test/eyelang/conformance/cases/extension/017_once_user_predicate.query +1 -0
  506. package/test/eyelang/conformance/cases/extension/018_findall_user_goal.pl +6 -0
  507. package/test/eyelang/conformance/cases/extension/018_findall_user_goal.query +1 -0
  508. package/test/eyelang/conformance/cases/extension/019_sort_deduplicates_atoms.pl +3 -0
  509. package/test/eyelang/conformance/cases/extension/019_sort_deduplicates_atoms.query +1 -0
  510. package/test/eyelang/conformance/cases/extension/020_append_bound_prefix_suffix.pl +4 -0
  511. package/test/eyelang/conformance/cases/extension/020_append_bound_prefix_suffix.query +1 -0
  512. package/test/eyelang/conformance/cases/extension/021_nth0_index_generation.pl +3 -0
  513. package/test/eyelang/conformance/cases/extension/021_nth0_index_generation.query +1 -0
  514. package/test/eyelang/conformance/cases/extension/022_set_nth0_edges.pl +4 -0
  515. package/test/eyelang/conformance/cases/extension/022_set_nth0_edges.query +1 -0
  516. package/test/eyelang/conformance/cases/extension/023_select_duplicate_occurrences.pl +3 -0
  517. package/test/eyelang/conformance/cases/extension/023_select_duplicate_occurrences.query +1 -0
  518. package/test/eyelang/conformance/cases/extension/024_not_member_filter.pl +6 -0
  519. package/test/eyelang/conformance/cases/extension/024_not_member_filter.query +1 -0
  520. package/test/eyelang/conformance/cases/extension/025_is_list_filter.pl +5 -0
  521. package/test/eyelang/conformance/cases/extension/025_is_list_filter.query +1 -0
  522. package/test/eyelang/conformance/cases/extension/026_nested_formula_terms.pl +5 -0
  523. package/test/eyelang/conformance/cases/extension/026_nested_formula_terms.query +1 -0
  524. package/test/eyelang/conformance/cases/extension/027_materialize_excludes_source_fact.pl +6 -0
  525. package/test/eyelang/conformance/cases/extension/028_numeric_and_lexical_comparison.pl +5 -0
  526. package/test/eyelang/conformance/cases/extension/028_numeric_and_lexical_comparison.query +1 -0
  527. package/test/eyelang/conformance/cases/extension/029_string_matching_filters.pl +6 -0
  528. package/test/eyelang/conformance/cases/extension/029_string_matching_filters.query +1 -0
  529. package/test/eyelang/conformance/cases/extension/030_string_and_atom_concat.pl +4 -0
  530. package/test/eyelang/conformance/cases/extension/030_string_and_atom_concat.query +1 -0
  531. package/test/eyelang/conformance/cases/extension/031_countall_empty_and_nonempty.pl +4 -0
  532. package/test/eyelang/conformance/cases/extension/031_countall_empty_and_nonempty.query +1 -0
  533. package/test/eyelang/conformance/cases/extension/032_sumall_numeric_template.pl +5 -0
  534. package/test/eyelang/conformance/cases/extension/032_sumall_numeric_template.query +1 -0
  535. package/test/eyelang/conformance/cases/extension/033_aggregate_min_template.pl +5 -0
  536. package/test/eyelang/conformance/cases/extension/033_aggregate_min_template.query +1 -0
  537. package/test/eyelang/conformance/cases/extension/034_aggregate_max_compound_key.pl +5 -0
  538. package/test/eyelang/conformance/cases/extension/034_aggregate_max_compound_key.query +1 -0
  539. package/test/eyelang/conformance/cases/extension/035_date_difference.pl +4 -0
  540. package/test/eyelang/conformance/cases/extension/036_extended_gcd.pl +3 -0
  541. package/test/eyelang/conformance/cases/extension/037_collatz_trajectory.pl +3 -0
  542. package/test/eyelang/conformance/cases/extension/038_kaprekar_steps.pl +3 -0
  543. package/test/eyelang/conformance/cases/extension/039_goldbach_pair.pl +3 -0
  544. package/test/eyelang/conformance/cases/extension/040_matrix_operations.pl +5 -0
  545. package/test/eyelang/conformance/cases/extension/041_atom_range_generators.pl +5 -0
  546. package/test/eyelang/conformance/cases/extension/042_n_queens_small.pl +3 -0
  547. package/test/eyelang/conformance/cases/extension/043_cnf_model.pl +3 -0
  548. package/test/eyelang/conformance/cases/extension/044_cover9_filter.pl +6 -0
  549. package/test/eyelang/conformance/cases/extension/045_alphametic_sum_small.pl +3 -0
  550. package/test/eyelang/conformance/cases/extension/046_bounded_subset.pl +4 -0
  551. package/test/eyelang/conformance/expected/core/001_fact_output.out +1 -0
  552. package/test/eyelang/conformance/expected/core/002_rule_recursion.out +2 -0
  553. package/test/eyelang/conformance/expected/core/003_terms_and_readback.out +13 -0
  554. package/test/eyelang/conformance/expected/core/004_conjunction_and_parentheses.out +1 -0
  555. package/test/eyelang/conformance/expected/core/005_list_deconstruction.out +2 -0
  556. package/test/eyelang/conformance/expected/core/006_comma_formula_data.out +1 -0
  557. package/test/eyelang/conformance/expected/core/007_anonymous_variables.out +1 -0
  558. package/test/eyelang/conformance/expected/core/008_graphic_atoms.out +3 -0
  559. package/test/eyelang/conformance/expected/core/009_comments_and_whitespace.out +2 -0
  560. package/test/eyelang/conformance/expected/core/010_variable_scope_and_reuse.out +2 -0
  561. package/test/eyelang/conformance/expected/core/011_predicate_arity.out +2 -0
  562. package/test/eyelang/conformance/expected/core/012_nested_compound_unification.out +2 -0
  563. package/test/eyelang/conformance/expected/core/013_multiple_clauses_order.out +2 -0
  564. package/test/eyelang/conformance/expected/core/014_failure_filters_answers.out +1 -0
  565. package/test/eyelang/conformance/expected/core/015_improper_list_unification.out +3 -0
  566. package/test/eyelang/conformance/expected/core/016_zero_arity_compound.out +1 -0
  567. package/test/eyelang/conformance/expected/core/017_three_step_recursion.out +3 -0
  568. package/test/eyelang/conformance/expected/core/018_quoted_atom_readback.out +3 -0
  569. package/test/eyelang/conformance/expected/core/019_parenthesized_three_conjuncts.out +1 -0
  570. package/test/eyelang/conformance/expected/core/020_nested_list_terms.out +2 -0
  571. package/test/eyelang/conformance/expected/core/021_repeated_variable_head.out +2 -0
  572. package/test/eyelang/conformance/expected/core/022_rule_head_structure.out +2 -0
  573. package/test/eyelang/conformance/expected/core/023_quoted_escapes_readback.out +2 -0
  574. package/test/eyelang/conformance/expected/core/024_numeric_literal_readback.out +3 -0
  575. package/test/eyelang/conformance/expected/core/025_body_parentheses_with_formula_data.out +1 -0
  576. package/test/eyelang/conformance/expected/core/026_underscore_named_variable_reuse.out +1 -0
  577. package/test/eyelang/conformance/expected/extension/001_default_derived_output.out +3 -0
  578. package/test/eyelang/conformance/expected/extension/002_materialize_focus.out +1 -0
  579. package/test/eyelang/conformance/expected/extension/003_arithmetic_and_comparison.out +10 -0
  580. package/test/eyelang/conformance/expected/extension/004_strings_and_atoms.out +4 -0
  581. package/test/eyelang/conformance/expected/extension/005_lists_aggregation_ordering.out +9 -0
  582. package/test/eyelang/conformance/expected/extension/006_formula_terms.out +4 -0
  583. package/test/eyelang/conformance/expected/extension/007_negation_once_generators.out +2 -0
  584. package/test/eyelang/conformance/expected/extension/008_equality_and_inequality.out +4 -0
  585. package/test/eyelang/conformance/expected/extension/009_list_relations.out +5 -0
  586. package/test/eyelang/conformance/expected/extension/010_append_splits.out +3 -0
  587. package/test/eyelang/conformance/expected/extension/011_matching_and_comparison.out +5 -0
  588. package/test/eyelang/conformance/expected/extension/012_memoize_declaration.out +2 -0
  589. package/test/eyelang/conformance/expected/extension/013_numeric_functions.out +7 -0
  590. package/test/eyelang/conformance/expected/extension/014_between_enumeration.out +3 -0
  591. package/test/eyelang/conformance/expected/extension/015_smallest_divisor.out +1 -0
  592. package/test/eyelang/conformance/expected/extension/016_negation_filter.out +2 -0
  593. package/test/eyelang/conformance/expected/extension/017_once_user_predicate.out +1 -0
  594. package/test/eyelang/conformance/expected/extension/018_findall_user_goal.out +1 -0
  595. package/test/eyelang/conformance/expected/extension/019_sort_deduplicates_atoms.out +1 -0
  596. package/test/eyelang/conformance/expected/extension/020_append_bound_prefix_suffix.out +2 -0
  597. package/test/eyelang/conformance/expected/extension/021_nth0_index_generation.out +1 -0
  598. package/test/eyelang/conformance/expected/extension/022_set_nth0_edges.out +2 -0
  599. package/test/eyelang/conformance/expected/extension/023_select_duplicate_occurrences.out +2 -0
  600. package/test/eyelang/conformance/expected/extension/024_not_member_filter.out +1 -0
  601. package/test/eyelang/conformance/expected/extension/025_is_list_filter.out +1 -0
  602. package/test/eyelang/conformance/expected/extension/026_nested_formula_terms.out +6 -0
  603. package/test/eyelang/conformance/expected/extension/027_materialize_excludes_source_fact.out +1 -0
  604. package/test/eyelang/conformance/expected/extension/028_numeric_and_lexical_comparison.out +3 -0
  605. package/test/eyelang/conformance/expected/extension/029_string_matching_filters.out +2 -0
  606. package/test/eyelang/conformance/expected/extension/030_string_and_atom_concat.out +2 -0
  607. package/test/eyelang/conformance/expected/extension/031_countall_empty_and_nonempty.out +1 -0
  608. package/test/eyelang/conformance/expected/extension/032_sumall_numeric_template.out +1 -0
  609. package/test/eyelang/conformance/expected/extension/033_aggregate_min_template.out +1 -0
  610. package/test/eyelang/conformance/expected/extension/034_aggregate_max_compound_key.out +1 -0
  611. package/test/eyelang/conformance/expected/extension/035_date_difference.out +2 -0
  612. package/test/eyelang/conformance/expected/extension/036_extended_gcd.out +1 -0
  613. package/test/eyelang/conformance/expected/extension/037_collatz_trajectory.out +1 -0
  614. package/test/eyelang/conformance/expected/extension/038_kaprekar_steps.out +1 -0
  615. package/test/eyelang/conformance/expected/extension/039_goldbach_pair.out +2 -0
  616. package/test/eyelang/conformance/expected/extension/040_matrix_operations.out +3 -0
  617. package/test/eyelang/conformance/expected/extension/041_atom_range_generators.out +8 -0
  618. package/test/eyelang/conformance/expected/extension/042_n_queens_small.out +2 -0
  619. package/test/eyelang/conformance/expected/extension/043_cnf_model.out +1 -0
  620. package/test/eyelang/conformance/expected/extension/044_cover9_filter.out +2 -0
  621. package/test/eyelang/conformance/expected/extension/045_alphametic_sum_small.out +4 -0
  622. package/test/eyelang/conformance/expected/extension/046_bounded_subset.out +5 -0
  623. package/test/eyelang/run-all.mjs +20 -0
  624. package/test/eyelang/run-conformance.mjs +80 -0
  625. package/test/eyelang/run-examples.mjs +126 -0
  626. package/test/eyelang/run-regression.mjs +640 -0
  627. package/test/eyelang/test-style.mjs +91 -0
  628. package/test/eyelang.test.js +58 -0
  629. package/test/run.js +1 -0
@@ -45,7 +45,7 @@ ex:aliasOf a rdf:Property .
45
45
  # --- dt: datatype ---------------------------------------------------
46
46
 
47
47
  dt:datatype a ex:Builtin ; ex:kind ex:Function ;
48
- rdfs:comment "Extracts the datatype IRI of a literal. Plain RDF string literals return xsd:string; language-tagged strings return rdf:langString; shorthand numeric/boolean literals return their inferred XSD datatype." .
48
+ rdfs:comment "Extracts the datatype IRI of a literal. Plain RDF string literals return xsd:string; language-tagged strings return rdf:langString; shorthand numeric/boolean literals return their inferred XSD datatype. It returns the literal's actual datatype IRI only; rdfs:Literal is a class and is not returned by dt:datatype." .
49
49
 
50
50
  dt:lexicalForm a ex:Builtin ; ex:kind ex:Function ;
51
51
  rdfs:comment "Extracts the literal lexical form as an xsd:string/plain string value, preserving the original lexical spelling such as leading zeroes." .
package/eyeling.js CHANGED
@@ -1888,17 +1888,7 @@ function evalDatatypeInspectionBuiltin(g, subst, kind) {
1888
1888
  const dt = literalDatatypeIri(g.s);
1889
1889
  if (dt === null) return [];
1890
1890
  valueTerm = internIri(dt);
1891
- const out = evalBindBuiltinObject(g.o, valueTerm, subst);
1892
-
1893
- // OWL 2 RL datatype rules often need common string literals to also
1894
- // participate in generic literal comparisons, while application rules still
1895
- // ask for their precise datatype explicitly. When the datatype output is
1896
- // unbound, expose rdfs:Literal as an additional super-datatype answer for
1897
- // xsd:string and rdf:langString; bound-object calls remain strictly exact.
1898
- if (g.o instanceof Var && (dt === XSD_STRING_DT || dt === RDF_LANGSTRING_DT)) {
1899
- out.push(...evalBindBuiltinObject(g.o, internIri(RDFS_LITERAL_DT), subst));
1900
- }
1901
- return out;
1891
+ return evalBindBuiltinObject(g.o, valueTerm, subst);
1902
1892
  } else if (kind === 'lexicalForm') {
1903
1893
  valueTerm = makeStringLiteral(literalLexicalValue(g.s.value));
1904
1894
  } else if (kind === 'language') {
@@ -6493,6 +6483,7 @@ async function main() {
6493
6483
  `Options:\n` +
6494
6484
  ` -a, --ast Print parsed AST as JSON and exit.\n` +
6495
6485
  ` --builtin <module.js> Load a custom builtin module (repeatable).\n` +
6486
+ ` --engine <n3|eyelang> Select the N3 engine (default) or eyelang engine.\n` +
6496
6487
  ` -d, --deterministic-skolem Make log:skolem stable across reasoning runs.\n` +
6497
6488
  ` -e, --enforce-https Rewrite http:// IRIs to https:// for log dereferencing builtins.\n` +
6498
6489
  ` -h, --help Show this help and exit.\n` +
package/index.d.ts CHANGED
@@ -80,6 +80,38 @@ export interface N3SourceListInput {
80
80
  scopeBlankNodes?: boolean;
81
81
  }
82
82
 
83
+ export type EngineName = 'n3' | 'eyeling' | 'eyelang' | 'prolog' | 'horn';
84
+
85
+ export type EyelangSource = string | { eyelang?: string; prolog?: string; text?: string; label?: string };
86
+
87
+ export interface EyelangSourceListInput {
88
+ sources: EyelangSource[];
89
+ }
90
+
91
+ export interface EyelangStats {
92
+ [key: string]: number;
93
+ }
94
+
95
+ export interface EyelangRunOptions {
96
+ engine?: EngineName;
97
+ proof?: boolean;
98
+ why?: boolean;
99
+ explain?: boolean;
100
+ stats?: boolean;
101
+ rdf?: boolean;
102
+ rdf12?: boolean;
103
+ n3?: boolean;
104
+ inputFormat?: 'auto' | 'eyelang' | 'rdf' | 'rdf12' | 'turtle' | 'ttl' | 'nt' | 'n3' | string;
105
+ args?: string[];
106
+ maxBuffer?: number;
107
+ [key: string]: unknown;
108
+ }
109
+
110
+ export interface EyelangRunResult {
111
+ stdout: string;
112
+ stats: EyelangStats;
113
+ }
114
+
83
115
  export interface RdfJsReasonInput {
84
116
  n3?: string;
85
117
  quads?: Iterable<import('@rdfjs/types').Quad> | AsyncIterable<import('@rdfjs/types').Quad>;
@@ -112,10 +144,17 @@ export interface StoreOptions {
112
144
  }
113
145
 
114
146
  export interface ReasonOptions {
147
+ engine?: EngineName;
115
148
  proof?: boolean;
116
149
  proofComments?: boolean;
117
150
  noProofComments?: boolean;
151
+ why?: boolean;
152
+ explain?: boolean;
153
+ stats?: boolean;
118
154
  rdf?: boolean;
155
+ rdf12?: boolean;
156
+ n3?: boolean;
157
+ inputFormat?: 'auto' | 'eyelang' | 'rdf' | 'rdf12' | 'turtle' | 'ttl' | 'nt' | 'n3' | string;
119
158
  args?: string[];
120
159
  maxBuffer?: number;
121
160
  builtinModules?: string | string[];
@@ -139,6 +178,7 @@ export interface BuiltinRegistrationContext {
139
178
  export type BuiltinHandler = (ctx: BuiltinRegistrationContext) => Array<Record<string, EyelingTerm>>;
140
179
 
141
180
  export interface ReasonStreamOptions {
181
+ engine?: EngineName;
142
182
  baseIri?: string | null;
143
183
  proof?: boolean;
144
184
  includeInputFactsInClosure?: boolean;
@@ -199,12 +239,18 @@ export class PersistentFactStore implements FactStore {
199
239
 
200
240
  export function reason(
201
241
  opts: ReasonOptions,
202
- input: string | RdfJsReasonInput | EyelingAstBundle | N3SourceListInput,
242
+ input: string | RdfJsReasonInput | EyelingAstBundle | N3SourceListInput | EyelangSourceListInput,
203
243
  ): string;
244
+ export function runAsync(
245
+ input: string,
246
+ opts: ReasonStreamOptions & { engine: 'eyelang' | 'prolog' | 'horn' },
247
+ ): Promise<EyelangRunResult>;
204
248
  export function runAsync(
205
249
  input: string | RdfJsReasonInput | EyelingAstBundle | N3SourceListInput,
206
- opts?: ReasonStreamOptions,
250
+ opts?: ReasonStreamOptions & { engine?: 'n3' | 'eyeling' },
207
251
  ): Promise<ReasonStreamResult & { store?: FactStore }>;
252
+ export function runEyelang(input: string, opts?: EyelangRunOptions): Promise<EyelangRunResult>;
253
+ export function reasonEyelang(input: string, opts?: EyelangRunOptions): Promise<string>;
208
254
  export function reasonStream(
209
255
  input: string | RdfJsReasonInput | EyelingAstBundle | N3SourceListInput,
210
256
  opts?: ReasonStreamOptions,
@@ -227,6 +273,8 @@ export interface EyelingModule {
227
273
  readonly version: string;
228
274
  reason: typeof reason;
229
275
  runAsync: typeof runAsync;
276
+ runEyelang: typeof runEyelang;
277
+ reasonEyelang: typeof reasonEyelang;
230
278
  reasonStream: typeof reasonStream;
231
279
  reasonRdfJs: typeof reasonRdfJs;
232
280
  readonly INFERENCE_FUSE_EXIT_CODE: typeof INFERENCE_FUSE_EXIT_CODE;
package/index.js CHANGED
@@ -4,12 +4,100 @@ const fs = require('node:fs');
4
4
  const os = require('node:os');
5
5
  const path = require('node:path');
6
6
  const cp = require('node:child_process');
7
+ const { pathToFileURL } = require('node:url');
7
8
 
8
9
  const bundleApi = require('./eyeling.js');
9
10
  const { dataFactory, normalizeReasonerInputSync } = require('./lib/rdfjs');
10
11
  const { isN3SourceListInput } = require('./lib/multisource');
11
12
  const engine = require('./lib/engine');
12
13
 
14
+
15
+ function normalizeEngineName(value) {
16
+ if (value == null || value === '') return 'n3';
17
+ const name = String(value).toLowerCase();
18
+ if (name === 'n3' || name === 'eyeling') return 'n3';
19
+ if (name === 'eyelang' || name === 'prolog' || name === 'horn') return 'eyelang';
20
+ throw new TypeError(`unknown Eyeling engine: ${value}`);
21
+ }
22
+
23
+ function normalizeEyelangSourceForTempFile(source) {
24
+ if (typeof source === 'string') return source;
25
+ if (source && typeof source === 'object' && !Array.isArray(source)) {
26
+ const text =
27
+ typeof source.eyelang === 'string' ? source.eyelang
28
+ : typeof source.prolog === 'string' ? source.prolog
29
+ : typeof source.text === 'string' ? source.text
30
+ : typeof source.n3 === 'string' ? source.n3
31
+ : null;
32
+ if (text !== null) return text;
33
+ }
34
+ throw new TypeError('reason({ engine: "eyelang" }, input): each source must be a string or an object with an eyelang/prolog/text field');
35
+ }
36
+
37
+ function normalizeEyelangInput(input) {
38
+ if (typeof input === 'string') return [input];
39
+ if (input == null) return [''];
40
+ if (input && typeof input === 'object' && !Array.isArray(input)) {
41
+ if (Array.isArray(input.sources)) return input.sources.map(normalizeEyelangSourceForTempFile);
42
+ return [normalizeEyelangSourceForTempFile(input)];
43
+ }
44
+ throw new TypeError('reason({ engine: "eyelang" }, input): input must be a string, source object, or { sources } list');
45
+ }
46
+
47
+ function reasonEyelangSync(opt = {}, input = '') {
48
+ const args = [];
49
+
50
+ if (opt.proof || opt.why || opt.explain) args.push('--proof');
51
+ if (opt.stats) args.push('--stats');
52
+ if (opt.rdf || opt.rdf12) args.push('--rdf');
53
+ if (opt.n3) args.push('--n3');
54
+ if (typeof opt.inputFormat === 'string' && opt.inputFormat) args.push('--input-format', opt.inputFormat);
55
+ if (Array.isArray(opt.args)) args.push(...opt.args);
56
+
57
+ const maxBuffer = Number.isFinite(opt.maxBuffer) ? opt.maxBuffer : 50 * 1024 * 1024;
58
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'eyeling-eyelang-'));
59
+
60
+ try {
61
+ const inputFiles = normalizeEyelangInput(input).map((text, index) => {
62
+ const inputFile = path.join(dir, `input-${index + 1}.pl`);
63
+ fs.writeFileSync(inputFile, text, 'utf8');
64
+ return inputFile;
65
+ });
66
+
67
+ const eyelangCliPath = path.join(__dirname, 'lib', 'eyelang', 'bin.js');
68
+ const res = cp.spawnSync(process.execPath, [eyelangCliPath, ...args, ...inputFiles], { encoding: 'utf8', maxBuffer });
69
+
70
+ if (res.error) throw res.error;
71
+ if (res.stderr) process.stderr.write(res.stderr);
72
+
73
+ if (res.status !== 0) {
74
+ const err = new Error(res.stderr || `eyelang exited with code ${res.status}`);
75
+ err.code = res.status;
76
+ err.stdout = res.stdout;
77
+ err.stderr = res.stderr;
78
+ throw err;
79
+ }
80
+
81
+ return res.stdout;
82
+ } finally {
83
+ fs.rmSync(dir, { recursive: true, force: true });
84
+ }
85
+ }
86
+
87
+ async function loadEyelangModule() {
88
+ return import(pathToFileURL(path.join(__dirname, 'lib', 'eyelang', 'index.mjs')).href);
89
+ }
90
+
91
+ async function runEyelang(input = '', opt = {}) {
92
+ const eyelang = await loadEyelangModule();
93
+ return eyelang.run(input, opt || {});
94
+ }
95
+
96
+ async function reasonEyelang(input = '', opt = {}) {
97
+ const result = await runEyelang(input, opt || {});
98
+ return result.stdout;
99
+ }
100
+
13
101
  function reason(opt = {}, input = '') {
14
102
  if (input == null) input = '';
15
103
 
@@ -17,6 +105,8 @@ function reason(opt = {}, input = '') {
17
105
  if (Array.isArray(opt)) opt = { args: opt };
18
106
  if (opt == null || typeof opt !== 'object') opt = {};
19
107
 
108
+ if (normalizeEngineName(opt.engine) === 'eyelang') return reasonEyelangSync(opt, input);
109
+
20
110
  const args = [];
21
111
 
22
112
  // default: proof output OFF for API output (machine-friendly)
@@ -116,12 +206,16 @@ function reason(opt = {}, input = '') {
116
206
  }
117
207
 
118
208
  async function runAsync(input = '', opt = {}) {
119
- return engine.runAsync(input, opt || {});
209
+ const options = opt || {};
210
+ if (normalizeEngineName(options.engine) === 'eyelang') return runEyelang(input, options);
211
+ return engine.runAsync(input, options);
120
212
  }
121
213
 
122
214
  module.exports = {
123
215
  reason,
124
216
  runAsync,
217
+ runEyelang,
218
+ reasonEyelang,
125
219
  reasonStream: bundleApi.reasonStream,
126
220
  reasonRdfJs: bundleApi.reasonRdfJs,
127
221
  rdfjs: dataFactory,
package/lib/builtins.js CHANGED
@@ -1877,17 +1877,7 @@ function evalDatatypeInspectionBuiltin(g, subst, kind) {
1877
1877
  const dt = literalDatatypeIri(g.s);
1878
1878
  if (dt === null) return [];
1879
1879
  valueTerm = internIri(dt);
1880
- const out = evalBindBuiltinObject(g.o, valueTerm, subst);
1881
-
1882
- // OWL 2 RL datatype rules often need common string literals to also
1883
- // participate in generic literal comparisons, while application rules still
1884
- // ask for their precise datatype explicitly. When the datatype output is
1885
- // unbound, expose rdfs:Literal as an additional super-datatype answer for
1886
- // xsd:string and rdf:langString; bound-object calls remain strictly exact.
1887
- if (g.o instanceof Var && (dt === XSD_STRING_DT || dt === RDF_LANGSTRING_DT)) {
1888
- out.push(...evalBindBuiltinObject(g.o, internIri(RDFS_LITERAL_DT), subst));
1889
- }
1890
- return out;
1880
+ return evalBindBuiltinObject(g.o, valueTerm, subst);
1891
1881
  } else if (kind === 'lexicalForm') {
1892
1882
  valueTerm = makeStringLiteral(literalLexicalValue(g.s.value));
1893
1883
  } else if (kind === 'language') {
package/lib/cli.js CHANGED
@@ -805,6 +805,7 @@ async function main() {
805
805
  `Options:\n` +
806
806
  ` -a, --ast Print parsed AST as JSON and exit.\n` +
807
807
  ` --builtin <module.js> Load a custom builtin module (repeatable).\n` +
808
+ ` --engine <n3|eyelang> Select the N3 engine (default) or eyelang engine.\n` +
808
809
  ` -d, --deterministic-skolem Make log:skolem stable across reasoning runs.\n` +
809
810
  ` -e, --enforce-https Rewrite http:// IRIs to https:// for log dereferencing builtins.\n` +
810
811
  ` -h, --help Show this help and exit.\n` +
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ import('./cli.mjs').then(({ main }) => main(process.argv.slice(2))).catch((error) => {
5
+ console.error(`eyelang: ${error && error.message ? error.message : String(error)}`);
6
+ process.exit(1);
7
+ });
@@ -0,0 +1,81 @@
1
+ // Aggregation builtins that run a inner goal and collect, count, sum, or select the best answers.
2
+ // Each handler clones the solver so the inner goal can enumerate independently of the outer goal.
3
+ import { compareTerms, copyResolved, isDecimalInteger, lexicalValue, listFromItems, numberTerm, numberTextFromDouble, parseFiniteNumber, unify } from '../term.mjs';
4
+
5
+ export const aggregationBuiltins = {
6
+ register(registry) {
7
+ registry.add('findall', 3, findall);
8
+ registry.add('countall', 2, countall);
9
+ registry.add('sumall', 3, sumall);
10
+ registry.add('aggregate_min', 5, aggregateBest(true));
11
+ registry.add('aggregate_max', 5, aggregateBest(false));
12
+ }
13
+ };
14
+
15
+ function* findall({ solver, goal, env }) {
16
+ const [template, innerGoal, bag] = goal.args;
17
+ const collector = solver.cloneForInnerGoal(10000000);
18
+ const collected = [];
19
+ for (const answerEnv of collector.solve([innerGoal], env.clone(), 0)) collected.push(copyResolved(template, answerEnv));
20
+ const next = env.clone();
21
+ if (unify(bag, listFromItems(collected), next)) yield next;
22
+ }
23
+
24
+ function* countall({ solver, goal, env }) {
25
+ const [innerGoal, count] = goal.args;
26
+ const collector = solver.cloneForInnerGoal(10000000);
27
+ let n = 0;
28
+ for (const _ of collector.solve([innerGoal], env.clone(), 0)) n++;
29
+ const next = env.clone();
30
+ if (unify(count, numberTerm(n), next)) yield next;
31
+ }
32
+
33
+ function* sumall({ solver, goal, env }) {
34
+ const [template, innerGoal, sum] = goal.args;
35
+ const collector = solver.cloneForInnerGoal(10000000);
36
+ let intSum = 0n;
37
+ let floatMode = false;
38
+ let floatSum = 0;
39
+ for (const answerEnv of collector.solve([innerGoal], env.clone(), 0)) {
40
+ const text = lexicalValue(template, answerEnv);
41
+ if (text == null) return;
42
+ if (!floatMode && isDecimalInteger(text)) intSum += BigInt(text);
43
+ else {
44
+ const value = parseFiniteNumber(text);
45
+ if (value == null) return;
46
+ if (!floatMode) { floatSum = Number(intSum); floatMode = true; }
47
+ floatSum += value;
48
+ }
49
+ }
50
+ const result = floatMode ? numberTextFromDouble(floatSum) : intSum.toString();
51
+ const next = env.clone();
52
+ if (unify(sum, numberTerm(result), next)) yield next;
53
+ }
54
+
55
+ function aggregateBest(wantMin) {
56
+ return function* ({ solver, goal, env }) {
57
+ const [keyTemplate, valueTemplate, innerGoal, bestKey, bestValue] = goal.args;
58
+ const collector = solver.cloneForInnerGoal(10000000);
59
+ let has = false;
60
+ let key = null;
61
+ let value = null;
62
+ for (const answerEnv of collector.solve([innerGoal], env.clone(), 0)) {
63
+ const candidateKey = copyResolved(keyTemplate, answerEnv);
64
+ const candidateValue = copyResolved(valueTemplate, answerEnv);
65
+ if (!has) {
66
+ has = true;
67
+ key = candidateKey;
68
+ value = candidateValue;
69
+ } else {
70
+ const cmp = compareTerms(candidateKey, key);
71
+ if ((wantMin && cmp < 0) || (!wantMin && cmp > 0)) {
72
+ key = candidateKey;
73
+ value = candidateValue;
74
+ }
75
+ }
76
+ }
77
+ if (!has) return;
78
+ const next = env.clone();
79
+ if (unify(bestKey, key, next) && unify(bestValue, value, next)) yield next;
80
+ };
81
+ }
@@ -0,0 +1,144 @@
1
+ // Reusable alphametic addition solver.
2
+ // It evaluates column constraints right-to-left, so examples such as
3
+ // SEND+MORE=MONEY and DONALD+GERALD=ROBERT do not need to express digit search
4
+ // with many relational select/3 and arithmetic goals.
5
+ import { atom, deref, listFromItems, numberTerm, properListItems, unify } from '../term.mjs';
6
+
7
+ export const alphameticBuiltins = {
8
+ register(registry) {
9
+ registry.add('alphametic_sum', 5, alphameticSum, {
10
+ fallbackWhenNotReady: true,
11
+ ready: alphameticReady,
12
+ });
13
+ }
14
+ };
15
+
16
+ function alphameticReady(goal, env) {
17
+ return atomList(goal.args[0], env) !== null && wordList(goal.args[1], env) !== null && atomList(goal.args[2], env) !== null;
18
+ }
19
+
20
+ function* alphameticSum({ goal, env }) {
21
+ const letters = atomList(goal.args[0], env);
22
+ const addends = wordList(goal.args[1], env);
23
+ const result = atomList(goal.args[2], env);
24
+ if (!letters || !addends || !result || letters.length > 10 || addends.length === 0) return;
25
+
26
+ const letterSet = new Set(letters);
27
+ for (const word of [...addends, result]) for (const letter of word) if (!letterSet.has(letter)) return;
28
+
29
+ const leading = new Set();
30
+ for (const word of [...addends, result]) if (word.length > 1) leading.add(word[0]);
31
+ const maxLen = Math.max(result.length, ...addends.map((word) => word.length));
32
+ const assignment = new Map();
33
+ const used = Array(10).fill(false);
34
+
35
+ function canUse(letter, digit) {
36
+ return !used[digit] && !(digit === 0 && leading.has(letter));
37
+ }
38
+
39
+ function assignDigit(letter, digit) {
40
+ assignment.set(letter, digit);
41
+ used[digit] = true;
42
+ }
43
+
44
+ function unassignDigit(letter, digit) {
45
+ assignment.delete(letter);
46
+ used[digit] = false;
47
+ }
48
+
49
+ function* assignAddends(column, carry, index, sum) {
50
+ if (index >= addends.length) {
51
+ yield* finishColumn(column, sum);
52
+ return;
53
+ }
54
+ const word = addends[index];
55
+ const letter = word[word.length - 1 - column];
56
+ if (letter === undefined) {
57
+ yield* assignAddends(column, carry, index + 1, sum);
58
+ return;
59
+ }
60
+ const assigned = assignment.get(letter);
61
+ if (assigned !== undefined) {
62
+ yield* assignAddends(column, carry, index + 1, sum + assigned);
63
+ return;
64
+ }
65
+ for (let digit = 0; digit <= 9; digit++) {
66
+ if (!canUse(letter, digit)) continue;
67
+ assignDigit(letter, digit);
68
+ yield* assignAddends(column, carry, index + 1, sum + digit);
69
+ unassignDigit(letter, digit);
70
+ }
71
+ }
72
+
73
+ function* finishColumn(column, sum) {
74
+ const resultLetter = result[result.length - 1 - column];
75
+ const digit = sum % 10;
76
+ const nextCarry = Math.floor(sum / 10);
77
+ if (resultLetter === undefined) {
78
+ if (digit === 0) yield* solveColumn(column + 1, nextCarry);
79
+ return;
80
+ }
81
+ const assigned = assignment.get(resultLetter);
82
+ if (assigned !== undefined) {
83
+ if (assigned === digit) yield* solveColumn(column + 1, nextCarry);
84
+ return;
85
+ }
86
+ if (!canUse(resultLetter, digit)) return;
87
+ assignDigit(resultLetter, digit);
88
+ yield* solveColumn(column + 1, nextCarry);
89
+ unassignDigit(resultLetter, digit);
90
+ }
91
+
92
+ function* solveColumn(column, carry) {
93
+ if (column >= maxLen) {
94
+ if (carry !== 0) return;
95
+ if (assignment.size !== letters.length) return;
96
+ yield new Map(assignment);
97
+ return;
98
+ }
99
+ yield* assignAddends(column, carry, 0, carry);
100
+ }
101
+
102
+ for (const solution of solveColumn(0, 0)) {
103
+ const digitTerms = letters.map((letter) => numberTerm(String(solution.get(letter))));
104
+ const values = [...addends, result].map((word) => wordValue(word, solution));
105
+ const valueTerms = values.map((value) => numberTerm(String(value)));
106
+ const next = env.clone();
107
+ if (unify(goal.args[3], listFromItems(digitTerms), next) && unify(goal.args[4], listFromItems(valueTerms), next)) yield next;
108
+ }
109
+ }
110
+
111
+ function wordValue(word, assignment) {
112
+ let value = 0;
113
+ for (const letter of word) value = value * 10 + assignment.get(letter);
114
+ return value;
115
+ }
116
+
117
+ function atomList(term, env) {
118
+ const items = properListItems(term, env);
119
+ if (!items) return null;
120
+ const out = [];
121
+ for (const item of items) {
122
+ const text = atomKey(deref(item, env));
123
+ if (text == null) return null;
124
+ out.push(text);
125
+ }
126
+ return out;
127
+ }
128
+
129
+ function wordList(term, env) {
130
+ const items = properListItems(term, env);
131
+ if (!items) return null;
132
+ const out = [];
133
+ for (const item of items) {
134
+ const word = atomList(item, env);
135
+ if (!word) return null;
136
+ out.push(word);
137
+ }
138
+ return out;
139
+ }
140
+
141
+ function atomKey(term) {
142
+ if (term.type === 'atom' || term.type === 'string' || term.type === 'number') return term.name;
143
+ return null;
144
+ }