eyeling 1.32.1 → 1.33.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. package/README.md +87 -16
  2. package/bin/eyeling.cjs +56 -4
  3. package/dist/browser/eyeling.browser.js +2 -11
  4. package/examples/eyelang/INTEGRATION.md +13 -0
  5. package/examples/eyelang/README.md +628 -0
  6. package/examples/eyelang/SPEC.md +684 -0
  7. package/examples/eyelang/access-control-policy.pl +52 -0
  8. package/examples/eyelang/ackermann.pl +46 -0
  9. package/examples/eyelang/age.pl +28 -0
  10. package/examples/eyelang/aliases-and-namespaces.pl +22 -0
  11. package/examples/eyelang/alignment-demo.pl +44 -0
  12. package/examples/eyelang/allen-interval-calculus.pl +64 -0
  13. package/examples/eyelang/ancestor.pl +21 -0
  14. package/examples/eyelang/animal.pl +21 -0
  15. package/examples/eyelang/annotation-rdf12.ttl +12 -0
  16. package/examples/eyelang/annotation.pl +34 -0
  17. package/examples/eyelang/auroracare.pl +309 -0
  18. package/examples/eyelang/backward.pl +12 -0
  19. package/examples/eyelang/basic-monadic.pl +10018 -0
  20. package/examples/eyelang/bayes-diagnosis.pl +108 -0
  21. package/examples/eyelang/bayes-therapy.pl +182 -0
  22. package/examples/eyelang/beam-deflection.pl +50 -0
  23. package/examples/eyelang/blocks-world-planning.pl +75 -0
  24. package/examples/eyelang/bmi.pl +232 -0
  25. package/examples/eyelang/braking-safety-worlds.pl +69 -0
  26. package/examples/eyelang/buck-converter-design.pl +78 -0
  27. package/examples/eyelang/cache-performance.pl +54 -0
  28. package/examples/eyelang/canary-release.pl +49 -0
  29. package/examples/eyelang/cat-koko.pl +24 -0
  30. package/examples/eyelang/clinical-trial-screening.pl +92 -0
  31. package/examples/eyelang/collatz-1000.pl +14 -0
  32. package/examples/eyelang/combinatorics-findall-sort.pl +37 -0
  33. package/examples/eyelang/competitive-enzyme-kinetics.pl +78 -0
  34. package/examples/eyelang/complex-matrix-stability.pl +45 -0
  35. package/examples/eyelang/complex.pl +121 -0
  36. package/examples/eyelang/composition-of-injective-functions-is-injective.pl +50 -0
  37. package/examples/eyelang/context-association.pl +53 -0
  38. package/examples/eyelang/control-system.pl +72 -0
  39. package/examples/eyelang/cryptarithmetic-send-more-money.pl +49 -0
  40. package/examples/eyelang/cyclic-path.pl +16 -0
  41. package/examples/eyelang/d3-group.pl +100 -0
  42. package/examples/eyelang/dairy-energy-balance.pl +65 -0
  43. package/examples/eyelang/data-negotiation.pl +39 -0
  44. package/examples/eyelang/deep-taxonomy-10.pl +115 -0
  45. package/examples/eyelang/deep-taxonomy-100.pl +385 -0
  46. package/examples/eyelang/deep-taxonomy-1000.pl +3085 -0
  47. package/examples/eyelang/deep-taxonomy-10000.pl +30094 -0
  48. package/examples/eyelang/deep-taxonomy-100000.pl +300184 -0
  49. package/examples/eyelang/delfour.pl +281 -0
  50. package/examples/eyelang/dense-hamiltonian-cycle.pl +92 -0
  51. package/examples/eyelang/deontic-logic.pl +52 -0
  52. package/examples/eyelang/derived-backward-rule.pl +30 -0
  53. package/examples/eyelang/derived-rule.pl +27 -0
  54. package/examples/eyelang/diamond-property.pl +38 -0
  55. package/examples/eyelang/dijkstra-findall-sort.pl +44 -0
  56. package/examples/eyelang/dijkstra-risk-path.pl +86 -0
  57. package/examples/eyelang/dijkstra.pl +46 -0
  58. package/examples/eyelang/dining-philosophers.pl +140 -0
  59. package/examples/eyelang/directional-language.ttl +9 -0
  60. package/examples/eyelang/dog.pl +25 -0
  61. package/examples/eyelang/drone-corridor-planner.pl +51 -0
  62. package/examples/eyelang/easter-computus.pl +89 -0
  63. package/examples/eyelang/electrical-rc-filter.pl +36 -0
  64. package/examples/eyelang/epidemic-policy.pl +67 -0
  65. package/examples/eyelang/equivalence-classes-overlap-implies-same-class.pl +27 -0
  66. package/examples/eyelang/eulerian-path.pl +85 -0
  67. package/examples/eyelang/ev-range-worlds.pl +82 -0
  68. package/examples/eyelang/exact-cover-sudoku.pl +113 -0
  69. package/examples/eyelang/existential-rule.pl +18 -0
  70. package/examples/eyelang/exoplanet-validation-worlds.pl +88 -0
  71. package/examples/eyelang/expression-eval.pl +43 -0
  72. package/examples/eyelang/eyeling-ackermann.n3 +41 -0
  73. package/examples/eyelang/eyeling-age-threshold.n3 +12 -0
  74. package/examples/eyelang/eyeling-alignment-demo.n3 +11 -0
  75. package/examples/eyelang/eyeling-allen-interval-calculus-small.n3 +13 -0
  76. package/examples/eyelang/eyeling-backward-recursion.n3 +11 -0
  77. package/examples/eyelang/eyeling-backward.n3 +10 -0
  78. package/examples/eyelang/eyeling-basic-monadic-small.n3 +11 -0
  79. package/examples/eyelang/eyeling-bmi.n3 +10 -0
  80. package/examples/eyelang/eyeling-cat-koko.n3 +15 -0
  81. package/examples/eyelang/eyeling-collatz-small.n3 +11 -0
  82. package/examples/eyelang/eyeling-collection.n3 +11 -0
  83. package/examples/eyelang/eyeling-complex-arithmetic.n3 +10 -0
  84. package/examples/eyelang/eyeling-context-association.n3 +11 -0
  85. package/examples/eyelang/eyeling-control-system-small.n3 +11 -0
  86. package/examples/eyelang/eyeling-crypto-builtins-extra.n3 +10 -0
  87. package/examples/eyelang/eyeling-crypto-builtins.n3 +8 -0
  88. package/examples/eyelang/eyeling-deep-taxonomy-10.n3 +18 -0
  89. package/examples/eyelang/eyeling-derived-backward-rule-flat.n3 +10 -0
  90. package/examples/eyelang/eyeling-derived-rule-flat.n3 +9 -0
  91. package/examples/eyelang/eyeling-digital-product-passport-small.n3 +11 -0
  92. package/examples/eyelang/eyeling-dijkstra-tiny.n3 +14 -0
  93. package/examples/eyelang/eyeling-dog-license.n3 +13 -0
  94. package/examples/eyelang/eyeling-drone-corridor-planner-small.n3 +13 -0
  95. package/examples/eyelang/eyeling-equals.n3 +8 -0
  96. package/examples/eyelang/eyeling-equivalence-classes.n3 +11 -0
  97. package/examples/eyelang/eyeling-euler-identity.n3 +9 -0
  98. package/examples/eyelang/eyeling-existential-rule.n3 +9 -0
  99. package/examples/eyelang/eyeling-expression-eval.n3 +11 -0
  100. package/examples/eyelang/eyeling-family-cousins-extended.n3 +12 -0
  101. package/examples/eyelang/eyeling-fastpow.n3 +10 -0
  102. package/examples/eyelang/eyeling-fibonacci.n3 +44 -0
  103. package/examples/eyelang/eyeling-french-cities-reachability.n3 +22 -0
  104. package/examples/eyelang/eyeling-goldbach-small.n3 +22 -0
  105. package/examples/eyelang/eyeling-good-cobbler.n3 +9 -0
  106. package/examples/eyelang/eyeling-list-builtins.n3 +10 -0
  107. package/examples/eyelang/eyeling-list-collection-extra.n3 +9 -0
  108. package/examples/eyelang/eyeling-math-builtins.n3 +9 -0
  109. package/examples/eyelang/eyeling-string-builtins-extra.n3 +9 -0
  110. package/examples/eyelang/eyeling-string-builtins.n3 +10 -0
  111. package/examples/eyelang/eyeling-time-builtins.n3 +11 -0
  112. package/examples/eyelang/eyeling-time-components-extra.n3 +10 -0
  113. package/examples/eyelang/eyeling-witch.n3 +10 -0
  114. package/examples/eyelang/family-cousins.n3 +17 -0
  115. package/examples/eyelang/family-cousins.pl +65 -0
  116. package/examples/eyelang/fastpow.pl +53 -0
  117. package/examples/eyelang/fft8-numeric.pl +83 -0
  118. package/examples/eyelang/fibonacci.pl +53 -0
  119. package/examples/eyelang/field-nitrogen-balance.pl +70 -0
  120. package/examples/eyelang/flandor.pl +296 -0
  121. package/examples/eyelang/floating-point.pl +23 -0
  122. package/examples/eyelang/four-color-map.pl +127 -0
  123. package/examples/eyelang/fundamental-theorem-arithmetic.pl +113 -0
  124. package/examples/eyelang/gcd-bezout-identity.pl +48 -0
  125. package/examples/eyelang/gd-step-certified.pl +158 -0
  126. package/examples/eyelang/gdpr-compliance.pl +69 -0
  127. package/examples/eyelang/goldbach-1000.pl +185 -0
  128. package/examples/eyelang/good-cobbler.pl +14 -0
  129. package/examples/eyelang/gps.pl +152 -0
  130. package/examples/eyelang/graph-reachability.pl +36 -0
  131. package/examples/eyelang/gray-code-counter.pl +48 -0
  132. package/examples/eyelang/greatest-lower-bound-uniqueness.pl +28 -0
  133. package/examples/eyelang/group-inverse-uniqueness.pl +34 -0
  134. package/examples/eyelang/hamiltonian-cycle.pl +55 -0
  135. package/examples/eyelang/hamiltonian-path.pl +49 -0
  136. package/examples/eyelang/hamming-code.pl +105 -0
  137. package/examples/eyelang/hanoi.pl +20 -0
  138. package/examples/eyelang/heat-loss.pl +51 -0
  139. package/examples/eyelang/heron-theorem.pl +36 -0
  140. package/examples/eyelang/ideal-gas-law.pl +37 -0
  141. package/examples/eyelang/illegitimate-reasoning.pl +88 -0
  142. package/examples/eyelang/kaprekar.pl +32 -0
  143. package/examples/eyelang/law-of-cosines.pl +31 -0
  144. package/examples/eyelang/least-squares-regression.pl +81 -0
  145. package/examples/eyelang/list-collection.pl +33 -0
  146. package/examples/eyelang/lldm.pl +78 -0
  147. package/examples/eyelang/manufacturing-quality-control.pl +73 -0
  148. package/examples/eyelang/matrix.pl +296 -0
  149. package/examples/eyelang/microgrid-dispatch.pl +85 -0
  150. package/examples/eyelang/monkey-bananas.pl +45 -0
  151. package/examples/eyelang/n-queens.pl +23 -0
  152. package/examples/eyelang/n3-builtins.n3 +28 -0
  153. package/examples/eyelang/network-sla.pl +48 -0
  154. package/examples/eyelang/newton-raphson.pl +49 -0
  155. package/examples/eyelang/nixon-diamond.pl +37 -0
  156. package/examples/eyelang/odrl-dpv-healthcare-risk-ranked.pl +266 -0
  157. package/examples/eyelang/odrl-dpv-risk-ranked.pl +320 -0
  158. package/examples/eyelang/orbital-transfer-design.pl +113 -0
  159. package/examples/eyelang/output/access-control-policy.pl +2 -0
  160. package/examples/eyelang/output/ackermann.pl +12 -0
  161. package/examples/eyelang/output/age.pl +2 -0
  162. package/examples/eyelang/output/aliases-and-namespaces.pl +5 -0
  163. package/examples/eyelang/output/alignment-demo.pl +32 -0
  164. package/examples/eyelang/output/allen-interval-calculus.pl +154 -0
  165. package/examples/eyelang/output/ancestor.pl +6 -0
  166. package/examples/eyelang/output/animal.pl +4 -0
  167. package/examples/eyelang/output/annotation-rdf12.ttl +1 -0
  168. package/examples/eyelang/output/annotation.pl +4 -0
  169. package/examples/eyelang/output/auroracare.pl +117 -0
  170. package/examples/eyelang/output/backward.pl +1 -0
  171. package/examples/eyelang/output/basic-monadic.pl +1518 -0
  172. package/examples/eyelang/output/bayes-diagnosis.pl +13 -0
  173. package/examples/eyelang/output/bayes-therapy.pl +23 -0
  174. package/examples/eyelang/output/beam-deflection.pl +5 -0
  175. package/examples/eyelang/output/blocks-world-planning.pl +4 -0
  176. package/examples/eyelang/output/bmi.pl +32 -0
  177. package/examples/eyelang/output/braking-safety-worlds.pl +18 -0
  178. package/examples/eyelang/output/buck-converter-design.pl +6 -0
  179. package/examples/eyelang/output/cache-performance.pl +4 -0
  180. package/examples/eyelang/output/canary-release.pl +5 -0
  181. package/examples/eyelang/output/cat-koko.pl +3 -0
  182. package/examples/eyelang/output/clinical-trial-screening.pl +9 -0
  183. package/examples/eyelang/output/collatz-1000.pl +1000 -0
  184. package/examples/eyelang/output/combinatorics-findall-sort.pl +2 -0
  185. package/examples/eyelang/output/competitive-enzyme-kinetics.pl +6 -0
  186. package/examples/eyelang/output/complex-matrix-stability.pl +5 -0
  187. package/examples/eyelang/output/complex.pl +1 -0
  188. package/examples/eyelang/output/composition-of-injective-functions-is-injective.pl +2 -0
  189. package/examples/eyelang/output/context-association.pl +3 -0
  190. package/examples/eyelang/output/control-system.pl +6 -0
  191. package/examples/eyelang/output/cryptarithmetic-send-more-money.pl +6 -0
  192. package/examples/eyelang/output/cyclic-path.pl +16 -0
  193. package/examples/eyelang/output/d3-group.pl +2 -0
  194. package/examples/eyelang/output/dairy-energy-balance.pl +13 -0
  195. package/examples/eyelang/output/data-negotiation.pl +1 -0
  196. package/examples/eyelang/output/deep-taxonomy-10.pl +16 -0
  197. package/examples/eyelang/output/deep-taxonomy-100.pl +16 -0
  198. package/examples/eyelang/output/deep-taxonomy-1000.pl +16 -0
  199. package/examples/eyelang/output/deep-taxonomy-10000.pl +16 -0
  200. package/examples/eyelang/output/deep-taxonomy-100000.pl +16 -0
  201. package/examples/eyelang/output/delfour.pl +31 -0
  202. package/examples/eyelang/output/dense-hamiltonian-cycle.pl +4 -0
  203. package/examples/eyelang/output/deontic-logic.pl +4 -0
  204. package/examples/eyelang/output/derived-backward-rule.pl +3 -0
  205. package/examples/eyelang/output/derived-rule.pl +2 -0
  206. package/examples/eyelang/output/diamond-property.pl +4 -0
  207. package/examples/eyelang/output/dijkstra-findall-sort.pl +2 -0
  208. package/examples/eyelang/output/dijkstra-risk-path.pl +29 -0
  209. package/examples/eyelang/output/dijkstra.pl +16 -0
  210. package/examples/eyelang/output/dining-philosophers.pl +350 -0
  211. package/examples/eyelang/output/directional-language.ttl +1 -0
  212. package/examples/eyelang/output/dog.pl +1 -0
  213. package/examples/eyelang/output/drone-corridor-planner.pl +17 -0
  214. package/examples/eyelang/output/easter-computus.pl +30 -0
  215. package/examples/eyelang/output/electrical-rc-filter.pl +3 -0
  216. package/examples/eyelang/output/epidemic-policy.pl +14 -0
  217. package/examples/eyelang/output/equivalence-classes-overlap-implies-same-class.pl +18 -0
  218. package/examples/eyelang/output/eulerian-path.pl +3 -0
  219. package/examples/eyelang/output/ev-range-worlds.pl +19 -0
  220. package/examples/eyelang/output/exact-cover-sudoku.pl +3 -0
  221. package/examples/eyelang/output/existential-rule.pl +2 -0
  222. package/examples/eyelang/output/exoplanet-validation-worlds.pl +22 -0
  223. package/examples/eyelang/output/expression-eval.pl +1 -0
  224. package/examples/eyelang/output/eyeling-ackermann.n3 +12 -0
  225. package/examples/eyelang/output/eyeling-age-threshold.n3 +4 -0
  226. package/examples/eyelang/output/eyeling-alignment-demo.n3 +1 -0
  227. package/examples/eyelang/output/eyeling-allen-interval-calculus-small.n3 +3 -0
  228. package/examples/eyelang/output/eyeling-backward-recursion.n3 +9 -0
  229. package/examples/eyelang/output/eyeling-backward.n3 +1 -0
  230. package/examples/eyelang/output/eyeling-basic-monadic-small.n3 +8 -0
  231. package/examples/eyelang/output/eyeling-bmi.n3 +2 -0
  232. package/examples/eyelang/output/eyeling-cat-koko.n3 +3 -0
  233. package/examples/eyelang/output/eyeling-collatz-small.n3 +3 -0
  234. package/examples/eyelang/output/eyeling-collection.n3 +1 -0
  235. package/examples/eyelang/output/eyeling-complex-arithmetic.n3 +5 -0
  236. package/examples/eyelang/output/eyeling-context-association.n3 +4 -0
  237. package/examples/eyelang/output/eyeling-control-system-small.n3 +4 -0
  238. package/examples/eyelang/output/eyeling-crypto-builtins-extra.n3 +3 -0
  239. package/examples/eyelang/output/eyeling-crypto-builtins.n3 +2 -0
  240. package/examples/eyelang/output/eyeling-deep-taxonomy-10.n3 +32 -0
  241. package/examples/eyelang/output/eyeling-derived-backward-rule-flat.n3 +4 -0
  242. package/examples/eyelang/output/eyeling-derived-rule-flat.n3 +2 -0
  243. package/examples/eyelang/output/eyeling-digital-product-passport-small.n3 +3 -0
  244. package/examples/eyelang/output/eyeling-dijkstra-tiny.n3 +9 -0
  245. package/examples/eyelang/output/eyeling-dog-license.n3 +1 -0
  246. package/examples/eyelang/output/eyeling-drone-corridor-planner-small.n3 +5 -0
  247. package/examples/eyelang/output/eyeling-equals.n3 +1 -0
  248. package/examples/eyelang/output/eyeling-equivalence-classes.n3 +2 -0
  249. package/examples/eyelang/output/eyeling-euler-identity.n3 +3 -0
  250. package/examples/eyelang/output/eyeling-existential-rule.n3 +4 -0
  251. package/examples/eyelang/output/eyeling-expression-eval.n3 +3 -0
  252. package/examples/eyelang/output/eyeling-family-cousins-extended.n3 +6 -0
  253. package/examples/eyelang/output/eyeling-fastpow.n3 +4 -0
  254. package/examples/eyelang/output/eyeling-fibonacci.n3 +6 -0
  255. package/examples/eyelang/output/eyeling-french-cities-reachability.n3 +25 -0
  256. package/examples/eyelang/output/eyeling-goldbach-small.n3 +2 -0
  257. package/examples/eyelang/output/eyeling-good-cobbler.n3 +2 -0
  258. package/examples/eyelang/output/eyeling-list-builtins.n3 +6 -0
  259. package/examples/eyelang/output/eyeling-list-collection-extra.n3 +5 -0
  260. package/examples/eyelang/output/eyeling-math-builtins.n3 +5 -0
  261. package/examples/eyelang/output/eyeling-string-builtins-extra.n3 +3 -0
  262. package/examples/eyelang/output/eyeling-string-builtins.n3 +4 -0
  263. package/examples/eyelang/output/eyeling-time-builtins.n3 +4 -0
  264. package/examples/eyelang/output/eyeling-time-components-extra.n3 +5 -0
  265. package/examples/eyelang/output/eyeling-witch.n3 +2 -0
  266. package/examples/eyelang/output/family-cousins.n3 +8 -0
  267. package/examples/eyelang/output/family-cousins.pl +28 -0
  268. package/examples/eyelang/output/fastpow.pl +6 -0
  269. package/examples/eyelang/output/fft8-numeric.pl +4 -0
  270. package/examples/eyelang/output/fibonacci.pl +6 -0
  271. package/examples/eyelang/output/field-nitrogen-balance.pl +21 -0
  272. package/examples/eyelang/output/flandor.pl +43 -0
  273. package/examples/eyelang/output/floating-point.pl +9 -0
  274. package/examples/eyelang/output/four-color-map.pl +3 -0
  275. package/examples/eyelang/output/fundamental-theorem-arithmetic.pl +9 -0
  276. package/examples/eyelang/output/gcd-bezout-identity.pl +36 -0
  277. package/examples/eyelang/output/gd-step-certified.pl +79 -0
  278. package/examples/eyelang/output/gdpr-compliance.pl +6 -0
  279. package/examples/eyelang/output/goldbach-1000.pl +667 -0
  280. package/examples/eyelang/output/good-cobbler.pl +1 -0
  281. package/examples/eyelang/output/gps.pl +21 -0
  282. package/examples/eyelang/output/graph-reachability.pl +3 -0
  283. package/examples/eyelang/output/gray-code-counter.pl +1 -0
  284. package/examples/eyelang/output/greatest-lower-bound-uniqueness.pl +2 -0
  285. package/examples/eyelang/output/group-inverse-uniqueness.pl +2 -0
  286. package/examples/eyelang/output/hamiltonian-cycle.pl +4 -0
  287. package/examples/eyelang/output/hamiltonian-path.pl +121 -0
  288. package/examples/eyelang/output/hamming-code.pl +6 -0
  289. package/examples/eyelang/output/hanoi.pl +1 -0
  290. package/examples/eyelang/output/heat-loss.pl +5 -0
  291. package/examples/eyelang/output/heron-theorem.pl +4 -0
  292. package/examples/eyelang/output/ideal-gas-law.pl +3 -0
  293. package/examples/eyelang/output/illegitimate-reasoning.pl +15 -0
  294. package/examples/eyelang/output/kaprekar.pl +8 -0
  295. package/examples/eyelang/output/law-of-cosines.pl +3 -0
  296. package/examples/eyelang/output/least-squares-regression.pl +5 -0
  297. package/examples/eyelang/output/list-collection.pl +3 -0
  298. package/examples/eyelang/output/lldm.pl +6 -0
  299. package/examples/eyelang/output/manufacturing-quality-control.pl +6 -0
  300. package/examples/eyelang/output/matrix.pl +10 -0
  301. package/examples/eyelang/output/microgrid-dispatch.pl +6 -0
  302. package/examples/eyelang/output/monkey-bananas.pl +5 -0
  303. package/examples/eyelang/output/n-queens.pl +93 -0
  304. package/examples/eyelang/output/n3-builtins.n3 +6 -0
  305. package/examples/eyelang/output/network-sla.pl +4 -0
  306. package/examples/eyelang/output/newton-raphson.pl +3 -0
  307. package/examples/eyelang/output/nixon-diamond.pl +5 -0
  308. package/examples/eyelang/output/odrl-dpv-healthcare-risk-ranked.pl +42 -0
  309. package/examples/eyelang/output/odrl-dpv-risk-ranked.pl +120 -0
  310. package/examples/eyelang/output/orbital-transfer-design.pl +7 -0
  311. package/examples/eyelang/output/path-discovery.pl +3 -0
  312. package/examples/eyelang/output/peano-arithmetic.pl +3 -0
  313. package/examples/eyelang/output/peasant.pl +10 -0
  314. package/examples/eyelang/output/pendulum-period.pl +4 -0
  315. package/examples/eyelang/output/polynomial.pl +14 -0
  316. package/examples/eyelang/output/project-portfolio-optimization.pl +6 -0
  317. package/examples/eyelang/output/proof-contrapositive.pl +3 -0
  318. package/examples/eyelang/output/quadratic-formula.pl +6 -0
  319. package/examples/eyelang/output/quine-mccluskey.pl +3 -0
  320. package/examples/eyelang/output/radioactive-decay.pl +5 -0
  321. package/examples/eyelang/output/resilient-city-orchestration.pl +67 -0
  322. package/examples/eyelang/output/riemann-hypothesis.pl +12 -0
  323. package/examples/eyelang/output/sat-dpll.pl +5 -0
  324. package/examples/eyelang/output/security-incident-correlation.pl +3 -0
  325. package/examples/eyelang/output/service-impact.pl +11 -0
  326. package/examples/eyelang/output/sieve.pl +1 -0
  327. package/examples/eyelang/output/skolem-functions.pl +16 -0
  328. package/examples/eyelang/output/socket-age.pl +1 -0
  329. package/examples/eyelang/output/socket-family.pl +3 -0
  330. package/examples/eyelang/output/socrates.n3 +1 -0
  331. package/examples/eyelang/output/socrates.pl +2 -0
  332. package/examples/eyelang/output/statistics-summary.pl +4 -0
  333. package/examples/eyelang/output/sudoku.pl +2 -0
  334. package/examples/eyelang/output/superdense-coding.pl +6 -0
  335. package/examples/eyelang/output/traveling-salesman.pl +1 -0
  336. package/examples/eyelang/output/triple-term.n3 +2 -0
  337. package/examples/eyelang/output/turing.pl +12 -0
  338. package/examples/eyelang/output/vector-similarity.pl +4 -0
  339. package/examples/eyelang/output/witch.pl +7 -0
  340. package/examples/eyelang/output/wolf-goat-cabbage.pl +3 -0
  341. package/examples/eyelang/output/zebra.pl +3 -0
  342. package/examples/eyelang/path-discovery.pl +44998 -0
  343. package/examples/eyelang/peano-arithmetic.pl +31 -0
  344. package/examples/eyelang/peasant.pl +30 -0
  345. package/examples/eyelang/pendulum-period.pl +50 -0
  346. package/examples/eyelang/polynomial.pl +124 -0
  347. package/examples/eyelang/project-portfolio-optimization.pl +101 -0
  348. package/examples/eyelang/proof/age.pl +71 -0
  349. package/examples/eyelang/proof/aliases-and-namespaces.pl +78 -0
  350. package/examples/eyelang/proof/ancestor.pl +140 -0
  351. package/examples/eyelang/proof/animal.pl +68 -0
  352. package/examples/eyelang/proof/annotation.pl +80 -0
  353. package/examples/eyelang/proof/backward.pl +22 -0
  354. package/examples/eyelang/proof/cat-koko.pl +86 -0
  355. package/examples/eyelang/proof/data-negotiation.pl +76 -0
  356. package/examples/eyelang/proof/derived-rule.pl +43 -0
  357. package/examples/eyelang/proof/dog.pl +31 -0
  358. package/examples/eyelang/proof/electrical-rc-filter.pl +105 -0
  359. package/examples/eyelang/proof/existential-rule.pl +40 -0
  360. package/examples/eyelang/proof/floating-point.pl +160 -0
  361. package/examples/eyelang/proof/good-cobbler.pl +16 -0
  362. package/examples/eyelang/proof/group-inverse-uniqueness.pl +84 -0
  363. package/examples/eyelang/proof/list-collection.pl +52 -0
  364. package/examples/eyelang/proof/proof-contrapositive.pl +78 -0
  365. package/examples/eyelang/proof/socket-age.pl +32 -0
  366. package/examples/eyelang/proof/socket-family.pl +59 -0
  367. package/examples/eyelang/proof/socrates.pl +38 -0
  368. package/examples/eyelang/proof-contrapositive.pl +27 -0
  369. package/examples/eyelang/quadratic-formula.pl +54 -0
  370. package/examples/eyelang/quine-mccluskey.pl +143 -0
  371. package/examples/eyelang/radioactive-decay.pl +56 -0
  372. package/examples/eyelang/resilient-city-orchestration.pl +303 -0
  373. package/examples/eyelang/riemann-hypothesis.pl +110 -0
  374. package/examples/eyelang/sat-dpll.pl +80 -0
  375. package/examples/eyelang/security-incident-correlation.pl +69 -0
  376. package/examples/eyelang/service-impact.pl +41 -0
  377. package/examples/eyelang/sieve.pl +20 -0
  378. package/examples/eyelang/skolem-functions.pl +52 -0
  379. package/examples/eyelang/socket-age.pl +39 -0
  380. package/examples/eyelang/socket-family.pl +28 -0
  381. package/examples/eyelang/socrates.n3 +11 -0
  382. package/examples/eyelang/socrates.pl +19 -0
  383. package/examples/eyelang/statistics-summary.pl +54 -0
  384. package/examples/eyelang/sudoku.pl +20 -0
  385. package/examples/eyelang/superdense-coding.pl +84 -0
  386. package/examples/eyelang/traveling-salesman.pl +64 -0
  387. package/examples/eyelang/triple-term.n3 +9 -0
  388. package/examples/eyelang/turing.pl +67 -0
  389. package/examples/eyelang/vector-similarity.pl +56 -0
  390. package/examples/eyelang/witch.pl +38 -0
  391. package/examples/eyelang/wolf-goat-cabbage.pl +56 -0
  392. package/examples/eyelang/zebra.pl +44 -0
  393. package/eyelang.d.ts +92 -0
  394. package/eyeling-builtins.ttl +1 -1
  395. package/eyeling.js +2 -11
  396. package/index.d.ts +50 -2
  397. package/index.js +95 -1
  398. package/lib/builtins.js +1 -11
  399. package/lib/cli.js +1 -0
  400. package/lib/eyelang/bin.js +7 -0
  401. package/lib/eyelang/builtins/aggregation.mjs +81 -0
  402. package/lib/eyelang/builtins/alphametic.mjs +144 -0
  403. package/lib/eyelang/builtins/arithmetic.mjs +197 -0
  404. package/lib/eyelang/builtins/control.mjs +22 -0
  405. package/lib/eyelang/builtins/core.mjs +78 -0
  406. package/lib/eyelang/builtins/formula.mjs +42 -0
  407. package/lib/eyelang/builtins/lists.mjs +149 -0
  408. package/lib/eyelang/builtins/matrix.mjs +226 -0
  409. package/lib/eyelang/builtins/n3.mjs +483 -0
  410. package/lib/eyelang/builtins/number-theory.mjs +114 -0
  411. package/lib/eyelang/builtins/portfolio.mjs +73 -0
  412. package/lib/eyelang/builtins/registry.mjs +54 -0
  413. package/lib/eyelang/builtins/search.mjs +579 -0
  414. package/lib/eyelang/builtins/strings.mjs +41 -0
  415. package/lib/eyelang/builtins/sudoku.mjs +141 -0
  416. package/lib/eyelang/cli.mjs +192 -0
  417. package/lib/eyelang/explain.mjs +324 -0
  418. package/lib/eyelang/hash.mjs +294 -0
  419. package/lib/eyelang/index.mjs +48 -0
  420. package/lib/eyelang/parser.mjs +428 -0
  421. package/lib/eyelang/program.mjs +244 -0
  422. package/lib/eyelang/rdf.mjs +747 -0
  423. package/lib/eyelang/solver.mjs +237 -0
  424. package/lib/eyelang/term.mjs +328 -0
  425. package/package.json +12 -3
  426. package/test/builtins.test.js +15 -2
  427. package/test/eyelang/conformance/README.md +45 -0
  428. package/test/eyelang/conformance/cases/core/001_fact_output.pl +4 -0
  429. package/test/eyelang/conformance/cases/core/001_fact_query.query +1 -0
  430. package/test/eyelang/conformance/cases/core/002_rule_recursion.pl +7 -0
  431. package/test/eyelang/conformance/cases/core/002_rule_recursion.query +1 -0
  432. package/test/eyelang/conformance/cases/core/003_terms_and_readback.pl +16 -0
  433. package/test/eyelang/conformance/cases/core/003_terms_and_readback.query +1 -0
  434. package/test/eyelang/conformance/cases/core/004_conjunction_and_parentheses.pl +5 -0
  435. package/test/eyelang/conformance/cases/core/004_conjunction_and_parentheses.query +1 -0
  436. package/test/eyelang/conformance/cases/core/005_list_deconstruction.pl +6 -0
  437. package/test/eyelang/conformance/cases/core/005_list_deconstruction.query +1 -0
  438. package/test/eyelang/conformance/cases/core/006_comma_formula_data.pl +4 -0
  439. package/test/eyelang/conformance/cases/core/006_comma_formula_data.query +1 -0
  440. package/test/eyelang/conformance/cases/core/007_anonymous_variables.pl +5 -0
  441. package/test/eyelang/conformance/cases/core/007_anonymous_variables.query +1 -0
  442. package/test/eyelang/conformance/cases/core/008_graphic_atoms.pl +6 -0
  443. package/test/eyelang/conformance/cases/core/008_graphic_atoms.query +1 -0
  444. package/test/eyelang/conformance/cases/core/009_comments_and_whitespace.pl +5 -0
  445. package/test/eyelang/conformance/cases/core/009_comments_and_whitespace.query +1 -0
  446. package/test/eyelang/conformance/cases/core/010_variable_scope_and_reuse.pl +8 -0
  447. package/test/eyelang/conformance/cases/core/010_variable_scope_and_reuse.query +1 -0
  448. package/test/eyelang/conformance/cases/core/011_predicate_arity.pl +6 -0
  449. package/test/eyelang/conformance/cases/core/011_predicate_arity.query +1 -0
  450. package/test/eyelang/conformance/cases/core/012_nested_compound_unification.pl +5 -0
  451. package/test/eyelang/conformance/cases/core/012_nested_compound_unification.query +1 -0
  452. package/test/eyelang/conformance/cases/core/013_multiple_clauses_order.pl +6 -0
  453. package/test/eyelang/conformance/cases/core/013_multiple_clauses_order.query +1 -0
  454. package/test/eyelang/conformance/cases/core/014_failure_filters_answers.pl +7 -0
  455. package/test/eyelang/conformance/cases/core/014_failure_filters_answers.query +1 -0
  456. package/test/eyelang/conformance/cases/core/015_improper_list_unification.pl +6 -0
  457. package/test/eyelang/conformance/cases/core/015_improper_list_unification.query +1 -0
  458. package/test/eyelang/conformance/cases/core/016_zero_arity_compound.pl +4 -0
  459. package/test/eyelang/conformance/cases/core/016_zero_arity_compound.query +1 -0
  460. package/test/eyelang/conformance/cases/core/017_three_step_recursion.pl +8 -0
  461. package/test/eyelang/conformance/cases/core/017_three_step_recursion.query +1 -0
  462. package/test/eyelang/conformance/cases/core/018_quoted_atom_readback.pl +6 -0
  463. package/test/eyelang/conformance/cases/core/018_quoted_atom_readback.query +1 -0
  464. package/test/eyelang/conformance/cases/core/019_parenthesized_three_conjuncts.pl +7 -0
  465. package/test/eyelang/conformance/cases/core/019_parenthesized_three_conjuncts.query +1 -0
  466. package/test/eyelang/conformance/cases/core/020_nested_list_terms.pl +5 -0
  467. package/test/eyelang/conformance/cases/core/020_nested_list_terms.query +1 -0
  468. package/test/eyelang/conformance/cases/core/021_repeated_variable_head.pl +7 -0
  469. package/test/eyelang/conformance/cases/core/022_rule_head_structure.pl +5 -0
  470. package/test/eyelang/conformance/cases/core/023_quoted_escapes_readback.pl +5 -0
  471. package/test/eyelang/conformance/cases/core/024_numeric_literal_readback.pl +6 -0
  472. package/test/eyelang/conformance/cases/core/025_body_parentheses_with_formula_data.pl +5 -0
  473. package/test/eyelang/conformance/cases/core/026_underscore_named_variable_reuse.pl +5 -0
  474. package/test/eyelang/conformance/cases/extension/001_default_derived_output.pl +5 -0
  475. package/test/eyelang/conformance/cases/extension/002_materialize_focus.pl +5 -0
  476. package/test/eyelang/conformance/cases/extension/003_arithmetic_and_comparison.pl +12 -0
  477. package/test/eyelang/conformance/cases/extension/003_arithmetic_and_comparison.query +1 -0
  478. package/test/eyelang/conformance/cases/extension/004_strings_and_atoms.pl +6 -0
  479. package/test/eyelang/conformance/cases/extension/004_strings_and_atoms.query +1 -0
  480. package/test/eyelang/conformance/cases/extension/005_lists_aggregation_ordering.pl +10 -0
  481. package/test/eyelang/conformance/cases/extension/005_lists_aggregation_ordering.query +1 -0
  482. package/test/eyelang/conformance/cases/extension/006_formula_terms.pl +5 -0
  483. package/test/eyelang/conformance/cases/extension/006_formula_terms.query +1 -0
  484. package/test/eyelang/conformance/cases/extension/007_negation_once_generators.pl +7 -0
  485. package/test/eyelang/conformance/cases/extension/007_negation_once_generators.query +1 -0
  486. package/test/eyelang/conformance/cases/extension/008_equality_and_inequality.pl +6 -0
  487. package/test/eyelang/conformance/cases/extension/008_equality_and_inequality.query +1 -0
  488. package/test/eyelang/conformance/cases/extension/009_list_relations.pl +6 -0
  489. package/test/eyelang/conformance/cases/extension/009_list_relations.query +1 -0
  490. package/test/eyelang/conformance/cases/extension/010_append_splits.pl +3 -0
  491. package/test/eyelang/conformance/cases/extension/010_append_splits.query +1 -0
  492. package/test/eyelang/conformance/cases/extension/011_matching_and_comparison.pl +7 -0
  493. package/test/eyelang/conformance/cases/extension/011_matching_and_comparison.query +1 -0
  494. package/test/eyelang/conformance/cases/extension/012_memoize_declaration.pl +8 -0
  495. package/test/eyelang/conformance/cases/extension/012_memoize_declaration.query +1 -0
  496. package/test/eyelang/conformance/cases/extension/013_numeric_functions.pl +9 -0
  497. package/test/eyelang/conformance/cases/extension/013_numeric_functions.query +1 -0
  498. package/test/eyelang/conformance/cases/extension/014_between_enumeration.pl +3 -0
  499. package/test/eyelang/conformance/cases/extension/014_between_enumeration.query +1 -0
  500. package/test/eyelang/conformance/cases/extension/015_smallest_divisor.pl +3 -0
  501. package/test/eyelang/conformance/cases/extension/015_smallest_divisor.query +1 -0
  502. package/test/eyelang/conformance/cases/extension/016_negation_filter.pl +7 -0
  503. package/test/eyelang/conformance/cases/extension/016_negation_filter.query +1 -0
  504. package/test/eyelang/conformance/cases/extension/017_once_user_predicate.pl +5 -0
  505. package/test/eyelang/conformance/cases/extension/017_once_user_predicate.query +1 -0
  506. package/test/eyelang/conformance/cases/extension/018_findall_user_goal.pl +6 -0
  507. package/test/eyelang/conformance/cases/extension/018_findall_user_goal.query +1 -0
  508. package/test/eyelang/conformance/cases/extension/019_sort_deduplicates_atoms.pl +3 -0
  509. package/test/eyelang/conformance/cases/extension/019_sort_deduplicates_atoms.query +1 -0
  510. package/test/eyelang/conformance/cases/extension/020_append_bound_prefix_suffix.pl +4 -0
  511. package/test/eyelang/conformance/cases/extension/020_append_bound_prefix_suffix.query +1 -0
  512. package/test/eyelang/conformance/cases/extension/021_nth0_index_generation.pl +3 -0
  513. package/test/eyelang/conformance/cases/extension/021_nth0_index_generation.query +1 -0
  514. package/test/eyelang/conformance/cases/extension/022_set_nth0_edges.pl +4 -0
  515. package/test/eyelang/conformance/cases/extension/022_set_nth0_edges.query +1 -0
  516. package/test/eyelang/conformance/cases/extension/023_select_duplicate_occurrences.pl +3 -0
  517. package/test/eyelang/conformance/cases/extension/023_select_duplicate_occurrences.query +1 -0
  518. package/test/eyelang/conformance/cases/extension/024_not_member_filter.pl +6 -0
  519. package/test/eyelang/conformance/cases/extension/024_not_member_filter.query +1 -0
  520. package/test/eyelang/conformance/cases/extension/025_is_list_filter.pl +5 -0
  521. package/test/eyelang/conformance/cases/extension/025_is_list_filter.query +1 -0
  522. package/test/eyelang/conformance/cases/extension/026_nested_formula_terms.pl +5 -0
  523. package/test/eyelang/conformance/cases/extension/026_nested_formula_terms.query +1 -0
  524. package/test/eyelang/conformance/cases/extension/027_materialize_excludes_source_fact.pl +6 -0
  525. package/test/eyelang/conformance/cases/extension/028_numeric_and_lexical_comparison.pl +5 -0
  526. package/test/eyelang/conformance/cases/extension/028_numeric_and_lexical_comparison.query +1 -0
  527. package/test/eyelang/conformance/cases/extension/029_string_matching_filters.pl +6 -0
  528. package/test/eyelang/conformance/cases/extension/029_string_matching_filters.query +1 -0
  529. package/test/eyelang/conformance/cases/extension/030_string_and_atom_concat.pl +4 -0
  530. package/test/eyelang/conformance/cases/extension/030_string_and_atom_concat.query +1 -0
  531. package/test/eyelang/conformance/cases/extension/031_countall_empty_and_nonempty.pl +4 -0
  532. package/test/eyelang/conformance/cases/extension/031_countall_empty_and_nonempty.query +1 -0
  533. package/test/eyelang/conformance/cases/extension/032_sumall_numeric_template.pl +5 -0
  534. package/test/eyelang/conformance/cases/extension/032_sumall_numeric_template.query +1 -0
  535. package/test/eyelang/conformance/cases/extension/033_aggregate_min_template.pl +5 -0
  536. package/test/eyelang/conformance/cases/extension/033_aggregate_min_template.query +1 -0
  537. package/test/eyelang/conformance/cases/extension/034_aggregate_max_compound_key.pl +5 -0
  538. package/test/eyelang/conformance/cases/extension/034_aggregate_max_compound_key.query +1 -0
  539. package/test/eyelang/conformance/cases/extension/035_date_difference.pl +4 -0
  540. package/test/eyelang/conformance/cases/extension/036_extended_gcd.pl +3 -0
  541. package/test/eyelang/conformance/cases/extension/037_collatz_trajectory.pl +3 -0
  542. package/test/eyelang/conformance/cases/extension/038_kaprekar_steps.pl +3 -0
  543. package/test/eyelang/conformance/cases/extension/039_goldbach_pair.pl +3 -0
  544. package/test/eyelang/conformance/cases/extension/040_matrix_operations.pl +5 -0
  545. package/test/eyelang/conformance/cases/extension/041_atom_range_generators.pl +5 -0
  546. package/test/eyelang/conformance/cases/extension/042_n_queens_small.pl +3 -0
  547. package/test/eyelang/conformance/cases/extension/043_cnf_model.pl +3 -0
  548. package/test/eyelang/conformance/cases/extension/044_cover9_filter.pl +6 -0
  549. package/test/eyelang/conformance/cases/extension/045_alphametic_sum_small.pl +3 -0
  550. package/test/eyelang/conformance/cases/extension/046_bounded_subset.pl +4 -0
  551. package/test/eyelang/conformance/expected/core/001_fact_output.out +1 -0
  552. package/test/eyelang/conformance/expected/core/002_rule_recursion.out +2 -0
  553. package/test/eyelang/conformance/expected/core/003_terms_and_readback.out +13 -0
  554. package/test/eyelang/conformance/expected/core/004_conjunction_and_parentheses.out +1 -0
  555. package/test/eyelang/conformance/expected/core/005_list_deconstruction.out +2 -0
  556. package/test/eyelang/conformance/expected/core/006_comma_formula_data.out +1 -0
  557. package/test/eyelang/conformance/expected/core/007_anonymous_variables.out +1 -0
  558. package/test/eyelang/conformance/expected/core/008_graphic_atoms.out +3 -0
  559. package/test/eyelang/conformance/expected/core/009_comments_and_whitespace.out +2 -0
  560. package/test/eyelang/conformance/expected/core/010_variable_scope_and_reuse.out +2 -0
  561. package/test/eyelang/conformance/expected/core/011_predicate_arity.out +2 -0
  562. package/test/eyelang/conformance/expected/core/012_nested_compound_unification.out +2 -0
  563. package/test/eyelang/conformance/expected/core/013_multiple_clauses_order.out +2 -0
  564. package/test/eyelang/conformance/expected/core/014_failure_filters_answers.out +1 -0
  565. package/test/eyelang/conformance/expected/core/015_improper_list_unification.out +3 -0
  566. package/test/eyelang/conformance/expected/core/016_zero_arity_compound.out +1 -0
  567. package/test/eyelang/conformance/expected/core/017_three_step_recursion.out +3 -0
  568. package/test/eyelang/conformance/expected/core/018_quoted_atom_readback.out +3 -0
  569. package/test/eyelang/conformance/expected/core/019_parenthesized_three_conjuncts.out +1 -0
  570. package/test/eyelang/conformance/expected/core/020_nested_list_terms.out +2 -0
  571. package/test/eyelang/conformance/expected/core/021_repeated_variable_head.out +2 -0
  572. package/test/eyelang/conformance/expected/core/022_rule_head_structure.out +2 -0
  573. package/test/eyelang/conformance/expected/core/023_quoted_escapes_readback.out +2 -0
  574. package/test/eyelang/conformance/expected/core/024_numeric_literal_readback.out +3 -0
  575. package/test/eyelang/conformance/expected/core/025_body_parentheses_with_formula_data.out +1 -0
  576. package/test/eyelang/conformance/expected/core/026_underscore_named_variable_reuse.out +1 -0
  577. package/test/eyelang/conformance/expected/extension/001_default_derived_output.out +3 -0
  578. package/test/eyelang/conformance/expected/extension/002_materialize_focus.out +1 -0
  579. package/test/eyelang/conformance/expected/extension/003_arithmetic_and_comparison.out +10 -0
  580. package/test/eyelang/conformance/expected/extension/004_strings_and_atoms.out +4 -0
  581. package/test/eyelang/conformance/expected/extension/005_lists_aggregation_ordering.out +9 -0
  582. package/test/eyelang/conformance/expected/extension/006_formula_terms.out +4 -0
  583. package/test/eyelang/conformance/expected/extension/007_negation_once_generators.out +2 -0
  584. package/test/eyelang/conformance/expected/extension/008_equality_and_inequality.out +4 -0
  585. package/test/eyelang/conformance/expected/extension/009_list_relations.out +5 -0
  586. package/test/eyelang/conformance/expected/extension/010_append_splits.out +3 -0
  587. package/test/eyelang/conformance/expected/extension/011_matching_and_comparison.out +5 -0
  588. package/test/eyelang/conformance/expected/extension/012_memoize_declaration.out +2 -0
  589. package/test/eyelang/conformance/expected/extension/013_numeric_functions.out +7 -0
  590. package/test/eyelang/conformance/expected/extension/014_between_enumeration.out +3 -0
  591. package/test/eyelang/conformance/expected/extension/015_smallest_divisor.out +1 -0
  592. package/test/eyelang/conformance/expected/extension/016_negation_filter.out +2 -0
  593. package/test/eyelang/conformance/expected/extension/017_once_user_predicate.out +1 -0
  594. package/test/eyelang/conformance/expected/extension/018_findall_user_goal.out +1 -0
  595. package/test/eyelang/conformance/expected/extension/019_sort_deduplicates_atoms.out +1 -0
  596. package/test/eyelang/conformance/expected/extension/020_append_bound_prefix_suffix.out +2 -0
  597. package/test/eyelang/conformance/expected/extension/021_nth0_index_generation.out +1 -0
  598. package/test/eyelang/conformance/expected/extension/022_set_nth0_edges.out +2 -0
  599. package/test/eyelang/conformance/expected/extension/023_select_duplicate_occurrences.out +2 -0
  600. package/test/eyelang/conformance/expected/extension/024_not_member_filter.out +1 -0
  601. package/test/eyelang/conformance/expected/extension/025_is_list_filter.out +1 -0
  602. package/test/eyelang/conformance/expected/extension/026_nested_formula_terms.out +6 -0
  603. package/test/eyelang/conformance/expected/extension/027_materialize_excludes_source_fact.out +1 -0
  604. package/test/eyelang/conformance/expected/extension/028_numeric_and_lexical_comparison.out +3 -0
  605. package/test/eyelang/conformance/expected/extension/029_string_matching_filters.out +2 -0
  606. package/test/eyelang/conformance/expected/extension/030_string_and_atom_concat.out +2 -0
  607. package/test/eyelang/conformance/expected/extension/031_countall_empty_and_nonempty.out +1 -0
  608. package/test/eyelang/conformance/expected/extension/032_sumall_numeric_template.out +1 -0
  609. package/test/eyelang/conformance/expected/extension/033_aggregate_min_template.out +1 -0
  610. package/test/eyelang/conformance/expected/extension/034_aggregate_max_compound_key.out +1 -0
  611. package/test/eyelang/conformance/expected/extension/035_date_difference.out +2 -0
  612. package/test/eyelang/conformance/expected/extension/036_extended_gcd.out +1 -0
  613. package/test/eyelang/conformance/expected/extension/037_collatz_trajectory.out +1 -0
  614. package/test/eyelang/conformance/expected/extension/038_kaprekar_steps.out +1 -0
  615. package/test/eyelang/conformance/expected/extension/039_goldbach_pair.out +2 -0
  616. package/test/eyelang/conformance/expected/extension/040_matrix_operations.out +3 -0
  617. package/test/eyelang/conformance/expected/extension/041_atom_range_generators.out +8 -0
  618. package/test/eyelang/conformance/expected/extension/042_n_queens_small.out +2 -0
  619. package/test/eyelang/conformance/expected/extension/043_cnf_model.out +1 -0
  620. package/test/eyelang/conformance/expected/extension/044_cover9_filter.out +2 -0
  621. package/test/eyelang/conformance/expected/extension/045_alphametic_sum_small.out +4 -0
  622. package/test/eyelang/conformance/expected/extension/046_bounded_subset.out +5 -0
  623. package/test/eyelang/run-all.mjs +20 -0
  624. package/test/eyelang/run-conformance.mjs +80 -0
  625. package/test/eyelang/run-examples.mjs +126 -0
  626. package/test/eyelang/run-regression.mjs +640 -0
  627. package/test/eyelang/test-style.mjs +91 -0
  628. package/test/eyelang.test.js +58 -0
  629. package/test/run.js +1 -0
@@ -0,0 +1,52 @@
1
+ % Access control policy example adapted from Eyelet input/access-control-policy.pl.
2
+ %
3
+ % This version avoids findall/3 by expressing allOf/anyOf/noneOf checks as
4
+ % finite logical conditions. The universal allOf/noneOf checks use negation
5
+ % as failure over bound policy facts.
6
+
7
+ % Output declarations: materialize/2 selects the relations written to this example's golden output.
8
+ materialize(policy, 2).
9
+ materialize(status, 2).
10
+ materialize(reason, 2).
11
+
12
+ % Program structure: facts set up the scenario, and rules derive the materialized conclusions.
13
+ policy_request(test1, policy_x).
14
+ has(test1, claim_a).
15
+ has(test1, claim_b).
16
+ has(test1, claim_c).
17
+
18
+ policy(policy_x).
19
+ allOf(policy_x, claim_a).
20
+ allOf(policy_x, claim_b).
21
+ anyOf(policy_x, claim_c).
22
+ noneOf(policy_x, claim_d).
23
+
24
+ % Derivation rules: each rule below contributes one logical step toward the displayed results.
25
+ passes_all_of(Request, Policy) :-
26
+ policy_request(Request, Policy),
27
+ policy(Policy),
28
+ not((allOf(Policy, Claim), not(has(Request, Claim)))).
29
+
30
+ passes_any_of(Request, Policy) :-
31
+ policy_request(Request, Policy),
32
+ policy(Policy),
33
+ anyOf(Policy, Claim),
34
+ has(Request, Claim).
35
+
36
+ passes_none_of(Request, Policy) :-
37
+ policy_request(Request, Policy),
38
+ policy(Policy),
39
+ not((noneOf(Policy, Claim), has(Request, Claim))).
40
+
41
+ passes_policy(Request, Policy) :-
42
+ passes_all_of(Request, Policy),
43
+ passes_any_of(Request, Policy),
44
+ passes_none_of(Request, Policy).
45
+
46
+ policy(test1, policy_x).
47
+
48
+ status(test1, policy_passed) :-
49
+ passes_policy(test1, policy_x).
50
+
51
+ reason(test1, "all required claims are present, one allowed claim is present, and no forbidden claim is present") :-
52
+ passes_policy(test1, policy_x).
@@ -0,0 +1,46 @@
1
+ % Ackermann-style hyperoperation benchmark adapted from Eyeling ackermann.n3.
2
+ % The two-argument entry point follows the Eyeling encoding:
3
+ % ackermann(X, Y) = hyper(X, Y + 3, 2) - 3.
4
+
5
+ % Output declarations: materialize/2 selects the relations written to this example's golden output.
6
+ materialize(ackermann, 2).
7
+
8
+ % Program structure: facts set up the scenario, and rules derive the materialized conclusions.
9
+ % Derivation rules: each rule below contributes one logical step toward the displayed results.
10
+ ackermann(X, Y, A) :-
11
+ add(Y, 3, B),
12
+ hyper(X, B, 2, C),
13
+ sub(C, 3, A).
14
+
15
+ % Successor, addition, multiplication, and exponentiation levels.
16
+ hyper(0, Y, _Z, A) :- add(Y, 1, A).
17
+ hyper(1, Y, Z, A) :- add(Y, Z, A).
18
+ hyper(2, Y, Z, A) :- mul(Y, Z, A).
19
+ hyper(3, Y, Z, A) :- pow(Z, Y, A).
20
+
21
+ % Higher levels recurse over the previous hyperoperation.
22
+ hyper(X, 0, _Z, 1) :- gt(X, 3).
23
+ hyper(X, Y, Z, A) :-
24
+ gt(X, 3),
25
+ neq(Y, 0),
26
+ sub(Y, 1, B),
27
+ hyper(X, B, Z, C),
28
+ sub(X, 1, D),
29
+ hyper(D, C, Z, A).
30
+
31
+ ack_case(0, 0).
32
+ ack_case(0, 6).
33
+ ack_case(1, 2).
34
+ ack_case(1, 7).
35
+ ack_case(2, 2).
36
+ ack_case(2, 9).
37
+ ack_case(3, 4).
38
+ ack_case(3, 1000).
39
+ ack_case(4, 0).
40
+ ack_case(4, 1).
41
+ ack_case(4, 2).
42
+ ack_case(5, 0).
43
+
44
+ ackermann([X, Y], A) :-
45
+ ack_case(X, Y),
46
+ ackermann(X, Y, A).
@@ -0,0 +1,28 @@
1
+ % Age checker adapted from Eyeling.
2
+ %
3
+ % Is the age of a person above some duration?
4
+
5
+ % Person data.
6
+ % Output declarations: materialize/2 selects the relations written to this example's golden output.
7
+ materialize(birthDay, 2).
8
+ materialize(duration, 2).
9
+ materialize(ageAbove, 2).
10
+ materialize(is, 2).
11
+
12
+ % Program structure: facts set up the scenario, and rules derive the materialized conclusions.
13
+ birthDay(patH, "1944-08-21").
14
+ duration(check, "P80Y").
15
+
16
+ % A person is above a duration if the local date minus the birthday is greater
17
+ % than that duration.
18
+ % Derivation rules: each rule below contributes one logical step toward the displayed results.
19
+ ageAbove(S, A) :-
20
+ birthDay(S, B),
21
+ duration(check, A),
22
+ local_time(D),
23
+ difference(D, B, F),
24
+ gt(F, A).
25
+
26
+ % Test mirroring the Eyeling example.
27
+ is(test, true) :-
28
+ ageAbove(S, "P80Y").
@@ -0,0 +1,22 @@
1
+ % Built-ins use one native spelling each.
2
+ % Vocabulary predicate names remain ordinary user predicates.
3
+
4
+ % The materialized relations below show that built-ins can coexist with
5
+ % ordinary vocabulary predicates that happen to look namespace-like.
6
+ % Output declarations: materialize/2 selects the relations written to this example's golden output.
7
+ materialize(value, 2).
8
+ materialize(ok, 2).
9
+ materialize(tail, 2).
10
+ materialize(label, 2).
11
+
12
+ % Program structure: facts set up the scenario, and rules derive the materialized conclusions.
13
+ % Native operations are called through their canonical predicate names.
14
+ % Derivation rules: each rule below contributes one logical step toward the displayed results.
15
+ value(nativeMath, X) :- add(0.125, 0.875, X).
16
+ ok(nativeCompare, true) :- lt(2, 3).
17
+ ok(nativeString, true) :- matches("scoped retail insight", "retail|medical").
18
+ tail(nativeList, Tail) :- rest([a, b, c], Tail).
19
+
20
+ % These names are just user data; eyelang does not give them special meaning.
21
+ example_label(vocabularyExample, "vocabulary names are ordinary predicate names").
22
+ label(vocabularyExample, Text) :- example_label(vocabularyExample, Text).
@@ -0,0 +1,44 @@
1
+ % Alignment demo, adapted from Eyeling's examples/alignment-demo.n3.
2
+ %
3
+ % The output is the Prolog-style counterpart of the Eyeling golden output:
4
+ % broader/narrower alignments, their transitive closure, the reflexive
5
+ % narrower-or-equal relation, and the concepts that roll up to ref_car.
6
+
7
+ % Output declarations: materialize/2 selects the relations written to this example's golden output.
8
+ materialize(broader, 2).
9
+ materialize(narrower, 2).
10
+ materialize(broaderTransitive, 2).
11
+ materialize(narrowerTransitive, 2).
12
+ materialize(narrowerOrEqualOf, 2).
13
+ materialize(rollsUpTo, 2).
14
+
15
+ % Program structure: facts set up the scenario, and rules derive the materialized conclusions.
16
+ concept(ref_car).
17
+ concept(tel_car).
18
+ concept(tel_heavy_vehicle).
19
+ concept(anpr_vehicle_with_plate).
20
+ concept(anpr_passenger_car).
21
+
22
+ assertedBroader(tel_car, ref_car).
23
+ assertedBroader(tel_heavy_vehicle, ref_car).
24
+ assertedBroader(anpr_vehicle_with_plate, ref_car).
25
+ assertedNarrower(anpr_vehicle_with_plate, anpr_passenger_car).
26
+
27
+ % Derivation rules: each rule below contributes one logical step toward the displayed results.
28
+ broader(X, Y) :- assertedBroader(X, Y).
29
+ broader(X, Y) :- assertedNarrower(Y, X).
30
+
31
+ narrower(X, Y) :- broader(Y, X).
32
+
33
+ broaderTransitive(X, Y) :- broader(X, Y).
34
+ broaderTransitive(X, Z) :- broader(X, Y), broaderTransitive(Y, Z).
35
+
36
+ narrowerTransitive(X, Y) :- narrower(X, Y).
37
+ narrowerTransitive(X, Z) :- narrower(X, Y), narrowerTransitive(Y, Z).
38
+
39
+ narrowerOrEqualOf(X, X) :- concept(X).
40
+ narrowerOrEqualOf(X, Y) :- broaderTransitive(X, Y).
41
+
42
+ rollsUpTo(X, ref_car) :-
43
+ narrowerOrEqualOf(X, ref_car),
44
+ neq(X, ref_car).
@@ -0,0 +1,64 @@
1
+ % Allen interval calculus adapted from Eyeling allen-interval-calculus.n3.
2
+ % Eyeling demonstrates dateTime and duration built-ins; this eyelang version
3
+ % uses integer hour offsets so the interval rules remain pure Horn clauses.
4
+ % The input interval table is a list of records, showing how tabular data can
5
+ % stay scoped as one term instead of many unrelated global start/end facts.
6
+
7
+ % Output declarations: materialize/2 selects the relations written to this example's golden output.
8
+ materialize(start, 2).
9
+ materialize(end, 2).
10
+ materialize(duration, 2).
11
+ materialize(statement, 3).
12
+
13
+ % Program structure: facts set up the scenario, and rules derive the materialized conclusions.
14
+ interval_table([
15
+ interval(a, 10, 12),
16
+ interval(b, 13, 15),
17
+ interval(c, 12, 14),
18
+ interval(d, 11, 13),
19
+ interval(e, 10, 12),
20
+ interval(f, 10, 11),
21
+ interval(g, 11, 12),
22
+ interval(h, 9, 16),
23
+ interval(i, 16, 18),
24
+ interval(j, 15, 16),
25
+ interval(k, 13, 14)
26
+ ]).
27
+
28
+ % Derivation rules: each rule below contributes one logical step toward the displayed results.
29
+ interval(I) :- interval_table(Table), member(interval(I, _Start, _End), Table).
30
+ start(I, Start) :- interval_table(Table), member(interval(I, Start, _End), Table).
31
+ end(I, End) :- interval_table(Table), member(interval(I, _Start, End), Table).
32
+
33
+ relation(I, before, J) :- end(I, EI), start(J, SJ), lt(EI, SJ).
34
+ relation(I, meets, J) :- end(I, E), start(J, E).
35
+ relation(I, overlaps, J) :-
36
+ start(I, SI), end(I, EI),
37
+ start(J, SJ), end(J, EJ),
38
+ lt(SI, SJ), lt(SJ, EI), lt(EI, EJ).
39
+ relation(I, starts, J) :-
40
+ start(I, S), start(J, S),
41
+ end(I, EI), end(J, EJ),
42
+ lt(EI, EJ).
43
+ relation(I, during, J) :-
44
+ start(I, SI), end(I, EI),
45
+ start(J, SJ), end(J, EJ),
46
+ lt(SJ, SI), lt(EI, EJ).
47
+ relation(I, finishes, J) :-
48
+ end(I, E), end(J, E),
49
+ start(I, SI), start(J, SJ),
50
+ lt(SJ, SI).
51
+ relation(I, equals, J) :-
52
+ start(I, S), start(J, S),
53
+ end(I, E), end(J, E).
54
+
55
+ relation(J, after, I) :- relation(I, before, J).
56
+ relation(J, metBy, I) :- relation(I, meets, J).
57
+ relation(J, overlappedBy, I) :- relation(I, overlaps, J).
58
+ relation(J, startedBy, I) :- relation(I, starts, J).
59
+ relation(J, contains, I) :- relation(I, during, J).
60
+ relation(J, finishedBy, I) :- relation(I, finishes, J).
61
+
62
+ duration(I, D) :- end(I, E), start(I, S), sub(E, S, D).
63
+
64
+ statement(I, Rel, J) :- relation(I, Rel, J).
@@ -0,0 +1,21 @@
1
+ % Basic recursive relation example.
2
+ % Both input facts and derived recursive answers are printed.
3
+ % Output declarations: materialize/2 selects the relations written to this example's golden output.
4
+ materialize(parent, 2).
5
+ materialize(ancestor, 2).
6
+
7
+ % Program structure: facts set up the scenario, and rules derive the materialized conclusions.
8
+ % Direct parent facts form a simple chain.
9
+ parent(pat, jan).
10
+ parent(jan, lies).
11
+ parent(lies, emma).
12
+
13
+ % Base case: every parent is also an ancestor.
14
+ % Derivation rules: each rule below contributes one logical step toward the displayed results.
15
+ ancestor(X, Y) :-
16
+ parent(X, Y).
17
+
18
+ % Recursive case: walk one parent edge and continue through the chain.
19
+ ancestor(X, Z) :-
20
+ parent(X, Y),
21
+ ancestor(Y, Z).
@@ -0,0 +1,21 @@
1
+ % Animal classification, adapted from Eyelet's input/animal.pl.
2
+ %
3
+ % The Eyelet source uses Unicode predicate names; this eyelang version keeps the
4
+ % same tiny inheritance idea with plain vocabulary names.
5
+
6
+ % Output declarations: materialize/2 selects the relations written to this example's golden output.
7
+ materialize(type, 2).
8
+ materialize(subclassOf, 2).
9
+ materialize(succeeds, 2).
10
+
11
+ % Program structure: facts set up the scenario, and rules derive the materialized conclusions.
12
+ human(joe).
13
+ animal(human).
14
+
15
+ % Derivation rules: each rule below contributes one logical step toward the displayed results.
16
+ animal(X) :- human(X).
17
+
18
+ type(joe, human) :- human(joe).
19
+ type(joe, animal) :- animal(joe).
20
+ subclassOf(human, animal) :- animal(human).
21
+ succeeds(animalExample, true) :- animal(_).
@@ -0,0 +1,12 @@
1
+ # Inspired by eyereasoner/eyeling examples/annotation.n3.
2
+ # Demonstrates RDF 1.2 annotation syntax lowered through rdf:reifies.
3
+ VERSION "1.2"
4
+ PREFIX : <http://example.org/annotation#>
5
+ PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
6
+
7
+ :a :name "Alice" ~ :t {| :statedBy :bob ; :recorded "2021-07-07"^^xsd:date |} .
8
+
9
+ { ?Statement rdf:reifies <<( ?Person :name ?Name )>> .
10
+ ?Statement :statedBy ?Agent . }
11
+ =>
12
+ { ?Person :nameStatementBy ?Agent . } .
@@ -0,0 +1,34 @@
1
+ % Annotation with quoted formula data.
2
+ %
3
+ % The program keeps the annotation as data and derives visible relations from it.
4
+ % Formula members become default output only when explicit rules project them.
5
+
6
+ % Output declarations: materialize/2 selects the relations written to this example's golden output.
7
+ materialize(name, 2).
8
+ materialize(log_nameOf, 2).
9
+ materialize(statedBy, 2).
10
+ materialize(recorded, 2).
11
+
12
+ % Program structure: facts set up the scenario, and rules derive the materialized conclusions.
13
+ annotation(t, (
14
+ name(a, "Alice"),
15
+ statedBy(t, bob),
16
+ recorded(t, "2021-07-07")
17
+ )).
18
+
19
+ % Derivation rules: each rule below contributes one logical step toward the displayed results.
20
+ name(S, O) :-
21
+ annotation(_T, Formula),
22
+ formula_binary(Formula, S, name, O).
23
+
24
+ log_nameOf(T, name(S, O)) :-
25
+ annotation(T, Formula),
26
+ formula_binary(Formula, S, name, O).
27
+
28
+ statedBy(S, O) :-
29
+ annotation(_T, Formula),
30
+ formula_binary(Formula, S, statedBy, O).
31
+
32
+ recorded(S, O) :-
33
+ annotation(_T, Formula),
34
+ formula_binary(Formula, S, recorded, O).
@@ -0,0 +1,309 @@
1
+ % AuroraCare purpose-based medical-data exchange case adapted from Eyeling auroracare.n3.
2
+ % The original N3 emits one Markdown block per scenario. This eyelang
3
+ % translation materializes the policy decisions, reasons, traces, and ARC-style
4
+ % check values as ordinary relation output.
5
+
6
+ % Output declarations: materialize/2 selects the relations written to this example's golden output.
7
+ materialize(label, 2).
8
+ materialize(description, 2).
9
+ materialize(careTeamLinked, 2).
10
+ materialize(subjectOptIn, 2).
11
+ materialize(subjectOptOut, 2).
12
+ materialize(decision, 2).
13
+ materialize(reason, 2).
14
+ materialize(matchedPolicyUid, 2).
15
+ materialize(matchedProhibition, 2).
16
+ materialize(trace, 2).
17
+ materialize(checkC1, 2).
18
+ materialize(checkC2, 2).
19
+ materialize(checkC3, 2).
20
+ materialize(checkC4, 2).
21
+ materialize(checkC5, 2).
22
+ materialize(checkC6, 2).
23
+ materialize(checkC7, 2).
24
+ materialize(checkC8, 2).
25
+ materialize(checkC9, 2).
26
+ materialize(checkC10Text, 2).
27
+
28
+ % Program structure: facts set up the scenario, and rules derive the materialized conclusions.
29
+ caseName(case, "auroracare").
30
+ question(case, "For each AuroraCare scenario, should the PDP permit or deny the requested use of health data, and why?").
31
+
32
+ % Policies: primary care, quality improvement, research, and an explicit denial.
33
+ policyUid(policyPrimary, "urn:policy:primary-care-001").
34
+ purposeAllowed(policyPrimary, primaryCareManagement).
35
+ purposeAllowed(policyPrimary, patientRemoteMonitoring).
36
+ roleAllowed(policyPrimary, "clinician").
37
+ allowAnyCategory(policyPrimary, patientSummary).
38
+ allowAnyCategory(policyPrimary, labResults).
39
+
40
+ policyUid(policyQi, "urn:policy:qi-2025-aurora").
41
+ purposeAllowed(policyQi, ensureQualitySafetyHealthcare).
42
+ requireEnvironment(policyQi, "secure_env").
43
+ requireAllCategory(policyQi, labResults).
44
+ requireAllCategory(policyQi, patientSummary).
45
+ duty(policyQi, requireConsent).
46
+ duty(policyQi, noExfiltration).
47
+
48
+ policyUid(policyResearch, "urn:policy:research-aurora-diabetes").
49
+ purposeAllowed(policyResearch, healthcareScientificResearch).
50
+ requireEnvironment(policyResearch, "secure_env").
51
+ requireTom(policyResearch, anonymisation).
52
+ allowAnyCategory(policyResearch, labResults).
53
+ allowAnyCategory(policyResearch, patientSummary).
54
+ allowAnyCategory(policyResearch, imagingReport).
55
+ duty(policyResearch, annualOutcomeReport).
56
+ duty(policyResearch, noReidentification).
57
+ duty(policyResearch, noExfiltration).
58
+
59
+ policyUid(policyDenyInsurance, "urn:policy:deny-insurance").
60
+ prohibitPurpose(policyDenyInsurance, insuranceManagement).
61
+
62
+ linkedTo(clinicianAlba, ruben).
63
+ linkedTo(gpRuben, ruben).
64
+ consentAllow(ruben, healthcareScientificResearch).
65
+ consentDeny(ruben, trainTestAndEvaluateAiSystemsAlgorithms).
66
+ primaryPurpose(auroracare, primaryCareManagement).
67
+ primaryPurpose(auroracare, patientRemoteMonitoring).
68
+ prohibitedPurpose(auroracare, insuranceManagement).
69
+
70
+ % Scenarios A-G mirror the upstream Markdown report cases.
71
+ scenario(scenarioA).
72
+ outputKey(scenarioA, out010A).
73
+ scenario_label(scenarioA, "A – Primary care visit").
74
+ scenario_description(scenarioA, "Clinician in the patient's care team accessing the patient summary for primary care management.").
75
+ requester(scenarioA, clinicianAlba).
76
+ requesterRole(scenarioA, "clinician").
77
+ subject(scenarioA, ruben).
78
+ purpose(scenarioA, primaryCareManagement).
79
+ environment(scenarioA, "api_gateway").
80
+ category(scenarioA, patientSummary).
81
+
82
+ scenario(scenarioB).
83
+ outputKey(scenarioB, out020B).
84
+ scenario_label(scenarioB, "B – Quality improvement (in scope)").
85
+ scenario_description(scenarioB, "QI analyst using lab results + summary in a secure environment.").
86
+ requester(scenarioB, qiAnalyst).
87
+ requesterRole(scenarioB, "data_user").
88
+ subject(scenarioB, ruben).
89
+ purpose(scenarioB, ensureQualitySafetyHealthcare).
90
+ environment(scenarioB, "secure_env").
91
+ category(scenarioB, labResults).
92
+ category(scenarioB, patientSummary).
93
+
94
+ scenario(scenarioC).
95
+ outputKey(scenarioC, out030C).
96
+ scenario_label(scenarioC, "C – Quality improvement (out of scope)").
97
+ scenario_description(scenarioC, "QI analyst with only lab results; policy expects labs + summary.").
98
+ requester(scenarioC, qiAnalyst).
99
+ requesterRole(scenarioC, "data_user").
100
+ subject(scenarioC, ruben).
101
+ purpose(scenarioC, ensureQualitySafetyHealthcare).
102
+ environment(scenarioC, "secure_env").
103
+ category(scenarioC, labResults).
104
+
105
+ scenario(scenarioD).
106
+ outputKey(scenarioD, out040D).
107
+ scenario_label(scenarioD, "D – Insurance management").
108
+ scenario_description(scenarioD, "Insurance bot attempting to use health data for insurance management (prohibited purpose).").
109
+ requester(scenarioD, insurerBot).
110
+ requesterRole(scenarioD, "data_user").
111
+ subject(scenarioD, ruben).
112
+ purpose(scenarioD, insuranceManagement).
113
+ environment(scenarioD, "secure_env").
114
+ category(scenarioD, patientSummary).
115
+
116
+ scenario(scenarioE).
117
+ outputKey(scenarioE, out050E).
118
+ scenario_label(scenarioE, "E – GP checks labs").
119
+ scenario_description(scenarioE, "GP for the same patient checking lab results via the API gateway.").
120
+ requester(scenarioE, gpRuben).
121
+ requesterRole(scenarioE, "clinician").
122
+ subject(scenarioE, ruben).
123
+ purpose(scenarioE, primaryCareManagement).
124
+ environment(scenarioE, "api_gateway").
125
+ category(scenarioE, labResults).
126
+
127
+ scenario(scenarioF).
128
+ outputKey(scenarioF, out060F).
129
+ scenario_label(scenarioF, "F – Research on anonymised dataset").
130
+ scenario_description(scenarioF, "Researcher using anonymised labs + summary in a secure environment, with opt-in.").
131
+ requester(scenarioF, researcherAurora).
132
+ requesterRole(scenarioF, "data_user").
133
+ subject(scenarioF, ruben).
134
+ purpose(scenarioF, healthcareScientificResearch).
135
+ environment(scenarioF, "secure_env").
136
+ tom(scenarioF, anonymisation).
137
+ category(scenarioF, patientSummary).
138
+ category(scenarioF, labResults).
139
+
140
+ scenario(scenarioG).
141
+ outputKey(scenarioG, out070G).
142
+ scenario_label(scenarioG, "G – AI training (opt-out)").
143
+ scenario_description(scenarioG, "Data user wants to train AI, but the subject opted out of AI training.").
144
+ requester(scenarioG, mlOps).
145
+ requesterRole(scenarioG, "data_user").
146
+ subject(scenarioG, ruben).
147
+ purpose(scenarioG, trainTestAndEvaluateAiSystemsAlgorithms).
148
+ environment(scenarioG, "secure_env").
149
+ category(scenarioG, patientSummary).
150
+ category(scenarioG, labResults).
151
+
152
+ % Derivation rules: each rule below contributes one logical step toward the displayed results.
153
+ label(S, Label) :- scenario_label(S, Label).
154
+ description(S, Description) :- scenario_description(S, Description).
155
+
156
+ care_team_linked(S) :-
157
+ requester(S, Requester),
158
+ subject(S, Subject),
159
+ linkedTo(Requester, Subject).
160
+
161
+ subject_opt_in(S) :-
162
+ subject(S, Subject),
163
+ purpose(S, Purpose),
164
+ consentAllow(Subject, Purpose).
165
+
166
+ subject_opt_out(S) :-
167
+ subject(S, Subject),
168
+ purpose(S, Purpose),
169
+ consentDeny(Subject, Purpose).
170
+
171
+ primary_policy_match(S) :-
172
+ purpose(S, primaryCareManagement),
173
+ requesterRole(S, "clinician"),
174
+ care_team_linked(S),
175
+ category(S, Category),
176
+ allowAnyCategory(policyPrimary, Category).
177
+
178
+ qi_policy_match(S) :-
179
+ purpose(S, ensureQualitySafetyHealthcare),
180
+ environment(S, "secure_env"),
181
+ category(S, labResults),
182
+ category(S, patientSummary).
183
+
184
+ research_policy_match(S) :-
185
+ purpose(S, healthcareScientificResearch),
186
+ environment(S, "secure_env"),
187
+ tom(S, anonymisation),
188
+ subject_opt_in(S),
189
+ category(S, labResults).
190
+
191
+ insurance_prohibition_match(S) :-
192
+ purpose(S, insuranceManagement),
193
+ prohibitPurpose(policyDenyInsurance, insuranceManagement).
194
+
195
+ ai_training_opt_out_match(S) :-
196
+ purpose(S, trainTestAndEvaluateAiSystemsAlgorithms),
197
+ subject_opt_out(S).
198
+
199
+ careTeamLinked(S, true) :- care_team_linked(S).
200
+ subjectOptIn(S, true) :- subject_opt_in(S).
201
+ subjectOptOut(S, true) :- subject_opt_out(S).
202
+
203
+ % Permit when a scenario satisfies one of the allowed policy branches.
204
+ decision(S, "PERMIT") :- primary_policy_match(S).
205
+ decision(S, "PERMIT") :- qi_policy_match(S).
206
+ decision(S, "PERMIT") :- research_policy_match(S).
207
+ % Deny branches preserve the reason that will be materialized for the report.
208
+ decision(S, "DENY") :- insurance_prohibition_match(S).
209
+ decision(S, "DENY") :- ai_training_opt_out_match(S).
210
+ decision(scenarioC, "DENY") :- purpose(scenarioC, ensureQualitySafetyHealthcare).
211
+
212
+ matchedPolicyUid(S, Uid) :- primary_policy_match(S), policyUid(policyPrimary, Uid).
213
+ matchedPolicyUid(S, Uid) :- qi_policy_match(S), policyUid(policyQi, Uid).
214
+ matchedPolicyUid(S, Uid) :- research_policy_match(S), policyUid(policyResearch, Uid).
215
+ matchedProhibition(S, policyDenyInsurance) :- insurance_prohibition_match(S).
216
+
217
+ reason(S, "Permitted: clinician in the patient's care team, and the primary-care policy matched.") :- primary_policy_match(S).
218
+ reason(S, "Permitted: ODRL/DPV policy matched for secondary use.") :- qi_policy_match(S).
219
+ reason(S, "Permitted: subject opted in and an ODRL/DPV policy matched (anonymised dataset in secure environment).") :- research_policy_match(S).
220
+ reason(S, "Denied: the requested purpose (insurance management) is prohibited by policy.") :- insurance_prohibition_match(S).
221
+ reason(S, "Denied: you opted out of your data being used to train AI systems.") :- ai_training_opt_out_match(S).
222
+ reason(scenarioC, "Denied: no policy matched (purpose, environment, TOMs, or categories out of scope).") :- purpose(scenarioC, ensureQualitySafetyHealthcare).
223
+
224
+ trace(S, "permit:primary_care_allowed") :- primary_policy_match(S).
225
+ trace(S, "urn:policy:primary-care-001:permit:odrl:permission_matched") :- primary_policy_match(S).
226
+ trace(S, "urn:policy:qi-2025-aurora:permit:odrl:permission_matched") :- qi_policy_match(S).
227
+ trace(S, "urn:policy:research-aurora-diabetes:permit:odrl:permission_matched") :- research_policy_match(S).
228
+ trace(S, "deny:prohibited_purpose") :- insurance_prohibition_match(S).
229
+ trace(S, "urn:policy:deny-insurance:deny:odrl:prohibition_matched") :- insurance_prohibition_match(S).
230
+ trace(S, "deny:subject_opted_out_ai_training") :- ai_training_opt_out_match(S).
231
+ trace(scenarioC, "urn:policy:qi-2025-aurora:deny:odrl:no_permission_matched") :- purpose(scenarioC, ensureQualitySafetyHealthcare).
232
+
233
+ % C1-C10 below are the ARC-style checklist lines from the upstream output.
234
+ checkC1(scenarioA, "SKIPPED - not a prohibited purpose") :- decision(scenarioA, "PERMIT").
235
+ checkC2(scenarioA, "OK - clinician") :- decision(scenarioA, "PERMIT").
236
+ checkC3(scenarioA, "OK - care-team linked") :- decision(scenarioA, "PERMIT").
237
+ checkC4(scenarioA, "SKIPPED") :- decision(scenarioA, "PERMIT").
238
+ checkC5(scenarioA, "OK - operator=isAnyOf, allowed=[\"https://example.org/health#PATIENT_SUMMARY\", \"https://example.org/health#LAB_RESULTS\"], requested=[\"https://example.org/health#PATIENT_SUMMARY\"]") :- decision(scenarioA, "PERMIT").
239
+ checkC6(scenarioA, "SKIPPED - no prohibition matched") :- decision(scenarioA, "PERMIT").
240
+ checkC7(scenarioA, "OK - trace shows matching permission") :- decision(scenarioA, "PERMIT").
241
+ checkC8(scenarioA, "SKIPPED - no matched policy or no duties") :- decision(scenarioA, "PERMIT").
242
+ checkC9(scenarioA, "SKIPPED - policy has no environment constraint") :- decision(scenarioA, "PERMIT").
243
+ checkC10Text(scenarioA, "INFO - matched policy: urn:policy:primary-care-001") :- decision(scenarioA, "PERMIT").
244
+
245
+ checkC1(scenarioB, "SKIPPED - not a prohibited purpose") :- decision(scenarioB, "PERMIT").
246
+ checkC2(scenarioB, "SKIPPED") :- decision(scenarioB, "PERMIT").
247
+ checkC3(scenarioB, "SKIPPED") :- decision(scenarioB, "PERMIT").
248
+ checkC4(scenarioB, "OK - opt-in present and policy matched") :- decision(scenarioB, "PERMIT").
249
+ checkC5(scenarioB, "OK - operator=isAllOf, allowed=[\"https://example.org/health#LAB_RESULTS\", \"https://example.org/health#PATIENT_SUMMARY\"], requested=[\"https://example.org/health#LAB_RESULTS\", \"https://example.org/health#PATIENT_SUMMARY\"]") :- decision(scenarioB, "PERMIT").
250
+ checkC6(scenarioB, "SKIPPED - no prohibition matched") :- decision(scenarioB, "PERMIT").
251
+ checkC7(scenarioB, "OK - trace shows matching permission") :- decision(scenarioB, "PERMIT").
252
+ checkC8(scenarioB, "INFO - duties attached: duty:https://w3id.org/dpv/legal/eu/ehds#requireConsent, duty:https://w3id.org/dpv/legal/eu/ehds#noExfiltration") :- decision(scenarioB, "PERMIT").
253
+ checkC9(scenarioB, "OK - operator=eq, allowed=\"secure_env\", requested=\"secure_env\"") :- decision(scenarioB, "PERMIT").
254
+ checkC10Text(scenarioB, "INFO - matched policy: urn:policy:qi-2025-aurora") :- decision(scenarioB, "PERMIT").
255
+
256
+ checkC1(scenarioC, "SKIPPED - not a prohibited purpose") :- decision(scenarioC, "DENY").
257
+ checkC2(scenarioC, "SKIPPED") :- decision(scenarioC, "DENY").
258
+ checkC3(scenarioC, "SKIPPED") :- decision(scenarioC, "DENY").
259
+ checkC4(scenarioC, "OK - denied because opt-in missing or no policy match") :- decision(scenarioC, "DENY").
260
+ checkC5(scenarioC, "SKIPPED") :- decision(scenarioC, "DENY").
261
+ checkC6(scenarioC, "SKIPPED - no prohibition matched") :- decision(scenarioC, "DENY").
262
+ checkC7(scenarioC, "SKIPPED") :- decision(scenarioC, "DENY").
263
+ checkC8(scenarioC, "SKIPPED - no matched policy or no duties") :- decision(scenarioC, "DENY").
264
+ checkC9(scenarioC, "SKIPPED") :- decision(scenarioC, "DENY").
265
+ checkC10Text(scenarioC, "SKIPPED - no matched policy") :- decision(scenarioC, "DENY").
266
+
267
+ checkC1(scenarioD, "OK - denied prohibited purpose") :- decision(scenarioD, "DENY").
268
+ checkC2(scenarioD, "SKIPPED") :- decision(scenarioD, "DENY").
269
+ checkC3(scenarioD, "SKIPPED") :- decision(scenarioD, "DENY").
270
+ checkC4(scenarioD, "SKIPPED") :- decision(scenarioD, "DENY").
271
+ checkC5(scenarioD, "SKIPPED") :- decision(scenarioD, "DENY").
272
+ checkC6(scenarioD, "OK - denied due to prohibition") :- decision(scenarioD, "DENY").
273
+ checkC7(scenarioD, "SKIPPED") :- decision(scenarioD, "DENY").
274
+ checkC8(scenarioD, "SKIPPED - no matched policy or no duties") :- decision(scenarioD, "DENY").
275
+ checkC9(scenarioD, "SKIPPED") :- decision(scenarioD, "DENY").
276
+ checkC10Text(scenarioD, "SKIPPED - no matched policy") :- decision(scenarioD, "DENY").
277
+
278
+ checkC1(scenarioE, "SKIPPED - not a prohibited purpose") :- decision(scenarioE, "PERMIT").
279
+ checkC2(scenarioE, "OK - clinician") :- decision(scenarioE, "PERMIT").
280
+ checkC3(scenarioE, "OK - care-team linked") :- decision(scenarioE, "PERMIT").
281
+ checkC4(scenarioE, "SKIPPED") :- decision(scenarioE, "PERMIT").
282
+ checkC5(scenarioE, "OK - operator=isAnyOf, allowed=[\"https://example.org/health#PATIENT_SUMMARY\", \"https://example.org/health#LAB_RESULTS\"], requested=[\"https://example.org/health#LAB_RESULTS\"]") :- decision(scenarioE, "PERMIT").
283
+ checkC6(scenarioE, "SKIPPED - no prohibition matched") :- decision(scenarioE, "PERMIT").
284
+ checkC7(scenarioE, "OK - trace shows matching permission") :- decision(scenarioE, "PERMIT").
285
+ checkC8(scenarioE, "SKIPPED - no matched policy or no duties") :- decision(scenarioE, "PERMIT").
286
+ checkC9(scenarioE, "SKIPPED - policy has no environment constraint") :- decision(scenarioE, "PERMIT").
287
+ checkC10Text(scenarioE, "INFO - matched policy: urn:policy:primary-care-001") :- decision(scenarioE, "PERMIT").
288
+
289
+ checkC1(scenarioF, "SKIPPED - not a prohibited purpose") :- decision(scenarioF, "PERMIT").
290
+ checkC2(scenarioF, "SKIPPED") :- decision(scenarioF, "PERMIT").
291
+ checkC3(scenarioF, "SKIPPED") :- decision(scenarioF, "PERMIT").
292
+ checkC4(scenarioF, "OK - opt-in present and policy matched") :- decision(scenarioF, "PERMIT").
293
+ checkC5(scenarioF, "OK - operator=isAnyOf, allowed=[\"https://example.org/health#LAB_RESULTS\", \"https://example.org/health#PATIENT_SUMMARY\", \"https://example.org/health#IMAGING_REPORT\"], requested=[\"https://example.org/health#PATIENT_SUMMARY\", \"https://example.org/health#LAB_RESULTS\"]") :- decision(scenarioF, "PERMIT").
294
+ checkC6(scenarioF, "SKIPPED - no prohibition matched") :- decision(scenarioF, "PERMIT").
295
+ checkC7(scenarioF, "OK - trace shows matching permission") :- decision(scenarioF, "PERMIT").
296
+ checkC8(scenarioF, "INFO - duties attached: duty:https://w3id.org/dpv/legal/eu/ehds#annualOutcomeReport, duty:https://w3id.org/dpv/legal/eu/ehds#noReidentification, duty:https://w3id.org/dpv/legal/eu/ehds#noExfiltration") :- decision(scenarioF, "PERMIT").
297
+ checkC9(scenarioF, "OK - operator=eq, allowed=\"secure_env\", requested=\"secure_env\"") :- decision(scenarioF, "PERMIT").
298
+ checkC10Text(scenarioF, "INFO - matched policy: urn:policy:research-aurora-diabetes") :- decision(scenarioF, "PERMIT").
299
+
300
+ checkC1(scenarioG, "SKIPPED - not a prohibited purpose") :- decision(scenarioG, "DENY").
301
+ checkC2(scenarioG, "SKIPPED") :- decision(scenarioG, "DENY").
302
+ checkC3(scenarioG, "SKIPPED") :- decision(scenarioG, "DENY").
303
+ checkC4(scenarioG, "OK - denied because opt-in missing or no policy match") :- decision(scenarioG, "DENY").
304
+ checkC5(scenarioG, "SKIPPED") :- decision(scenarioG, "DENY").
305
+ checkC6(scenarioG, "SKIPPED - no prohibition matched") :- decision(scenarioG, "DENY").
306
+ checkC7(scenarioG, "SKIPPED") :- decision(scenarioG, "DENY").
307
+ checkC8(scenarioG, "SKIPPED - no matched policy or no duties") :- decision(scenarioG, "DENY").
308
+ checkC9(scenarioG, "SKIPPED") :- decision(scenarioG, "DENY").
309
+ checkC10Text(scenarioG, "SKIPPED - no matched policy") :- decision(scenarioG, "DENY").