eyelang 1.2.2 → 1.3.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 (922) hide show
  1. package/README.md +4 -4
  2. package/docs/guide.md +230 -229
  3. package/docs/language-reference.md +169 -157
  4. package/examples/access-control-policy.eye +52 -0
  5. package/examples/ackermann.eye +47 -0
  6. package/examples/age.eye +26 -0
  7. package/examples/aliases-and-namespaces.eye +20 -0
  8. package/examples/alignment-demo.eye +44 -0
  9. package/examples/allen-interval-calculus.eye +64 -0
  10. package/examples/ancestor.eye +22 -0
  11. package/examples/animal.eye +21 -0
  12. package/examples/annotation.eye +34 -0
  13. package/examples/auroracare.eye +309 -0
  14. package/examples/backward.eye +11 -0
  15. package/examples/basic-monadic.eye +10032 -0
  16. package/examples/bayes-diagnosis.eye +108 -0
  17. package/examples/bayes-therapy.eye +189 -0
  18. package/examples/beam-deflection.eye +48 -0
  19. package/examples/binomial-vandermonde.eye +49 -0
  20. package/examples/blocks-world-planning.eye +77 -0
  21. package/examples/bmi.eye +232 -0
  22. package/examples/braking-safety-worlds.eye +69 -0
  23. package/examples/buck-converter-design.eye +83 -0
  24. package/examples/cache-performance.eye +56 -0
  25. package/examples/canary-release.eye +51 -0
  26. package/examples/cat-koko.eye +24 -0
  27. package/examples/catalan-convolution.eye +37 -0
  28. package/examples/chart-parser.eye +65 -0
  29. package/examples/clinical-trial-screening.eye +97 -0
  30. package/examples/collatz-1000.eye +45 -0
  31. package/examples/combinatorics-findall-sort.eye +38 -0
  32. package/examples/competitive-enzyme-kinetics.eye +78 -0
  33. package/examples/complex.eye +133 -0
  34. package/examples/composition-of-injective-functions-is-injective.eye +50 -0
  35. package/examples/context-association.eye +53 -0
  36. package/examples/context-schema-audit.eye +46 -0
  37. package/examples/continued-fraction-sqrt2.eye +36 -0
  38. package/examples/control-system.eye +76 -0
  39. package/examples/critical-path-schedule.eye +82 -0
  40. package/examples/cyclic-path.eye +18 -0
  41. package/examples/d3-group.eye +99 -0
  42. package/examples/dairy-energy-balance.eye +66 -0
  43. package/examples/data-negotiation.eye +38 -0
  44. package/examples/deep-taxonomy-10.eye +115 -0
  45. package/examples/deep-taxonomy-100.eye +385 -0
  46. package/examples/deep-taxonomy-1000.eye +3085 -0
  47. package/examples/deep-taxonomy-10000.eye +30094 -0
  48. package/examples/deep-taxonomy-100000.eye +300184 -0
  49. package/examples/delfour.eye +281 -0
  50. package/examples/deontic-logic.eye +52 -0
  51. package/examples/derived-backward-rule.eye +30 -0
  52. package/examples/derived-rule.eye +27 -0
  53. package/examples/diamond-property.eye +38 -0
  54. package/examples/dijkstra-findall-sort.eye +43 -0
  55. package/examples/dijkstra-risk-path.eye +87 -0
  56. package/examples/dijkstra.eye +50 -0
  57. package/examples/dining-philosophers.eye +147 -0
  58. package/examples/dog.eye +25 -0
  59. package/examples/dpv-odrl-purpose-mapping.eye +48 -0
  60. package/examples/drone-corridor-planner.eye +48 -0
  61. package/examples/easter-computus.eye +88 -0
  62. package/examples/electrical-rc-filter.eye +37 -0
  63. package/examples/epidemic-policy.eye +66 -0
  64. package/examples/equivalence-classes-overlap-implies-same-class.eye +27 -0
  65. package/examples/eulerian-path.eye +87 -0
  66. package/examples/ev-range-worlds.eye +87 -0
  67. package/examples/existential-rule.eye +21 -0
  68. package/examples/exoplanet-validation-worlds.eye +94 -0
  69. package/examples/expression-eval.eye +45 -0
  70. package/examples/family-cousins.eye +67 -0
  71. package/examples/fastpow.eye +61 -0
  72. package/examples/fft8-numeric.eye +85 -0
  73. package/examples/fibonacci.eye +60 -0
  74. package/examples/field-nitrogen-balance.eye +73 -0
  75. package/examples/flandor.eye +296 -0
  76. package/examples/floating-point.eye +28 -0
  77. package/examples/four-color-map.eye +133 -0
  78. package/examples/fundamental-theorem-arithmetic.eye +119 -0
  79. package/examples/gd-step-certified.eye +162 -0
  80. package/examples/gdpr-compliance.eye +69 -0
  81. package/examples/good-cobbler.eye +16 -0
  82. package/examples/gps.eye +146 -0
  83. package/examples/graph-reachability.eye +33 -0
  84. package/examples/graph.eye +35 -0
  85. package/examples/gray-code-counter.eye +47 -0
  86. package/examples/greatest-lower-bound-uniqueness.eye +30 -0
  87. package/examples/group-inverse-uniqueness.eye +36 -0
  88. package/examples/hamiltonian-path.eye +51 -0
  89. package/examples/hamming-code.eye +109 -0
  90. package/examples/hanoi.eye +19 -0
  91. package/examples/heat-loss.eye +56 -0
  92. package/examples/heron-theorem.eye +42 -0
  93. package/examples/ideal-gas-law.eye +39 -0
  94. package/examples/illegitimate-reasoning.eye +88 -0
  95. package/examples/integer-partitions.eye +35 -0
  96. package/examples/intuitionistic-logic-kripke.eye +69 -0
  97. package/examples/job-shop-scheduling.eye +48 -0
  98. package/examples/knapsack-optimization.eye +46 -0
  99. package/examples/knowledge-engineering-alignment-flow.eye +46 -0
  100. package/examples/law-of-cosines.eye +37 -0
  101. package/examples/least-squares-regression.eye +85 -0
  102. package/examples/linear-logic-resources.eye +51 -0
  103. package/examples/list-collection.eye +35 -0
  104. package/examples/lldm.eye +80 -0
  105. package/examples/manufacturing-quality-control.eye +73 -0
  106. package/examples/matrix-chain-order.eye +79 -0
  107. package/examples/microgrid-dispatch.eye +89 -0
  108. package/examples/missionaries-cannibals.eye +53 -0
  109. package/examples/modal-logic-kripke.eye +45 -0
  110. package/examples/modular-exponentiation.eye +35 -0
  111. package/examples/monkey-bananas.eye +45 -0
  112. package/examples/n-queens-8.eye +35 -0
  113. package/examples/network-sla.eye +48 -0
  114. package/examples/newton-raphson.eye +48 -0
  115. package/examples/nixon-diamond.eye +37 -0
  116. package/examples/observability-log-correlation.eye +40 -0
  117. package/examples/odrl-dpv-fpv-trust-flow.eye +51 -0
  118. package/examples/odrl-dpv-healthcare-risk-ranked.eye +270 -0
  119. package/examples/odrl-dpv-risk-ranked.eye +320 -0
  120. package/examples/orbital-transfer-design.eye +116 -0
  121. package/examples/path-discovery.eye +45013 -0
  122. package/examples/peano-arithmetic.eye +33 -0
  123. package/examples/peasant.eye +29 -0
  124. package/examples/pell-equation.eye +34 -0
  125. package/examples/pendulum-period.eye +50 -0
  126. package/examples/polynomial.eye +124 -0
  127. package/examples/proof/access-control-policy.eye +158 -0
  128. package/examples/proof/age.eye +71 -0
  129. package/examples/proof/aliases-and-namespaces.eye +78 -0
  130. package/examples/proof/ancestor.eye +140 -0
  131. package/examples/proof/animal.eye +68 -0
  132. package/examples/proof/annotation.eye +80 -0
  133. package/examples/proof/backward.eye +22 -0
  134. package/examples/proof/bayes-diagnosis.eye +208 -0
  135. package/examples/proof/beam-deflection.eye +227 -0
  136. package/examples/proof/cache-performance.eye +310 -0
  137. package/examples/proof/canary-release.eye +172 -0
  138. package/examples/proof/cat-koko.eye +86 -0
  139. package/examples/proof/chart-parser.eye +474 -0
  140. package/examples/proof/clinical-trial-screening.eye +389 -0
  141. package/examples/proof/composition-of-injective-functions-is-injective.eye +258 -0
  142. package/examples/proof/context-association.eye +78 -0
  143. package/examples/proof/data-negotiation.eye +76 -0
  144. package/examples/proof/deontic-logic.eye +109 -0
  145. package/examples/proof/derived-backward-rule.eye +74 -0
  146. package/examples/proof/derived-rule.eye +43 -0
  147. package/examples/proof/diamond-property.eye +307 -0
  148. package/examples/proof/dog.eye +31 -0
  149. package/examples/proof/dpv-odrl-purpose-mapping.eye +348 -0
  150. package/examples/proof/electrical-rc-filter.eye +105 -0
  151. package/examples/proof/epidemic-policy.eye +774 -0
  152. package/examples/proof/equivalence-classes-overlap-implies-same-class.eye +1098 -0
  153. package/examples/proof/existential-rule.eye +40 -0
  154. package/examples/proof/expression-eval.eye +105 -0
  155. package/examples/proof/floating-point.eye +160 -0
  156. package/examples/proof/gdpr-compliance.eye +199 -0
  157. package/examples/proof/good-cobbler.eye +16 -0
  158. package/examples/proof/graph-reachability.eye +151 -0
  159. package/examples/proof/greatest-lower-bound-uniqueness.eye +150 -0
  160. package/examples/proof/group-inverse-uniqueness.eye +84 -0
  161. package/examples/proof/hanoi.eye +185 -0
  162. package/examples/proof/heat-loss.eye +228 -0
  163. package/examples/proof/ideal-gas-law.eye +151 -0
  164. package/examples/proof/intuitionistic-logic-kripke.eye +133 -0
  165. package/examples/proof/linear-logic-resources.eye +205 -0
  166. package/examples/proof/list-collection.eye +52 -0
  167. package/examples/proof/modal-logic-kripke.eye +125 -0
  168. package/examples/proof/nixon-diamond.eye +181 -0
  169. package/examples/proof/proof-contrapositive.eye +78 -0
  170. package/examples/proof/reusable-builtins.eye +124 -0
  171. package/examples/proof/security-incident-correlation.eye +270 -0
  172. package/examples/proof/socket-age.eye +32 -0
  173. package/examples/proof/socket-family.eye +59 -0
  174. package/examples/proof/socrates.eye +38 -0
  175. package/examples/proof/term-tools.eye +95 -0
  176. package/examples/proof/witch.eye +216 -0
  177. package/examples/proof-contrapositive.eye +27 -0
  178. package/examples/quadratic-formula.eye +56 -0
  179. package/examples/radioactive-decay.eye +58 -0
  180. package/examples/reusable-builtins.eye +36 -0
  181. package/examples/riemann-hypothesis.eye +110 -0
  182. package/examples/security-incident-correlation.eye +69 -0
  183. package/examples/send-more-money.eye +71 -0
  184. package/examples/service-impact.eye +41 -0
  185. package/examples/sieve.eye +20 -0
  186. package/examples/skolem-functions.eye +52 -0
  187. package/examples/socket-age.eye +39 -0
  188. package/examples/socket-family.eye +28 -0
  189. package/examples/socrates.eye +19 -0
  190. package/examples/stable-marriage.eye +92 -0
  191. package/examples/statistics-summary.eye +56 -0
  192. package/examples/stirling-bell-numbers.eye +32 -0
  193. package/examples/sudoku-4x4.eye +54 -0
  194. package/examples/superdense-coding.eye +84 -0
  195. package/examples/term-tools.eye +32 -0
  196. package/examples/totient-summatory.eye +33 -0
  197. package/examples/trust-flow-provenance-threshold.eye +47 -0
  198. package/examples/turing.eye +69 -0
  199. package/examples/vector-similarity.eye +60 -0
  200. package/examples/vulnerability-impact.eye +69 -0
  201. package/examples/web-names.eye +83 -0
  202. package/examples/weighted-interval-scheduling.eye +81 -0
  203. package/examples/witch.eye +38 -0
  204. package/examples/wolf-goat-cabbage.eye +56 -0
  205. package/examples/zebra.eye +45 -0
  206. package/index.d.ts +1 -1
  207. package/package.json +2 -2
  208. package/playground.html +10 -10
  209. package/src/cli.js +2 -2
  210. package/src/explain.js +1 -1
  211. package/src/parser.js +37 -7
  212. package/src/program.js +3 -3
  213. package/src/solver.js +2 -2
  214. package/src/term.js +9 -0
  215. package/test/conformance/README.md +2 -2
  216. package/test/conformance/cases/001_fact_output.eye +4 -0
  217. package/test/conformance/cases/002_rule_recursion.eye +7 -0
  218. package/test/conformance/cases/002_rule_recursion.query +1 -1
  219. package/test/conformance/cases/003_terms_and_readback.eye +16 -0
  220. package/test/conformance/cases/003_terms_and_readback.query +1 -1
  221. package/test/conformance/cases/004_conjunction_and_parentheses.eye +5 -0
  222. package/test/conformance/cases/004_conjunction_and_parentheses.query +1 -1
  223. package/test/conformance/cases/005_list_deconstruction.eye +6 -0
  224. package/test/conformance/cases/005_list_deconstruction.query +1 -1
  225. package/test/conformance/cases/006_comma_formula_data.eye +4 -0
  226. package/test/conformance/cases/006_comma_formula_data.query +1 -1
  227. package/test/conformance/cases/007_anonymous_variables.eye +5 -0
  228. package/test/conformance/cases/007_anonymous_variables.query +1 -1
  229. package/test/conformance/cases/008_graphic_atoms.eye +6 -0
  230. package/test/conformance/cases/008_graphic_atoms.query +1 -1
  231. package/test/conformance/cases/009_comments_and_whitespace.eye +5 -0
  232. package/test/conformance/cases/009_comments_and_whitespace.query +1 -1
  233. package/test/conformance/cases/010_variable_scope_and_reuse.eye +8 -0
  234. package/test/conformance/cases/010_variable_scope_and_reuse.query +1 -1
  235. package/test/conformance/cases/011_predicate_arity.eye +6 -0
  236. package/test/conformance/cases/011_predicate_arity.query +1 -1
  237. package/test/conformance/cases/012_nested_compound_unification.eye +5 -0
  238. package/test/conformance/cases/012_nested_compound_unification.query +1 -1
  239. package/test/conformance/cases/013_multiple_clauses_order.eye +6 -0
  240. package/test/conformance/cases/013_multiple_clauses_order.query +1 -1
  241. package/test/conformance/cases/014_failure_filters_answers.eye +7 -0
  242. package/test/conformance/cases/014_failure_filters_answers.query +1 -1
  243. package/test/conformance/cases/015_improper_list_unification.eye +6 -0
  244. package/test/conformance/cases/015_improper_list_unification.query +1 -1
  245. package/test/conformance/cases/016_arity_zero_atom.eye +4 -0
  246. package/test/conformance/cases/017_three_step_recursion.eye +8 -0
  247. package/test/conformance/cases/017_three_step_recursion.query +1 -1
  248. package/test/conformance/cases/018_quoted_atom_readback.eye +6 -0
  249. package/test/conformance/cases/018_quoted_atom_readback.query +1 -1
  250. package/test/conformance/cases/019_parenthesized_three_conjuncts.eye +7 -0
  251. package/test/conformance/cases/019_parenthesized_three_conjuncts.query +1 -1
  252. package/test/conformance/cases/020_nested_list_terms.eye +5 -0
  253. package/test/conformance/cases/020_nested_list_terms.query +1 -1
  254. package/test/conformance/cases/021_repeated_variable_head.eye +7 -0
  255. package/test/conformance/cases/022_rule_head_structure.eye +5 -0
  256. package/test/conformance/cases/023_quoted_escapes_readback.eye +5 -0
  257. package/test/conformance/cases/024_numeric_literal_readback.eye +6 -0
  258. package/test/conformance/cases/025_body_parentheses_with_formula_data.eye +5 -0
  259. package/test/conformance/cases/026_question_underscore_named_variable_reuse.eye +5 -0
  260. package/test/conformance/cases/027_default_derived_output.eye +5 -0
  261. package/test/conformance/cases/028_materialize_focus.eye +5 -0
  262. package/test/conformance/cases/029_arithmetic_and_comparison.eye +11 -0
  263. package/test/conformance/cases/029_arithmetic_and_comparison.query +1 -1
  264. package/test/conformance/cases/030_strings_and_atoms.eye +4 -0
  265. package/test/conformance/cases/030_strings_and_atoms.query +1 -1
  266. package/test/conformance/cases/031_lists_aggregation_ordering.eye +10 -0
  267. package/test/conformance/cases/031_lists_aggregation_ordering.query +1 -1
  268. package/test/conformance/cases/032_holds_parts.eye +4 -0
  269. package/test/conformance/cases/033_negation_once_generators.eye +7 -0
  270. package/test/conformance/cases/033_negation_once_generators.query +1 -1
  271. package/test/conformance/cases/034_equality_and_inequality.eye +6 -0
  272. package/test/conformance/cases/034_equality_and_inequality.query +1 -1
  273. package/test/conformance/cases/035_list_relations.eye +5 -0
  274. package/test/conformance/cases/035_list_relations.query +1 -1
  275. package/test/conformance/cases/036_append_splits.eye +3 -0
  276. package/test/conformance/cases/036_append_splits.query +1 -1
  277. package/test/conformance/cases/037_matching_and_comparison.query +1 -1
  278. package/test/conformance/cases/038_table_declaration.eye +8 -0
  279. package/test/conformance/cases/038_table_declaration.query +1 -0
  280. package/test/conformance/cases/039_numeric_functions.eye +9 -0
  281. package/test/conformance/cases/039_numeric_functions.query +1 -1
  282. package/test/conformance/cases/040_between_enumeration.eye +3 -0
  283. package/test/conformance/cases/040_between_enumeration.query +1 -1
  284. package/test/conformance/cases/041_smallest_divisor.eye +3 -0
  285. package/test/conformance/cases/041_smallest_divisor.query +1 -1
  286. package/test/conformance/cases/042_negation_filter.eye +7 -0
  287. package/test/conformance/cases/042_negation_filter.query +1 -1
  288. package/test/conformance/cases/043_once_user_predicate.eye +5 -0
  289. package/test/conformance/cases/043_once_user_predicate.query +1 -1
  290. package/test/conformance/cases/044_findall_user_goal.eye +6 -0
  291. package/test/conformance/cases/044_findall_user_goal.query +1 -1
  292. package/test/conformance/cases/045_sort_deduplicates_atoms.eye +3 -0
  293. package/test/conformance/cases/045_sort_deduplicates_atoms.query +1 -1
  294. package/test/conformance/cases/046_append_bound_prefix_suffix.eye +4 -0
  295. package/test/conformance/cases/046_append_bound_prefix_suffix.query +1 -1
  296. package/test/conformance/cases/047_nth0_index_generation.eye +3 -0
  297. package/test/conformance/cases/047_nth0_index_generation.query +1 -1
  298. package/test/conformance/cases/048_set_nth0_edges.eye +4 -0
  299. package/test/conformance/cases/048_set_nth0_edges.query +1 -1
  300. package/test/conformance/cases/049_select_duplicate_occurrences.eye +3 -0
  301. package/test/conformance/cases/049_select_duplicate_occurrences.query +1 -1
  302. package/test/conformance/cases/050_not_member_filter.eye +6 -0
  303. package/test/conformance/cases/050_not_member_filter.query +1 -1
  304. package/test/conformance/cases/051_nested_holds_parts.eye +4 -0
  305. package/test/conformance/cases/052_holds_member.eye +3 -0
  306. package/test/conformance/cases/053_materialize_excludes_source_fact.eye +6 -0
  307. package/test/conformance/cases/054_numeric_and_lexical_comparison.query +1 -1
  308. package/test/conformance/cases/055_string_matching_filters.eye +6 -0
  309. package/test/conformance/cases/055_string_matching_filters.query +1 -1
  310. package/test/conformance/cases/056_string_and_atom_concat.eye +3 -0
  311. package/test/conformance/cases/056_string_and_atom_concat.query +1 -1
  312. package/test/conformance/cases/057_countall_empty_and_nonempty.eye +4 -0
  313. package/test/conformance/cases/057_countall_empty_and_nonempty.query +1 -1
  314. package/test/conformance/cases/058_sumall_numeric_template.eye +5 -0
  315. package/test/conformance/cases/058_sumall_numeric_template.query +1 -1
  316. package/test/conformance/cases/059_aggregate_min_template.eye +5 -0
  317. package/test/conformance/cases/059_aggregate_min_template.query +1 -1
  318. package/test/conformance/cases/060_aggregate_max_compound_key.eye +5 -0
  319. package/test/conformance/cases/060_aggregate_max_compound_key.query +1 -1
  320. package/test/conformance/cases/061_date_difference.eye +4 -0
  321. package/test/conformance/cases/062_reusable_numeric_builtins.eye +10 -0
  322. package/test/conformance/cases/063_reusable_list_builtins.eye +11 -0
  323. package/test/conformance/cases/064_reusable_string_builtins.eye +12 -0
  324. package/test/conformance/cases/065_reusable_term_control_builtins.eye +11 -0
  325. package/test/conformance/cases/066_numeric_edges.eye +14 -0
  326. package/test/conformance/cases/067_list_edges.eye +10 -0
  327. package/test/conformance/cases/068_list_generation_order.eye +7 -0
  328. package/test/conformance/cases/069_list_summaries_and_sets.eye +9 -0
  329. package/test/conformance/cases/070_matches_named_captures.eye +13 -0
  330. package/test/conformance/cases/071_string_edges.eye +10 -0
  331. package/test/conformance/cases/072_string_conversions.eye +10 -0
  332. package/test/conformance/cases/073_term_introspection_edges.eye +10 -0
  333. package/test/conformance/cases/074_forall_edges.eye +10 -0
  334. package/test/conformance/cases/075_aggregation_edges.eye +12 -0
  335. package/test/conformance/cases/076_composed_reusable_builtins.eye +8 -0
  336. package/test/conformance/cases/077_recursive_path_with_lists.eye +10 -0
  337. package/test/conformance/cases/078_mutual_recursion_with_arithmetic.eye +7 -0
  338. package/test/conformance/cases/079_big_integer_arithmetic.eye +8 -0
  339. package/test/conformance/cases/080_rounding_modes.eye +10 -0
  340. package/test/conformance/cases/081_zero_safe_numeric_functions.eye +9 -0
  341. package/test/conformance/cases/083_between_modes_and_empty_ranges.eye +8 -0
  342. package/test/conformance/cases/084_append_and_select_composition.eye +7 -0
  343. package/test/conformance/cases/085_nth_and_update_edges.eye +8 -0
  344. package/test/conformance/cases/086_slicing_pipeline.eye +10 -0
  345. package/test/conformance/cases/087_sort_reverse_length.eye +8 -0
  346. package/test/conformance/cases/088_list_summaries_failures.eye +8 -0
  347. package/test/conformance/cases/089_string_split_join_pipeline.eye +7 -0
  348. package/test/conformance/cases/090_string_substring_replace_edges.eye +9 -0
  349. package/test/conformance/cases/091_string_case_and_trim.eye +7 -0
  350. package/test/conformance/cases/092_scalar_string_conversions.eye +9 -0
  351. package/test/conformance/cases/093_regex_named_captures_context.eye +8 -0
  352. package/test/conformance/cases/094_context_holds_enumeration.eye +7 -0
  353. package/test/conformance/cases/095_term_introspection_roundtrip.eye +8 -0
  354. package/test/conformance/cases/096_functor_scalar_edges.eye +8 -0
  355. package/test/conformance/cases/097_control_negation_once_forall.eye +13 -0
  356. package/test/conformance/cases/098_aggregation_nested_templates.eye +11 -0
  357. package/test/conformance/cases/099_materialize_multiple_arities.eye +8 -0
  358. package/test/conformance/cases/100_reusable_builtin_workflow.eye +10 -0
  359. package/test/conformance/cases/101_question_mark_variables.eye +7 -0
  360. package/test/conformance/cases/102_table_declaration.eye +11 -0
  361. package/test/conformance/cases/103_angle_iri_atoms.eye +7 -0
  362. package/test/conformance/expected/101_question_mark_variables.eye +3 -0
  363. package/test/conformance/expected/102_table_declaration.eye +6 -0
  364. package/test/conformance/expected/103_angle_iri_atoms.eye +3 -0
  365. package/test/run-conformance.mjs +4 -4
  366. package/test/run-examples.mjs +51 -51
  367. package/test/run-regression.mjs +178 -74
  368. package/examples/access-control-policy.pl +0 -52
  369. package/examples/ackermann.pl +0 -47
  370. package/examples/age.pl +0 -26
  371. package/examples/aliases-and-namespaces.pl +0 -20
  372. package/examples/alignment-demo.pl +0 -44
  373. package/examples/allen-interval-calculus.pl +0 -64
  374. package/examples/ancestor.pl +0 -22
  375. package/examples/animal.pl +0 -21
  376. package/examples/annotation.pl +0 -34
  377. package/examples/auroracare.pl +0 -309
  378. package/examples/backward.pl +0 -11
  379. package/examples/basic-monadic.pl +0 -10032
  380. package/examples/bayes-diagnosis.pl +0 -108
  381. package/examples/bayes-therapy.pl +0 -189
  382. package/examples/beam-deflection.pl +0 -48
  383. package/examples/binomial-vandermonde.pl +0 -49
  384. package/examples/blocks-world-planning.pl +0 -77
  385. package/examples/bmi.pl +0 -232
  386. package/examples/braking-safety-worlds.pl +0 -69
  387. package/examples/buck-converter-design.pl +0 -83
  388. package/examples/cache-performance.pl +0 -56
  389. package/examples/canary-release.pl +0 -51
  390. package/examples/cat-koko.pl +0 -24
  391. package/examples/catalan-convolution.pl +0 -37
  392. package/examples/chart-parser.pl +0 -65
  393. package/examples/clinical-trial-screening.pl +0 -97
  394. package/examples/collatz-1000.pl +0 -45
  395. package/examples/combinatorics-findall-sort.pl +0 -38
  396. package/examples/competitive-enzyme-kinetics.pl +0 -78
  397. package/examples/complex.pl +0 -133
  398. package/examples/composition-of-injective-functions-is-injective.pl +0 -50
  399. package/examples/context-association.pl +0 -53
  400. package/examples/context-schema-audit.pl +0 -46
  401. package/examples/continued-fraction-sqrt2.pl +0 -36
  402. package/examples/control-system.pl +0 -76
  403. package/examples/critical-path-schedule.pl +0 -82
  404. package/examples/cyclic-path.pl +0 -18
  405. package/examples/d3-group.pl +0 -99
  406. package/examples/dairy-energy-balance.pl +0 -66
  407. package/examples/data-negotiation.pl +0 -38
  408. package/examples/deep-taxonomy-10.pl +0 -115
  409. package/examples/deep-taxonomy-100.pl +0 -385
  410. package/examples/deep-taxonomy-1000.pl +0 -3085
  411. package/examples/deep-taxonomy-10000.pl +0 -30094
  412. package/examples/deep-taxonomy-100000.pl +0 -300184
  413. package/examples/delfour.pl +0 -281
  414. package/examples/deontic-logic.pl +0 -52
  415. package/examples/derived-backward-rule.pl +0 -30
  416. package/examples/derived-rule.pl +0 -27
  417. package/examples/diamond-property.pl +0 -38
  418. package/examples/dijkstra-findall-sort.pl +0 -43
  419. package/examples/dijkstra-risk-path.pl +0 -87
  420. package/examples/dijkstra.pl +0 -50
  421. package/examples/dining-philosophers.pl +0 -147
  422. package/examples/dog.pl +0 -25
  423. package/examples/dpv-odrl-purpose-mapping.pl +0 -48
  424. package/examples/drone-corridor-planner.pl +0 -48
  425. package/examples/easter-computus.pl +0 -88
  426. package/examples/electrical-rc-filter.pl +0 -37
  427. package/examples/epidemic-policy.pl +0 -66
  428. package/examples/equivalence-classes-overlap-implies-same-class.pl +0 -27
  429. package/examples/eulerian-path.pl +0 -87
  430. package/examples/ev-range-worlds.pl +0 -87
  431. package/examples/existential-rule.pl +0 -21
  432. package/examples/exoplanet-validation-worlds.pl +0 -94
  433. package/examples/expression-eval.pl +0 -45
  434. package/examples/family-cousins.pl +0 -67
  435. package/examples/fastpow.pl +0 -61
  436. package/examples/fft8-numeric.pl +0 -85
  437. package/examples/fibonacci.pl +0 -60
  438. package/examples/field-nitrogen-balance.pl +0 -73
  439. package/examples/flandor.pl +0 -296
  440. package/examples/floating-point.pl +0 -28
  441. package/examples/four-color-map.pl +0 -133
  442. package/examples/fundamental-theorem-arithmetic.pl +0 -119
  443. package/examples/gd-step-certified.pl +0 -162
  444. package/examples/gdpr-compliance.pl +0 -69
  445. package/examples/good-cobbler.pl +0 -16
  446. package/examples/gps.pl +0 -146
  447. package/examples/graph-reachability.pl +0 -33
  448. package/examples/graph.pl +0 -35
  449. package/examples/gray-code-counter.pl +0 -47
  450. package/examples/greatest-lower-bound-uniqueness.pl +0 -30
  451. package/examples/group-inverse-uniqueness.pl +0 -36
  452. package/examples/hamiltonian-path.pl +0 -51
  453. package/examples/hamming-code.pl +0 -109
  454. package/examples/hanoi.pl +0 -19
  455. package/examples/heat-loss.pl +0 -56
  456. package/examples/heron-theorem.pl +0 -42
  457. package/examples/ideal-gas-law.pl +0 -39
  458. package/examples/illegitimate-reasoning.pl +0 -88
  459. package/examples/integer-partitions.pl +0 -35
  460. package/examples/intuitionistic-logic-kripke.pl +0 -69
  461. package/examples/job-shop-scheduling.pl +0 -48
  462. package/examples/knapsack-optimization.pl +0 -46
  463. package/examples/knowledge-engineering-alignment-flow.pl +0 -46
  464. package/examples/law-of-cosines.pl +0 -37
  465. package/examples/least-squares-regression.pl +0 -85
  466. package/examples/linear-logic-resources.pl +0 -51
  467. package/examples/list-collection.pl +0 -35
  468. package/examples/lldm.pl +0 -80
  469. package/examples/manufacturing-quality-control.pl +0 -73
  470. package/examples/matrix-chain-order.pl +0 -79
  471. package/examples/microgrid-dispatch.pl +0 -89
  472. package/examples/missionaries-cannibals.pl +0 -53
  473. package/examples/modal-logic-kripke.pl +0 -45
  474. package/examples/modular-exponentiation.pl +0 -35
  475. package/examples/monkey-bananas.pl +0 -45
  476. package/examples/n-queens-8.pl +0 -35
  477. package/examples/network-sla.pl +0 -48
  478. package/examples/newton-raphson.pl +0 -48
  479. package/examples/nixon-diamond.pl +0 -37
  480. package/examples/observability-log-correlation.pl +0 -40
  481. package/examples/odrl-dpv-fpv-trust-flow.pl +0 -51
  482. package/examples/odrl-dpv-healthcare-risk-ranked.pl +0 -270
  483. package/examples/odrl-dpv-risk-ranked.pl +0 -320
  484. package/examples/orbital-transfer-design.pl +0 -116
  485. package/examples/path-discovery.pl +0 -45013
  486. package/examples/peano-arithmetic.pl +0 -33
  487. package/examples/peasant.pl +0 -29
  488. package/examples/pell-equation.pl +0 -34
  489. package/examples/pendulum-period.pl +0 -50
  490. package/examples/polynomial.pl +0 -124
  491. package/examples/proof/access-control-policy.pl +0 -158
  492. package/examples/proof/age.pl +0 -71
  493. package/examples/proof/aliases-and-namespaces.pl +0 -78
  494. package/examples/proof/ancestor.pl +0 -140
  495. package/examples/proof/animal.pl +0 -68
  496. package/examples/proof/annotation.pl +0 -80
  497. package/examples/proof/backward.pl +0 -22
  498. package/examples/proof/bayes-diagnosis.pl +0 -208
  499. package/examples/proof/beam-deflection.pl +0 -227
  500. package/examples/proof/cache-performance.pl +0 -310
  501. package/examples/proof/canary-release.pl +0 -172
  502. package/examples/proof/cat-koko.pl +0 -86
  503. package/examples/proof/chart-parser.pl +0 -474
  504. package/examples/proof/clinical-trial-screening.pl +0 -389
  505. package/examples/proof/composition-of-injective-functions-is-injective.pl +0 -258
  506. package/examples/proof/context-association.pl +0 -78
  507. package/examples/proof/data-negotiation.pl +0 -76
  508. package/examples/proof/deontic-logic.pl +0 -109
  509. package/examples/proof/derived-backward-rule.pl +0 -74
  510. package/examples/proof/derived-rule.pl +0 -43
  511. package/examples/proof/diamond-property.pl +0 -307
  512. package/examples/proof/dog.pl +0 -31
  513. package/examples/proof/dpv-odrl-purpose-mapping.pl +0 -348
  514. package/examples/proof/electrical-rc-filter.pl +0 -105
  515. package/examples/proof/epidemic-policy.pl +0 -774
  516. package/examples/proof/equivalence-classes-overlap-implies-same-class.pl +0 -1098
  517. package/examples/proof/existential-rule.pl +0 -40
  518. package/examples/proof/expression-eval.pl +0 -105
  519. package/examples/proof/floating-point.pl +0 -160
  520. package/examples/proof/gdpr-compliance.pl +0 -199
  521. package/examples/proof/good-cobbler.pl +0 -16
  522. package/examples/proof/graph-reachability.pl +0 -151
  523. package/examples/proof/greatest-lower-bound-uniqueness.pl +0 -150
  524. package/examples/proof/group-inverse-uniqueness.pl +0 -84
  525. package/examples/proof/hanoi.pl +0 -185
  526. package/examples/proof/heat-loss.pl +0 -228
  527. package/examples/proof/ideal-gas-law.pl +0 -151
  528. package/examples/proof/intuitionistic-logic-kripke.pl +0 -133
  529. package/examples/proof/linear-logic-resources.pl +0 -205
  530. package/examples/proof/list-collection.pl +0 -52
  531. package/examples/proof/modal-logic-kripke.pl +0 -125
  532. package/examples/proof/nixon-diamond.pl +0 -181
  533. package/examples/proof/proof-contrapositive.pl +0 -78
  534. package/examples/proof/reusable-builtins.pl +0 -124
  535. package/examples/proof/security-incident-correlation.pl +0 -270
  536. package/examples/proof/socket-age.pl +0 -32
  537. package/examples/proof/socket-family.pl +0 -59
  538. package/examples/proof/socrates.pl +0 -38
  539. package/examples/proof/term-tools.pl +0 -95
  540. package/examples/proof/witch.pl +0 -216
  541. package/examples/proof-contrapositive.pl +0 -27
  542. package/examples/quadratic-formula.pl +0 -56
  543. package/examples/radioactive-decay.pl +0 -58
  544. package/examples/reusable-builtins.pl +0 -36
  545. package/examples/riemann-hypothesis.pl +0 -110
  546. package/examples/security-incident-correlation.pl +0 -69
  547. package/examples/send-more-money.pl +0 -71
  548. package/examples/service-impact.pl +0 -41
  549. package/examples/sieve.pl +0 -20
  550. package/examples/skolem-functions.pl +0 -52
  551. package/examples/socket-age.pl +0 -39
  552. package/examples/socket-family.pl +0 -28
  553. package/examples/socrates.pl +0 -19
  554. package/examples/stable-marriage.pl +0 -92
  555. package/examples/statistics-summary.pl +0 -56
  556. package/examples/stirling-bell-numbers.pl +0 -32
  557. package/examples/sudoku-4x4.pl +0 -54
  558. package/examples/superdense-coding.pl +0 -84
  559. package/examples/term-tools.pl +0 -32
  560. package/examples/totient-summatory.pl +0 -33
  561. package/examples/trust-flow-provenance-threshold.pl +0 -47
  562. package/examples/turing.pl +0 -69
  563. package/examples/vector-similarity.pl +0 -60
  564. package/examples/vulnerability-impact.pl +0 -69
  565. package/examples/web-names.pl +0 -83
  566. package/examples/weighted-interval-scheduling.pl +0 -81
  567. package/examples/witch.pl +0 -38
  568. package/examples/wolf-goat-cabbage.pl +0 -56
  569. package/examples/zebra.pl +0 -45
  570. package/test/conformance/cases/001_fact_output.pl +0 -4
  571. package/test/conformance/cases/002_rule_recursion.pl +0 -7
  572. package/test/conformance/cases/003_terms_and_readback.pl +0 -16
  573. package/test/conformance/cases/004_conjunction_and_parentheses.pl +0 -5
  574. package/test/conformance/cases/005_list_deconstruction.pl +0 -6
  575. package/test/conformance/cases/006_comma_formula_data.pl +0 -4
  576. package/test/conformance/cases/007_anonymous_variables.pl +0 -5
  577. package/test/conformance/cases/008_graphic_atoms.pl +0 -6
  578. package/test/conformance/cases/009_comments_and_whitespace.pl +0 -5
  579. package/test/conformance/cases/010_variable_scope_and_reuse.pl +0 -8
  580. package/test/conformance/cases/011_predicate_arity.pl +0 -6
  581. package/test/conformance/cases/012_nested_compound_unification.pl +0 -5
  582. package/test/conformance/cases/013_multiple_clauses_order.pl +0 -6
  583. package/test/conformance/cases/014_failure_filters_answers.pl +0 -7
  584. package/test/conformance/cases/015_improper_list_unification.pl +0 -6
  585. package/test/conformance/cases/016_arity_zero_atom.pl +0 -4
  586. package/test/conformance/cases/017_three_step_recursion.pl +0 -8
  587. package/test/conformance/cases/018_quoted_atom_readback.pl +0 -6
  588. package/test/conformance/cases/019_parenthesized_three_conjuncts.pl +0 -7
  589. package/test/conformance/cases/020_nested_list_terms.pl +0 -5
  590. package/test/conformance/cases/021_repeated_variable_head.pl +0 -7
  591. package/test/conformance/cases/022_rule_head_structure.pl +0 -5
  592. package/test/conformance/cases/023_quoted_escapes_readback.pl +0 -5
  593. package/test/conformance/cases/024_numeric_literal_readback.pl +0 -6
  594. package/test/conformance/cases/025_body_parentheses_with_formula_data.pl +0 -5
  595. package/test/conformance/cases/026_underscore_named_variable_reuse.pl +0 -5
  596. package/test/conformance/cases/027_default_derived_output.pl +0 -5
  597. package/test/conformance/cases/028_materialize_focus.pl +0 -5
  598. package/test/conformance/cases/029_arithmetic_and_comparison.pl +0 -11
  599. package/test/conformance/cases/030_strings_and_atoms.pl +0 -4
  600. package/test/conformance/cases/031_lists_aggregation_ordering.pl +0 -10
  601. package/test/conformance/cases/032_holds_parts.pl +0 -4
  602. package/test/conformance/cases/033_negation_once_generators.pl +0 -7
  603. package/test/conformance/cases/034_equality_and_inequality.pl +0 -6
  604. package/test/conformance/cases/035_list_relations.pl +0 -5
  605. package/test/conformance/cases/036_append_splits.pl +0 -3
  606. package/test/conformance/cases/038_memoize_declaration.pl +0 -8
  607. package/test/conformance/cases/038_memoize_declaration.query +0 -1
  608. package/test/conformance/cases/039_numeric_functions.pl +0 -9
  609. package/test/conformance/cases/040_between_enumeration.pl +0 -3
  610. package/test/conformance/cases/041_smallest_divisor.pl +0 -3
  611. package/test/conformance/cases/042_negation_filter.pl +0 -7
  612. package/test/conformance/cases/043_once_user_predicate.pl +0 -5
  613. package/test/conformance/cases/044_findall_user_goal.pl +0 -6
  614. package/test/conformance/cases/045_sort_deduplicates_atoms.pl +0 -3
  615. package/test/conformance/cases/046_append_bound_prefix_suffix.pl +0 -4
  616. package/test/conformance/cases/047_nth0_index_generation.pl +0 -3
  617. package/test/conformance/cases/048_set_nth0_edges.pl +0 -4
  618. package/test/conformance/cases/049_select_duplicate_occurrences.pl +0 -3
  619. package/test/conformance/cases/050_not_member_filter.pl +0 -6
  620. package/test/conformance/cases/051_nested_holds_parts.pl +0 -4
  621. package/test/conformance/cases/052_holds_member.pl +0 -3
  622. package/test/conformance/cases/053_materialize_excludes_source_fact.pl +0 -6
  623. package/test/conformance/cases/055_string_matching_filters.pl +0 -6
  624. package/test/conformance/cases/056_string_and_atom_concat.pl +0 -3
  625. package/test/conformance/cases/057_countall_empty_and_nonempty.pl +0 -4
  626. package/test/conformance/cases/058_sumall_numeric_template.pl +0 -5
  627. package/test/conformance/cases/059_aggregate_min_template.pl +0 -5
  628. package/test/conformance/cases/060_aggregate_max_compound_key.pl +0 -5
  629. package/test/conformance/cases/061_date_difference.pl +0 -4
  630. package/test/conformance/cases/062_reusable_numeric_builtins.pl +0 -10
  631. package/test/conformance/cases/063_reusable_list_builtins.pl +0 -11
  632. package/test/conformance/cases/064_reusable_string_builtins.pl +0 -12
  633. package/test/conformance/cases/065_reusable_term_control_builtins.pl +0 -11
  634. package/test/conformance/cases/066_numeric_edges.pl +0 -14
  635. package/test/conformance/cases/067_list_edges.pl +0 -10
  636. package/test/conformance/cases/068_list_generation_order.pl +0 -7
  637. package/test/conformance/cases/069_list_summaries_and_sets.pl +0 -9
  638. package/test/conformance/cases/070_matches_named_captures.pl +0 -13
  639. package/test/conformance/cases/071_string_edges.pl +0 -10
  640. package/test/conformance/cases/072_string_conversions.pl +0 -10
  641. package/test/conformance/cases/073_term_introspection_edges.pl +0 -10
  642. package/test/conformance/cases/074_forall_edges.pl +0 -10
  643. package/test/conformance/cases/075_aggregation_edges.pl +0 -12
  644. package/test/conformance/cases/076_composed_reusable_builtins.pl +0 -8
  645. package/test/conformance/cases/077_recursive_path_with_lists.pl +0 -10
  646. package/test/conformance/cases/078_mutual_recursion_with_arithmetic.pl +0 -7
  647. package/test/conformance/cases/079_big_integer_arithmetic.pl +0 -8
  648. package/test/conformance/cases/080_rounding_modes.pl +0 -10
  649. package/test/conformance/cases/081_zero_safe_numeric_functions.pl +0 -9
  650. package/test/conformance/cases/083_between_modes_and_empty_ranges.pl +0 -8
  651. package/test/conformance/cases/084_append_and_select_composition.pl +0 -7
  652. package/test/conformance/cases/085_nth_and_update_edges.pl +0 -8
  653. package/test/conformance/cases/086_slicing_pipeline.pl +0 -10
  654. package/test/conformance/cases/087_sort_reverse_length.pl +0 -8
  655. package/test/conformance/cases/088_list_summaries_failures.pl +0 -8
  656. package/test/conformance/cases/089_string_split_join_pipeline.pl +0 -7
  657. package/test/conformance/cases/090_string_substring_replace_edges.pl +0 -9
  658. package/test/conformance/cases/091_string_case_and_trim.pl +0 -7
  659. package/test/conformance/cases/092_scalar_string_conversions.pl +0 -9
  660. package/test/conformance/cases/093_regex_named_captures_context.pl +0 -8
  661. package/test/conformance/cases/094_context_holds_enumeration.pl +0 -7
  662. package/test/conformance/cases/095_term_introspection_roundtrip.pl +0 -8
  663. package/test/conformance/cases/096_functor_scalar_edges.pl +0 -8
  664. package/test/conformance/cases/097_control_negation_once_forall.pl +0 -13
  665. package/test/conformance/cases/098_aggregation_nested_templates.pl +0 -11
  666. package/test/conformance/cases/099_materialize_multiple_arities.pl +0 -8
  667. package/test/conformance/cases/100_reusable_builtin_workflow.pl +0 -10
  668. /package/examples/output/{access-control-policy.pl → access-control-policy.eye} +0 -0
  669. /package/examples/output/{ackermann.pl → ackermann.eye} +0 -0
  670. /package/examples/output/{age.pl → age.eye} +0 -0
  671. /package/examples/output/{aliases-and-namespaces.pl → aliases-and-namespaces.eye} +0 -0
  672. /package/examples/output/{alignment-demo.pl → alignment-demo.eye} +0 -0
  673. /package/examples/output/{allen-interval-calculus.pl → allen-interval-calculus.eye} +0 -0
  674. /package/examples/output/{ancestor.pl → ancestor.eye} +0 -0
  675. /package/examples/output/{animal.pl → animal.eye} +0 -0
  676. /package/examples/output/{annotation.pl → annotation.eye} +0 -0
  677. /package/examples/output/{auroracare.pl → auroracare.eye} +0 -0
  678. /package/examples/output/{backward.pl → backward.eye} +0 -0
  679. /package/examples/output/{basic-monadic.pl → basic-monadic.eye} +0 -0
  680. /package/examples/output/{bayes-diagnosis.pl → bayes-diagnosis.eye} +0 -0
  681. /package/examples/output/{bayes-therapy.pl → bayes-therapy.eye} +0 -0
  682. /package/examples/output/{beam-deflection.pl → beam-deflection.eye} +0 -0
  683. /package/examples/output/{binomial-vandermonde.pl → binomial-vandermonde.eye} +0 -0
  684. /package/examples/output/{blocks-world-planning.pl → blocks-world-planning.eye} +0 -0
  685. /package/examples/output/{bmi.pl → bmi.eye} +0 -0
  686. /package/examples/output/{braking-safety-worlds.pl → braking-safety-worlds.eye} +0 -0
  687. /package/examples/output/{buck-converter-design.pl → buck-converter-design.eye} +0 -0
  688. /package/examples/output/{cache-performance.pl → cache-performance.eye} +0 -0
  689. /package/examples/output/{canary-release.pl → canary-release.eye} +0 -0
  690. /package/examples/output/{cat-koko.pl → cat-koko.eye} +0 -0
  691. /package/examples/output/{catalan-convolution.pl → catalan-convolution.eye} +0 -0
  692. /package/examples/output/{chart-parser.pl → chart-parser.eye} +0 -0
  693. /package/examples/output/{clinical-trial-screening.pl → clinical-trial-screening.eye} +0 -0
  694. /package/examples/output/{collatz-1000.pl → collatz-1000.eye} +0 -0
  695. /package/examples/output/{combinatorics-findall-sort.pl → combinatorics-findall-sort.eye} +0 -0
  696. /package/examples/output/{competitive-enzyme-kinetics.pl → competitive-enzyme-kinetics.eye} +0 -0
  697. /package/examples/output/{complex.pl → complex.eye} +0 -0
  698. /package/examples/output/{composition-of-injective-functions-is-injective.pl → composition-of-injective-functions-is-injective.eye} +0 -0
  699. /package/examples/output/{context-association.pl → context-association.eye} +0 -0
  700. /package/examples/output/{context-schema-audit.pl → context-schema-audit.eye} +0 -0
  701. /package/examples/output/{continued-fraction-sqrt2.pl → continued-fraction-sqrt2.eye} +0 -0
  702. /package/examples/output/{control-system.pl → control-system.eye} +0 -0
  703. /package/examples/output/{critical-path-schedule.pl → critical-path-schedule.eye} +0 -0
  704. /package/examples/output/{cyclic-path.pl → cyclic-path.eye} +0 -0
  705. /package/examples/output/{d3-group.pl → d3-group.eye} +0 -0
  706. /package/examples/output/{dairy-energy-balance.pl → dairy-energy-balance.eye} +0 -0
  707. /package/examples/output/{data-negotiation.pl → data-negotiation.eye} +0 -0
  708. /package/examples/output/{deep-taxonomy-10.pl → deep-taxonomy-10.eye} +0 -0
  709. /package/examples/output/{deep-taxonomy-100.pl → deep-taxonomy-100.eye} +0 -0
  710. /package/examples/output/{deep-taxonomy-1000.pl → deep-taxonomy-1000.eye} +0 -0
  711. /package/examples/output/{deep-taxonomy-10000.pl → deep-taxonomy-10000.eye} +0 -0
  712. /package/examples/output/{deep-taxonomy-100000.pl → deep-taxonomy-100000.eye} +0 -0
  713. /package/examples/output/{delfour.pl → delfour.eye} +0 -0
  714. /package/examples/output/{deontic-logic.pl → deontic-logic.eye} +0 -0
  715. /package/examples/output/{derived-backward-rule.pl → derived-backward-rule.eye} +0 -0
  716. /package/examples/output/{derived-rule.pl → derived-rule.eye} +0 -0
  717. /package/examples/output/{diamond-property.pl → diamond-property.eye} +0 -0
  718. /package/examples/output/{dijkstra-findall-sort.pl → dijkstra-findall-sort.eye} +0 -0
  719. /package/examples/output/{dijkstra-risk-path.pl → dijkstra-risk-path.eye} +0 -0
  720. /package/examples/output/{dijkstra.pl → dijkstra.eye} +0 -0
  721. /package/examples/output/{dining-philosophers.pl → dining-philosophers.eye} +0 -0
  722. /package/examples/output/{dog.pl → dog.eye} +0 -0
  723. /package/examples/output/{dpv-odrl-purpose-mapping.pl → dpv-odrl-purpose-mapping.eye} +0 -0
  724. /package/examples/output/{drone-corridor-planner.pl → drone-corridor-planner.eye} +0 -0
  725. /package/examples/output/{easter-computus.pl → easter-computus.eye} +0 -0
  726. /package/examples/output/{electrical-rc-filter.pl → electrical-rc-filter.eye} +0 -0
  727. /package/examples/output/{epidemic-policy.pl → epidemic-policy.eye} +0 -0
  728. /package/examples/output/{equivalence-classes-overlap-implies-same-class.pl → equivalence-classes-overlap-implies-same-class.eye} +0 -0
  729. /package/examples/output/{eulerian-path.pl → eulerian-path.eye} +0 -0
  730. /package/examples/output/{ev-range-worlds.pl → ev-range-worlds.eye} +0 -0
  731. /package/examples/output/{existential-rule.pl → existential-rule.eye} +0 -0
  732. /package/examples/output/{exoplanet-validation-worlds.pl → exoplanet-validation-worlds.eye} +0 -0
  733. /package/examples/output/{expression-eval.pl → expression-eval.eye} +0 -0
  734. /package/examples/output/{family-cousins.pl → family-cousins.eye} +0 -0
  735. /package/examples/output/{fastpow.pl → fastpow.eye} +0 -0
  736. /package/examples/output/{fft8-numeric.pl → fft8-numeric.eye} +0 -0
  737. /package/examples/output/{fibonacci.pl → fibonacci.eye} +0 -0
  738. /package/examples/output/{field-nitrogen-balance.pl → field-nitrogen-balance.eye} +0 -0
  739. /package/examples/output/{flandor.pl → flandor.eye} +0 -0
  740. /package/examples/output/{floating-point.pl → floating-point.eye} +0 -0
  741. /package/examples/output/{four-color-map.pl → four-color-map.eye} +0 -0
  742. /package/examples/output/{fundamental-theorem-arithmetic.pl → fundamental-theorem-arithmetic.eye} +0 -0
  743. /package/examples/output/{gd-step-certified.pl → gd-step-certified.eye} +0 -0
  744. /package/examples/output/{gdpr-compliance.pl → gdpr-compliance.eye} +0 -0
  745. /package/examples/output/{good-cobbler.pl → good-cobbler.eye} +0 -0
  746. /package/examples/output/{gps.pl → gps.eye} +0 -0
  747. /package/examples/output/{graph-reachability.pl → graph-reachability.eye} +0 -0
  748. /package/examples/output/{graph.pl → graph.eye} +0 -0
  749. /package/examples/output/{gray-code-counter.pl → gray-code-counter.eye} +0 -0
  750. /package/examples/output/{greatest-lower-bound-uniqueness.pl → greatest-lower-bound-uniqueness.eye} +0 -0
  751. /package/examples/output/{group-inverse-uniqueness.pl → group-inverse-uniqueness.eye} +0 -0
  752. /package/examples/output/{hamiltonian-path.pl → hamiltonian-path.eye} +0 -0
  753. /package/examples/output/{hamming-code.pl → hamming-code.eye} +0 -0
  754. /package/examples/output/{hanoi.pl → hanoi.eye} +0 -0
  755. /package/examples/output/{heat-loss.pl → heat-loss.eye} +0 -0
  756. /package/examples/output/{heron-theorem.pl → heron-theorem.eye} +0 -0
  757. /package/examples/output/{ideal-gas-law.pl → ideal-gas-law.eye} +0 -0
  758. /package/examples/output/{illegitimate-reasoning.pl → illegitimate-reasoning.eye} +0 -0
  759. /package/examples/output/{integer-partitions.pl → integer-partitions.eye} +0 -0
  760. /package/examples/output/{intuitionistic-logic-kripke.pl → intuitionistic-logic-kripke.eye} +0 -0
  761. /package/examples/output/{job-shop-scheduling.pl → job-shop-scheduling.eye} +0 -0
  762. /package/examples/output/{knapsack-optimization.pl → knapsack-optimization.eye} +0 -0
  763. /package/examples/output/{knowledge-engineering-alignment-flow.pl → knowledge-engineering-alignment-flow.eye} +0 -0
  764. /package/examples/output/{law-of-cosines.pl → law-of-cosines.eye} +0 -0
  765. /package/examples/output/{least-squares-regression.pl → least-squares-regression.eye} +0 -0
  766. /package/examples/output/{linear-logic-resources.pl → linear-logic-resources.eye} +0 -0
  767. /package/examples/output/{list-collection.pl → list-collection.eye} +0 -0
  768. /package/examples/output/{lldm.pl → lldm.eye} +0 -0
  769. /package/examples/output/{manufacturing-quality-control.pl → manufacturing-quality-control.eye} +0 -0
  770. /package/examples/output/{matrix-chain-order.pl → matrix-chain-order.eye} +0 -0
  771. /package/examples/output/{microgrid-dispatch.pl → microgrid-dispatch.eye} +0 -0
  772. /package/examples/output/{missionaries-cannibals.pl → missionaries-cannibals.eye} +0 -0
  773. /package/examples/output/{modal-logic-kripke.pl → modal-logic-kripke.eye} +0 -0
  774. /package/examples/output/{modular-exponentiation.pl → modular-exponentiation.eye} +0 -0
  775. /package/examples/output/{monkey-bananas.pl → monkey-bananas.eye} +0 -0
  776. /package/examples/output/{n-queens-8.pl → n-queens-8.eye} +0 -0
  777. /package/examples/output/{network-sla.pl → network-sla.eye} +0 -0
  778. /package/examples/output/{newton-raphson.pl → newton-raphson.eye} +0 -0
  779. /package/examples/output/{nixon-diamond.pl → nixon-diamond.eye} +0 -0
  780. /package/examples/output/{observability-log-correlation.pl → observability-log-correlation.eye} +0 -0
  781. /package/examples/output/{odrl-dpv-fpv-trust-flow.pl → odrl-dpv-fpv-trust-flow.eye} +0 -0
  782. /package/examples/output/{odrl-dpv-healthcare-risk-ranked.pl → odrl-dpv-healthcare-risk-ranked.eye} +0 -0
  783. /package/examples/output/{odrl-dpv-risk-ranked.pl → odrl-dpv-risk-ranked.eye} +0 -0
  784. /package/examples/output/{orbital-transfer-design.pl → orbital-transfer-design.eye} +0 -0
  785. /package/examples/output/{path-discovery.pl → path-discovery.eye} +0 -0
  786. /package/examples/output/{peano-arithmetic.pl → peano-arithmetic.eye} +0 -0
  787. /package/examples/output/{peasant.pl → peasant.eye} +0 -0
  788. /package/examples/output/{pell-equation.pl → pell-equation.eye} +0 -0
  789. /package/examples/output/{pendulum-period.pl → pendulum-period.eye} +0 -0
  790. /package/examples/output/{polynomial.pl → polynomial.eye} +0 -0
  791. /package/examples/output/{proof-contrapositive.pl → proof-contrapositive.eye} +0 -0
  792. /package/examples/output/{quadratic-formula.pl → quadratic-formula.eye} +0 -0
  793. /package/examples/output/{radioactive-decay.pl → radioactive-decay.eye} +0 -0
  794. /package/examples/output/{reusable-builtins.pl → reusable-builtins.eye} +0 -0
  795. /package/examples/output/{riemann-hypothesis.pl → riemann-hypothesis.eye} +0 -0
  796. /package/examples/output/{security-incident-correlation.pl → security-incident-correlation.eye} +0 -0
  797. /package/examples/output/{send-more-money.pl → send-more-money.eye} +0 -0
  798. /package/examples/output/{service-impact.pl → service-impact.eye} +0 -0
  799. /package/examples/output/{sieve.pl → sieve.eye} +0 -0
  800. /package/examples/output/{skolem-functions.pl → skolem-functions.eye} +0 -0
  801. /package/examples/output/{socket-age.pl → socket-age.eye} +0 -0
  802. /package/examples/output/{socket-family.pl → socket-family.eye} +0 -0
  803. /package/examples/output/{socrates.pl → socrates.eye} +0 -0
  804. /package/examples/output/{stable-marriage.pl → stable-marriage.eye} +0 -0
  805. /package/examples/output/{statistics-summary.pl → statistics-summary.eye} +0 -0
  806. /package/examples/output/{stirling-bell-numbers.pl → stirling-bell-numbers.eye} +0 -0
  807. /package/examples/output/{sudoku-4x4.pl → sudoku-4x4.eye} +0 -0
  808. /package/examples/output/{superdense-coding.pl → superdense-coding.eye} +0 -0
  809. /package/examples/output/{term-tools.pl → term-tools.eye} +0 -0
  810. /package/examples/output/{totient-summatory.pl → totient-summatory.eye} +0 -0
  811. /package/examples/output/{trust-flow-provenance-threshold.pl → trust-flow-provenance-threshold.eye} +0 -0
  812. /package/examples/output/{turing.pl → turing.eye} +0 -0
  813. /package/examples/output/{vector-similarity.pl → vector-similarity.eye} +0 -0
  814. /package/examples/output/{vulnerability-impact.pl → vulnerability-impact.eye} +0 -0
  815. /package/examples/output/{web-names.pl → web-names.eye} +0 -0
  816. /package/examples/output/{weighted-interval-scheduling.pl → weighted-interval-scheduling.eye} +0 -0
  817. /package/examples/output/{witch.pl → witch.eye} +0 -0
  818. /package/examples/output/{wolf-goat-cabbage.pl → wolf-goat-cabbage.eye} +0 -0
  819. /package/examples/output/{zebra.pl → zebra.eye} +0 -0
  820. /package/test/conformance/cases/{037_matching_and_comparison.pl → 037_matching_and_comparison.eye} +0 -0
  821. /package/test/conformance/cases/{054_numeric_and_lexical_comparison.pl → 054_numeric_and_lexical_comparison.eye} +0 -0
  822. /package/test/conformance/cases/{082_comparison_semantics.pl → 082_comparison_semantics.eye} +0 -0
  823. /package/test/conformance/expected/{001_fact_output.pl → 001_fact_output.eye} +0 -0
  824. /package/test/conformance/expected/{002_rule_recursion.pl → 002_rule_recursion.eye} +0 -0
  825. /package/test/conformance/expected/{003_terms_and_readback.pl → 003_terms_and_readback.eye} +0 -0
  826. /package/test/conformance/expected/{004_conjunction_and_parentheses.pl → 004_conjunction_and_parentheses.eye} +0 -0
  827. /package/test/conformance/expected/{005_list_deconstruction.pl → 005_list_deconstruction.eye} +0 -0
  828. /package/test/conformance/expected/{006_comma_formula_data.pl → 006_comma_formula_data.eye} +0 -0
  829. /package/test/conformance/expected/{007_anonymous_variables.pl → 007_anonymous_variables.eye} +0 -0
  830. /package/test/conformance/expected/{008_graphic_atoms.pl → 008_graphic_atoms.eye} +0 -0
  831. /package/test/conformance/expected/{009_comments_and_whitespace.pl → 009_comments_and_whitespace.eye} +0 -0
  832. /package/test/conformance/expected/{010_variable_scope_and_reuse.pl → 010_variable_scope_and_reuse.eye} +0 -0
  833. /package/test/conformance/expected/{011_predicate_arity.pl → 011_predicate_arity.eye} +0 -0
  834. /package/test/conformance/expected/{012_nested_compound_unification.pl → 012_nested_compound_unification.eye} +0 -0
  835. /package/test/conformance/expected/{013_multiple_clauses_order.pl → 013_multiple_clauses_order.eye} +0 -0
  836. /package/test/conformance/expected/{014_failure_filters_answers.pl → 014_failure_filters_answers.eye} +0 -0
  837. /package/test/conformance/expected/{015_improper_list_unification.pl → 015_improper_list_unification.eye} +0 -0
  838. /package/test/conformance/expected/{016_arity_zero_atom.pl → 016_arity_zero_atom.eye} +0 -0
  839. /package/test/conformance/expected/{017_three_step_recursion.pl → 017_three_step_recursion.eye} +0 -0
  840. /package/test/conformance/expected/{018_quoted_atom_readback.pl → 018_quoted_atom_readback.eye} +0 -0
  841. /package/test/conformance/expected/{019_parenthesized_three_conjuncts.pl → 019_parenthesized_three_conjuncts.eye} +0 -0
  842. /package/test/conformance/expected/{020_nested_list_terms.pl → 020_nested_list_terms.eye} +0 -0
  843. /package/test/conformance/expected/{021_repeated_variable_head.pl → 021_repeated_variable_head.eye} +0 -0
  844. /package/test/conformance/expected/{022_rule_head_structure.pl → 022_rule_head_structure.eye} +0 -0
  845. /package/test/conformance/expected/{023_quoted_escapes_readback.pl → 023_quoted_escapes_readback.eye} +0 -0
  846. /package/test/conformance/expected/{024_numeric_literal_readback.pl → 024_numeric_literal_readback.eye} +0 -0
  847. /package/test/conformance/expected/{025_body_parentheses_with_formula_data.pl → 025_body_parentheses_with_formula_data.eye} +0 -0
  848. /package/test/conformance/expected/{026_underscore_named_variable_reuse.pl → 026_question_underscore_named_variable_reuse.eye} +0 -0
  849. /package/test/conformance/expected/{027_default_derived_output.pl → 027_default_derived_output.eye} +0 -0
  850. /package/test/conformance/expected/{028_materialize_focus.pl → 028_materialize_focus.eye} +0 -0
  851. /package/test/conformance/expected/{029_arithmetic_and_comparison.pl → 029_arithmetic_and_comparison.eye} +0 -0
  852. /package/test/conformance/expected/{030_strings_and_atoms.pl → 030_strings_and_atoms.eye} +0 -0
  853. /package/test/conformance/expected/{031_lists_aggregation_ordering.pl → 031_lists_aggregation_ordering.eye} +0 -0
  854. /package/test/conformance/expected/{032_holds_parts.pl → 032_holds_parts.eye} +0 -0
  855. /package/test/conformance/expected/{033_negation_once_generators.pl → 033_negation_once_generators.eye} +0 -0
  856. /package/test/conformance/expected/{034_equality_and_inequality.pl → 034_equality_and_inequality.eye} +0 -0
  857. /package/test/conformance/expected/{035_list_relations.pl → 035_list_relations.eye} +0 -0
  858. /package/test/conformance/expected/{036_append_splits.pl → 036_append_splits.eye} +0 -0
  859. /package/test/conformance/expected/{037_matching_and_comparison.pl → 037_matching_and_comparison.eye} +0 -0
  860. /package/test/conformance/expected/{038_memoize_declaration.pl → 038_table_declaration.eye} +0 -0
  861. /package/test/conformance/expected/{039_numeric_functions.pl → 039_numeric_functions.eye} +0 -0
  862. /package/test/conformance/expected/{040_between_enumeration.pl → 040_between_enumeration.eye} +0 -0
  863. /package/test/conformance/expected/{041_smallest_divisor.pl → 041_smallest_divisor.eye} +0 -0
  864. /package/test/conformance/expected/{042_negation_filter.pl → 042_negation_filter.eye} +0 -0
  865. /package/test/conformance/expected/{043_once_user_predicate.pl → 043_once_user_predicate.eye} +0 -0
  866. /package/test/conformance/expected/{044_findall_user_goal.pl → 044_findall_user_goal.eye} +0 -0
  867. /package/test/conformance/expected/{045_sort_deduplicates_atoms.pl → 045_sort_deduplicates_atoms.eye} +0 -0
  868. /package/test/conformance/expected/{046_append_bound_prefix_suffix.pl → 046_append_bound_prefix_suffix.eye} +0 -0
  869. /package/test/conformance/expected/{047_nth0_index_generation.pl → 047_nth0_index_generation.eye} +0 -0
  870. /package/test/conformance/expected/{048_set_nth0_edges.pl → 048_set_nth0_edges.eye} +0 -0
  871. /package/test/conformance/expected/{049_select_duplicate_occurrences.pl → 049_select_duplicate_occurrences.eye} +0 -0
  872. /package/test/conformance/expected/{050_not_member_filter.pl → 050_not_member_filter.eye} +0 -0
  873. /package/test/conformance/expected/{051_nested_holds_parts.pl → 051_nested_holds_parts.eye} +0 -0
  874. /package/test/conformance/expected/{052_holds_member.pl → 052_holds_member.eye} +0 -0
  875. /package/test/conformance/expected/{053_materialize_excludes_source_fact.pl → 053_materialize_excludes_source_fact.eye} +0 -0
  876. /package/test/conformance/expected/{054_numeric_and_lexical_comparison.pl → 054_numeric_and_lexical_comparison.eye} +0 -0
  877. /package/test/conformance/expected/{055_string_matching_filters.pl → 055_string_matching_filters.eye} +0 -0
  878. /package/test/conformance/expected/{056_string_and_atom_concat.pl → 056_string_and_atom_concat.eye} +0 -0
  879. /package/test/conformance/expected/{057_countall_empty_and_nonempty.pl → 057_countall_empty_and_nonempty.eye} +0 -0
  880. /package/test/conformance/expected/{058_sumall_numeric_template.pl → 058_sumall_numeric_template.eye} +0 -0
  881. /package/test/conformance/expected/{059_aggregate_min_template.pl → 059_aggregate_min_template.eye} +0 -0
  882. /package/test/conformance/expected/{060_aggregate_max_compound_key.pl → 060_aggregate_max_compound_key.eye} +0 -0
  883. /package/test/conformance/expected/{061_date_difference.pl → 061_date_difference.eye} +0 -0
  884. /package/test/conformance/expected/{062_reusable_numeric_builtins.pl → 062_reusable_numeric_builtins.eye} +0 -0
  885. /package/test/conformance/expected/{063_reusable_list_builtins.pl → 063_reusable_list_builtins.eye} +0 -0
  886. /package/test/conformance/expected/{064_reusable_string_builtins.pl → 064_reusable_string_builtins.eye} +0 -0
  887. /package/test/conformance/expected/{065_reusable_term_control_builtins.pl → 065_reusable_term_control_builtins.eye} +0 -0
  888. /package/test/conformance/expected/{066_numeric_edges.pl → 066_numeric_edges.eye} +0 -0
  889. /package/test/conformance/expected/{067_list_edges.pl → 067_list_edges.eye} +0 -0
  890. /package/test/conformance/expected/{068_list_generation_order.pl → 068_list_generation_order.eye} +0 -0
  891. /package/test/conformance/expected/{069_list_summaries_and_sets.pl → 069_list_summaries_and_sets.eye} +0 -0
  892. /package/test/conformance/expected/{070_matches_named_captures.pl → 070_matches_named_captures.eye} +0 -0
  893. /package/test/conformance/expected/{071_string_edges.pl → 071_string_edges.eye} +0 -0
  894. /package/test/conformance/expected/{072_string_conversions.pl → 072_string_conversions.eye} +0 -0
  895. /package/test/conformance/expected/{073_term_introspection_edges.pl → 073_term_introspection_edges.eye} +0 -0
  896. /package/test/conformance/expected/{074_forall_edges.pl → 074_forall_edges.eye} +0 -0
  897. /package/test/conformance/expected/{075_aggregation_edges.pl → 075_aggregation_edges.eye} +0 -0
  898. /package/test/conformance/expected/{076_composed_reusable_builtins.pl → 076_composed_reusable_builtins.eye} +0 -0
  899. /package/test/conformance/expected/{077_recursive_path_with_lists.pl → 077_recursive_path_with_lists.eye} +0 -0
  900. /package/test/conformance/expected/{078_mutual_recursion_with_arithmetic.pl → 078_mutual_recursion_with_arithmetic.eye} +0 -0
  901. /package/test/conformance/expected/{079_big_integer_arithmetic.pl → 079_big_integer_arithmetic.eye} +0 -0
  902. /package/test/conformance/expected/{080_rounding_modes.pl → 080_rounding_modes.eye} +0 -0
  903. /package/test/conformance/expected/{081_zero_safe_numeric_functions.pl → 081_zero_safe_numeric_functions.eye} +0 -0
  904. /package/test/conformance/expected/{082_comparison_semantics.pl → 082_comparison_semantics.eye} +0 -0
  905. /package/test/conformance/expected/{083_between_modes_and_empty_ranges.pl → 083_between_modes_and_empty_ranges.eye} +0 -0
  906. /package/test/conformance/expected/{084_append_and_select_composition.pl → 084_append_and_select_composition.eye} +0 -0
  907. /package/test/conformance/expected/{085_nth_and_update_edges.pl → 085_nth_and_update_edges.eye} +0 -0
  908. /package/test/conformance/expected/{086_slicing_pipeline.pl → 086_slicing_pipeline.eye} +0 -0
  909. /package/test/conformance/expected/{087_sort_reverse_length.pl → 087_sort_reverse_length.eye} +0 -0
  910. /package/test/conformance/expected/{088_list_summaries_failures.pl → 088_list_summaries_failures.eye} +0 -0
  911. /package/test/conformance/expected/{089_string_split_join_pipeline.pl → 089_string_split_join_pipeline.eye} +0 -0
  912. /package/test/conformance/expected/{090_string_substring_replace_edges.pl → 090_string_substring_replace_edges.eye} +0 -0
  913. /package/test/conformance/expected/{091_string_case_and_trim.pl → 091_string_case_and_trim.eye} +0 -0
  914. /package/test/conformance/expected/{092_scalar_string_conversions.pl → 092_scalar_string_conversions.eye} +0 -0
  915. /package/test/conformance/expected/{093_regex_named_captures_context.pl → 093_regex_named_captures_context.eye} +0 -0
  916. /package/test/conformance/expected/{094_context_holds_enumeration.pl → 094_context_holds_enumeration.eye} +0 -0
  917. /package/test/conformance/expected/{095_term_introspection_roundtrip.pl → 095_term_introspection_roundtrip.eye} +0 -0
  918. /package/test/conformance/expected/{096_functor_scalar_edges.pl → 096_functor_scalar_edges.eye} +0 -0
  919. /package/test/conformance/expected/{097_control_negation_once_forall.pl → 097_control_negation_once_forall.eye} +0 -0
  920. /package/test/conformance/expected/{098_aggregation_nested_templates.pl → 098_aggregation_nested_templates.eye} +0 -0
  921. /package/test/conformance/expected/{099_materialize_multiple_arities.pl → 099_materialize_multiple_arities.eye} +0 -0
  922. /package/test/conformance/expected/{100_reusable_builtin_workflow.pl → 100_reusable_builtin_workflow.eye} +0 -0
@@ -43,7 +43,7 @@
43
43
  - [9.10 Search control](#910-search-control)
44
44
  - [10. Implementation-specific built-ins](#10-implementation-specific-built-ins)
45
45
  - [11. Declarations](#11-declarations)
46
- - [11.1 Memoization](#111-memoization)
46
+ - [11.1 Tabling](#111-tabling)
47
47
  - [11.2 Default-output materialization](#112-default-output-materialization)
48
48
  - [12. eyelang Sockets](#12-eyelang-sockets)
49
49
  - [12.1 Socket vocabulary](#121-socket-vocabulary)
@@ -62,9 +62,9 @@
62
62
 
63
63
  ## Abstract
64
64
 
65
- Eyelang is a compact definite-clause language whose surface syntax is a deliberately small subset of ordinary Prolog term and clause syntax for rule-based programs over ordinary terms, lists, arithmetic, strings, and finite search. A Eyelang program is a finite sequence of facts and Horn clauses. The underlying declarative semantics of the pure language is **Herbrand semantics**: constants, compound terms, and lists denote themselves, and predicates denote sets of ground atomic formulas over those terms. Evaluation is goal-directed: goals are solved by unification against facts, rules, and a fixed set of built-in predicates.
65
+ Eyelang is a compact definite-clause language whose surface syntax is Prolog-like term and clause syntax with deliberate eyelang choices for rule-based programs over ordinary terms, lists, arithmetic, strings, and finite search. A Eyelang program is a finite sequence of facts and Horn clauses. The underlying declarative semantics of the pure language is **Herbrand semantics**: constants, compound terms, and lists denote themselves, and predicates denote sets of ground atomic formulas over those terms. Evaluation is goal-directed: goals are solved by unification against facts, rules, and a fixed set of built-in predicates.
66
66
 
67
- Eyelang is intentionally smaller than ISO Prolog. It supports a Prolog-syntax subset sufficient to express Horn-clause reasoning, list processing, arithmetic examples, finite search, and context data, without operators, cut, modules, dynamic predicates, DCGs, zero-arity compound syntax, or a complete ISO standard library.
67
+ Eyelang is intentionally smaller than ISO Prolog. It supports compact Horn-clause reasoning, list processing, arithmetic examples, finite search, and context data, without operators, cut, modules, dynamic predicates, DCGs, zero-arity compound syntax, or a complete ISO standard library.
68
68
 
69
69
  ## 1. Terminology and normative language
70
70
 
@@ -78,7 +78,7 @@ An **atomic formula** is a predicate application such as `parent(pat, jan)` or `
78
78
 
79
79
  This distinction is normative: `pat` is an atom constant and can appear as a term argument; `parent(pat, jan)` is an atomic formula and can appear as a fact, rule head, or goal. A compound term such as `pair(pat, jan)` has the same surface shape as an atomic formula, but its role is determined by context: as data it is a compound term, and as a clause head or goal it is an atomic formula with predicate symbol `pair/2`.
80
80
 
81
- A **clause** is either a fact `Head.` or a rule `Head :- Body.`.
81
+ A **clause** is either a fact such as `parent(pat, jan).` or a rule such as `ancestor(?x, ?y) :- parent(?x, ?y).`.
82
82
 
83
83
  A **goal** is an atomic formula, a built-in call, or a comma conjunction.
84
84
 
@@ -92,7 +92,7 @@ Eyelang is designed to be:
92
92
 
93
93
  - small enough to embed and audit;
94
94
  - deterministic in textual output order after duplicate suppression;
95
- - useful for relation-style `p(S, O)` output through ordinary predicate names;
95
+ - useful for relation-style `p(?s, ?o)` output through ordinary predicate names;
96
96
  - practical for examples involving recursion, lists, arithmetic, strings, aggregation, finite search, and context-valued data.
97
97
 
98
98
  Non-goals include complete ISO Prolog compatibility, operator declarations, module systems, dynamic database updates, cut-based control, and full bottom-up closure semantics.
@@ -107,7 +107,7 @@ Input is Unicode text. Whitespace separates tokens and is otherwise insignifican
107
107
 
108
108
  A percent sign starts a line comment outside quoted strings and quoted atom constants. The comment extends to the end of the line.
109
109
 
110
- ```prolog
110
+ ```eyelang
111
111
  parent(pat, jan). % this is a comment
112
112
  ```
113
113
 
@@ -119,28 +119,28 @@ The punctuation tokens are:
119
119
  ( ) [ ] , | . :-
120
120
  ```
121
121
 
122
- A colon outside `:-` is not part of the language. Namespace-like names SHOULD be written as ISO-compatible atom constants such as `person_type`, `odrl_permission`, or quoted atoms such as `'org.schema'`.
122
+ A colon outside `:-` is not part of the language. Namespace-like names SHOULD be written as explicit atom constants such as `person_type`, `odrl_permission`, or quoted atoms such as `'org.schema'`.
123
123
 
124
124
  ### 3.4 Variables
125
125
 
126
- A variable starts with an uppercase ASCII letter or underscore, followed by zero or more ASCII letters, digits, or underscores.
126
+ A variable starts with `?` followed by an ASCII letter or underscore and then zero or more ASCII letters, digits, or underscores. This N3/SPARQL-style spelling is the only source-level variable spelling in eyelang.
127
127
 
128
128
  Examples:
129
129
 
130
- ```prolog
131
- X
132
- Person
133
- _Thing
134
- _
130
+ ```eyelang
131
+ ?x
132
+ ?person
133
+ ?_thing
134
+ ?_
135
135
  ```
136
136
 
137
- Each `_` anonymous variable occurrence is fresh.
137
+ Each `?_` anonymous variable occurrence is fresh. A bare `_` is not a variable in eyelang source.
138
138
 
139
139
  ### 3.5 Atom constants
140
140
 
141
- A plain atom constant starts with a lowercase ASCII letter and is followed by zero or more ASCII letters, digits, or underscores. A dot is not part of a plain atom in the ISO-compatible subset; dotted web spaces such as `'be.ugent'` or `'org.schema'` MUST be quoted if they are meant as one atom constant. Names such as `a-b` or `http://example` MUST also be quoted if they are meant as one atom constant:
141
+ A plain atom constant starts with a lowercase ASCII letter and is followed by zero or more ASCII letters, digits, or underscores. A dot is not part of a plain atom; dotted web spaces such as `'be.ugent'` or `'org.schema'` MUST be quoted if they are meant as one atom constant. Names such as `a-b` MUST also be quoted if they are meant as one atom constant:
142
142
 
143
- ```prolog
143
+ ```eyelang
144
144
  pat
145
145
  type
146
146
  case_123
@@ -148,12 +148,21 @@ case_123
148
148
  'org.schema'
149
149
  'eyereasoner.github'
150
150
  'a-b'
151
- 'http://example'
152
151
  ```
153
152
 
153
+ Absolute IRI atom constants MAY also be written between angle brackets. The content must be an absolute IRI-like lexical value with a scheme such as `https:` or `urn:`. Eyelang stores the content as the atom value and prints absolute IRI atoms with angle brackets on read-back:
154
+
155
+ ```eyelang
156
+ <https://example.org/alice>
157
+ <urn:example:bob>
158
+ triple(<https://example.org/alice>, <https://schema.org/name>, "Alice").
159
+ ```
160
+
161
+ Quoted absolute IRI atoms remain valid input, but read-back normalizes them to angle-bracket syntax. For example, `'https://example.org/alice'` prints as `<https://example.org/alice>`.
162
+
154
163
  A quoted atom constant is enclosed in single quotes. A single quote inside a quoted atom constant is represented by doubling it:
155
164
 
156
- ```prolog
165
+ ```eyelang
157
166
  'atom with spaces'
158
167
  'needs''quote'
159
168
  ''
@@ -165,6 +174,8 @@ A graphic atom constant is one or more graphic characters from this set:
165
174
  #$&*+-/<=>?@^~\
166
175
  ```
167
176
 
177
+ Angle-bracket IRI syntax is recognized only for absolute IRI-like contents. Graphic atoms such as `<=>`, `<`, and `>=` remain graphic atoms.
178
+
168
179
  ### 3.6 Strings
169
180
 
170
181
  A string is enclosed in double quotes. The implementation supports common escapes such as `\n`, `\t`, `\"`, and `\\`.
@@ -173,7 +184,7 @@ A string is enclosed in double quotes. The implementation supports common escape
173
184
 
174
185
  Numbers are scalar terms. Integers, decimal numbers, and scientific notation are accepted:
175
186
 
176
- ```prolog
187
+ ```eyelang
177
188
  0
178
189
  -42
179
190
  0.25
@@ -207,17 +218,17 @@ A clause head SHOULD be a compound term. Non-compound heads are parsed but are n
207
218
 
208
219
  Arity-zero data is written as an atom constant, not as a zero-arity compound:
209
220
 
210
- ```prolog
221
+ ```eyelang
211
222
  value(example, nil).
212
223
  ```
213
224
 
214
- The syntax `nil()` is intentionally rejected so eyelang source and read-back output remain inside the Prolog syntax subset used by this language.
225
+ The syntax `nil()` is intentionally rejected so eyelang source and read-back output use one representation for arity-zero data.
215
226
 
216
227
  ## 5. Terms
217
228
 
218
229
  ### 5.1 Variables
219
230
 
220
- Variables are scoped to a single clause or selected goal. A variable in a rule head and body denotes the same logical variable within that clause.
231
+ Variables are scoped to a single clause or selected goal. A variable in a rule head and body denotes the same logical variable within that clause. Names preserve their spelling, so repeated `?x` occurrences in one clause refer to the same variable.
221
232
 
222
233
  ### 5.2 Atom constants, strings, and numbers
223
234
 
@@ -227,7 +238,7 @@ Atom constants, strings, and numbers are distinct scalar term kinds. Two scalar
227
238
 
228
239
  A compound term has a functor name and arity:
229
240
 
230
- ```prolog
241
+ ```eyelang
231
242
  parent(pat, jan)
232
243
  pair(3, nested(atom, [x, y]))
233
244
  ```
@@ -240,7 +251,7 @@ The functor or predicate name is fixed syntactically and is written as an atom c
240
251
 
241
252
  Lists use Prolog surface syntax and are represented internally with `./2` and `[]`:
242
253
 
243
- ```prolog
254
+ ```eyelang
244
255
  []
245
256
  [a, b, c]
246
257
  [a, b | tail]
@@ -250,7 +261,7 @@ Lists use Prolog surface syntax and are represented internally with `./2` and `[
250
261
 
251
262
  Parenthesized comma terms may be goals or data:
252
263
 
253
- ```prolog
264
+ ```eyelang
254
265
  (parent(pat, jan), parent(jan, emma))
255
266
  (name(alice, "Alice"), knows(alice, bob))
256
267
  ```
@@ -261,19 +272,19 @@ When a comma term appears as a goal, it is evaluated as conjunction. When it app
261
272
 
262
273
  A fact has no body:
263
274
 
264
- ```prolog
275
+ ```eyelang
265
276
  parent(pat, jan).
266
277
  ```
267
278
 
268
279
  A rule has a head and a body:
269
280
 
270
- ```prolog
271
- ancestor(X, Y) :-
272
- parent(X, Y).
281
+ ```eyelang
282
+ ancestor(?x, ?y) :-
283
+ parent(?x, ?y).
273
284
 
274
- ancestor(X, Z) :-
275
- parent(X, Y),
276
- ancestor(Y, Z).
285
+ ancestor(?x, ?z) :-
286
+ parent(?x, ?y),
287
+ ancestor(?y, ?z).
277
288
  ```
278
289
 
279
290
  Clauses with the same predicate name and arity define one predicate group. Predicate name and arity are both significant: `p/1` and `p/2` are different predicates.
@@ -294,7 +305,7 @@ A goal fails when no built-in case or user clause can prove it. eyelang has no e
294
305
 
295
306
  ### 7.3 Finite search expectation
296
307
 
297
- Programs and selected output goals SHOULD be written so the relevant search space is finite. eyelang includes recursion guards and memoization support, but it is not required to terminate for arbitrary recursive logic programs.
308
+ Programs and selected output goals SHOULD be written so the relevant search space is finite. eyelang includes recursion guards and tabling support, but it is not required to terminate for arbitrary recursive logic programs.
298
309
 
299
310
  ## 8. Logical reading: Herbrand semantics
300
311
 
@@ -304,17 +315,17 @@ An atom constant by itself is not true or false. For example, `pat` is a term, n
304
315
 
305
316
  A **Herbrand interpretation** for a program is a set of ground atomic formulas that are considered true. A source fact such as:
306
317
 
307
- ```prolog
318
+ ```eyelang
308
319
  parent(pat, jan).
309
320
  ```
310
321
 
311
322
  places the ground atomic formula `parent(pat, jan)` in the interpretation. A rule such as:
312
323
 
313
- ```prolog
314
- ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z).
324
+ ```eyelang
325
+ ancestor(?x, ?z) :- parent(?x, ?y), ancestor(?y, ?z).
315
326
  ```
316
327
 
317
- is read universally over Herbrand terms: for every substitution of `X`, `Y`, and `Z` by ground Herbrand terms, if both ground body atomic formulas are true, then the ground head atomic formula is true. The declarative meaning of a pure program is the **least Herbrand model**: the smallest set of ground atomic formulas that contains all facts and is closed under all rules.
328
+ is read universally over Herbrand terms: for every substitution of `?x`, `?y`, and `?z` by ground Herbrand terms, if both ground body atomic formulas are true, then the ground head atomic formula is true. The declarative meaning of a pure program is the **least Herbrand model**: the smallest set of ground atomic formulas that contains all facts and is closed under all rules.
318
329
 
319
330
  Equivalently, the least Herbrand model is obtained by repeatedly applying the immediate-consequence operation: start with the source facts, add every ground rule head whose ground body is already true, and continue to the least fixed point. This definition is mathematical; an implementation does not have to compute the model bottom-up.
320
331
 
@@ -326,11 +337,11 @@ Variables do not range over external objects, records, pointers, or host-languag
326
337
 
327
338
  Because the domain is Herbrand, equality in the pure language is syntactic identity of terms after substitution. Two distinct atom constants are distinct. Two compound terms are equal only when they have the same functor, the same arity, and pairwise equal arguments. Lists follow the same rule through their `[]` and `./2` representation.
328
339
 
329
- Operationally, eyelang uses first-order unification to find substitutions. The implementation does not perform an occurs check, so cyclic terms are not part of the portable Herbrand reading even if a particular implementation can temporarily construct recursive bindings internally. Portable programs SHOULD avoid relying on occurs-check-sensitive cases such as `eq(X, f(X))`.
340
+ Operationally, eyelang uses first-order unification to find substitutions. The implementation does not perform an occurs check, so cyclic terms are not part of the portable Herbrand reading even if a particular implementation can temporarily construct recursive bindings internally. Portable programs SHOULD avoid relying on occurs-check-sensitive cases such as `eq(?x, f(?x))`.
330
341
 
331
342
  ### 8.3 Goal-directed execution versus model-theoretic meaning
332
343
 
333
- eyelang's CLI and library evaluator are goal-directed. They try to prove requested goals by resolving them against facts, rules, and built-ins, using clause order, goal order, indexing, memoization, and deterministic built-in execution. This operational strategy is intended to enumerate answers that are true in the least Herbrand model for the pure Horn-clause fragment, but it is not a complete bottom-up model enumerator. Non-terminating recursion or infinite generators can prevent an answer from being found even when the answer belongs to the least Herbrand model.
344
+ eyelang's CLI and library evaluator are goal-directed. They try to prove requested goals by resolving them against facts, rules, and built-ins, using clause order, goal order, indexing, tabling, and deterministic built-in execution. This operational strategy is intended to enumerate answers that are true in the least Herbrand model for the pure Horn-clause fragment, but it is not a complete bottom-up model enumerator. Non-terminating recursion or infinite generators can prevent an answer from being found even when the answer belongs to the least Herbrand model.
334
345
 
335
346
  Default CLI output is also a host behavior, not a separate semantics. It asks broad materialization goals, suppresses duplicates, excludes source facts, keeps ground answers, and prints selected consequences. Embedders can still access the goal-directed solver directly through the implementation API.
336
347
 
@@ -338,9 +349,9 @@ Default CLI output is also a host behavior, not a separate semantics. It asks br
338
349
 
339
350
  Built-ins are specified relations or operations added to the Herbrand core. A built-in call in a goal has the syntax of an atomic formula, but its success relation is specified procedurally here rather than by source clauses. Some built-ins, such as `eq/2`, `append/3`, `member/2`, and `length/2`, can be understood as relations over Herbrand terms. Others, such as arithmetic, string matching, date/time predicates, aggregation, `once/1`, and negation-as-failure, are operational extensions whose behavior is defined by this specification rather than by pure least-Herbrand-model semantics alone.
340
351
 
341
- Arithmetic and string built-ins do not introduce a separate semantic universe. They inspect the lexical values of already represented Herbrand constants and, when they succeed, bind output arguments to eyelang terms such as numbers, strings, or atom constants. For example, `add(2, 3, X)` may bind `X` to the number term `5`; it does not mean that variables range over host-language numbers outside the Herbrand universe.
352
+ Arithmetic and string built-ins do not introduce a separate semantic universe. They inspect the lexical values of already represented Herbrand constants and, when they succeed, bind output arguments to eyelang terms such as numbers, strings, or atom constants. For example, `add(2, 3, ?x)` may bind `?x` to the number term `5`; it does not mean that variables range over host-language numbers outside the Herbrand universe.
342
353
 
343
- Negation-as-failure `not(Goal)` is especially operational: it succeeds when the current goal-directed search finds no solution for `Goal`. It is not classical negation and should not be read as adding negative facts to the Herbrand model. Programs using negation SHOULD keep the negated goal sufficiently ground and finite.
354
+ Negation-as-failure `not(?goal)` is especially operational: it succeeds when the current goal-directed search finds no solution for `?goal`. It is not classical negation and should not be read as adding negative facts to the Herbrand model. Programs using negation SHOULD keep the negated goal sufficiently ground and finite.
344
355
 
345
356
  ## 9. Standard built-in predicates
346
357
 
@@ -354,36 +365,36 @@ Implementations MAY provide additional built-ins, but such built-ins are impleme
354
365
 
355
366
  | Built-in | Meaning |
356
367
  |---|---|
357
- | `eq(A, B)` | Succeeds when `A` and `B` unify. |
358
- | `neq(A, B)` | Succeeds when `A` and `B` do not unify. |
368
+ | `eq(?a, ?b)` | Succeeds when `?a` and `?b` unify. |
369
+ | `neq(?a, ?b)` | Succeeds when `?a` and `?b` do not unify. |
359
370
 
360
371
  ### 9.2 Arithmetic
361
372
 
362
373
  | Built-in | Meaning |
363
374
  |---|---|
364
- | `neg(A, B)` | `B` is the numeric negation of `A`. |
365
- | `abs(A, B)` | `B` is the absolute value of `A`. |
366
- | `sin(A, B)`, `cos(A, B)`, `tan(A, B)` | Trigonometric floating functions. |
367
- | `asin(A, B)`, `acos(A, B)`, `atan2(Y, X, Angle)` | Inverse trigonometric floating functions. |
368
- | `sqrt(A, B)` | Square root. Fails for negative inputs. |
369
- | `floor(A, B)`, `ceiling(A, B)`, `trunc(A, B)`, `rounded(A, B)` | Integer-valued numeric rounding functions. |
370
- | `exp(A, B)`, `log(A, B)` | Natural exponent and logarithm. `log/2` fails for non-positive inputs. |
371
- | `add(A, B, C)` | `C = A + B`. |
372
- | `sub(A, B, C)` | `C = A - B`. |
373
- | `mul(A, B, C)` | `C = A * B`. |
374
- | `div(A, B, C)` | `C = A / B`; integer inputs use integer division. |
375
- | `mod(A, B, C)` | Integer remainder. |
376
- | `pow(A, B, C)` | `C = A^B`. |
377
- | `min(A, B, C)`, `max(A, B, C)` | Numeric minimum and maximum. |
375
+ | `neg(?a, ?b)` | `?b` is the numeric negation of `?a`. |
376
+ | `abs(?a, ?b)` | `?b` is the absolute value of `?a`. |
377
+ | `sin(?a, ?b)`, `cos(?a, ?b)`, `tan(?a, ?b)` | Trigonometric floating functions. |
378
+ | `asin(?a, ?b)`, `acos(?a, ?b)`, `atan2(?y, ?x, ?angle)` | Inverse trigonometric floating functions. |
379
+ | `sqrt(?a, ?b)` | Square root. Fails for negative inputs. |
380
+ | `floor(?a, ?b)`, `ceiling(?a, ?b)`, `trunc(?a, ?b)`, `rounded(?a, ?b)` | Integer-valued numeric rounding functions. |
381
+ | `exp(?a, ?b)`, `log(?a, ?b)` | Natural exponent and logarithm. `log/2` fails for non-positive inputs. |
382
+ | `add(?a, ?b, ?c)` | `?c = ?a + ?b`. |
383
+ | `sub(?a, ?b, ?c)` | `?c = ?a - ?b`. |
384
+ | `mul(?a, ?b, ?c)` | `?c = ?a * ?b`. |
385
+ | `div(?a, ?b, ?c)` | `?c = ?a / ?b`; integer inputs use integer division. |
386
+ | `mod(?a, ?b, ?c)` | Integer remainder. |
387
+ | `pow(?a, ?b, ?c)` | `?c = ?a^?b`. |
388
+ | `min(?a, ?b, ?c)`, `max(?a, ?b, ?c)` | Numeric minimum and maximum. |
378
389
 
379
390
  ### 9.3 Comparison
380
391
 
381
392
  | Built-in | Meaning |
382
393
  |---|---|
383
- | `lt(A, B)` | `A < B`. |
384
- | `gt(A, B)` | `A > B`. |
385
- | `le(A, B)` | `A =< B`. |
386
- | `ge(A, B)` | `A >= B`. |
394
+ | `lt(?a, ?b)` | `?a < ?b`. |
395
+ | `gt(?a, ?b)` | `?a > ?b`. |
396
+ | `le(?a, ?b)` | `?a =< ?b`. |
397
+ | `ge(?a, ?b)` | `?a >= ?b`. |
387
398
 
388
399
  Comparisons interpret numeric-looking terms numerically. Other scalar terms are compared lexically.
389
400
 
@@ -391,66 +402,66 @@ Comparisons interpret numeric-looking terms numerically. Other scalar terms are
391
402
 
392
403
  | Built-in | Meaning |
393
404
  |---|---|
394
- | `local_time(T)` | Binds `T` to the local date string. For deterministic runs, `EYELANG_LOCAL_TIME=YYYY-MM-DD` overrides the current date. |
395
- | `difference(A, B, D)` | Computes an ISO-like date/duration difference. |
405
+ | `local_time(?t)` | Binds `?t` to the local date string. For deterministic runs, `EYELANG_LOCAL_TIME=YYYY-MM-DD` overrides the current date. |
406
+ | `difference(?a, ?b, ?d)` | Computes an ISO-like date/duration difference. |
396
407
 
397
408
  ### 9.5 Generators
398
409
 
399
410
  | Built-in | Meaning |
400
411
  |---|---|
401
- | `between(Low, High, X)` | Enumerates integers from `Low` through `High`. |
402
- | `smallest_divisor_from(N, Start, D)` | Finds a divisor of `N` starting at `Start`. |
412
+ | `between(?low, ?high, ?x)` | Enumerates integers from `?low` through `?high`. |
413
+ | `smallest_divisor_from(?n, ?start, ?d)` | Finds a divisor of `?n` starting at `?start`. |
403
414
 
404
415
  ### 9.6 Strings and atom constants
405
416
 
406
417
  | Built-in | Meaning |
407
418
  |---|---|
408
- | `str_concat(A, B, C)` | String concatenation. |
409
- | `contains(Text, Needle)` | Text contains `Needle`. |
410
- | `matches(Text, Pattern)` | Text matches a simple implementation regex/search pattern. |
411
- | `matches(Text, Pattern, Context)` | Text matches a JavaScript regular expression with named capture groups; `Context` is a comma context containing one unary term per matched capture group. |
412
- | `not_matches(Text, Pattern)` | Negation of `matches/2`. |
413
- | `split(Text, Separator, Parts)` | Splits text into a proper list of strings. |
414
- | `join(Parts, Separator, Text)` | Joins a proper list of scalar terms into a string. |
415
- | `substring(Text, Start, Length, Out)` | Extracts a zero-based substring. |
416
- | `replace(Text, Search, Replacement, Out)` | Replaces all non-empty literal occurrences of `Search`. |
417
- | `lowercase(Text, Out)`, `uppercase(Text, Out)`, `trim(Text, Out)` | Text normalization helpers. |
418
- | `number_string(Number, String)` | Converts a number to a string or parses a numeric string into a number. |
419
- | `atom_string(Atom, String)` | Converts between atom constants and strings. |
420
- | `term_string(Term, String)` | Renders a ground term as its eyelang source string. |
419
+ | `str_concat(?a, ?b, ?c)` | String concatenation. |
420
+ | `contains(?text, ?needle)` | `?text` contains `?needle`. |
421
+ | `matches(?text, ?pattern)` | Text matches a simple implementation regex/search pattern. |
422
+ | `matches(?text, ?pattern, ?context)` | `?text` matches a JavaScript regular expression with named capture groups; `?context` is a comma context containing one unary term per matched capture group. |
423
+ | `not_matches(?text, ?pattern)` | Negation of `matches/2`. |
424
+ | `split(?text, ?separator, ?parts)` | Splits text into a proper list of strings. |
425
+ | `join(?parts, ?separator, ?text)` | Joins a proper list of scalar terms into a string. |
426
+ | `substring(?text, ?start, ?length, ?out)` | Extracts a zero-based substring. |
427
+ | `replace(?text, ?search, ?replacement, ?out)` | Replaces all non-empty literal occurrences of `?search`. |
428
+ | `lowercase(?text, ?out)`, `uppercase(?text, ?out)`, `trim(?text, ?out)` | Text normalization helpers. |
429
+ | `number_string(?number, ?string)` | Converts a number to a string or parses a numeric string into a number. |
430
+ | `atom_string(?atom, ?string)` | Converts between atom constants and strings. |
431
+ | `term_string(?term, ?string)` | Renders a ground term as its eyelang source string. |
421
432
 
422
433
  ### 9.7 Lists
423
434
 
424
435
  | Built-in | Meaning |
425
436
  |---|---|
426
- | `append(A, B, C)` | List append/split relation. |
427
- | `nth0(Index, List, Value)` | Zero-based list lookup. |
428
- | `set_nth0(Index, List, Value, Out)` | Functional list update. |
429
- | `head(List, Head)` | Head of a non-empty list. |
430
- | `rest(List, Tail)` | Tail of a non-empty list. |
431
- | `last(List, Last)` | Last element of a non-empty proper list. |
432
- | `take(N, List, Prefix)` | First `N` items of a proper list. |
433
- | `drop(N, List, Suffix)` | Proper-list suffix after dropping `N` items. |
434
- | `slice(Start, Length, List, Slice)` | Zero-based proper-list slice. |
435
- | `member(X, List)` | Member generator. |
436
- | `select(X, List, Rest)` | Selects one occurrence. |
437
- | `not_member(X, List)` | Succeeds when `X` is not a member. |
438
- | `reverse(A, B)` | Reverses a proper list. |
439
- | `length(List, N)` | Proper-list length. |
440
- | `sum_list(List, Sum)` | Numeric sum of a proper list; empty lists produce `0`. |
441
- | `min_list(List, Min)`, `max_list(List, Max)` | Minimum and maximum under standard term ordering. |
442
- | `list_to_set(List, Set)` | Removes duplicates while preserving the first occurrence order. |
443
- | `sort(Input, Output)` | Sorts and deduplicates a proper list. |
437
+ | `append(?a, ?b, ?c)` | List append/split relation. |
438
+ | `nth0(?index, ?list, ?value)` | Zero-based list lookup. |
439
+ | `set_nth0(?index, ?list, ?value, ?out)` | Functional list update. |
440
+ | `head(?list, ?head)` | Head of a non-empty list. |
441
+ | `rest(?list, ?tail)` | Tail of a non-empty list. |
442
+ | `last(?list, ?last)` | Last element of a non-empty proper list. |
443
+ | `take(?n, ?list, ?prefix)` | First `?n` items of a proper list. |
444
+ | `drop(?n, ?list, ?suffix)` | Proper-list suffix after dropping `?n` items. |
445
+ | `slice(?start, ?length, ?list, ?slice)` | Zero-based proper-list slice. |
446
+ | `member(?x, ?list)` | Member generator. |
447
+ | `select(?x, ?list, ?rest)` | Selects one occurrence. |
448
+ | `not_member(?x, ?list)` | Succeeds when `?x` is not a member. |
449
+ | `reverse(?a, ?b)` | Reverses a proper list. |
450
+ | `length(?list, ?n)` | Proper-list length. |
451
+ | `sum_list(?list, ?sum)` | Numeric sum of a proper list; empty lists produce `0`. |
452
+ | `min_list(?list, ?min)`, `max_list(?list, ?max)` | Minimum and maximum under standard term ordering. |
453
+ | `list_to_set(?list, ?set)` | Removes duplicates while preserving the first occurrence order. |
454
+ | `sort(?input, ?output)` | Sorts and deduplicates a proper list. |
444
455
 
445
456
  ### 9.8 Aggregation and ordering
446
457
 
447
458
  | Built-in | Meaning |
448
459
  |---|---|
449
- | `findall(Template, Goal, Bag)` | Collects all templates for solutions of `Goal`. |
450
- | `countall(Goal, Count)` | Counts solutions of `Goal`; empty solution sets produce `0`. |
451
- | `sumall(Template, Goal, Sum)` | Sums numeric `Template` values over solutions of `Goal`; empty solution sets produce `0`. |
452
- | `aggregate_min(Key, Template, Goal, BestKey, BestTemplate)` | Selects the solution of `Goal` with the smallest resolved `Key`, returning that key and the corresponding resolved `Template`. Fails when `Goal` has no solutions. |
453
- | `aggregate_max(Key, Template, Goal, BestKey, BestTemplate)` | Selects the solution of `Goal` with the largest resolved `Key`, returning that key and the corresponding resolved `Template`. Fails when `Goal` has no solutions. |
460
+ | `findall(?template, ?goal, ?bag)` | Collects all templates for solutions of `?goal`. |
461
+ | `countall(?goal, ?count)` | Counts solutions of `?goal`; empty solution sets produce `0`. |
462
+ | `sumall(?template, ?goal, ?sum)` | Sums numeric `?template` values over solutions of `?goal`; empty solution sets produce `0`. |
463
+ | `aggregate_min(?key, ?template, ?goal, ?bestkey, ?besttemplate)` | Selects the solution of `?goal` with the smallest resolved `?key`, returning that key and the corresponding resolved `?template`. Fails when `?goal` has no solutions. |
464
+ | `aggregate_max(?key, ?template, ?goal, ?bestkey, ?besttemplate)` | Selects the solution of `?goal` with the largest resolved `?key`, returning that key and the corresponding resolved `?template`. Fails when `?goal` has no solutions. |
454
465
 
455
466
  ### 9.9 Context and term inspection
456
467
 
@@ -458,33 +469,33 @@ Context terms are data representations of atomic formulas and comma conjunctions
458
469
 
459
470
  | Built-in | Meaning |
460
471
  |---|---|
461
- | `holds(Context, Term)` | Enumerates member terms inside a context term and unifies each member with `Term`. |
462
- | `holds(Context, Name, Args)` | Enumerates context members of any arity, exposing each member as atom constant `Name` plus a proper argument list `Args`. |
463
- | `functor(Term, Name, Arity)` | Decomposes a non-variable term into its name and arity. |
464
- | `arg(Index, Term, Arg)` | Extracts the 1-based argument of a compound term. |
465
- | `compound_name_arguments(Term, Name, Args)` | Decomposes a compound term or constructs one from an atom name and proper argument list. |
472
+ | `holds(?context, ?term)` | Enumerates member terms inside a context term and unifies each member with `?term`. |
473
+ | `holds(?context, ?name, ?args)` | Enumerates context members of any arity, exposing each member as atom constant `?name` plus a proper argument list `?args`. |
474
+ | `functor(?term, ?name, ?arity)` | Decomposes a non-variable term into its name and arity. |
475
+ | `arg(?index, ?term, ?arg)` | Extracts the 1-based argument of a compound term. |
476
+ | `compound_name_arguments(?term, ?name, ?args)` | Decomposes a compound term or constructs one from an atom name and proper argument list. |
466
477
 
467
478
  Example:
468
479
 
469
- ```prolog
470
- holds((name(alice, "Alice"), knows(alice, bob)), name(S, O)).
471
- holds((ready, name(alice, "Alice"), route(alice, bob, 7)), Name, Args).
480
+ ```eyelang
481
+ holds((name(alice, "Alice"), knows(alice, bob)), name(?s, ?o)).
482
+ holds((ready, name(alice, "Alice"), route(alice, bob, 7)), ?name, ?args).
472
483
  functor(route(alice, bob, 7), route, 3).
473
484
  arg(2, route(alice, bob, 7), bob).
474
- compound_name_arguments(Term, route, [alice, bob, 7]).
485
+ compound_name_arguments(?term, route, [alice, bob, 7]).
475
486
  ```
476
487
 
477
488
  The first goal can yield `holds((name(alice, "Alice"), knows(alice, bob)), name(alice, "Alice")).` The second can yield `holds((ready, name(alice, "Alice"), route(alice, bob, 7)), ready, []).`, `holds((ready, name(alice, "Alice"), route(alice, bob, 7)), name, [alice, "Alice"]).`, and `holds((ready, name(alice, "Alice"), route(alice, bob, 7)), route, [alice, bob, 7]).`
478
489
 
479
- `holds/3` is the appropriate form for schema-style introspection because it exposes the predicate name and all arguments without assuming a fixed arity. For example, a single rule can inspect `heartbeat`, `source(sensor17)`, `temperature(sensor17, 38)`, and `signature(sensor17, sha256, Hash, Time)` as `heartbeat/0`, `source/1`, `temperature/2`, and `signature/4`; see [`context-schema-audit.pl`](../examples/context-schema-audit.pl).
490
+ `holds/3` is the appropriate form for schema-style introspection because it exposes the predicate name and all arguments without assuming a fixed arity. For example, a single rule can inspect `heartbeat`, `source(sensor17)`, `temperature(sensor17, 38)`, and `signature(sensor17, sha256, ?hash, ?time)` as `heartbeat/0`, `source/1`, `temperature/2`, and `signature/4`; see [`context-schema-audit.eye`](../examples/context-schema-audit.eye).
480
491
 
481
492
  ### 9.10 Search control
482
493
 
483
494
  | Built-in | Meaning |
484
495
  |---|---|
485
- | `not(Goal)` | Negation as failure. Succeeds when `Goal` has no solution. |
486
- | `once(Goal)` | Succeeds with at most the first solution of `Goal`. |
487
- | `forall(Generator, Test)` | Succeeds when every solution of `Generator` also satisfies `Test`; succeeds vacuously when `Generator` has no solutions. |
496
+ | `not(?goal)` | Negation as failure. Succeeds when `?goal` has no solution. |
497
+ | `once(?goal)` | Succeeds with at most the first solution of `?goal`. |
498
+ | `forall(?generator, ?test)` | Succeeds when every solution of `?generator` also satisfies `?test`; succeeds vacuously when `?generator` has no solutions. |
488
499
 
489
500
  ## 10. Implementation-specific built-ins
490
501
 
@@ -494,7 +505,7 @@ Implementation-specific built-ins are not required for conformance to this speci
494
505
 
495
506
  An implementation-specific built-in SHOULD obey the same surface-language discipline as standard built-ins:
496
507
 
497
- - it is called using ordinary atomic-formula syntax, for example `some_extension(A, B)`;
508
+ - it is called using ordinary atomic-formula syntax, for example `some_extension(?a, ?b)`;
498
509
  - its arguments and results are eyelang terms from the Herbrand universe;
499
510
  - it succeeds, fails, and binds variables as a relation over eyelang terms;
500
511
  - it SHOULD document its intended modes, especially which arguments must be ground before it runs deterministically;
@@ -508,36 +519,36 @@ An implementation that provides explanation output SHOULD make implementation-sp
508
519
 
509
520
  Declarations are written as ordinary facts, but the host treats them specially.
510
521
 
511
- ### 11.1 Memoization
522
+ ### 11.1 Tabling
512
523
 
513
- ```prolog
514
- memoize(Name, Arity).
524
+ ```eyelang
525
+ table(path, 2).
515
526
  ```
516
527
 
517
- `Name` MUST be an atom constant and `Arity` MUST be a non-negative integer. The declaration asks the solver to table answers for the named predicate group when applicable.
528
+ The first argument MUST be an atom constant and the second argument MUST be a non-negative integer. A `table/2` declaration asks the solver to table answers for the named predicate group when applicable. The old `memoize/2` spelling is not part of the eyelang language.
518
529
 
519
530
  Example:
520
531
 
521
- ```prolog
522
- memoize(path, 2).
532
+ ```eyelang
533
+ table(path, 2).
523
534
  ```
524
535
 
525
536
  ### 11.2 Default-output materialization
526
537
 
527
- ```prolog
528
- materialize(Name, Arity).
538
+ ```eyelang
539
+ materialize(answer, 2).
529
540
  ```
530
541
 
531
- `Name` MUST be an atom constant and `Arity` MUST be a non-negative integer. If a program contains one or more `materialize/2` declarations, default CLI output is restricted to those predicate groups. Source facts are still excluded from printed output.
542
+ The first argument MUST be an atom constant and the second argument MUST be a non-negative integer. If a program contains one or more `materialize/2` declarations, default CLI output is restricted to those predicate groups. Source facts are still excluded from printed output.
532
543
 
533
544
  Example:
534
545
 
535
- ```prolog
546
+ ```eyelang
536
547
  materialize(status, 2).
537
548
  materialize(reason, 2).
538
549
  ```
539
550
 
540
- `materialize/2` affects host output selection only; it does not change the logical meaning of the program. Materialized output facts are not asserted as new source facts for subsequent output goals. A host MAY solve several materialized predicates in one solver run, and memoized predicate answers MAY be reused within that run, but this reuse is controlled by `memoize/2`, not by materialization.
551
+ `materialize/2` affects host output selection only; it does not change the logical meaning of the program. Materialized output facts are not asserted as new source facts for subsequent output goals. A host MAY solve several materialized predicates in one solver run, and tabled predicate answers MAY be reused within that run, but this reuse is controlled by `table/2`, not by materialization.
541
552
 
542
553
  ## 12. Eyelang Sockets
543
554
 
@@ -551,22 +562,22 @@ In this specification, sockets are a portable **programming pattern** expressed
551
562
 
552
563
  The minimal socket vocabulary is:
553
564
 
554
- ```prolog
555
- socket(Name, Contract).
556
- plug(Provider, Name).
557
- provides(Signature).
558
- requires(Signature).
565
+ ```eyelang
566
+ socket(?name, ?contract).
567
+ plug(?provider, ?name).
568
+ provides(?signature).
569
+ requires(?signature).
559
570
  ```
560
571
 
561
- `Name` and `Provider` are ordinary eyelang terms, usually atom constants. `Contract` is an ordinary eyelang term that describes the expected or offered knowledge. A portable signature form is:
572
+ `?name` and `?provider` are ordinary eyelang terms, usually atom constants. `?contract` is an ordinary eyelang term that describes the expected or offered knowledge. A portable signature form is:
562
573
 
563
- ```prolog
564
- predicate(PredicateName, Arity)
574
+ ```eyelang
575
+ predicate(?predicatename, ?arity)
565
576
  ```
566
577
 
567
578
  For example:
568
579
 
569
- ```prolog
580
+ ```eyelang
570
581
  socket(family_source, provides(predicate(parent, 2))).
571
582
  plug(family_file, family_source).
572
583
  ```
@@ -577,7 +588,7 @@ This says that `family_source` is a named opening for knowledge of the shape `pa
577
588
 
578
589
  A rule module can declare the knowledge it expects:
579
590
 
580
- ```prolog
591
+ ```eyelang
581
592
  materialize(ancestor, 2).
582
593
 
583
594
  socket(family_source, provides(predicate(parent, 2))).
@@ -586,12 +597,12 @@ plug(family_file, family_source).
586
597
  parent(pat, jan).
587
598
  parent(jan, emma).
588
599
 
589
- ancestor(X, Y) :-
590
- parent(X, Y).
600
+ ancestor(?x, ?y) :-
601
+ parent(?x, ?y).
591
602
 
592
- ancestor(X, Z) :-
593
- parent(X, Y),
594
- ancestor(Y, Z).
603
+ ancestor(?x, ?z) :-
604
+ parent(?x, ?y),
605
+ ancestor(?y, ?z).
595
606
  ```
596
607
 
597
608
  The `ancestor/2` rules do not depend on a particular storage mechanism for `parent/2`. In a small test, the provider may be the same file. In an embedded host, it may be a database adapter, a document extractor, a remote service, or another eyelang module. The socket facts make that boundary explicit without changing the logical meaning of the rules.
@@ -622,7 +633,7 @@ Default host output behavior is:
622
633
 
623
634
  ### 13.1 Explanation output
624
635
 
625
- When proof output is enabled, each answer SHOULD be followed by a machine-readable `why/2` fact. Explanation output is ordinary eyelang syntax whose second argument is a nested abstract proof term such as `proof(goal(G), by(Method), bindings(Bindings), uses(Proofs))`; implementations SHOULD print `goal(...)` and `by(...)` on separate lines for readability. A proof term preserves the answer goal, derivation method, relevant bindings, and nested uses while omitting proof IDs. User clauses SHOULD be referenced explicitly as `fact(Filename, clause(N))` or `rule(Filename, clause(N))`, where `N` is the 1-based clause number within that source. Built-ins SHOULD be referenced as `builtin(Name, Arity)` because they do not come from source clauses. Explanation output is outside the logical semantics of the input program and MUST NOT change the set of answers.
636
+ When proof output is enabled, each answer SHOULD be followed by a machine-readable `why/2` fact. Explanation output is ordinary eyelang syntax whose second argument is a nested abstract proof term such as `proof(goal(?g), by(?method), bindings(?bindings), uses(?proofs))`; implementations SHOULD print `goal(...)` and `by(...)` on separate lines for readability. A proof term preserves the answer goal, derivation method, relevant bindings, and nested uses while omitting proof IDs. User clauses SHOULD be referenced explicitly as `fact(?filename, clause(?n))` or `rule(?filename, clause(?n))`, where `?n` is the 1-based clause number within that source. Built-ins SHOULD be referenced as `builtin(?name, ?arity)` because they do not come from source clauses. Explanation output is outside the logical semantics of the input program and MUST NOT change the set of answers.
626
637
 
627
638
  ## 14. Conformance
628
639
 
@@ -635,19 +646,20 @@ A conforming eyelang implementation supports the standard language described abo
635
646
  - lists and comma conjunctions;
636
647
  - answer printing and read-back formatting;
637
648
  - the standard built-ins listed in section 9;
638
- - `memoize/2` declarations;
649
+ - `table/2` declarations;
639
650
  - `materialize/2` declarations;
640
651
  - default derived output;
641
652
  - explanation output when the host exposes proof output.
642
653
 
643
654
  Browser execution, package layout, CLI URL loading, and any implementation-specific built-ins described in host documentation are outside this conformance surface unless separately standardized.
644
655
 
645
- Conformance cases live in the repository under `test/conformance/`. They are run by `npm test` before the example suite, and can be run alone with `node test/run-conformance.mjs`. Each case has an input program under `conformance/cases/` and an exact expected standard-output file under `conformance/expected/`; both use `.pl` so expected output remains eyelang-readable.
656
+ Conformance cases live in the repository under `test/conformance/`. They are run by `npm test` before the example suite, and can be run alone with `node test/run-conformance.mjs`. Each case has an input program under `conformance/cases/` and an exact expected standard-output file under `conformance/expected/`; both use `.eye` so expected output remains eyelang-readable.
646
657
 
647
658
  ## 15. Relationship to ISO Prolog
648
659
 
649
- eyelang source is intended to be a subset of familiar Prolog term and Horn-clause syntax, but eyelang is not ISO Prolog. Notable differences include:
660
+ eyelang source is intended to be familiar to Prolog readers, but eyelang is not ISO Prolog and intentionally avoids some ISO-compatible source spellings. Notable differences include:
650
661
 
662
+ - `?x` variables are the only variable spelling; traditional Prolog `X` and `_` variables are rejected;
651
663
  - no operators or operator declarations;
652
664
  - no zero-arity compound syntax such as `nil()`;
653
665
  - no cut;
@@ -658,39 +670,39 @@ eyelang source is intended to be a subset of familiar Prolog term and Horn-claus
658
670
  - no variables in functor or predicate position;
659
671
  - no occurs check in unification.
660
672
 
661
- Programs intended to be portable to eyelang SHOULD avoid ISO-specific syntax and keep terms explicit. Atom names that are not plain lowercase-starting names, dot-separated plain names, or graphic atom tokens SHOULD be written as quoted atoms, for example `'a-b'`.
673
+ Programs intended to be portable to eyelang SHOULD use `?` variables, avoid ISO-specific syntax, and keep terms explicit. Atom names that are not plain lowercase-starting names, graphic atom tokens, or angle-bracket absolute IRI atoms SHOULD be written as quoted atoms, for example `'a-b'`.
662
674
 
663
675
  ## 16. Examples
664
676
 
665
677
  ### 16.1 Transitive closure
666
678
 
667
- ```prolog
679
+ ```eyelang
668
680
  parent(pat, jan).
669
681
  parent(jan, emma).
670
682
 
671
- ancestor(X, Y) :- parent(X, Y).
672
- ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z).
683
+ ancestor(?x, ?y) :- parent(?x, ?y).
684
+ ancestor(?x, ?z) :- parent(?x, ?y), ancestor(?y, ?z).
673
685
  ```
674
686
 
675
687
  ### 16.2 Arithmetic
676
688
 
677
- ```prolog
678
- square(X, Y) :- mul(X, X, Y).
679
- answer(three, Y) :- square(3, Y).
689
+ ```eyelang
690
+ square(?x, ?y) :- mul(?x, ?x, ?y).
691
+ answer(three, ?y) :- square(3, ?y).
680
692
  ```
681
693
 
682
694
  ### 16.3 Lists
683
695
 
684
- ```prolog
685
- first([X | _Rest], X).
686
- answer(example, X) :- first([a, b, c], X).
696
+ ```eyelang
697
+ first([?x | ?_rest], ?x).
698
+ answer(example, ?x) :- first([a, b, c], ?x).
687
699
  ```
688
700
 
689
701
  ### 16.4 Negation as failure
690
702
 
691
- ```prolog
703
+ ```eyelang
692
704
  closed(b).
693
- open(X) :- not(closed(X)).
705
+ open(?x) :- not(closed(?x)).
694
706
  status(a, open) :- open(a).
695
707
  ```
696
708