eyeling 1.32.0 → 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 (630) hide show
  1. package/README.md +123 -18
  2. package/bin/eyeling.cjs +56 -4
  3. package/browser.d.ts +63 -0
  4. package/dist/browser/eyeling.browser.js +298 -14
  5. package/examples/eyelang/INTEGRATION.md +13 -0
  6. package/examples/eyelang/README.md +628 -0
  7. package/examples/eyelang/SPEC.md +684 -0
  8. package/examples/eyelang/access-control-policy.pl +52 -0
  9. package/examples/eyelang/ackermann.pl +46 -0
  10. package/examples/eyelang/age.pl +28 -0
  11. package/examples/eyelang/aliases-and-namespaces.pl +22 -0
  12. package/examples/eyelang/alignment-demo.pl +44 -0
  13. package/examples/eyelang/allen-interval-calculus.pl +64 -0
  14. package/examples/eyelang/ancestor.pl +21 -0
  15. package/examples/eyelang/animal.pl +21 -0
  16. package/examples/eyelang/annotation-rdf12.ttl +12 -0
  17. package/examples/eyelang/annotation.pl +34 -0
  18. package/examples/eyelang/auroracare.pl +309 -0
  19. package/examples/eyelang/backward.pl +12 -0
  20. package/examples/eyelang/basic-monadic.pl +10018 -0
  21. package/examples/eyelang/bayes-diagnosis.pl +108 -0
  22. package/examples/eyelang/bayes-therapy.pl +182 -0
  23. package/examples/eyelang/beam-deflection.pl +50 -0
  24. package/examples/eyelang/blocks-world-planning.pl +75 -0
  25. package/examples/eyelang/bmi.pl +232 -0
  26. package/examples/eyelang/braking-safety-worlds.pl +69 -0
  27. package/examples/eyelang/buck-converter-design.pl +78 -0
  28. package/examples/eyelang/cache-performance.pl +54 -0
  29. package/examples/eyelang/canary-release.pl +49 -0
  30. package/examples/eyelang/cat-koko.pl +24 -0
  31. package/examples/eyelang/clinical-trial-screening.pl +92 -0
  32. package/examples/eyelang/collatz-1000.pl +14 -0
  33. package/examples/eyelang/combinatorics-findall-sort.pl +37 -0
  34. package/examples/eyelang/competitive-enzyme-kinetics.pl +78 -0
  35. package/examples/eyelang/complex-matrix-stability.pl +45 -0
  36. package/examples/eyelang/complex.pl +121 -0
  37. package/examples/eyelang/composition-of-injective-functions-is-injective.pl +50 -0
  38. package/examples/eyelang/context-association.pl +53 -0
  39. package/examples/eyelang/control-system.pl +72 -0
  40. package/examples/eyelang/cryptarithmetic-send-more-money.pl +49 -0
  41. package/examples/eyelang/cyclic-path.pl +16 -0
  42. package/examples/eyelang/d3-group.pl +100 -0
  43. package/examples/eyelang/dairy-energy-balance.pl +65 -0
  44. package/examples/eyelang/data-negotiation.pl +39 -0
  45. package/examples/eyelang/deep-taxonomy-10.pl +115 -0
  46. package/examples/eyelang/deep-taxonomy-100.pl +385 -0
  47. package/examples/eyelang/deep-taxonomy-1000.pl +3085 -0
  48. package/examples/eyelang/deep-taxonomy-10000.pl +30094 -0
  49. package/examples/eyelang/deep-taxonomy-100000.pl +300184 -0
  50. package/examples/eyelang/delfour.pl +281 -0
  51. package/examples/eyelang/dense-hamiltonian-cycle.pl +92 -0
  52. package/examples/eyelang/deontic-logic.pl +52 -0
  53. package/examples/eyelang/derived-backward-rule.pl +30 -0
  54. package/examples/eyelang/derived-rule.pl +27 -0
  55. package/examples/eyelang/diamond-property.pl +38 -0
  56. package/examples/eyelang/dijkstra-findall-sort.pl +44 -0
  57. package/examples/eyelang/dijkstra-risk-path.pl +86 -0
  58. package/examples/eyelang/dijkstra.pl +46 -0
  59. package/examples/eyelang/dining-philosophers.pl +140 -0
  60. package/examples/eyelang/directional-language.ttl +9 -0
  61. package/examples/eyelang/dog.pl +25 -0
  62. package/examples/eyelang/drone-corridor-planner.pl +51 -0
  63. package/examples/eyelang/easter-computus.pl +89 -0
  64. package/examples/eyelang/electrical-rc-filter.pl +36 -0
  65. package/examples/eyelang/epidemic-policy.pl +67 -0
  66. package/examples/eyelang/equivalence-classes-overlap-implies-same-class.pl +27 -0
  67. package/examples/eyelang/eulerian-path.pl +85 -0
  68. package/examples/eyelang/ev-range-worlds.pl +82 -0
  69. package/examples/eyelang/exact-cover-sudoku.pl +113 -0
  70. package/examples/eyelang/existential-rule.pl +18 -0
  71. package/examples/eyelang/exoplanet-validation-worlds.pl +88 -0
  72. package/examples/eyelang/expression-eval.pl +43 -0
  73. package/examples/eyelang/eyeling-ackermann.n3 +41 -0
  74. package/examples/eyelang/eyeling-age-threshold.n3 +12 -0
  75. package/examples/eyelang/eyeling-alignment-demo.n3 +11 -0
  76. package/examples/eyelang/eyeling-allen-interval-calculus-small.n3 +13 -0
  77. package/examples/eyelang/eyeling-backward-recursion.n3 +11 -0
  78. package/examples/eyelang/eyeling-backward.n3 +10 -0
  79. package/examples/eyelang/eyeling-basic-monadic-small.n3 +11 -0
  80. package/examples/eyelang/eyeling-bmi.n3 +10 -0
  81. package/examples/eyelang/eyeling-cat-koko.n3 +15 -0
  82. package/examples/eyelang/eyeling-collatz-small.n3 +11 -0
  83. package/examples/eyelang/eyeling-collection.n3 +11 -0
  84. package/examples/eyelang/eyeling-complex-arithmetic.n3 +10 -0
  85. package/examples/eyelang/eyeling-context-association.n3 +11 -0
  86. package/examples/eyelang/eyeling-control-system-small.n3 +11 -0
  87. package/examples/eyelang/eyeling-crypto-builtins-extra.n3 +10 -0
  88. package/examples/eyelang/eyeling-crypto-builtins.n3 +8 -0
  89. package/examples/eyelang/eyeling-deep-taxonomy-10.n3 +18 -0
  90. package/examples/eyelang/eyeling-derived-backward-rule-flat.n3 +10 -0
  91. package/examples/eyelang/eyeling-derived-rule-flat.n3 +9 -0
  92. package/examples/eyelang/eyeling-digital-product-passport-small.n3 +11 -0
  93. package/examples/eyelang/eyeling-dijkstra-tiny.n3 +14 -0
  94. package/examples/eyelang/eyeling-dog-license.n3 +13 -0
  95. package/examples/eyelang/eyeling-drone-corridor-planner-small.n3 +13 -0
  96. package/examples/eyelang/eyeling-equals.n3 +8 -0
  97. package/examples/eyelang/eyeling-equivalence-classes.n3 +11 -0
  98. package/examples/eyelang/eyeling-euler-identity.n3 +9 -0
  99. package/examples/eyelang/eyeling-existential-rule.n3 +9 -0
  100. package/examples/eyelang/eyeling-expression-eval.n3 +11 -0
  101. package/examples/eyelang/eyeling-family-cousins-extended.n3 +12 -0
  102. package/examples/eyelang/eyeling-fastpow.n3 +10 -0
  103. package/examples/eyelang/eyeling-fibonacci.n3 +44 -0
  104. package/examples/eyelang/eyeling-french-cities-reachability.n3 +22 -0
  105. package/examples/eyelang/eyeling-goldbach-small.n3 +22 -0
  106. package/examples/eyelang/eyeling-good-cobbler.n3 +9 -0
  107. package/examples/eyelang/eyeling-list-builtins.n3 +10 -0
  108. package/examples/eyelang/eyeling-list-collection-extra.n3 +9 -0
  109. package/examples/eyelang/eyeling-math-builtins.n3 +9 -0
  110. package/examples/eyelang/eyeling-string-builtins-extra.n3 +9 -0
  111. package/examples/eyelang/eyeling-string-builtins.n3 +10 -0
  112. package/examples/eyelang/eyeling-time-builtins.n3 +11 -0
  113. package/examples/eyelang/eyeling-time-components-extra.n3 +10 -0
  114. package/examples/eyelang/eyeling-witch.n3 +10 -0
  115. package/examples/eyelang/family-cousins.n3 +17 -0
  116. package/examples/eyelang/family-cousins.pl +65 -0
  117. package/examples/eyelang/fastpow.pl +53 -0
  118. package/examples/eyelang/fft8-numeric.pl +83 -0
  119. package/examples/eyelang/fibonacci.pl +53 -0
  120. package/examples/eyelang/field-nitrogen-balance.pl +70 -0
  121. package/examples/eyelang/flandor.pl +296 -0
  122. package/examples/eyelang/floating-point.pl +23 -0
  123. package/examples/eyelang/four-color-map.pl +127 -0
  124. package/examples/eyelang/fundamental-theorem-arithmetic.pl +113 -0
  125. package/examples/eyelang/gcd-bezout-identity.pl +48 -0
  126. package/examples/eyelang/gd-step-certified.pl +158 -0
  127. package/examples/eyelang/gdpr-compliance.pl +69 -0
  128. package/examples/eyelang/goldbach-1000.pl +185 -0
  129. package/examples/eyelang/good-cobbler.pl +14 -0
  130. package/examples/eyelang/gps.pl +152 -0
  131. package/examples/eyelang/graph-reachability.pl +36 -0
  132. package/examples/eyelang/gray-code-counter.pl +48 -0
  133. package/examples/eyelang/greatest-lower-bound-uniqueness.pl +28 -0
  134. package/examples/eyelang/group-inverse-uniqueness.pl +34 -0
  135. package/examples/eyelang/hamiltonian-cycle.pl +55 -0
  136. package/examples/eyelang/hamiltonian-path.pl +49 -0
  137. package/examples/eyelang/hamming-code.pl +105 -0
  138. package/examples/eyelang/hanoi.pl +20 -0
  139. package/examples/eyelang/heat-loss.pl +51 -0
  140. package/examples/eyelang/heron-theorem.pl +36 -0
  141. package/examples/eyelang/ideal-gas-law.pl +37 -0
  142. package/examples/eyelang/illegitimate-reasoning.pl +88 -0
  143. package/examples/eyelang/kaprekar.pl +32 -0
  144. package/examples/eyelang/law-of-cosines.pl +31 -0
  145. package/examples/eyelang/least-squares-regression.pl +81 -0
  146. package/examples/eyelang/list-collection.pl +33 -0
  147. package/examples/eyelang/lldm.pl +78 -0
  148. package/examples/eyelang/manufacturing-quality-control.pl +73 -0
  149. package/examples/eyelang/matrix.pl +296 -0
  150. package/examples/eyelang/microgrid-dispatch.pl +85 -0
  151. package/examples/eyelang/monkey-bananas.pl +45 -0
  152. package/examples/eyelang/n-queens.pl +23 -0
  153. package/examples/eyelang/n3-builtins.n3 +28 -0
  154. package/examples/eyelang/network-sla.pl +48 -0
  155. package/examples/eyelang/newton-raphson.pl +49 -0
  156. package/examples/eyelang/nixon-diamond.pl +37 -0
  157. package/examples/eyelang/odrl-dpv-healthcare-risk-ranked.pl +266 -0
  158. package/examples/eyelang/odrl-dpv-risk-ranked.pl +320 -0
  159. package/examples/eyelang/orbital-transfer-design.pl +113 -0
  160. package/examples/eyelang/output/access-control-policy.pl +2 -0
  161. package/examples/eyelang/output/ackermann.pl +12 -0
  162. package/examples/eyelang/output/age.pl +2 -0
  163. package/examples/eyelang/output/aliases-and-namespaces.pl +5 -0
  164. package/examples/eyelang/output/alignment-demo.pl +32 -0
  165. package/examples/eyelang/output/allen-interval-calculus.pl +154 -0
  166. package/examples/eyelang/output/ancestor.pl +6 -0
  167. package/examples/eyelang/output/animal.pl +4 -0
  168. package/examples/eyelang/output/annotation-rdf12.ttl +1 -0
  169. package/examples/eyelang/output/annotation.pl +4 -0
  170. package/examples/eyelang/output/auroracare.pl +117 -0
  171. package/examples/eyelang/output/backward.pl +1 -0
  172. package/examples/eyelang/output/basic-monadic.pl +1518 -0
  173. package/examples/eyelang/output/bayes-diagnosis.pl +13 -0
  174. package/examples/eyelang/output/bayes-therapy.pl +23 -0
  175. package/examples/eyelang/output/beam-deflection.pl +5 -0
  176. package/examples/eyelang/output/blocks-world-planning.pl +4 -0
  177. package/examples/eyelang/output/bmi.pl +32 -0
  178. package/examples/eyelang/output/braking-safety-worlds.pl +18 -0
  179. package/examples/eyelang/output/buck-converter-design.pl +6 -0
  180. package/examples/eyelang/output/cache-performance.pl +4 -0
  181. package/examples/eyelang/output/canary-release.pl +5 -0
  182. package/examples/eyelang/output/cat-koko.pl +3 -0
  183. package/examples/eyelang/output/clinical-trial-screening.pl +9 -0
  184. package/examples/eyelang/output/collatz-1000.pl +1000 -0
  185. package/examples/eyelang/output/combinatorics-findall-sort.pl +2 -0
  186. package/examples/eyelang/output/competitive-enzyme-kinetics.pl +6 -0
  187. package/examples/eyelang/output/complex-matrix-stability.pl +5 -0
  188. package/examples/eyelang/output/complex.pl +1 -0
  189. package/examples/eyelang/output/composition-of-injective-functions-is-injective.pl +2 -0
  190. package/examples/eyelang/output/context-association.pl +3 -0
  191. package/examples/eyelang/output/control-system.pl +6 -0
  192. package/examples/eyelang/output/cryptarithmetic-send-more-money.pl +6 -0
  193. package/examples/eyelang/output/cyclic-path.pl +16 -0
  194. package/examples/eyelang/output/d3-group.pl +2 -0
  195. package/examples/eyelang/output/dairy-energy-balance.pl +13 -0
  196. package/examples/eyelang/output/data-negotiation.pl +1 -0
  197. package/examples/eyelang/output/deep-taxonomy-10.pl +16 -0
  198. package/examples/eyelang/output/deep-taxonomy-100.pl +16 -0
  199. package/examples/eyelang/output/deep-taxonomy-1000.pl +16 -0
  200. package/examples/eyelang/output/deep-taxonomy-10000.pl +16 -0
  201. package/examples/eyelang/output/deep-taxonomy-100000.pl +16 -0
  202. package/examples/eyelang/output/delfour.pl +31 -0
  203. package/examples/eyelang/output/dense-hamiltonian-cycle.pl +4 -0
  204. package/examples/eyelang/output/deontic-logic.pl +4 -0
  205. package/examples/eyelang/output/derived-backward-rule.pl +3 -0
  206. package/examples/eyelang/output/derived-rule.pl +2 -0
  207. package/examples/eyelang/output/diamond-property.pl +4 -0
  208. package/examples/eyelang/output/dijkstra-findall-sort.pl +2 -0
  209. package/examples/eyelang/output/dijkstra-risk-path.pl +29 -0
  210. package/examples/eyelang/output/dijkstra.pl +16 -0
  211. package/examples/eyelang/output/dining-philosophers.pl +350 -0
  212. package/examples/eyelang/output/directional-language.ttl +1 -0
  213. package/examples/eyelang/output/dog.pl +1 -0
  214. package/examples/eyelang/output/drone-corridor-planner.pl +17 -0
  215. package/examples/eyelang/output/easter-computus.pl +30 -0
  216. package/examples/eyelang/output/electrical-rc-filter.pl +3 -0
  217. package/examples/eyelang/output/epidemic-policy.pl +14 -0
  218. package/examples/eyelang/output/equivalence-classes-overlap-implies-same-class.pl +18 -0
  219. package/examples/eyelang/output/eulerian-path.pl +3 -0
  220. package/examples/eyelang/output/ev-range-worlds.pl +19 -0
  221. package/examples/eyelang/output/exact-cover-sudoku.pl +3 -0
  222. package/examples/eyelang/output/existential-rule.pl +2 -0
  223. package/examples/eyelang/output/exoplanet-validation-worlds.pl +22 -0
  224. package/examples/eyelang/output/expression-eval.pl +1 -0
  225. package/examples/eyelang/output/eyeling-ackermann.n3 +12 -0
  226. package/examples/eyelang/output/eyeling-age-threshold.n3 +4 -0
  227. package/examples/eyelang/output/eyeling-alignment-demo.n3 +1 -0
  228. package/examples/eyelang/output/eyeling-allen-interval-calculus-small.n3 +3 -0
  229. package/examples/eyelang/output/eyeling-backward-recursion.n3 +9 -0
  230. package/examples/eyelang/output/eyeling-backward.n3 +1 -0
  231. package/examples/eyelang/output/eyeling-basic-monadic-small.n3 +8 -0
  232. package/examples/eyelang/output/eyeling-bmi.n3 +2 -0
  233. package/examples/eyelang/output/eyeling-cat-koko.n3 +3 -0
  234. package/examples/eyelang/output/eyeling-collatz-small.n3 +3 -0
  235. package/examples/eyelang/output/eyeling-collection.n3 +1 -0
  236. package/examples/eyelang/output/eyeling-complex-arithmetic.n3 +5 -0
  237. package/examples/eyelang/output/eyeling-context-association.n3 +4 -0
  238. package/examples/eyelang/output/eyeling-control-system-small.n3 +4 -0
  239. package/examples/eyelang/output/eyeling-crypto-builtins-extra.n3 +3 -0
  240. package/examples/eyelang/output/eyeling-crypto-builtins.n3 +2 -0
  241. package/examples/eyelang/output/eyeling-deep-taxonomy-10.n3 +32 -0
  242. package/examples/eyelang/output/eyeling-derived-backward-rule-flat.n3 +4 -0
  243. package/examples/eyelang/output/eyeling-derived-rule-flat.n3 +2 -0
  244. package/examples/eyelang/output/eyeling-digital-product-passport-small.n3 +3 -0
  245. package/examples/eyelang/output/eyeling-dijkstra-tiny.n3 +9 -0
  246. package/examples/eyelang/output/eyeling-dog-license.n3 +1 -0
  247. package/examples/eyelang/output/eyeling-drone-corridor-planner-small.n3 +5 -0
  248. package/examples/eyelang/output/eyeling-equals.n3 +1 -0
  249. package/examples/eyelang/output/eyeling-equivalence-classes.n3 +2 -0
  250. package/examples/eyelang/output/eyeling-euler-identity.n3 +3 -0
  251. package/examples/eyelang/output/eyeling-existential-rule.n3 +4 -0
  252. package/examples/eyelang/output/eyeling-expression-eval.n3 +3 -0
  253. package/examples/eyelang/output/eyeling-family-cousins-extended.n3 +6 -0
  254. package/examples/eyelang/output/eyeling-fastpow.n3 +4 -0
  255. package/examples/eyelang/output/eyeling-fibonacci.n3 +6 -0
  256. package/examples/eyelang/output/eyeling-french-cities-reachability.n3 +25 -0
  257. package/examples/eyelang/output/eyeling-goldbach-small.n3 +2 -0
  258. package/examples/eyelang/output/eyeling-good-cobbler.n3 +2 -0
  259. package/examples/eyelang/output/eyeling-list-builtins.n3 +6 -0
  260. package/examples/eyelang/output/eyeling-list-collection-extra.n3 +5 -0
  261. package/examples/eyelang/output/eyeling-math-builtins.n3 +5 -0
  262. package/examples/eyelang/output/eyeling-string-builtins-extra.n3 +3 -0
  263. package/examples/eyelang/output/eyeling-string-builtins.n3 +4 -0
  264. package/examples/eyelang/output/eyeling-time-builtins.n3 +4 -0
  265. package/examples/eyelang/output/eyeling-time-components-extra.n3 +5 -0
  266. package/examples/eyelang/output/eyeling-witch.n3 +2 -0
  267. package/examples/eyelang/output/family-cousins.n3 +8 -0
  268. package/examples/eyelang/output/family-cousins.pl +28 -0
  269. package/examples/eyelang/output/fastpow.pl +6 -0
  270. package/examples/eyelang/output/fft8-numeric.pl +4 -0
  271. package/examples/eyelang/output/fibonacci.pl +6 -0
  272. package/examples/eyelang/output/field-nitrogen-balance.pl +21 -0
  273. package/examples/eyelang/output/flandor.pl +43 -0
  274. package/examples/eyelang/output/floating-point.pl +9 -0
  275. package/examples/eyelang/output/four-color-map.pl +3 -0
  276. package/examples/eyelang/output/fundamental-theorem-arithmetic.pl +9 -0
  277. package/examples/eyelang/output/gcd-bezout-identity.pl +36 -0
  278. package/examples/eyelang/output/gd-step-certified.pl +79 -0
  279. package/examples/eyelang/output/gdpr-compliance.pl +6 -0
  280. package/examples/eyelang/output/goldbach-1000.pl +667 -0
  281. package/examples/eyelang/output/good-cobbler.pl +1 -0
  282. package/examples/eyelang/output/gps.pl +21 -0
  283. package/examples/eyelang/output/graph-reachability.pl +3 -0
  284. package/examples/eyelang/output/gray-code-counter.pl +1 -0
  285. package/examples/eyelang/output/greatest-lower-bound-uniqueness.pl +2 -0
  286. package/examples/eyelang/output/group-inverse-uniqueness.pl +2 -0
  287. package/examples/eyelang/output/hamiltonian-cycle.pl +4 -0
  288. package/examples/eyelang/output/hamiltonian-path.pl +121 -0
  289. package/examples/eyelang/output/hamming-code.pl +6 -0
  290. package/examples/eyelang/output/hanoi.pl +1 -0
  291. package/examples/eyelang/output/heat-loss.pl +5 -0
  292. package/examples/eyelang/output/heron-theorem.pl +4 -0
  293. package/examples/eyelang/output/ideal-gas-law.pl +3 -0
  294. package/examples/eyelang/output/illegitimate-reasoning.pl +15 -0
  295. package/examples/eyelang/output/kaprekar.pl +8 -0
  296. package/examples/eyelang/output/law-of-cosines.pl +3 -0
  297. package/examples/eyelang/output/least-squares-regression.pl +5 -0
  298. package/examples/eyelang/output/list-collection.pl +3 -0
  299. package/examples/eyelang/output/lldm.pl +6 -0
  300. package/examples/eyelang/output/manufacturing-quality-control.pl +6 -0
  301. package/examples/eyelang/output/matrix.pl +10 -0
  302. package/examples/eyelang/output/microgrid-dispatch.pl +6 -0
  303. package/examples/eyelang/output/monkey-bananas.pl +5 -0
  304. package/examples/eyelang/output/n-queens.pl +93 -0
  305. package/examples/eyelang/output/n3-builtins.n3 +6 -0
  306. package/examples/eyelang/output/network-sla.pl +4 -0
  307. package/examples/eyelang/output/newton-raphson.pl +3 -0
  308. package/examples/eyelang/output/nixon-diamond.pl +5 -0
  309. package/examples/eyelang/output/odrl-dpv-healthcare-risk-ranked.pl +42 -0
  310. package/examples/eyelang/output/odrl-dpv-risk-ranked.pl +120 -0
  311. package/examples/eyelang/output/orbital-transfer-design.pl +7 -0
  312. package/examples/eyelang/output/path-discovery.pl +3 -0
  313. package/examples/eyelang/output/peano-arithmetic.pl +3 -0
  314. package/examples/eyelang/output/peasant.pl +10 -0
  315. package/examples/eyelang/output/pendulum-period.pl +4 -0
  316. package/examples/eyelang/output/polynomial.pl +14 -0
  317. package/examples/eyelang/output/project-portfolio-optimization.pl +6 -0
  318. package/examples/eyelang/output/proof-contrapositive.pl +3 -0
  319. package/examples/eyelang/output/quadratic-formula.pl +6 -0
  320. package/examples/eyelang/output/quine-mccluskey.pl +3 -0
  321. package/examples/eyelang/output/radioactive-decay.pl +5 -0
  322. package/examples/eyelang/output/resilient-city-orchestration.pl +67 -0
  323. package/examples/eyelang/output/riemann-hypothesis.pl +12 -0
  324. package/examples/eyelang/output/sat-dpll.pl +5 -0
  325. package/examples/eyelang/output/security-incident-correlation.pl +3 -0
  326. package/examples/eyelang/output/service-impact.pl +11 -0
  327. package/examples/eyelang/output/sieve.pl +1 -0
  328. package/examples/eyelang/output/skolem-functions.pl +16 -0
  329. package/examples/eyelang/output/socket-age.pl +1 -0
  330. package/examples/eyelang/output/socket-family.pl +3 -0
  331. package/examples/eyelang/output/socrates.n3 +1 -0
  332. package/examples/eyelang/output/socrates.pl +2 -0
  333. package/examples/eyelang/output/statistics-summary.pl +4 -0
  334. package/examples/eyelang/output/sudoku.pl +2 -0
  335. package/examples/eyelang/output/superdense-coding.pl +6 -0
  336. package/examples/eyelang/output/traveling-salesman.pl +1 -0
  337. package/examples/eyelang/output/triple-term.n3 +2 -0
  338. package/examples/eyelang/output/turing.pl +12 -0
  339. package/examples/eyelang/output/vector-similarity.pl +4 -0
  340. package/examples/eyelang/output/witch.pl +7 -0
  341. package/examples/eyelang/output/wolf-goat-cabbage.pl +3 -0
  342. package/examples/eyelang/output/zebra.pl +3 -0
  343. package/examples/eyelang/path-discovery.pl +44998 -0
  344. package/examples/eyelang/peano-arithmetic.pl +31 -0
  345. package/examples/eyelang/peasant.pl +30 -0
  346. package/examples/eyelang/pendulum-period.pl +50 -0
  347. package/examples/eyelang/polynomial.pl +124 -0
  348. package/examples/eyelang/project-portfolio-optimization.pl +101 -0
  349. package/examples/eyelang/proof/age.pl +71 -0
  350. package/examples/eyelang/proof/aliases-and-namespaces.pl +78 -0
  351. package/examples/eyelang/proof/ancestor.pl +140 -0
  352. package/examples/eyelang/proof/animal.pl +68 -0
  353. package/examples/eyelang/proof/annotation.pl +80 -0
  354. package/examples/eyelang/proof/backward.pl +22 -0
  355. package/examples/eyelang/proof/cat-koko.pl +86 -0
  356. package/examples/eyelang/proof/data-negotiation.pl +76 -0
  357. package/examples/eyelang/proof/derived-rule.pl +43 -0
  358. package/examples/eyelang/proof/dog.pl +31 -0
  359. package/examples/eyelang/proof/electrical-rc-filter.pl +105 -0
  360. package/examples/eyelang/proof/existential-rule.pl +40 -0
  361. package/examples/eyelang/proof/floating-point.pl +160 -0
  362. package/examples/eyelang/proof/good-cobbler.pl +16 -0
  363. package/examples/eyelang/proof/group-inverse-uniqueness.pl +84 -0
  364. package/examples/eyelang/proof/list-collection.pl +52 -0
  365. package/examples/eyelang/proof/proof-contrapositive.pl +78 -0
  366. package/examples/eyelang/proof/socket-age.pl +32 -0
  367. package/examples/eyelang/proof/socket-family.pl +59 -0
  368. package/examples/eyelang/proof/socrates.pl +38 -0
  369. package/examples/eyelang/proof-contrapositive.pl +27 -0
  370. package/examples/eyelang/quadratic-formula.pl +54 -0
  371. package/examples/eyelang/quine-mccluskey.pl +143 -0
  372. package/examples/eyelang/radioactive-decay.pl +56 -0
  373. package/examples/eyelang/resilient-city-orchestration.pl +303 -0
  374. package/examples/eyelang/riemann-hypothesis.pl +110 -0
  375. package/examples/eyelang/sat-dpll.pl +80 -0
  376. package/examples/eyelang/security-incident-correlation.pl +69 -0
  377. package/examples/eyelang/service-impact.pl +41 -0
  378. package/examples/eyelang/sieve.pl +20 -0
  379. package/examples/eyelang/skolem-functions.pl +52 -0
  380. package/examples/eyelang/socket-age.pl +39 -0
  381. package/examples/eyelang/socket-family.pl +28 -0
  382. package/examples/eyelang/socrates.n3 +11 -0
  383. package/examples/eyelang/socrates.pl +19 -0
  384. package/examples/eyelang/statistics-summary.pl +54 -0
  385. package/examples/eyelang/sudoku.pl +20 -0
  386. package/examples/eyelang/superdense-coding.pl +84 -0
  387. package/examples/eyelang/traveling-salesman.pl +64 -0
  388. package/examples/eyelang/triple-term.n3 +9 -0
  389. package/examples/eyelang/turing.pl +67 -0
  390. package/examples/eyelang/vector-similarity.pl +56 -0
  391. package/examples/eyelang/witch.pl +38 -0
  392. package/examples/eyelang/wolf-goat-cabbage.pl +56 -0
  393. package/examples/eyelang/zebra.pl +44 -0
  394. package/eyelang.d.ts +92 -0
  395. package/eyeling-builtins.ttl +3 -3
  396. package/eyeling.js +298 -14
  397. package/index.d.ts +290 -283
  398. package/index.js +95 -1
  399. package/lib/builtins.js +297 -14
  400. package/lib/cli.js +1 -0
  401. package/lib/eyelang/bin.js +7 -0
  402. package/lib/eyelang/builtins/aggregation.mjs +81 -0
  403. package/lib/eyelang/builtins/alphametic.mjs +144 -0
  404. package/lib/eyelang/builtins/arithmetic.mjs +197 -0
  405. package/lib/eyelang/builtins/control.mjs +22 -0
  406. package/lib/eyelang/builtins/core.mjs +78 -0
  407. package/lib/eyelang/builtins/formula.mjs +42 -0
  408. package/lib/eyelang/builtins/lists.mjs +149 -0
  409. package/lib/eyelang/builtins/matrix.mjs +226 -0
  410. package/lib/eyelang/builtins/n3.mjs +483 -0
  411. package/lib/eyelang/builtins/number-theory.mjs +114 -0
  412. package/lib/eyelang/builtins/portfolio.mjs +73 -0
  413. package/lib/eyelang/builtins/registry.mjs +54 -0
  414. package/lib/eyelang/builtins/search.mjs +579 -0
  415. package/lib/eyelang/builtins/strings.mjs +41 -0
  416. package/lib/eyelang/builtins/sudoku.mjs +141 -0
  417. package/lib/eyelang/cli.mjs +192 -0
  418. package/lib/eyelang/explain.mjs +324 -0
  419. package/lib/eyelang/hash.mjs +294 -0
  420. package/lib/eyelang/index.mjs +48 -0
  421. package/lib/eyelang/parser.mjs +428 -0
  422. package/lib/eyelang/program.mjs +244 -0
  423. package/lib/eyelang/rdf.mjs +747 -0
  424. package/lib/eyelang/solver.mjs +237 -0
  425. package/lib/eyelang/term.mjs +328 -0
  426. package/package.json +15 -5
  427. package/test/builtins.test.js +49 -1
  428. package/test/eyelang/conformance/README.md +45 -0
  429. package/test/eyelang/conformance/cases/core/001_fact_output.pl +4 -0
  430. package/test/eyelang/conformance/cases/core/001_fact_query.query +1 -0
  431. package/test/eyelang/conformance/cases/core/002_rule_recursion.pl +7 -0
  432. package/test/eyelang/conformance/cases/core/002_rule_recursion.query +1 -0
  433. package/test/eyelang/conformance/cases/core/003_terms_and_readback.pl +16 -0
  434. package/test/eyelang/conformance/cases/core/003_terms_and_readback.query +1 -0
  435. package/test/eyelang/conformance/cases/core/004_conjunction_and_parentheses.pl +5 -0
  436. package/test/eyelang/conformance/cases/core/004_conjunction_and_parentheses.query +1 -0
  437. package/test/eyelang/conformance/cases/core/005_list_deconstruction.pl +6 -0
  438. package/test/eyelang/conformance/cases/core/005_list_deconstruction.query +1 -0
  439. package/test/eyelang/conformance/cases/core/006_comma_formula_data.pl +4 -0
  440. package/test/eyelang/conformance/cases/core/006_comma_formula_data.query +1 -0
  441. package/test/eyelang/conformance/cases/core/007_anonymous_variables.pl +5 -0
  442. package/test/eyelang/conformance/cases/core/007_anonymous_variables.query +1 -0
  443. package/test/eyelang/conformance/cases/core/008_graphic_atoms.pl +6 -0
  444. package/test/eyelang/conformance/cases/core/008_graphic_atoms.query +1 -0
  445. package/test/eyelang/conformance/cases/core/009_comments_and_whitespace.pl +5 -0
  446. package/test/eyelang/conformance/cases/core/009_comments_and_whitespace.query +1 -0
  447. package/test/eyelang/conformance/cases/core/010_variable_scope_and_reuse.pl +8 -0
  448. package/test/eyelang/conformance/cases/core/010_variable_scope_and_reuse.query +1 -0
  449. package/test/eyelang/conformance/cases/core/011_predicate_arity.pl +6 -0
  450. package/test/eyelang/conformance/cases/core/011_predicate_arity.query +1 -0
  451. package/test/eyelang/conformance/cases/core/012_nested_compound_unification.pl +5 -0
  452. package/test/eyelang/conformance/cases/core/012_nested_compound_unification.query +1 -0
  453. package/test/eyelang/conformance/cases/core/013_multiple_clauses_order.pl +6 -0
  454. package/test/eyelang/conformance/cases/core/013_multiple_clauses_order.query +1 -0
  455. package/test/eyelang/conformance/cases/core/014_failure_filters_answers.pl +7 -0
  456. package/test/eyelang/conformance/cases/core/014_failure_filters_answers.query +1 -0
  457. package/test/eyelang/conformance/cases/core/015_improper_list_unification.pl +6 -0
  458. package/test/eyelang/conformance/cases/core/015_improper_list_unification.query +1 -0
  459. package/test/eyelang/conformance/cases/core/016_zero_arity_compound.pl +4 -0
  460. package/test/eyelang/conformance/cases/core/016_zero_arity_compound.query +1 -0
  461. package/test/eyelang/conformance/cases/core/017_three_step_recursion.pl +8 -0
  462. package/test/eyelang/conformance/cases/core/017_three_step_recursion.query +1 -0
  463. package/test/eyelang/conformance/cases/core/018_quoted_atom_readback.pl +6 -0
  464. package/test/eyelang/conformance/cases/core/018_quoted_atom_readback.query +1 -0
  465. package/test/eyelang/conformance/cases/core/019_parenthesized_three_conjuncts.pl +7 -0
  466. package/test/eyelang/conformance/cases/core/019_parenthesized_three_conjuncts.query +1 -0
  467. package/test/eyelang/conformance/cases/core/020_nested_list_terms.pl +5 -0
  468. package/test/eyelang/conformance/cases/core/020_nested_list_terms.query +1 -0
  469. package/test/eyelang/conformance/cases/core/021_repeated_variable_head.pl +7 -0
  470. package/test/eyelang/conformance/cases/core/022_rule_head_structure.pl +5 -0
  471. package/test/eyelang/conformance/cases/core/023_quoted_escapes_readback.pl +5 -0
  472. package/test/eyelang/conformance/cases/core/024_numeric_literal_readback.pl +6 -0
  473. package/test/eyelang/conformance/cases/core/025_body_parentheses_with_formula_data.pl +5 -0
  474. package/test/eyelang/conformance/cases/core/026_underscore_named_variable_reuse.pl +5 -0
  475. package/test/eyelang/conformance/cases/extension/001_default_derived_output.pl +5 -0
  476. package/test/eyelang/conformance/cases/extension/002_materialize_focus.pl +5 -0
  477. package/test/eyelang/conformance/cases/extension/003_arithmetic_and_comparison.pl +12 -0
  478. package/test/eyelang/conformance/cases/extension/003_arithmetic_and_comparison.query +1 -0
  479. package/test/eyelang/conformance/cases/extension/004_strings_and_atoms.pl +6 -0
  480. package/test/eyelang/conformance/cases/extension/004_strings_and_atoms.query +1 -0
  481. package/test/eyelang/conformance/cases/extension/005_lists_aggregation_ordering.pl +10 -0
  482. package/test/eyelang/conformance/cases/extension/005_lists_aggregation_ordering.query +1 -0
  483. package/test/eyelang/conformance/cases/extension/006_formula_terms.pl +5 -0
  484. package/test/eyelang/conformance/cases/extension/006_formula_terms.query +1 -0
  485. package/test/eyelang/conformance/cases/extension/007_negation_once_generators.pl +7 -0
  486. package/test/eyelang/conformance/cases/extension/007_negation_once_generators.query +1 -0
  487. package/test/eyelang/conformance/cases/extension/008_equality_and_inequality.pl +6 -0
  488. package/test/eyelang/conformance/cases/extension/008_equality_and_inequality.query +1 -0
  489. package/test/eyelang/conformance/cases/extension/009_list_relations.pl +6 -0
  490. package/test/eyelang/conformance/cases/extension/009_list_relations.query +1 -0
  491. package/test/eyelang/conformance/cases/extension/010_append_splits.pl +3 -0
  492. package/test/eyelang/conformance/cases/extension/010_append_splits.query +1 -0
  493. package/test/eyelang/conformance/cases/extension/011_matching_and_comparison.pl +7 -0
  494. package/test/eyelang/conformance/cases/extension/011_matching_and_comparison.query +1 -0
  495. package/test/eyelang/conformance/cases/extension/012_memoize_declaration.pl +8 -0
  496. package/test/eyelang/conformance/cases/extension/012_memoize_declaration.query +1 -0
  497. package/test/eyelang/conformance/cases/extension/013_numeric_functions.pl +9 -0
  498. package/test/eyelang/conformance/cases/extension/013_numeric_functions.query +1 -0
  499. package/test/eyelang/conformance/cases/extension/014_between_enumeration.pl +3 -0
  500. package/test/eyelang/conformance/cases/extension/014_between_enumeration.query +1 -0
  501. package/test/eyelang/conformance/cases/extension/015_smallest_divisor.pl +3 -0
  502. package/test/eyelang/conformance/cases/extension/015_smallest_divisor.query +1 -0
  503. package/test/eyelang/conformance/cases/extension/016_negation_filter.pl +7 -0
  504. package/test/eyelang/conformance/cases/extension/016_negation_filter.query +1 -0
  505. package/test/eyelang/conformance/cases/extension/017_once_user_predicate.pl +5 -0
  506. package/test/eyelang/conformance/cases/extension/017_once_user_predicate.query +1 -0
  507. package/test/eyelang/conformance/cases/extension/018_findall_user_goal.pl +6 -0
  508. package/test/eyelang/conformance/cases/extension/018_findall_user_goal.query +1 -0
  509. package/test/eyelang/conformance/cases/extension/019_sort_deduplicates_atoms.pl +3 -0
  510. package/test/eyelang/conformance/cases/extension/019_sort_deduplicates_atoms.query +1 -0
  511. package/test/eyelang/conformance/cases/extension/020_append_bound_prefix_suffix.pl +4 -0
  512. package/test/eyelang/conformance/cases/extension/020_append_bound_prefix_suffix.query +1 -0
  513. package/test/eyelang/conformance/cases/extension/021_nth0_index_generation.pl +3 -0
  514. package/test/eyelang/conformance/cases/extension/021_nth0_index_generation.query +1 -0
  515. package/test/eyelang/conformance/cases/extension/022_set_nth0_edges.pl +4 -0
  516. package/test/eyelang/conformance/cases/extension/022_set_nth0_edges.query +1 -0
  517. package/test/eyelang/conformance/cases/extension/023_select_duplicate_occurrences.pl +3 -0
  518. package/test/eyelang/conformance/cases/extension/023_select_duplicate_occurrences.query +1 -0
  519. package/test/eyelang/conformance/cases/extension/024_not_member_filter.pl +6 -0
  520. package/test/eyelang/conformance/cases/extension/024_not_member_filter.query +1 -0
  521. package/test/eyelang/conformance/cases/extension/025_is_list_filter.pl +5 -0
  522. package/test/eyelang/conformance/cases/extension/025_is_list_filter.query +1 -0
  523. package/test/eyelang/conformance/cases/extension/026_nested_formula_terms.pl +5 -0
  524. package/test/eyelang/conformance/cases/extension/026_nested_formula_terms.query +1 -0
  525. package/test/eyelang/conformance/cases/extension/027_materialize_excludes_source_fact.pl +6 -0
  526. package/test/eyelang/conformance/cases/extension/028_numeric_and_lexical_comparison.pl +5 -0
  527. package/test/eyelang/conformance/cases/extension/028_numeric_and_lexical_comparison.query +1 -0
  528. package/test/eyelang/conformance/cases/extension/029_string_matching_filters.pl +6 -0
  529. package/test/eyelang/conformance/cases/extension/029_string_matching_filters.query +1 -0
  530. package/test/eyelang/conformance/cases/extension/030_string_and_atom_concat.pl +4 -0
  531. package/test/eyelang/conformance/cases/extension/030_string_and_atom_concat.query +1 -0
  532. package/test/eyelang/conformance/cases/extension/031_countall_empty_and_nonempty.pl +4 -0
  533. package/test/eyelang/conformance/cases/extension/031_countall_empty_and_nonempty.query +1 -0
  534. package/test/eyelang/conformance/cases/extension/032_sumall_numeric_template.pl +5 -0
  535. package/test/eyelang/conformance/cases/extension/032_sumall_numeric_template.query +1 -0
  536. package/test/eyelang/conformance/cases/extension/033_aggregate_min_template.pl +5 -0
  537. package/test/eyelang/conformance/cases/extension/033_aggregate_min_template.query +1 -0
  538. package/test/eyelang/conformance/cases/extension/034_aggregate_max_compound_key.pl +5 -0
  539. package/test/eyelang/conformance/cases/extension/034_aggregate_max_compound_key.query +1 -0
  540. package/test/eyelang/conformance/cases/extension/035_date_difference.pl +4 -0
  541. package/test/eyelang/conformance/cases/extension/036_extended_gcd.pl +3 -0
  542. package/test/eyelang/conformance/cases/extension/037_collatz_trajectory.pl +3 -0
  543. package/test/eyelang/conformance/cases/extension/038_kaprekar_steps.pl +3 -0
  544. package/test/eyelang/conformance/cases/extension/039_goldbach_pair.pl +3 -0
  545. package/test/eyelang/conformance/cases/extension/040_matrix_operations.pl +5 -0
  546. package/test/eyelang/conformance/cases/extension/041_atom_range_generators.pl +5 -0
  547. package/test/eyelang/conformance/cases/extension/042_n_queens_small.pl +3 -0
  548. package/test/eyelang/conformance/cases/extension/043_cnf_model.pl +3 -0
  549. package/test/eyelang/conformance/cases/extension/044_cover9_filter.pl +6 -0
  550. package/test/eyelang/conformance/cases/extension/045_alphametic_sum_small.pl +3 -0
  551. package/test/eyelang/conformance/cases/extension/046_bounded_subset.pl +4 -0
  552. package/test/eyelang/conformance/expected/core/001_fact_output.out +1 -0
  553. package/test/eyelang/conformance/expected/core/002_rule_recursion.out +2 -0
  554. package/test/eyelang/conformance/expected/core/003_terms_and_readback.out +13 -0
  555. package/test/eyelang/conformance/expected/core/004_conjunction_and_parentheses.out +1 -0
  556. package/test/eyelang/conformance/expected/core/005_list_deconstruction.out +2 -0
  557. package/test/eyelang/conformance/expected/core/006_comma_formula_data.out +1 -0
  558. package/test/eyelang/conformance/expected/core/007_anonymous_variables.out +1 -0
  559. package/test/eyelang/conformance/expected/core/008_graphic_atoms.out +3 -0
  560. package/test/eyelang/conformance/expected/core/009_comments_and_whitespace.out +2 -0
  561. package/test/eyelang/conformance/expected/core/010_variable_scope_and_reuse.out +2 -0
  562. package/test/eyelang/conformance/expected/core/011_predicate_arity.out +2 -0
  563. package/test/eyelang/conformance/expected/core/012_nested_compound_unification.out +2 -0
  564. package/test/eyelang/conformance/expected/core/013_multiple_clauses_order.out +2 -0
  565. package/test/eyelang/conformance/expected/core/014_failure_filters_answers.out +1 -0
  566. package/test/eyelang/conformance/expected/core/015_improper_list_unification.out +3 -0
  567. package/test/eyelang/conformance/expected/core/016_zero_arity_compound.out +1 -0
  568. package/test/eyelang/conformance/expected/core/017_three_step_recursion.out +3 -0
  569. package/test/eyelang/conformance/expected/core/018_quoted_atom_readback.out +3 -0
  570. package/test/eyelang/conformance/expected/core/019_parenthesized_three_conjuncts.out +1 -0
  571. package/test/eyelang/conformance/expected/core/020_nested_list_terms.out +2 -0
  572. package/test/eyelang/conformance/expected/core/021_repeated_variable_head.out +2 -0
  573. package/test/eyelang/conformance/expected/core/022_rule_head_structure.out +2 -0
  574. package/test/eyelang/conformance/expected/core/023_quoted_escapes_readback.out +2 -0
  575. package/test/eyelang/conformance/expected/core/024_numeric_literal_readback.out +3 -0
  576. package/test/eyelang/conformance/expected/core/025_body_parentheses_with_formula_data.out +1 -0
  577. package/test/eyelang/conformance/expected/core/026_underscore_named_variable_reuse.out +1 -0
  578. package/test/eyelang/conformance/expected/extension/001_default_derived_output.out +3 -0
  579. package/test/eyelang/conformance/expected/extension/002_materialize_focus.out +1 -0
  580. package/test/eyelang/conformance/expected/extension/003_arithmetic_and_comparison.out +10 -0
  581. package/test/eyelang/conformance/expected/extension/004_strings_and_atoms.out +4 -0
  582. package/test/eyelang/conformance/expected/extension/005_lists_aggregation_ordering.out +9 -0
  583. package/test/eyelang/conformance/expected/extension/006_formula_terms.out +4 -0
  584. package/test/eyelang/conformance/expected/extension/007_negation_once_generators.out +2 -0
  585. package/test/eyelang/conformance/expected/extension/008_equality_and_inequality.out +4 -0
  586. package/test/eyelang/conformance/expected/extension/009_list_relations.out +5 -0
  587. package/test/eyelang/conformance/expected/extension/010_append_splits.out +3 -0
  588. package/test/eyelang/conformance/expected/extension/011_matching_and_comparison.out +5 -0
  589. package/test/eyelang/conformance/expected/extension/012_memoize_declaration.out +2 -0
  590. package/test/eyelang/conformance/expected/extension/013_numeric_functions.out +7 -0
  591. package/test/eyelang/conformance/expected/extension/014_between_enumeration.out +3 -0
  592. package/test/eyelang/conformance/expected/extension/015_smallest_divisor.out +1 -0
  593. package/test/eyelang/conformance/expected/extension/016_negation_filter.out +2 -0
  594. package/test/eyelang/conformance/expected/extension/017_once_user_predicate.out +1 -0
  595. package/test/eyelang/conformance/expected/extension/018_findall_user_goal.out +1 -0
  596. package/test/eyelang/conformance/expected/extension/019_sort_deduplicates_atoms.out +1 -0
  597. package/test/eyelang/conformance/expected/extension/020_append_bound_prefix_suffix.out +2 -0
  598. package/test/eyelang/conformance/expected/extension/021_nth0_index_generation.out +1 -0
  599. package/test/eyelang/conformance/expected/extension/022_set_nth0_edges.out +2 -0
  600. package/test/eyelang/conformance/expected/extension/023_select_duplicate_occurrences.out +2 -0
  601. package/test/eyelang/conformance/expected/extension/024_not_member_filter.out +1 -0
  602. package/test/eyelang/conformance/expected/extension/025_is_list_filter.out +1 -0
  603. package/test/eyelang/conformance/expected/extension/026_nested_formula_terms.out +6 -0
  604. package/test/eyelang/conformance/expected/extension/027_materialize_excludes_source_fact.out +1 -0
  605. package/test/eyelang/conformance/expected/extension/028_numeric_and_lexical_comparison.out +3 -0
  606. package/test/eyelang/conformance/expected/extension/029_string_matching_filters.out +2 -0
  607. package/test/eyelang/conformance/expected/extension/030_string_and_atom_concat.out +2 -0
  608. package/test/eyelang/conformance/expected/extension/031_countall_empty_and_nonempty.out +1 -0
  609. package/test/eyelang/conformance/expected/extension/032_sumall_numeric_template.out +1 -0
  610. package/test/eyelang/conformance/expected/extension/033_aggregate_min_template.out +1 -0
  611. package/test/eyelang/conformance/expected/extension/034_aggregate_max_compound_key.out +1 -0
  612. package/test/eyelang/conformance/expected/extension/035_date_difference.out +2 -0
  613. package/test/eyelang/conformance/expected/extension/036_extended_gcd.out +1 -0
  614. package/test/eyelang/conformance/expected/extension/037_collatz_trajectory.out +1 -0
  615. package/test/eyelang/conformance/expected/extension/038_kaprekar_steps.out +1 -0
  616. package/test/eyelang/conformance/expected/extension/039_goldbach_pair.out +2 -0
  617. package/test/eyelang/conformance/expected/extension/040_matrix_operations.out +3 -0
  618. package/test/eyelang/conformance/expected/extension/041_atom_range_generators.out +8 -0
  619. package/test/eyelang/conformance/expected/extension/042_n_queens_small.out +2 -0
  620. package/test/eyelang/conformance/expected/extension/043_cnf_model.out +1 -0
  621. package/test/eyelang/conformance/expected/extension/044_cover9_filter.out +2 -0
  622. package/test/eyelang/conformance/expected/extension/045_alphametic_sum_small.out +4 -0
  623. package/test/eyelang/conformance/expected/extension/046_bounded_subset.out +5 -0
  624. package/test/eyelang/run-all.mjs +20 -0
  625. package/test/eyelang/run-conformance.mjs +80 -0
  626. package/test/eyelang/run-examples.mjs +126 -0
  627. package/test/eyelang/run-regression.mjs +640 -0
  628. package/test/eyelang/test-style.mjs +91 -0
  629. package/test/eyelang.test.js +58 -0
  630. package/test/run.js +1 -0
package/lib/builtins.js CHANGED
@@ -8,6 +8,8 @@
8
8
 
9
9
  const {
10
10
  RDF_NS,
11
+ RDFS_NS,
12
+ OWL_NS,
11
13
  XSD_NS,
12
14
  CRYPTO_NS,
13
15
  MATH_NS,
@@ -1035,6 +1037,9 @@ const XSD_HEX_BINARY_DT = XSD_NS + 'hexBinary';
1035
1037
  const XSD_BASE64_BINARY_DT = XSD_NS + 'base64Binary';
1036
1038
  const XSD_ANY_URI_DT = XSD_NS + 'anyURI';
1037
1039
  const RDF_LANGSTRING_DT = RDF_NS + 'langString';
1040
+ const RDF_PLAIN_LITERAL_DT = RDF_NS + 'PlainLiteral';
1041
+ const RDF_XML_LITERAL_DT = RDF_NS + 'XMLLiteral';
1042
+ const RDFS_LITERAL_DT = RDFS_NS + 'Literal';
1038
1043
 
1039
1044
  const XSD_STRING_LIKE_DTS = new Set([
1040
1045
  XSD_STRING_DT,
@@ -1063,6 +1068,9 @@ const XSD_INTEGER_BOUNDS = new Map([
1063
1068
 
1064
1069
  const XSD_DATATYPE_BUILTIN_DTS = new Set([
1065
1070
  RDF_LANGSTRING_DT,
1071
+ RDF_PLAIN_LITERAL_DT,
1072
+ RDF_XML_LITERAL_DT,
1073
+ RDFS_LITERAL_DT,
1066
1074
  XSD_STRING_DT,
1067
1075
  XSD_NS + 'normalizedString',
1068
1076
  XSD_NS + 'token',
@@ -1084,6 +1092,11 @@ const XSD_DATATYPE_BUILTIN_DTS = new Set([
1084
1092
  ]);
1085
1093
 
1086
1094
 
1095
+ const XSD_FLOAT_MAX_VALUE = 3.4028234663852886e38;
1096
+ const XSD_FLOAT_MIN_POSITIVE_VALUE = 1.401298464324817e-45;
1097
+ const XSD_DOUBLE_MAX_VALUE = Number.MAX_VALUE;
1098
+ const XSD_DOUBLE_MIN_POSITIVE_VALUE = Number.MIN_VALUE;
1099
+
1087
1100
  // Integer-derived datatypes from XML Schema Part 2 (and commonly used ones).
1088
1101
  const XSD_INTEGER_DERIVED_DTS = new Set([
1089
1102
  XSD_INTEGER_DT,
@@ -1142,13 +1155,31 @@ function inferDatatypeForShorthandLexical(lex) {
1142
1155
 
1143
1156
  function extractLiteralLanguageTag(litVal) {
1144
1157
  if (typeof litVal !== 'string' || !literalHasLangTag(litVal)) return null;
1145
- const lastQuote = litVal.lastIndexOf('"');
1158
+
1159
+ let lastQuote;
1160
+ let quoteLen;
1161
+ if (litVal.startsWith('\"\"\"')) {
1162
+ lastQuote = litVal.lastIndexOf('\"\"\"');
1163
+ quoteLen = 3;
1164
+ } else {
1165
+ lastQuote = litVal.lastIndexOf('"');
1166
+ quoteLen = 1;
1167
+ }
1168
+
1146
1169
  if (lastQuote < 0) return null;
1147
- const after = lastQuote + 1;
1170
+ const after = lastQuote + quoteLen;
1148
1171
  if (after >= litVal.length || litVal[after] !== '@') return null;
1149
1172
  const tag = litVal.slice(after + 1);
1150
- if (!/^[A-Za-z]+(?:-[A-Za-z0-9]+)*(?:--(?:ltr|rtl))?$/.test(tag)) return null;
1151
- return tag;
1173
+ if (!isValidLanguageTag(tag, true)) return null;
1174
+ return tag.toLowerCase();
1175
+ }
1176
+
1177
+ function isValidLanguageTag(tag, allowDirectionalSuffix) {
1178
+ if (typeof tag !== 'string') return false;
1179
+ const pattern = allowDirectionalSuffix
1180
+ ? /^[A-Za-z]{1,8}(?:-[A-Za-z0-9]{1,8})*(?:--(?:ltr|rtl))?$/
1181
+ : /^[A-Za-z]{1,8}(?:-[A-Za-z0-9]{1,8})*$/;
1182
+ return pattern.test(tag);
1152
1183
  }
1153
1184
 
1154
1185
  function literalLexicalValue(litVal) {
@@ -1207,17 +1238,18 @@ function canonicalFloatDoubleLex(n) {
1207
1238
  }
1208
1239
 
1209
1240
  function parseStringLikeDatatypeValue(lexical, dt) {
1210
- let value = String(lexical);
1241
+ const value = String(lexical);
1211
1242
 
1212
1243
  if (dt === XSD_NS + 'normalizedString') {
1213
- value = value.replace(/[\t\n\r]/g, ' ');
1244
+ if (/[\t\n\r]/.test(value)) return null;
1214
1245
  } else if (dt !== XSD_STRING_DT) {
1215
- value = value.replace(/[\t\n\r ]+/g, ' ').trim();
1246
+ // String-derived datatypes with whitespace facet collapse are considered
1247
+ // lexically valid only when the spelling is already in collapsed form.
1248
+ if (/[\t\n\r]/.test(value) || /^ | $/.test(value) || / {2,}/.test(value)) return null;
1216
1249
  }
1217
1250
 
1218
1251
  if (dt === XSD_NS + 'language') {
1219
- if (!/^[A-Za-z]{1,8}(?:-[A-Za-z0-9]{1,8})*$/.test(value)) return null;
1220
- value = value.toLowerCase();
1252
+ if (!isValidLanguageTag(value, false)) return null;
1221
1253
  } else if (dt === XSD_NS + 'Name') {
1222
1254
  if (!/^[:_\p{L}][:_\p{L}\p{N}.\-\u00B7\u0300-\u036F\u203F-\u2040]*$/u.test(value)) return null;
1223
1255
  } else if (dt === XSD_NS + 'NCName') {
@@ -1229,9 +1261,51 @@ function parseStringLikeDatatypeValue(lexical, dt) {
1229
1261
  return {
1230
1262
  family: 'string',
1231
1263
  dt,
1232
- value,
1233
- canonicalLex: value,
1234
- canonicalLiteral: makeDatatypeTypedLiteral(value, dt),
1264
+ value: dt === XSD_NS + 'language' ? value.toLowerCase() : value,
1265
+ canonicalLex: dt === XSD_NS + 'language' ? value.toLowerCase() : value,
1266
+ canonicalLiteral: makeDatatypeTypedLiteral(dt === XSD_NS + 'language' ? value.toLowerCase() : value, dt),
1267
+ comparable: true,
1268
+ };
1269
+ }
1270
+
1271
+ function parsePlainLiteralDatatypeValue(lexical) {
1272
+ const parsed = splitPlainLiteralLexical(lexical);
1273
+ if (!parsed) return null;
1274
+ const canonicalLex = `${parsed.text}@${parsed.lang}`;
1275
+ return {
1276
+ family: 'plainLiteral',
1277
+ dt: RDF_PLAIN_LITERAL_DT,
1278
+ value: parsed.text,
1279
+ lang: parsed.lang,
1280
+ canonicalLex,
1281
+ canonicalLiteral: makeDatatypeTypedLiteral(canonicalLex, RDF_PLAIN_LITERAL_DT),
1282
+ comparable: true,
1283
+ };
1284
+ }
1285
+
1286
+ function splitPlainLiteralLexical(lexical) {
1287
+ const s = String(lexical);
1288
+ const at = s.lastIndexOf('@');
1289
+ // rdf:PlainLiteral lexical forms encode the literal as text + "@" +
1290
+ // language-tag. The language tag may be empty, e.g. "abc@".
1291
+ // A lexical with no separator at all, e.g. "abc", is ill-typed.
1292
+ if (at < 0) return null;
1293
+ const text = s.slice(0, at);
1294
+ const lang = s.slice(at + 1);
1295
+ if (lang !== '' && !isValidLanguageTag(lang, false)) return null;
1296
+ return { text, lang: lang.toLowerCase() };
1297
+ }
1298
+
1299
+ function parseXmlLiteralDatatypeValue(lexical) {
1300
+ const s = String(lexical);
1301
+ if (!isWellFormedXmlFragment(s)) return null;
1302
+ const canonicalLex = s.trim();
1303
+ return {
1304
+ family: 'xmlLiteral',
1305
+ dt: RDF_XML_LITERAL_DT,
1306
+ value: canonicalLex,
1307
+ canonicalLex,
1308
+ canonicalLiteral: makeDatatypeTypedLiteral(canonicalLex, RDF_XML_LITERAL_DT),
1235
1309
  comparable: true,
1236
1310
  };
1237
1311
  }
@@ -1319,6 +1393,11 @@ function parseFloatDoubleDatatypeValue(lexical, dt) {
1319
1393
  const special = parseXsdFloatSpecialLex(s);
1320
1394
  const value = special !== null ? special : Number(s);
1321
1395
  if (Number.isNaN(value) && s !== 'NaN') return null;
1396
+ if (Number.isFinite(value)) {
1397
+ const abs = Math.abs(value);
1398
+ if (dt === XSD_FLOAT_DT && abs > 0 && (abs > XSD_FLOAT_MAX_VALUE || abs < XSD_FLOAT_MIN_POSITIVE_VALUE)) return null;
1399
+ if (dt === XSD_DOUBLE_DT && abs > 0 && (abs > XSD_DOUBLE_MAX_VALUE || abs < XSD_DOUBLE_MIN_POSITIVE_VALUE)) return null;
1400
+ }
1322
1401
  const canonicalLex = canonicalFloatDoubleLex(value);
1323
1402
  return {
1324
1403
  family: 'numeric',
@@ -1408,7 +1487,11 @@ function parseBinaryDatatypeValue(lexical, dt) {
1408
1487
 
1409
1488
  function parseAnyUriDatatypeValue(lexical) {
1410
1489
  const value = String(lexical);
1411
- if (/[\u0000-\u001F\u007F]/.test(value)) return null;
1490
+ if (/[^\u0021-\u007E]/.test(value) || /[<>"{}|\\^`]/.test(value)) return null;
1491
+ for (let i = 0; i < value.length; i += 1) {
1492
+ if (value[i] === '%' && !/^[0-9A-Fa-f]{2}$/.test(value.slice(i + 1, i + 3))) return null;
1493
+ }
1494
+ if (!isValidIriReferenceLexical(value)) return null;
1412
1495
  return {
1413
1496
  family: 'anyURI',
1414
1497
  dt: XSD_ANY_URI_DT,
@@ -1419,6 +1502,116 @@ function parseAnyUriDatatypeValue(lexical) {
1419
1502
  };
1420
1503
  }
1421
1504
 
1505
+ function isValidIriReferenceLexical(value) {
1506
+ // Minimal RFC 3987/3986 structural check for IRI references. In
1507
+ // particular, a relative reference may not start with a colon-bearing first
1508
+ // path segment such as ":abc"; this is the OWL 2 RL anyURI illtyped case.
1509
+ // Empty references and fragment-only references are allowed.
1510
+ const s = String(value);
1511
+ if (s === '') return true;
1512
+ if (/^[A-Za-z][A-Za-z0-9+.-]*:/.test(s)) return true; // absolute scheme
1513
+ if (s.startsWith('//') || s.startsWith('/') || s.startsWith('?') || s.startsWith('#')) return true;
1514
+ const cut = s.search(/[/?#]/);
1515
+ const firstSegment = cut < 0 ? s : s.slice(0, cut);
1516
+ return !firstSegment.includes(':');
1517
+ }
1518
+
1519
+ function isWellFormedXmlFragment(input) {
1520
+ const source = String(input).trim();
1521
+ if (!source) return false;
1522
+ const stack = [];
1523
+ let seenElement = false;
1524
+ let position = 0;
1525
+
1526
+ while (position < source.length) {
1527
+ const open = source.indexOf('<', position);
1528
+ if (open < 0) return stack.length === 0 && isValidXmlText(source.slice(position)) && seenElement;
1529
+ if (!isValidXmlText(source.slice(position, open))) return false;
1530
+
1531
+ if (source.startsWith('<!--', open)) {
1532
+ const close = source.indexOf('-->', open + 4);
1533
+ if (close < 0 || source.slice(open + 4, close).includes('--')) return false;
1534
+ position = close + 3;
1535
+ continue;
1536
+ }
1537
+
1538
+ if (source.startsWith('<![CDATA[', open)) {
1539
+ const close = source.indexOf(']]>', open + 9);
1540
+ if (close < 0) return false;
1541
+ position = close + 3;
1542
+ continue;
1543
+ }
1544
+
1545
+ if (source.startsWith('<?', open)) {
1546
+ const close = source.indexOf('?>', open + 2);
1547
+ if (close < 0) return false;
1548
+ position = close + 2;
1549
+ continue;
1550
+ }
1551
+
1552
+ if (source.startsWith('</', open)) {
1553
+ const close = source.indexOf('>', open + 2);
1554
+ if (close < 0) return false;
1555
+ const name = source.slice(open + 2, close).trim();
1556
+ if (!isValidXmlName(name) || stack.pop() !== name) return false;
1557
+ position = close + 1;
1558
+ continue;
1559
+ }
1560
+
1561
+ const close = findXmlTagEnd(source, open + 1);
1562
+ if (close < 0) return false;
1563
+ const raw = source.slice(open + 1, close);
1564
+ const selfClosing = /\/\s*$/.test(raw);
1565
+ const content = selfClosing ? raw.replace(/\/\s*$/, '').trim() : raw.trim();
1566
+ const nameMatch = /^([^\s/>]+)/.exec(content);
1567
+ if (!nameMatch || !isValidXmlName(nameMatch[1]) || !areValidXmlAttributes(content.slice(nameMatch[0].length))) return false;
1568
+ seenElement = true;
1569
+ if (!selfClosing) stack.push(nameMatch[1]);
1570
+ position = close + 1;
1571
+ }
1572
+
1573
+ return stack.length === 0 && seenElement;
1574
+ }
1575
+
1576
+ function findXmlTagEnd(source, start) {
1577
+ let quote = null;
1578
+ for (let i = start; i < source.length; i += 1) {
1579
+ const ch = source[i];
1580
+ if (quote) {
1581
+ if (ch === quote) quote = null;
1582
+ } else if (ch === '"' || ch === "'") {
1583
+ quote = ch;
1584
+ } else if (ch === '>') {
1585
+ return i;
1586
+ }
1587
+ }
1588
+ return -1;
1589
+ }
1590
+
1591
+ function areValidXmlAttributes(source) {
1592
+ let rest = String(source).trim();
1593
+ const seen = new Set();
1594
+ while (rest) {
1595
+ const m = /^([A-Za-z_:\u0080-\uFFFF][A-Za-z0-9_.:\-\u0080-\uFFFF]*)\s*=\s*("[^"]*"|'[^']*')\s*/u.exec(rest);
1596
+ if (!m || seen.has(m[1]) || !isValidXmlAttributeValue(m[2].slice(1, -1))) return false;
1597
+ seen.add(m[1]);
1598
+ rest = rest.slice(m[0].length).trim();
1599
+ }
1600
+ return true;
1601
+ }
1602
+
1603
+ function isValidXmlAttributeValue(value) {
1604
+ return !/[<]/.test(value) && isValidXmlText(value);
1605
+ }
1606
+
1607
+ function isValidXmlText(value) {
1608
+ return !/[<&]/.test(String(value).replace(/&(?:amp|lt|gt|quot|apos|#\d+|#x[0-9A-Fa-f]+);/g, ''));
1609
+ }
1610
+
1611
+ function isValidXmlName(name) {
1612
+ return /^[A-Za-z_:\u0080-\uFFFF][A-Za-z0-9_.:\-\u0080-\uFFFF]*$/u.test(name) && !/^xml$/i.test(name);
1613
+ }
1614
+
1422
1615
  function isLeapYearBigInt(year) {
1423
1616
  if (year % 400n === 0n) return true;
1424
1617
  if (year % 100n === 0n) return false;
@@ -1575,11 +1768,33 @@ function parseLangStringDatatypeValue(t, lexical) {
1575
1768
  };
1576
1769
  }
1577
1770
 
1771
+ function literalTermDatatypeKey(t) {
1772
+ return `${literalLexicalValue(t.value)}^^${literalDatatypeIri(t) || ''}`;
1773
+ }
1774
+
1578
1775
  function parseDatatypeValueForDatatype(t, dt) {
1579
1776
  if (!(t instanceof Literal) || typeof dt !== 'string' || !isSupportedDatatypeIri(dt)) return null;
1777
+
1778
+ if (dt === RDFS_LITERAL_DT) {
1779
+ const ownDt = literalDatatypeIri(t);
1780
+ if (ownDt === null || !isSupportedDatatypeIri(ownDt)) return null;
1781
+ const ownValue = parseDatatypeValueForDatatype(t, ownDt);
1782
+ if (!ownValue) return null;
1783
+ return {
1784
+ family: 'literal',
1785
+ dt: RDFS_LITERAL_DT,
1786
+ value: literalTermDatatypeKey(t),
1787
+ canonicalLex: literalLexicalValue(t.value),
1788
+ canonicalLiteral: t,
1789
+ comparable: false,
1790
+ };
1791
+ }
1792
+
1580
1793
  const lexical = literalLexicalValue(t.value);
1581
1794
 
1582
1795
  if (dt === RDF_LANGSTRING_DT) return parseLangStringDatatypeValue(t, lexical);
1796
+ if (dt === RDF_PLAIN_LITERAL_DT) return parsePlainLiteralDatatypeValue(lexical);
1797
+ if (dt === RDF_XML_LITERAL_DT) return parseXmlLiteralDatatypeValue(lexical);
1583
1798
  if (literalHasLangTag(t.value)) return null;
1584
1799
  if (XSD_STRING_LIKE_DTS.has(dt)) return parseStringLikeDatatypeValue(lexical, dt);
1585
1800
  if (dt === XSD_BOOLEAN_DT) return parseBooleanDatatypeValue(lexical);
@@ -1605,10 +1820,11 @@ function compareDecimalExactValues(a, b) {
1605
1820
 
1606
1821
  function datatypeValuesSame(a, b) {
1607
1822
  if (!a || !b || !a.comparable || !b.comparable) return false;
1608
- if (a.family === 'langString' || b.family === 'langString') {
1823
+ if (a.family === 'langString' || b.family === 'langString' || a.family === 'plainLiteral' || b.family === 'plainLiteral') {
1609
1824
  return a.family === b.family && a.value === b.value && a.lang === b.lang;
1610
1825
  }
1611
1826
  if (a.family === 'string' && b.family === 'string') return a.value === b.value;
1827
+ if (a.family === 'xmlLiteral' && b.family === 'xmlLiteral') return a.value === b.value;
1612
1828
  if (a.family === 'boolean' && b.family === 'boolean') return a.value === b.value;
1613
1829
  if (a.family === 'anyURI' && b.family === 'anyURI') return a.value === b.value;
1614
1830
  if (a.family === 'binary' && b.family === 'binary') {
@@ -1635,7 +1851,9 @@ function datatypeValuesSame(a, b) {
1635
1851
  function datatypeValuesComparable(a, b) {
1636
1852
  if (!a || !b || !a.comparable || !b.comparable) return false;
1637
1853
  if (a.family === 'dateTime' && b.family === 'dateTime' && a.hasTimezone !== b.hasTimezone) return false;
1854
+ if (a.family === 'numeric' && b.family === 'numeric') return true;
1638
1855
  if (a.family === 'langString' || b.family === 'langString') return a.family === b.family;
1856
+ if (a.family === 'plainLiteral' || b.family === 'plainLiteral') return a.family === b.family;
1639
1857
  if (a.family === 'string' || b.family === 'string') return a.family === b.family;
1640
1858
  return a.family === b.family;
1641
1859
  }
@@ -1659,6 +1877,17 @@ function evalDatatypeInspectionBuiltin(g, subst, kind) {
1659
1877
  const dt = literalDatatypeIri(g.s);
1660
1878
  if (dt === null) return [];
1661
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;
1662
1891
  } else if (kind === 'lexicalForm') {
1663
1892
  valueTerm = makeStringLiteral(literalLexicalValue(g.s.value));
1664
1893
  } else if (kind === 'language') {
@@ -1727,6 +1956,57 @@ function evalDatatypeValueComparisonBuiltin(g, subst, same) {
1727
1956
  return [];
1728
1957
  }
1729
1958
 
1959
+ function evalOwlSameAsBuiltin(g, subst, facts, maxResults) {
1960
+ const out = [];
1961
+ const seen = new Set();
1962
+ const limit = typeof maxResults === 'number' && maxResults > 0 ? maxResults : Infinity;
1963
+
1964
+ function addPair(left, right) {
1965
+ if (out.length >= limit) return true;
1966
+ const key = `${termFastKey ? termFastKey(left) : termToN3(left)} ${termFastKey ? termFastKey(right) : termToN3(right)}`;
1967
+ if (seen.has(key)) return false;
1968
+ let s2 = unifyTerm(g.s, left, subst);
1969
+ if (s2 === null) return false;
1970
+ s2 = unifyTerm(g.o, right, s2);
1971
+ if (s2 === null) return false;
1972
+ seen.add(key);
1973
+ out.push(s2);
1974
+ return out.length >= limit;
1975
+ }
1976
+
1977
+ function addReflexive(term) {
1978
+ return addPair(term, term);
1979
+ }
1980
+
1981
+ const sameAsIri = OWL_NS + 'sameAs';
1982
+ const differentFromIri = OWL_NS + 'differentFrom';
1983
+
1984
+ for (const tr of facts || []) {
1985
+ if (tr && tr.p instanceof Iri && tr.p.value === sameAsIri) {
1986
+ if (addPair(tr.s, tr.o)) return out;
1987
+ }
1988
+ }
1989
+
1990
+ // owl:sameAs is reflexive. Avoid enumerating the entire active term universe
1991
+ // for fully-unbound goals; only add the reflexive pairs that are immediately
1992
+ // needed to detect explicit self-diversity (?x owl:differentFrom ?x).
1993
+ if (!(g.s instanceof Var) && !(g.o instanceof Var)) {
1994
+ if (termsEqual(g.s, g.o)) addReflexive(g.s);
1995
+ } else if (!(g.s instanceof Var)) {
1996
+ addReflexive(g.s);
1997
+ } else if (!(g.o instanceof Var)) {
1998
+ addReflexive(g.o);
1999
+ } else {
2000
+ for (const tr of facts || []) {
2001
+ if (tr && tr.p instanceof Iri && tr.p.value === differentFromIri && termsEqual(tr.s, tr.o)) {
2002
+ if (addReflexive(tr.s)) return out;
2003
+ }
2004
+ }
2005
+ }
2006
+
2007
+ return out;
2008
+ }
2009
+
1730
2010
  // ===========================================================================
1731
2011
  // Math builtin helpers
1732
2012
  // ===========================================================================
@@ -2866,6 +3146,8 @@ function evalBuiltin(goal, subst, facts, backRules, depth, varGen, maxResults) {
2866
3146
  const pv = iriValue(g.p);
2867
3147
  if (pv === null) return null;
2868
3148
 
3149
+ if (pv === OWL_NS + 'sameAs') return evalOwlSameAsBuiltin(g, subst, facts, maxResults);
3150
+
2869
3151
  // Super restricted mode: disable *all* builtins except => / <= (log:implies / log:impliedBy)
2870
3152
  if (typeof getSuperRestrictedMode === 'function' && getSuperRestrictedMode()) {
2871
3153
  const allow1 = LOG_NS + 'implies';
@@ -5208,6 +5490,7 @@ function isBuiltinPred(p) {
5208
5490
  }
5209
5491
 
5210
5492
  if (__customBuiltinHandlers.has(v)) return true;
5493
+ if (v === OWL_NS + 'sameAs') return true;
5211
5494
 
5212
5495
  return (
5213
5496
  v.startsWith(CRYPTO_NS) ||
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
+ }