eyeling 1.34.5 → 1.34.6

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 (307) hide show
  1. package/README.md +3 -90
  2. package/bin/eyeling.cjs +4 -56
  3. package/dist/browser/eyeling.browser.js +0 -1
  4. package/examples/context-schema-audit.n3 +1 -1
  5. package/eyeling.js +0 -1
  6. package/index.d.ts +3 -37
  7. package/index.js +1 -90
  8. package/lib/cli.js +0 -1
  9. package/package.json +3 -12
  10. package/test/packlist.test.js +0 -2
  11. package/test/run.js +0 -2
  12. package/docs/eyelang-guide.md +0 -535
  13. package/docs/eyelang-language-reference.md +0 -697
  14. package/examples/eyelang/access-control-policy.pl +0 -52
  15. package/examples/eyelang/ackermann.pl +0 -46
  16. package/examples/eyelang/age.pl +0 -28
  17. package/examples/eyelang/aliases-and-namespaces.pl +0 -22
  18. package/examples/eyelang/alignment-demo.pl +0 -44
  19. package/examples/eyelang/allen-interval-calculus.pl +0 -64
  20. package/examples/eyelang/ancestor.pl +0 -21
  21. package/examples/eyelang/animal.pl +0 -21
  22. package/examples/eyelang/annotation.pl +0 -34
  23. package/examples/eyelang/auroracare.pl +0 -309
  24. package/examples/eyelang/backward.pl +0 -12
  25. package/examples/eyelang/basic-monadic.pl +0 -10032
  26. package/examples/eyelang/bayes-diagnosis.pl +0 -108
  27. package/examples/eyelang/bayes-therapy.pl +0 -182
  28. package/examples/eyelang/beam-deflection.pl +0 -50
  29. package/examples/eyelang/blocks-world-planning.pl +0 -75
  30. package/examples/eyelang/bmi.pl +0 -232
  31. package/examples/eyelang/braking-safety-worlds.pl +0 -69
  32. package/examples/eyelang/buck-converter-design.pl +0 -78
  33. package/examples/eyelang/cache-performance.pl +0 -54
  34. package/examples/eyelang/canary-release.pl +0 -49
  35. package/examples/eyelang/cat-koko.pl +0 -24
  36. package/examples/eyelang/clinical-trial-screening.pl +0 -92
  37. package/examples/eyelang/combinatorics-findall-sort.pl +0 -37
  38. package/examples/eyelang/competitive-enzyme-kinetics.pl +0 -78
  39. package/examples/eyelang/complex.pl +0 -121
  40. package/examples/eyelang/composition-of-injective-functions-is-injective.pl +0 -50
  41. package/examples/eyelang/context-association.pl +0 -53
  42. package/examples/eyelang/context-schema-audit.pl +0 -46
  43. package/examples/eyelang/control-system.pl +0 -72
  44. package/examples/eyelang/cyclic-path.pl +0 -16
  45. package/examples/eyelang/d3-group.pl +0 -100
  46. package/examples/eyelang/dairy-energy-balance.pl +0 -65
  47. package/examples/eyelang/data-negotiation.pl +0 -39
  48. package/examples/eyelang/deep-taxonomy-10.pl +0 -115
  49. package/examples/eyelang/deep-taxonomy-100.pl +0 -385
  50. package/examples/eyelang/deep-taxonomy-1000.pl +0 -3085
  51. package/examples/eyelang/deep-taxonomy-10000.pl +0 -30094
  52. package/examples/eyelang/deep-taxonomy-100000.pl +0 -300184
  53. package/examples/eyelang/delfour.pl +0 -281
  54. package/examples/eyelang/deontic-logic.pl +0 -52
  55. package/examples/eyelang/derived-backward-rule.pl +0 -30
  56. package/examples/eyelang/derived-rule.pl +0 -27
  57. package/examples/eyelang/diamond-property.pl +0 -38
  58. package/examples/eyelang/dijkstra-findall-sort.pl +0 -44
  59. package/examples/eyelang/dijkstra-risk-path.pl +0 -86
  60. package/examples/eyelang/dijkstra.pl +0 -46
  61. package/examples/eyelang/dining-philosophers.pl +0 -140
  62. package/examples/eyelang/dog.pl +0 -25
  63. package/examples/eyelang/dpv-odrl-purpose-mapping.pl +0 -46
  64. package/examples/eyelang/drone-corridor-planner.pl +0 -51
  65. package/examples/eyelang/easter-computus.pl +0 -89
  66. package/examples/eyelang/electrical-rc-filter.pl +0 -36
  67. package/examples/eyelang/epidemic-policy.pl +0 -67
  68. package/examples/eyelang/equivalence-classes-overlap-implies-same-class.pl +0 -27
  69. package/examples/eyelang/eulerian-path.pl +0 -85
  70. package/examples/eyelang/ev-range-worlds.pl +0 -82
  71. package/examples/eyelang/existential-rule.pl +0 -18
  72. package/examples/eyelang/exoplanet-validation-worlds.pl +0 -88
  73. package/examples/eyelang/expression-eval.pl +0 -43
  74. package/examples/eyelang/family-cousins.pl +0 -65
  75. package/examples/eyelang/fastpow.pl +0 -53
  76. package/examples/eyelang/fft8-numeric.pl +0 -83
  77. package/examples/eyelang/fibonacci.pl +0 -53
  78. package/examples/eyelang/field-nitrogen-balance.pl +0 -70
  79. package/examples/eyelang/flandor.pl +0 -296
  80. package/examples/eyelang/floating-point.pl +0 -23
  81. package/examples/eyelang/four-color-map.pl +0 -127
  82. package/examples/eyelang/fundamental-theorem-arithmetic.pl +0 -113
  83. package/examples/eyelang/gd-step-certified.pl +0 -158
  84. package/examples/eyelang/gdpr-compliance.pl +0 -69
  85. package/examples/eyelang/good-cobbler.pl +0 -14
  86. package/examples/eyelang/gps.pl +0 -152
  87. package/examples/eyelang/graph-reachability.pl +0 -36
  88. package/examples/eyelang/gray-code-counter.pl +0 -48
  89. package/examples/eyelang/greatest-lower-bound-uniqueness.pl +0 -28
  90. package/examples/eyelang/group-inverse-uniqueness.pl +0 -34
  91. package/examples/eyelang/hamiltonian-path.pl +0 -49
  92. package/examples/eyelang/hamming-code.pl +0 -105
  93. package/examples/eyelang/hanoi.pl +0 -20
  94. package/examples/eyelang/heat-loss.pl +0 -51
  95. package/examples/eyelang/heron-theorem.pl +0 -36
  96. package/examples/eyelang/ideal-gas-law.pl +0 -37
  97. package/examples/eyelang/illegitimate-reasoning.pl +0 -88
  98. package/examples/eyelang/knowledge-engineering-alignment-flow.pl +0 -40
  99. package/examples/eyelang/law-of-cosines.pl +0 -31
  100. package/examples/eyelang/least-squares-regression.pl +0 -81
  101. package/examples/eyelang/list-collection.pl +0 -33
  102. package/examples/eyelang/lldm.pl +0 -78
  103. package/examples/eyelang/manufacturing-quality-control.pl +0 -73
  104. package/examples/eyelang/microgrid-dispatch.pl +0 -85
  105. package/examples/eyelang/monkey-bananas.pl +0 -45
  106. package/examples/eyelang/network-sla.pl +0 -48
  107. package/examples/eyelang/newton-raphson.pl +0 -49
  108. package/examples/eyelang/nixon-diamond.pl +0 -37
  109. package/examples/eyelang/observability-log-correlation.pl +0 -34
  110. package/examples/eyelang/odrl-dpv-fpv-trust-flow.pl +0 -43
  111. package/examples/eyelang/odrl-dpv-healthcare-risk-ranked.pl +0 -266
  112. package/examples/eyelang/odrl-dpv-risk-ranked.pl +0 -320
  113. package/examples/eyelang/orbital-transfer-design.pl +0 -113
  114. package/examples/eyelang/output/access-control-policy.pl +0 -2
  115. package/examples/eyelang/output/ackermann.pl +0 -12
  116. package/examples/eyelang/output/age.pl +0 -2
  117. package/examples/eyelang/output/aliases-and-namespaces.pl +0 -5
  118. package/examples/eyelang/output/alignment-demo.pl +0 -32
  119. package/examples/eyelang/output/allen-interval-calculus.pl +0 -154
  120. package/examples/eyelang/output/ancestor.pl +0 -6
  121. package/examples/eyelang/output/animal.pl +0 -4
  122. package/examples/eyelang/output/annotation.pl +0 -4
  123. package/examples/eyelang/output/auroracare.pl +0 -117
  124. package/examples/eyelang/output/backward.pl +0 -1
  125. package/examples/eyelang/output/basic-monadic.pl +0 -1518
  126. package/examples/eyelang/output/bayes-diagnosis.pl +0 -13
  127. package/examples/eyelang/output/bayes-therapy.pl +0 -23
  128. package/examples/eyelang/output/beam-deflection.pl +0 -5
  129. package/examples/eyelang/output/blocks-world-planning.pl +0 -4
  130. package/examples/eyelang/output/bmi.pl +0 -32
  131. package/examples/eyelang/output/braking-safety-worlds.pl +0 -18
  132. package/examples/eyelang/output/buck-converter-design.pl +0 -6
  133. package/examples/eyelang/output/cache-performance.pl +0 -4
  134. package/examples/eyelang/output/canary-release.pl +0 -5
  135. package/examples/eyelang/output/cat-koko.pl +0 -3
  136. package/examples/eyelang/output/clinical-trial-screening.pl +0 -9
  137. package/examples/eyelang/output/combinatorics-findall-sort.pl +0 -2
  138. package/examples/eyelang/output/competitive-enzyme-kinetics.pl +0 -6
  139. package/examples/eyelang/output/complex.pl +0 -1
  140. package/examples/eyelang/output/composition-of-injective-functions-is-injective.pl +0 -2
  141. package/examples/eyelang/output/context-association.pl +0 -3
  142. package/examples/eyelang/output/context-schema-audit.pl +0 -12
  143. package/examples/eyelang/output/control-system.pl +0 -6
  144. package/examples/eyelang/output/cyclic-path.pl +0 -16
  145. package/examples/eyelang/output/d3-group.pl +0 -2
  146. package/examples/eyelang/output/dairy-energy-balance.pl +0 -13
  147. package/examples/eyelang/output/data-negotiation.pl +0 -1
  148. package/examples/eyelang/output/deep-taxonomy-10.pl +0 -16
  149. package/examples/eyelang/output/deep-taxonomy-100.pl +0 -16
  150. package/examples/eyelang/output/deep-taxonomy-1000.pl +0 -16
  151. package/examples/eyelang/output/deep-taxonomy-10000.pl +0 -16
  152. package/examples/eyelang/output/deep-taxonomy-100000.pl +0 -16
  153. package/examples/eyelang/output/delfour.pl +0 -31
  154. package/examples/eyelang/output/deontic-logic.pl +0 -4
  155. package/examples/eyelang/output/derived-backward-rule.pl +0 -3
  156. package/examples/eyelang/output/derived-rule.pl +0 -2
  157. package/examples/eyelang/output/diamond-property.pl +0 -4
  158. package/examples/eyelang/output/dijkstra-findall-sort.pl +0 -2
  159. package/examples/eyelang/output/dijkstra-risk-path.pl +0 -29
  160. package/examples/eyelang/output/dijkstra.pl +0 -16
  161. package/examples/eyelang/output/dining-philosophers.pl +0 -350
  162. package/examples/eyelang/output/dog.pl +0 -1
  163. package/examples/eyelang/output/dpv-odrl-purpose-mapping.pl +0 -18
  164. package/examples/eyelang/output/drone-corridor-planner.pl +0 -17
  165. package/examples/eyelang/output/easter-computus.pl +0 -30
  166. package/examples/eyelang/output/electrical-rc-filter.pl +0 -3
  167. package/examples/eyelang/output/epidemic-policy.pl +0 -14
  168. package/examples/eyelang/output/equivalence-classes-overlap-implies-same-class.pl +0 -18
  169. package/examples/eyelang/output/eulerian-path.pl +0 -3
  170. package/examples/eyelang/output/ev-range-worlds.pl +0 -19
  171. package/examples/eyelang/output/existential-rule.pl +0 -2
  172. package/examples/eyelang/output/exoplanet-validation-worlds.pl +0 -22
  173. package/examples/eyelang/output/expression-eval.pl +0 -1
  174. package/examples/eyelang/output/family-cousins.pl +0 -28
  175. package/examples/eyelang/output/fastpow.pl +0 -6
  176. package/examples/eyelang/output/fft8-numeric.pl +0 -4
  177. package/examples/eyelang/output/fibonacci.pl +0 -6
  178. package/examples/eyelang/output/field-nitrogen-balance.pl +0 -21
  179. package/examples/eyelang/output/flandor.pl +0 -43
  180. package/examples/eyelang/output/floating-point.pl +0 -9
  181. package/examples/eyelang/output/four-color-map.pl +0 -3
  182. package/examples/eyelang/output/fundamental-theorem-arithmetic.pl +0 -9
  183. package/examples/eyelang/output/gd-step-certified.pl +0 -79
  184. package/examples/eyelang/output/gdpr-compliance.pl +0 -6
  185. package/examples/eyelang/output/good-cobbler.pl +0 -1
  186. package/examples/eyelang/output/gps.pl +0 -21
  187. package/examples/eyelang/output/graph-reachability.pl +0 -3
  188. package/examples/eyelang/output/gray-code-counter.pl +0 -1
  189. package/examples/eyelang/output/greatest-lower-bound-uniqueness.pl +0 -2
  190. package/examples/eyelang/output/group-inverse-uniqueness.pl +0 -2
  191. package/examples/eyelang/output/hamiltonian-path.pl +0 -121
  192. package/examples/eyelang/output/hamming-code.pl +0 -6
  193. package/examples/eyelang/output/hanoi.pl +0 -1
  194. package/examples/eyelang/output/heat-loss.pl +0 -5
  195. package/examples/eyelang/output/heron-theorem.pl +0 -4
  196. package/examples/eyelang/output/ideal-gas-law.pl +0 -3
  197. package/examples/eyelang/output/illegitimate-reasoning.pl +0 -15
  198. package/examples/eyelang/output/knowledge-engineering-alignment-flow.pl +0 -17
  199. package/examples/eyelang/output/law-of-cosines.pl +0 -3
  200. package/examples/eyelang/output/least-squares-regression.pl +0 -5
  201. package/examples/eyelang/output/list-collection.pl +0 -3
  202. package/examples/eyelang/output/lldm.pl +0 -6
  203. package/examples/eyelang/output/manufacturing-quality-control.pl +0 -6
  204. package/examples/eyelang/output/microgrid-dispatch.pl +0 -6
  205. package/examples/eyelang/output/monkey-bananas.pl +0 -5
  206. package/examples/eyelang/output/network-sla.pl +0 -4
  207. package/examples/eyelang/output/newton-raphson.pl +0 -3
  208. package/examples/eyelang/output/nixon-diamond.pl +0 -5
  209. package/examples/eyelang/output/observability-log-correlation.pl +0 -28
  210. package/examples/eyelang/output/odrl-dpv-fpv-trust-flow.pl +0 -9
  211. package/examples/eyelang/output/odrl-dpv-healthcare-risk-ranked.pl +0 -42
  212. package/examples/eyelang/output/odrl-dpv-risk-ranked.pl +0 -120
  213. package/examples/eyelang/output/orbital-transfer-design.pl +0 -7
  214. package/examples/eyelang/output/path-discovery.pl +0 -3
  215. package/examples/eyelang/output/peano-arithmetic.pl +0 -3
  216. package/examples/eyelang/output/peasant.pl +0 -10
  217. package/examples/eyelang/output/pendulum-period.pl +0 -4
  218. package/examples/eyelang/output/polynomial.pl +0 -14
  219. package/examples/eyelang/output/proof-contrapositive.pl +0 -3
  220. package/examples/eyelang/output/quadratic-formula.pl +0 -6
  221. package/examples/eyelang/output/radioactive-decay.pl +0 -5
  222. package/examples/eyelang/output/reusable-builtins.pl +0 -5
  223. package/examples/eyelang/output/riemann-hypothesis.pl +0 -12
  224. package/examples/eyelang/output/security-incident-correlation.pl +0 -3
  225. package/examples/eyelang/output/service-impact.pl +0 -11
  226. package/examples/eyelang/output/sieve.pl +0 -1
  227. package/examples/eyelang/output/skolem-functions.pl +0 -16
  228. package/examples/eyelang/output/socket-age.pl +0 -1
  229. package/examples/eyelang/output/socket-family.pl +0 -3
  230. package/examples/eyelang/output/socrates.pl +0 -2
  231. package/examples/eyelang/output/statistics-summary.pl +0 -4
  232. package/examples/eyelang/output/superdense-coding.pl +0 -6
  233. package/examples/eyelang/output/term-tools.pl +0 -6
  234. package/examples/eyelang/output/trust-flow-provenance-threshold.pl +0 -6
  235. package/examples/eyelang/output/turing.pl +0 -12
  236. package/examples/eyelang/output/vector-similarity.pl +0 -4
  237. package/examples/eyelang/output/vulnerability-impact.pl +0 -20
  238. package/examples/eyelang/output/witch.pl +0 -7
  239. package/examples/eyelang/output/wolf-goat-cabbage.pl +0 -3
  240. package/examples/eyelang/output/zebra.pl +0 -3
  241. package/examples/eyelang/path-discovery.pl +0 -45013
  242. package/examples/eyelang/peano-arithmetic.pl +0 -31
  243. package/examples/eyelang/peasant.pl +0 -30
  244. package/examples/eyelang/pendulum-period.pl +0 -50
  245. package/examples/eyelang/polynomial.pl +0 -124
  246. package/examples/eyelang/proof/age.pl +0 -71
  247. package/examples/eyelang/proof/aliases-and-namespaces.pl +0 -78
  248. package/examples/eyelang/proof/ancestor.pl +0 -140
  249. package/examples/eyelang/proof/animal.pl +0 -68
  250. package/examples/eyelang/proof/annotation.pl +0 -80
  251. package/examples/eyelang/proof/backward.pl +0 -22
  252. package/examples/eyelang/proof/cat-koko.pl +0 -86
  253. package/examples/eyelang/proof/data-negotiation.pl +0 -76
  254. package/examples/eyelang/proof/derived-rule.pl +0 -43
  255. package/examples/eyelang/proof/dog.pl +0 -31
  256. package/examples/eyelang/proof/electrical-rc-filter.pl +0 -105
  257. package/examples/eyelang/proof/existential-rule.pl +0 -40
  258. package/examples/eyelang/proof/floating-point.pl +0 -160
  259. package/examples/eyelang/proof/good-cobbler.pl +0 -16
  260. package/examples/eyelang/proof/group-inverse-uniqueness.pl +0 -84
  261. package/examples/eyelang/proof/list-collection.pl +0 -52
  262. package/examples/eyelang/proof/proof-contrapositive.pl +0 -78
  263. package/examples/eyelang/proof/socket-age.pl +0 -32
  264. package/examples/eyelang/proof/socket-family.pl +0 -59
  265. package/examples/eyelang/proof/socrates.pl +0 -38
  266. package/examples/eyelang/proof-contrapositive.pl +0 -27
  267. package/examples/eyelang/quadratic-formula.pl +0 -54
  268. package/examples/eyelang/radioactive-decay.pl +0 -56
  269. package/examples/eyelang/reusable-builtins.pl +0 -32
  270. package/examples/eyelang/riemann-hypothesis.pl +0 -110
  271. package/examples/eyelang/security-incident-correlation.pl +0 -69
  272. package/examples/eyelang/service-impact.pl +0 -41
  273. package/examples/eyelang/sieve.pl +0 -20
  274. package/examples/eyelang/skolem-functions.pl +0 -52
  275. package/examples/eyelang/socket-age.pl +0 -39
  276. package/examples/eyelang/socket-family.pl +0 -28
  277. package/examples/eyelang/socrates.pl +0 -19
  278. package/examples/eyelang/statistics-summary.pl +0 -54
  279. package/examples/eyelang/superdense-coding.pl +0 -84
  280. package/examples/eyelang/term-tools.pl +0 -23
  281. package/examples/eyelang/trust-flow-provenance-threshold.pl +0 -40
  282. package/examples/eyelang/turing.pl +0 -67
  283. package/examples/eyelang/vector-similarity.pl +0 -56
  284. package/examples/eyelang/vulnerability-impact.pl +0 -70
  285. package/examples/eyelang/witch.pl +0 -38
  286. package/examples/eyelang/wolf-goat-cabbage.pl +0 -56
  287. package/examples/eyelang/zebra.pl +0 -44
  288. package/eyelang.d.ts +0 -80
  289. package/lib/eyelang/bin.js +0 -7
  290. package/lib/eyelang/builtins/aggregation.js +0 -81
  291. package/lib/eyelang/builtins/arithmetic.js +0 -208
  292. package/lib/eyelang/builtins/context.js +0 -42
  293. package/lib/eyelang/builtins/control.js +0 -34
  294. package/lib/eyelang/builtins/core.js +0 -78
  295. package/lib/eyelang/builtins/lists.js +0 -283
  296. package/lib/eyelang/builtins/registry.js +0 -48
  297. package/lib/eyelang/builtins/strings.js +0 -234
  298. package/lib/eyelang/builtins/terms.js +0 -66
  299. package/lib/eyelang/cli.js +0 -180
  300. package/lib/eyelang/explain.js +0 -324
  301. package/lib/eyelang/hash.js +0 -294
  302. package/lib/eyelang/index.js +0 -47
  303. package/lib/eyelang/package.json +0 -3
  304. package/lib/eyelang/parser.js +0 -428
  305. package/lib/eyelang/program.js +0 -237
  306. package/lib/eyelang/solver.js +0 -237
  307. package/lib/eyelang/term.js +0 -328
@@ -1,283 +0,0 @@
1
- // List builtins for proper lists, selection, membership, sorting, indexing, slicing, and summaries.
2
- // Several predicates support both checking and generation, so the argument modes are handled explicitly.
3
- import {
4
- compareTerms,
5
- copyResolved,
6
- deref,
7
- isDecimalInteger,
8
- isCons,
9
- lexicalValue,
10
- listFromItems,
11
- numberTerm,
12
- numberTextFromDouble,
13
- parseFiniteNumber,
14
- properListItems,
15
- unify,
16
- } from '../term.js';
17
-
18
- export const listBuiltins = {
19
- register(registry) {
20
- registry.add('append', 3, append);
21
- registry.add('nth0', 3, nth0);
22
- registry.add('set_nth0', 4, setNth0, { deterministic: true });
23
- registry.add('head', 2, head, { deterministic: true, fallbackWhenNotReady: true, ready: firstConsReady });
24
- registry.add('rest', 2, rest, { deterministic: true, fallbackWhenNotReady: true, ready: firstConsReady });
25
- registry.add('last', 2, last, { deterministic: true, fallbackWhenNotReady: true, ready: firstProperListReady });
26
- registry.add('take', 3, take, { deterministic: true, fallbackWhenNotReady: true, ready: countAndListReady });
27
- registry.add('drop', 3, drop, { deterministic: true, fallbackWhenNotReady: true, ready: countAndListReady });
28
- registry.add('slice', 4, slice, { deterministic: true, fallbackWhenNotReady: true, ready: sliceReady });
29
- registry.add('member', 2, member);
30
- registry.add('select', 3, select);
31
- registry.add('not_member', 2, notMember, { deterministic: true });
32
- registry.add('reverse', 2, reverse, { deterministic: true });
33
- registry.add('length', 2, lengthBuiltin, { deterministic: true });
34
- registry.add('sum_list', 2, sumList, { deterministic: true, fallbackWhenNotReady: true, ready: firstProperListReady });
35
- registry.add('min_list', 2, minList, { deterministic: true, fallbackWhenNotReady: true, ready: firstProperListReady });
36
- registry.add('max_list', 2, maxList, { deterministic: true, fallbackWhenNotReady: true, ready: firstProperListReady });
37
- registry.add('list_to_set', 2, listToSet, { deterministic: true, fallbackWhenNotReady: true, ready: firstProperListReady });
38
- registry.add('sort', 2, sortBuiltin, { deterministic: true });
39
- }
40
- };
41
-
42
-
43
-
44
- function firstConsReady(goal, env) {
45
- return isCons(deref(goal.args[0], env));
46
- }
47
-
48
- function firstProperListReady(goal, env) {
49
- return properListItems(goal.args[0], env) !== null;
50
- }
51
-
52
- function countAndListReady(goal, env) {
53
- return safeIndex(goal.args[0], env) !== null && properListItems(goal.args[1], env) !== null;
54
- }
55
-
56
- function sliceReady(goal, env) {
57
- return safeIndex(goal.args[0], env) !== null && safeIndex(goal.args[1], env) !== null && properListItems(goal.args[2], env) !== null;
58
- }
59
-
60
- function listFromItemsExcept(items, skip) {
61
- const copy = new Array(items.length - 1);
62
- for (let i = 0, j = 0; i < items.length; i++) if (i !== skip) copy[j++] = items[i];
63
- return listFromItems(copy);
64
- }
65
-
66
- function* append({ goal, env }) {
67
- let items = properListItems(goal.args[0], env);
68
- if (items) {
69
- const result = listFromItems(items, 0, items.length, deref(goal.args[1], env));
70
- const next = env.clone();
71
- if (unify(goal.args[2], result, next)) yield next;
72
- return;
73
- }
74
- items = properListItems(goal.args[2], env);
75
- if (!items) return;
76
- for (let split = 0; split <= items.length; split++) {
77
- const prefix = listFromItems(items, 0, split);
78
- const suffix = listFromItems(items, split, items.length);
79
- const next = env.clone();
80
- if (unify(goal.args[0], prefix, next) && unify(goal.args[1], suffix, next)) yield next;
81
- }
82
- }
83
-
84
- function* nth0({ goal, env }) {
85
- const items = properListItems(goal.args[1], env);
86
- if (!items) return;
87
- const indexText = lexicalValue(goal.args[0], env);
88
- if (/^-?\d+$/.test(indexText ?? '')) {
89
- const index = Number(indexText);
90
- if (Number.isSafeInteger(index) && index >= 0 && index < items.length) {
91
- const next = env.clone();
92
- if (unify(goal.args[2], items[index], next)) yield next;
93
- }
94
- return;
95
- }
96
- if (deref(goal.args[0], env).type !== 'var') return;
97
- for (let i = 0; i < items.length; i++) {
98
- const next = env.clone();
99
- if (unify(goal.args[0], numberTerm(i), next) && unify(goal.args[2], items[i], next)) yield next;
100
- }
101
- }
102
-
103
- function* setNth0({ goal, env }) {
104
- const index = safeIndex(goal.args[0], env);
105
- if (index == null) return;
106
- const items = properListItems(goal.args[1], env);
107
- if (!items || index >= items.length) return;
108
- const out = items.slice();
109
- out[index] = goal.args[2];
110
- const next = env.clone();
111
- if (unify(goal.args[3], listFromItems(out), next)) yield next;
112
- }
113
-
114
- function* head({ goal, env }) {
115
- const list = deref(goal.args[0], env);
116
- if (!isCons(list)) return;
117
- const next = env.clone();
118
- if (unify(goal.args[1], list.args[0], next)) yield next;
119
- }
120
-
121
- function* rest({ goal, env }) {
122
- const list = deref(goal.args[0], env);
123
- if (!isCons(list)) return;
124
- const next = env.clone();
125
- if (unify(goal.args[1], list.args[1], next)) yield next;
126
- }
127
-
128
- function* last({ goal, env }) {
129
- const items = properListItems(goal.args[0], env);
130
- if (!items || items.length === 0) return;
131
- const next = env.clone();
132
- if (unify(goal.args[1], items[items.length - 1], next)) yield next;
133
- }
134
-
135
- function* take({ goal, env }) {
136
- const count = safeIndex(goal.args[0], env);
137
- if (count == null) return;
138
- const items = properListItems(goal.args[1], env);
139
- if (!items || count > items.length) return;
140
- const next = env.clone();
141
- if (unify(goal.args[2], listFromItems(items, 0, count), next)) yield next;
142
- }
143
-
144
- function* drop({ goal, env }) {
145
- const count = safeIndex(goal.args[0], env);
146
- if (count == null) return;
147
- const items = properListItems(goal.args[1], env);
148
- if (!items || count > items.length) return;
149
- const next = env.clone();
150
- if (unify(goal.args[2], listFromItems(items, count, items.length), next)) yield next;
151
- }
152
-
153
- function* slice({ goal, env }) {
154
- const start = safeIndex(goal.args[0], env);
155
- const count = safeIndex(goal.args[1], env);
156
- if (start == null || count == null) return;
157
- const items = properListItems(goal.args[2], env);
158
- if (!items || start + count > items.length) return;
159
- const next = env.clone();
160
- if (unify(goal.args[3], listFromItems(items, start, start + count), next)) yield next;
161
- }
162
-
163
- function* member({ goal, env }) {
164
- const items = properListItems(goal.args[1], env);
165
- if (!items) return;
166
- for (const item of items) {
167
- const next = env.clone();
168
- if (unify(goal.args[0], item, next)) yield next;
169
- }
170
- }
171
-
172
- function* select({ goal, env }) {
173
- const items = properListItems(goal.args[1], env);
174
- if (!items) return;
175
- for (let i = 0; i < items.length; i++) {
176
- const next = env.clone();
177
- if (unify(goal.args[0], items[i], next) && unify(goal.args[2], listFromItemsExcept(items, i), next)) yield next;
178
- }
179
- }
180
-
181
- function* notMember({ goal, env }) {
182
- const items = properListItems(goal.args[1], env);
183
- if (!items) return;
184
- const value = deref(goal.args[0], env);
185
- if (value.type === 'number' || value.type === 'atom' || value.type === 'string') {
186
- for (const item of items) {
187
- const resolved = deref(item, env);
188
- if (resolved.type === value.type && resolved.name === value.name) return;
189
- }
190
- yield env;
191
- return;
192
- }
193
- for (const item of items) {
194
- const attempt = env.clone();
195
- if (unify(goal.args[0], item, attempt)) return;
196
- }
197
- yield env;
198
- }
199
-
200
- function* reverse({ goal, env }) {
201
- const items = properListItems(goal.args[0], env);
202
- if (!items) return;
203
- const next = env.clone();
204
- if (unify(goal.args[1], listFromItems([...items].reverse()), next)) yield next;
205
- }
206
-
207
- function* lengthBuiltin({ goal, env }) {
208
- const items = properListItems(goal.args[0], env);
209
- if (!items) return;
210
- const next = env.clone();
211
- if (unify(goal.args[1], numberTerm(items.length), next)) yield next;
212
- }
213
-
214
- function* sumList({ goal, env }) {
215
- const items = properListItems(goal.args[0], env);
216
- if (!items) return;
217
- let intSum = 0n;
218
- let floatMode = false;
219
- let floatSum = 0;
220
- for (const item of items) {
221
- const text = lexicalValue(item, env);
222
- if (text == null) return;
223
- if (!floatMode && isDecimalInteger(text)) intSum += BigInt(text);
224
- else {
225
- const value = parseFiniteNumber(text);
226
- if (value == null) return;
227
- if (!floatMode) { floatSum = Number(intSum); floatMode = true; }
228
- floatSum += value;
229
- }
230
- }
231
- const out = floatMode ? numberTextFromDouble(floatSum) : intSum.toString();
232
- const next = env.clone();
233
- if (unify(goal.args[1], numberTerm(out), next)) yield next;
234
- }
235
-
236
- function* minList({ goal, env }) {
237
- yield* minMaxList(goal, env, true);
238
- }
239
-
240
- function* maxList({ goal, env }) {
241
- yield* minMaxList(goal, env, false);
242
- }
243
-
244
- function* minMaxList(goal, env, wantMin) {
245
- const items = properListItems(goal.args[0], env);
246
- if (!items || items.length === 0) return;
247
- let best = copyResolved(items[0], env);
248
- for (let i = 1; i < items.length; i++) {
249
- const item = copyResolved(items[i], env);
250
- const cmp = compareTerms(item, best);
251
- if ((wantMin && cmp < 0) || (!wantMin && cmp > 0)) best = item;
252
- }
253
- const next = env.clone();
254
- if (unify(goal.args[1], best, next)) yield next;
255
- }
256
-
257
- function* listToSet({ goal, env }) {
258
- const items = properListItems(goal.args[0], env);
259
- if (!items) return;
260
- const unique = [];
261
- for (const item of items.map((entry) => copyResolved(entry, env))) {
262
- if (!unique.some((seen) => compareTerms(seen, item) === 0)) unique.push(item);
263
- }
264
- const next = env.clone();
265
- if (unify(goal.args[1], listFromItems(unique), next)) yield next;
266
- }
267
-
268
- function* sortBuiltin({ goal, env }) {
269
- const items = properListItems(goal.args[0], env);
270
- if (!items) return;
271
- const sorted = items.map((item) => copyResolved(item, env)).sort(compareTerms);
272
- const unique = [];
273
- for (const item of sorted) if (unique.length === 0 || compareTerms(unique[unique.length - 1], item) !== 0) unique.push(item);
274
- const next = env.clone();
275
- if (unify(goal.args[1], listFromItems(unique), next)) yield next;
276
- }
277
-
278
- function safeIndex(term, env) {
279
- const text = lexicalValue(term, env);
280
- if (!/^-?\d+$/.test(text ?? '')) return null;
281
- const index = Number(text);
282
- return Number.isSafeInteger(index) && index >= 0 ? index : null;
283
- }
@@ -1,48 +0,0 @@
1
- // Registry for builtins and their execution metadata.
2
- // The solver uses the metadata to know when a builtin is deterministic, mode-ready, or should fall back to user clauses.
3
- import { arithmeticBuiltins } from './arithmetic.js';
4
- import { coreBuiltins } from './core.js';
5
- import { stringBuiltins } from './strings.js';
6
- import { listBuiltins } from './lists.js';
7
- import { aggregationBuiltins } from './aggregation.js';
8
- import { contextBuiltins } from './context.js';
9
- import { controlBuiltins } from './control.js';
10
- import { termBuiltins } from './terms.js';
11
-
12
- export class BuiltinRegistry {
13
- constructor() {
14
- this.defs = new Map();
15
- }
16
- add(name, arity, handler, options = {}) {
17
- // ready() describes the argument mode in which the builtin is safe to run;
18
- // fallbackWhenNotReady keeps user-defined clauses visible outside that mode.
19
- this.defs.set(`${name}/${arity}`, {
20
- name,
21
- arity,
22
- handler,
23
- deterministic: options.deterministic ?? false,
24
- ready: options.ready ?? null,
25
- fallbackWhenNotReady: options.fallbackWhenNotReady ?? false,
26
- shouldUse: options.shouldUse ?? null,
27
- });
28
- return this;
29
- }
30
- get(name, arity) {
31
- return this.defs.get(`${name}/${arity}`) ?? null;
32
- }
33
- }
34
-
35
- export function createDefaultRegistry() {
36
- const registry = new BuiltinRegistry();
37
- for (const mod of [coreBuiltins, arithmeticBuiltins, stringBuiltins, listBuiltins, aggregationBuiltins, contextBuiltins, controlBuiltins, termBuiltins]) {
38
- mod.register(registry);
39
- }
40
- return registry;
41
- }
42
-
43
- let defaultRegistry = null;
44
-
45
- export function getDefaultRegistry() {
46
- if (defaultRegistry == null) defaultRegistry = createDefaultRegistry();
47
- return defaultRegistry;
48
- }
@@ -1,234 +0,0 @@
1
- // String builtins.
2
- // They mostly project from already-ground terms to avoid guessing string domains.
3
- import {
4
- atom,
5
- compound,
6
- deref,
7
- isDecimalInteger,
8
- lexicalValue,
9
- listFromItems,
10
- numberTerm,
11
- parseFiniteNumber,
12
- properListItems,
13
- stringTerm,
14
- termToString,
15
- unify,
16
- } from '../term.js';
17
-
18
- export const stringBuiltins = {
19
- register(registry) {
20
- registry.add('str_concat', 3, concat, { deterministic: true });
21
- for (const name of ['contains', 'matches', 'not_matches']) registry.add(name, 2, contains(name), { deterministic: true });
22
- registry.add('matches', 3, matchCaptures, { deterministic: true });
23
- registry.add('split', 3, split, { deterministic: true, fallbackWhenNotReady: true, ready: firstTwoLexicalReady });
24
- registry.add('join', 3, join, { deterministic: true, fallbackWhenNotReady: true, ready: listAndSecondLexicalReady });
25
- registry.add('substring', 4, substring, { deterministic: true, fallbackWhenNotReady: true, ready: substringReady });
26
- registry.add('replace', 4, replace, { deterministic: true, fallbackWhenNotReady: true, ready: firstThreeLexicalReady });
27
- registry.add('lowercase', 2, caseFold('lower'), { deterministic: true, fallbackWhenNotReady: true, ready: firstLexicalReady });
28
- registry.add('uppercase', 2, caseFold('upper'), { deterministic: true, fallbackWhenNotReady: true, ready: firstLexicalReady });
29
- registry.add('trim', 2, trim, { deterministic: true, fallbackWhenNotReady: true, ready: firstLexicalReady });
30
- registry.add('number_string', 2, numberString, { deterministic: true, fallbackWhenNotReady: true, ready: numberStringReady });
31
- registry.add('atom_string', 2, atomString, { deterministic: true, fallbackWhenNotReady: true, ready: atomStringReady });
32
- registry.add('term_string', 2, termString, { deterministic: true, fallbackWhenNotReady: true, ready: firstNonvarReady });
33
- }
34
- };
35
-
36
-
37
-
38
- function firstLexicalReady(goal, env) {
39
- return lexicalValue(goal.args[0], env) !== null;
40
- }
41
-
42
- function firstTwoLexicalReady(goal, env) {
43
- return lexicalValue(goal.args[0], env) !== null && lexicalValue(goal.args[1], env) !== null;
44
- }
45
-
46
- function firstThreeLexicalReady(goal, env) {
47
- return firstTwoLexicalReady(goal, env) && lexicalValue(goal.args[2], env) !== null;
48
- }
49
-
50
- function listAndSecondLexicalReady(goal, env) {
51
- return properListItems(goal.args[0], env) !== null && lexicalValue(goal.args[1], env) !== null;
52
- }
53
-
54
- function substringReady(goal, env) {
55
- return lexicalValue(goal.args[0], env) !== null && safeIndex(goal.args[1], env) !== null && safeIndex(goal.args[2], env) !== null;
56
- }
57
-
58
- function numberStringReady(goal, env) {
59
- const left = deref(goal.args[0], env);
60
- const right = deref(goal.args[1], env);
61
- return left.type === 'number' || right.type === 'string' || right.type === 'atom';
62
- }
63
-
64
- function atomStringReady(goal, env) {
65
- const left = deref(goal.args[0], env);
66
- const right = deref(goal.args[1], env);
67
- return left.type === 'atom' || right.type === 'string' || right.type === 'atom' || right.type === 'number';
68
- }
69
-
70
- function firstNonvarReady(goal, env) {
71
- return deref(goal.args[0], env).type !== 'var';
72
- }
73
-
74
- function* concat({ goal, env }) {
75
- const left = lexicalValue(goal.args[0], env);
76
- const right = lexicalValue(goal.args[1], env);
77
- if (left == null || right == null) return;
78
- const next = env.clone();
79
- if (unify(goal.args[2], stringTerm(left + right), next)) yield next;
80
- }
81
-
82
- function contains(name) {
83
- return function* ({ goal, env }) {
84
- const haystack = lexicalValue(goal.args[0], env);
85
- const needle = lexicalValue(goal.args[1], env);
86
- if (haystack == null || needle == null) return;
87
- const has = haystack.includes(needle);
88
- const matches = simpleAlternationMatch(haystack, needle);
89
- const pass = (name === 'contains' && has) ||
90
- (name === 'matches' && matches) ||
91
- (name === 'not_matches' && !matches);
92
- if (pass) yield env;
93
- };
94
- }
95
-
96
- function* matchCaptures({ goal, env }) {
97
- const text = lexicalValue(goal.args[0], env);
98
- const pattern = lexicalValue(goal.args[1], env);
99
- if (text == null || pattern == null) return;
100
-
101
- let match;
102
- try {
103
- match = new RegExp(pattern).exec(text);
104
- } catch (_) {
105
- return;
106
- }
107
- if (!match?.groups) return;
108
-
109
- const context = contextFromGroups(match.groups);
110
- if (context == null) return;
111
-
112
- const next = env.clone();
113
- if (unify(goal.args[2], context, next)) yield next;
114
- }
115
-
116
- function* split({ goal, env }) {
117
- const text = lexicalValue(goal.args[0], env);
118
- const separator = lexicalValue(goal.args[1], env);
119
- if (text == null || separator == null) return;
120
- const parts = text.split(separator).map(stringTerm);
121
- const next = env.clone();
122
- if (unify(goal.args[2], listFromItems(parts), next)) yield next;
123
- }
124
-
125
- function* join({ goal, env }) {
126
- const items = properListItems(goal.args[0], env);
127
- const separator = lexicalValue(goal.args[1], env);
128
- if (!items || separator == null) return;
129
- const strings = [];
130
- for (const item of items) {
131
- const value = lexicalValue(item, env);
132
- if (value == null) return;
133
- strings.push(value);
134
- }
135
- const next = env.clone();
136
- if (unify(goal.args[2], stringTerm(strings.join(separator)), next)) yield next;
137
- }
138
-
139
- function* substring({ goal, env }) {
140
- const text = lexicalValue(goal.args[0], env);
141
- const start = safeIndex(goal.args[1], env);
142
- const count = safeIndex(goal.args[2], env);
143
- if (text == null || start == null || count == null || start + count > text.length) return;
144
- const next = env.clone();
145
- if (unify(goal.args[3], stringTerm(text.slice(start, start + count)), next)) yield next;
146
- }
147
-
148
- function* replace({ goal, env }) {
149
- const text = lexicalValue(goal.args[0], env);
150
- const search = lexicalValue(goal.args[1], env);
151
- const replacement = lexicalValue(goal.args[2], env);
152
- if (text == null || search == null || replacement == null) return;
153
- const out = search === '' ? text : text.split(search).join(replacement);
154
- const next = env.clone();
155
- if (unify(goal.args[3], stringTerm(out), next)) yield next;
156
- }
157
-
158
- function caseFold(direction) {
159
- return function* ({ goal, env }) {
160
- const text = lexicalValue(goal.args[0], env);
161
- if (text == null) return;
162
- const next = env.clone();
163
- const out = direction === 'lower' ? text.toLowerCase() : text.toUpperCase();
164
- if (unify(goal.args[1], stringTerm(out), next)) yield next;
165
- };
166
- }
167
-
168
- function* trim({ goal, env }) {
169
- const text = lexicalValue(goal.args[0], env);
170
- if (text == null) return;
171
- const next = env.clone();
172
- if (unify(goal.args[1], stringTerm(text.trim()), next)) yield next;
173
- }
174
-
175
- function* numberString({ goal, env }) {
176
- const left = deref(goal.args[0], env);
177
- const right = deref(goal.args[1], env);
178
- const next = env.clone();
179
- if (left.type === 'number') {
180
- if (unify(goal.args[1], stringTerm(left.name), next)) yield next;
181
- return;
182
- }
183
- if (right.type === 'string' || right.type === 'atom') {
184
- if (!numericText(right.name)) return;
185
- if (unify(goal.args[0], numberTerm(right.name), next)) yield next;
186
- }
187
- }
188
-
189
- function* atomString({ goal, env }) {
190
- const left = deref(goal.args[0], env);
191
- const right = deref(goal.args[1], env);
192
- const next = env.clone();
193
- if (left.type === 'atom') {
194
- if (unify(goal.args[1], stringTerm(left.name), next)) yield next;
195
- return;
196
- }
197
- if (right.type === 'string' || right.type === 'atom' || right.type === 'number') {
198
- if (unify(goal.args[0], atom(right.name), next)) yield next;
199
- }
200
- }
201
-
202
- function* termString({ goal, env }) {
203
- const term = deref(goal.args[0], env);
204
- if (term.type === 'var') return;
205
- const next = env.clone();
206
- if (unify(goal.args[1], stringTerm(termToString(term, env, true)), next)) yield next;
207
- }
208
-
209
- function contextFromGroups(groups) {
210
- const terms = [];
211
- for (const [name, value] of Object.entries(groups)) {
212
- if (value !== undefined) terms.push(compound(name, [stringTerm(value)]));
213
- }
214
- if (terms.length === 0) return null;
215
-
216
- let context = terms[terms.length - 1];
217
- for (let i = terms.length - 2; i >= 0; i--) context = compound(',', [terms[i], context]);
218
- return context;
219
- }
220
-
221
- function simpleAlternationMatch(haystack, pattern) {
222
- return pattern.split('|').some((part) => part === '' || haystack.includes(part));
223
- }
224
-
225
- function safeIndex(term, env) {
226
- const text = lexicalValue(term, env);
227
- if (!/^-?\d+$/.test(text ?? '')) return null;
228
- const index = Number(text);
229
- return Number.isSafeInteger(index) && index >= 0 ? index : null;
230
- }
231
-
232
- function numericText(text) {
233
- return isDecimalInteger(text) || parseFiniteNumber(text) != null;
234
- }
@@ -1,66 +0,0 @@
1
- // Term-inspection builtins for reusable meta-programming over eyelang terms.
2
- import { atom, compound, deref, listFromItems, lexicalValue, numberTerm, properListItems, stringTerm, unify } from '../term.js';
3
-
4
- export const termBuiltins = {
5
- register(registry) {
6
- registry.add('functor', 3, functorBuiltin, { deterministic: true, fallbackWhenNotReady: true, ready: firstNonvarReady });
7
- registry.add('arg', 3, argBuiltin, { deterministic: true, fallbackWhenNotReady: true, ready: argReady });
8
- registry.add('compound_name_arguments', 3, compoundNameArguments, { deterministic: true, fallbackWhenNotReady: true, ready: compoundNameArgumentsReady });
9
- }
10
- };
11
-
12
-
13
- function firstNonvarReady(goal, env) {
14
- return deref(goal.args[0], env).type !== 'var';
15
- }
16
-
17
- function argReady(goal, env) {
18
- return /^\d+$/.test(lexicalValue(goal.args[0], env) ?? '') && deref(goal.args[1], env).type === 'compound';
19
- }
20
-
21
- function compoundNameArgumentsReady(goal, env) {
22
- const term = deref(goal.args[0], env);
23
- if (term.type === 'compound') return true;
24
- return term.type === 'var' && lexicalValue(goal.args[1], env) !== null && properListItems(goal.args[2], env) !== null;
25
- }
26
-
27
- function* functorBuiltin({ goal, env }) {
28
- const term = deref(goal.args[0], env);
29
- if (term.type === 'var') return;
30
- const nameTerm = term.type === 'compound' ? atom(term.name) : scalarNameTerm(term);
31
- const arity = term.type === 'compound' ? term.arity : 0;
32
- const next = env.clone();
33
- if (unify(goal.args[1], nameTerm, next) && unify(goal.args[2], numberTerm(arity), next)) yield next;
34
- }
35
-
36
- function* argBuiltin({ goal, env }) {
37
- const indexText = lexicalValue(goal.args[0], env);
38
- if (!/^\d+$/.test(indexText ?? '')) return;
39
- const index = Number(indexText);
40
- const term = deref(goal.args[1], env);
41
- if (term.type !== 'compound' || !Number.isSafeInteger(index) || index < 1 || index > term.arity) return;
42
- const next = env.clone();
43
- if (unify(goal.args[2], term.args[index - 1], next)) yield next;
44
- }
45
-
46
- function* compoundNameArguments({ goal, env }) {
47
- const term = deref(goal.args[0], env);
48
- if (term.type === 'compound') {
49
- const next = env.clone();
50
- if (unify(goal.args[1], atom(term.name), next) && unify(goal.args[2], listFromItems(term.args), next)) yield next;
51
- return;
52
- }
53
- if (term.type !== 'var') return;
54
-
55
- const name = lexicalValue(goal.args[1], env);
56
- const args = properListItems(goal.args[2], env);
57
- if (name == null || !args) return;
58
- const next = env.clone();
59
- if (unify(goal.args[0], compound(name, args), next)) yield next;
60
- }
61
-
62
- function scalarNameTerm(term) {
63
- if (term.type === 'atom') return atom(term.name);
64
- if (term.type === 'number') return numberTerm(term.name);
65
- return stringTerm(term.name);
66
- }