eyelang 1.2.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/docs/guide.md +230 -229
- package/docs/language-reference.md +157 -156
- package/examples/access-control-policy.eye +52 -0
- package/examples/ackermann.eye +47 -0
- package/examples/age.eye +26 -0
- package/examples/aliases-and-namespaces.eye +20 -0
- package/examples/alignment-demo.eye +44 -0
- package/examples/allen-interval-calculus.eye +64 -0
- package/examples/ancestor.eye +22 -0
- package/examples/animal.eye +21 -0
- package/examples/annotation.eye +34 -0
- package/examples/auroracare.eye +309 -0
- package/examples/backward.eye +11 -0
- package/examples/basic-monadic.eye +10032 -0
- package/examples/bayes-diagnosis.eye +108 -0
- package/examples/bayes-therapy.eye +189 -0
- package/examples/beam-deflection.eye +48 -0
- package/examples/binomial-vandermonde.eye +49 -0
- package/examples/blocks-world-planning.eye +77 -0
- package/examples/bmi.eye +232 -0
- package/examples/braking-safety-worlds.eye +69 -0
- package/examples/buck-converter-design.eye +83 -0
- package/examples/cache-performance.eye +56 -0
- package/examples/canary-release.eye +51 -0
- package/examples/cat-koko.eye +24 -0
- package/examples/catalan-convolution.eye +37 -0
- package/examples/chart-parser.eye +65 -0
- package/examples/clinical-trial-screening.eye +97 -0
- package/examples/collatz-1000.eye +45 -0
- package/examples/combinatorics-findall-sort.eye +38 -0
- package/examples/competitive-enzyme-kinetics.eye +78 -0
- package/examples/complex.eye +133 -0
- package/examples/composition-of-injective-functions-is-injective.eye +50 -0
- package/examples/context-association.eye +53 -0
- package/examples/context-schema-audit.eye +46 -0
- package/examples/continued-fraction-sqrt2.eye +36 -0
- package/examples/control-system.eye +76 -0
- package/examples/critical-path-schedule.eye +82 -0
- package/examples/cyclic-path.eye +18 -0
- package/examples/d3-group.eye +99 -0
- package/examples/dairy-energy-balance.eye +66 -0
- package/examples/data-negotiation.eye +38 -0
- package/examples/deep-taxonomy-10.eye +115 -0
- package/examples/deep-taxonomy-100.eye +385 -0
- package/examples/deep-taxonomy-1000.eye +3085 -0
- package/examples/deep-taxonomy-10000.eye +30094 -0
- package/examples/deep-taxonomy-100000.eye +300184 -0
- package/examples/delfour.eye +281 -0
- package/examples/deontic-logic.eye +52 -0
- package/examples/derived-backward-rule.eye +30 -0
- package/examples/derived-rule.eye +27 -0
- package/examples/diamond-property.eye +38 -0
- package/examples/dijkstra-findall-sort.eye +43 -0
- package/examples/dijkstra-risk-path.eye +87 -0
- package/examples/dijkstra.eye +50 -0
- package/examples/dining-philosophers.eye +147 -0
- package/examples/dog.eye +25 -0
- package/examples/dpv-odrl-purpose-mapping.eye +48 -0
- package/examples/drone-corridor-planner.eye +48 -0
- package/examples/easter-computus.eye +88 -0
- package/examples/electrical-rc-filter.eye +37 -0
- package/examples/epidemic-policy.eye +66 -0
- package/examples/equivalence-classes-overlap-implies-same-class.eye +27 -0
- package/examples/eulerian-path.eye +87 -0
- package/examples/ev-range-worlds.eye +87 -0
- package/examples/existential-rule.eye +21 -0
- package/examples/exoplanet-validation-worlds.eye +94 -0
- package/examples/expression-eval.eye +45 -0
- package/examples/family-cousins.eye +67 -0
- package/examples/fastpow.eye +61 -0
- package/examples/fft8-numeric.eye +85 -0
- package/examples/fibonacci.eye +60 -0
- package/examples/field-nitrogen-balance.eye +73 -0
- package/examples/flandor.eye +296 -0
- package/examples/floating-point.eye +28 -0
- package/examples/four-color-map.eye +133 -0
- package/examples/fundamental-theorem-arithmetic.eye +119 -0
- package/examples/gd-step-certified.eye +162 -0
- package/examples/gdpr-compliance.eye +69 -0
- package/examples/good-cobbler.eye +16 -0
- package/examples/gps.eye +146 -0
- package/examples/graph-reachability.eye +33 -0
- package/examples/graph.eye +35 -0
- package/examples/gray-code-counter.eye +47 -0
- package/examples/greatest-lower-bound-uniqueness.eye +30 -0
- package/examples/group-inverse-uniqueness.eye +36 -0
- package/examples/hamiltonian-path.eye +51 -0
- package/examples/hamming-code.eye +109 -0
- package/examples/hanoi.eye +19 -0
- package/examples/heat-loss.eye +56 -0
- package/examples/heron-theorem.eye +42 -0
- package/examples/ideal-gas-law.eye +39 -0
- package/examples/illegitimate-reasoning.eye +88 -0
- package/examples/integer-partitions.eye +35 -0
- package/examples/intuitionistic-logic-kripke.eye +69 -0
- package/examples/job-shop-scheduling.eye +48 -0
- package/examples/knapsack-optimization.eye +46 -0
- package/examples/knowledge-engineering-alignment-flow.eye +46 -0
- package/examples/law-of-cosines.eye +37 -0
- package/examples/least-squares-regression.eye +85 -0
- package/examples/linear-logic-resources.eye +51 -0
- package/examples/list-collection.eye +35 -0
- package/examples/lldm.eye +80 -0
- package/examples/manufacturing-quality-control.eye +73 -0
- package/examples/matrix-chain-order.eye +79 -0
- package/examples/microgrid-dispatch.eye +89 -0
- package/examples/missionaries-cannibals.eye +53 -0
- package/examples/modal-logic-kripke.eye +45 -0
- package/examples/modular-exponentiation.eye +35 -0
- package/examples/monkey-bananas.eye +45 -0
- package/examples/n-queens-8.eye +35 -0
- package/examples/network-sla.eye +48 -0
- package/examples/newton-raphson.eye +48 -0
- package/examples/nixon-diamond.eye +37 -0
- package/examples/observability-log-correlation.eye +40 -0
- package/examples/odrl-dpv-fpv-trust-flow.eye +51 -0
- package/examples/odrl-dpv-healthcare-risk-ranked.eye +270 -0
- package/examples/odrl-dpv-risk-ranked.eye +320 -0
- package/examples/orbital-transfer-design.eye +116 -0
- package/examples/path-discovery.eye +45013 -0
- package/examples/peano-arithmetic.eye +33 -0
- package/examples/peasant.eye +29 -0
- package/examples/pell-equation.eye +34 -0
- package/examples/pendulum-period.eye +50 -0
- package/examples/polynomial.eye +124 -0
- package/examples/proof/access-control-policy.eye +158 -0
- package/examples/proof/age.eye +71 -0
- package/examples/proof/aliases-and-namespaces.eye +78 -0
- package/examples/proof/ancestor.eye +140 -0
- package/examples/proof/animal.eye +68 -0
- package/examples/proof/annotation.eye +80 -0
- package/examples/proof/backward.eye +22 -0
- package/examples/proof/bayes-diagnosis.eye +208 -0
- package/examples/proof/beam-deflection.eye +227 -0
- package/examples/proof/cache-performance.eye +310 -0
- package/examples/proof/canary-release.eye +172 -0
- package/examples/proof/cat-koko.eye +86 -0
- package/examples/proof/chart-parser.eye +474 -0
- package/examples/proof/clinical-trial-screening.eye +389 -0
- package/examples/proof/composition-of-injective-functions-is-injective.eye +258 -0
- package/examples/proof/context-association.eye +78 -0
- package/examples/proof/data-negotiation.eye +76 -0
- package/examples/proof/deontic-logic.eye +109 -0
- package/examples/proof/derived-backward-rule.eye +74 -0
- package/examples/proof/derived-rule.eye +43 -0
- package/examples/proof/diamond-property.eye +307 -0
- package/examples/proof/dog.eye +31 -0
- package/examples/proof/dpv-odrl-purpose-mapping.eye +348 -0
- package/examples/proof/electrical-rc-filter.eye +105 -0
- package/examples/proof/epidemic-policy.eye +774 -0
- package/examples/proof/equivalence-classes-overlap-implies-same-class.eye +1098 -0
- package/examples/proof/existential-rule.eye +40 -0
- package/examples/proof/expression-eval.eye +105 -0
- package/examples/proof/floating-point.eye +160 -0
- package/examples/proof/gdpr-compliance.eye +199 -0
- package/examples/proof/good-cobbler.eye +16 -0
- package/examples/proof/graph-reachability.eye +151 -0
- package/examples/proof/greatest-lower-bound-uniqueness.eye +150 -0
- package/examples/proof/group-inverse-uniqueness.eye +84 -0
- package/examples/proof/hanoi.eye +185 -0
- package/examples/proof/heat-loss.eye +228 -0
- package/examples/proof/ideal-gas-law.eye +151 -0
- package/examples/proof/intuitionistic-logic-kripke.eye +133 -0
- package/examples/proof/linear-logic-resources.eye +205 -0
- package/examples/proof/list-collection.eye +52 -0
- package/examples/proof/modal-logic-kripke.eye +125 -0
- package/examples/proof/nixon-diamond.eye +181 -0
- package/examples/proof/proof-contrapositive.eye +78 -0
- package/examples/proof/reusable-builtins.eye +124 -0
- package/examples/proof/security-incident-correlation.eye +270 -0
- package/examples/proof/socket-age.eye +32 -0
- package/examples/proof/socket-family.eye +59 -0
- package/examples/proof/socrates.eye +38 -0
- package/examples/proof/term-tools.eye +95 -0
- package/examples/proof/witch.eye +216 -0
- package/examples/proof-contrapositive.eye +27 -0
- package/examples/quadratic-formula.eye +56 -0
- package/examples/radioactive-decay.eye +58 -0
- package/examples/reusable-builtins.eye +36 -0
- package/examples/riemann-hypothesis.eye +110 -0
- package/examples/security-incident-correlation.eye +69 -0
- package/examples/send-more-money.eye +71 -0
- package/examples/service-impact.eye +41 -0
- package/examples/sieve.eye +20 -0
- package/examples/skolem-functions.eye +52 -0
- package/examples/socket-age.eye +39 -0
- package/examples/socket-family.eye +28 -0
- package/examples/socrates.eye +19 -0
- package/examples/stable-marriage.eye +92 -0
- package/examples/statistics-summary.eye +56 -0
- package/examples/stirling-bell-numbers.eye +32 -0
- package/examples/sudoku-4x4.eye +54 -0
- package/examples/superdense-coding.eye +84 -0
- package/examples/term-tools.eye +32 -0
- package/examples/totient-summatory.eye +33 -0
- package/examples/trust-flow-provenance-threshold.eye +47 -0
- package/examples/turing.eye +69 -0
- package/examples/vector-similarity.eye +60 -0
- package/examples/vulnerability-impact.eye +69 -0
- package/examples/web-names.eye +83 -0
- package/examples/weighted-interval-scheduling.eye +81 -0
- package/examples/witch.eye +38 -0
- package/examples/wolf-goat-cabbage.eye +56 -0
- package/examples/zebra.eye +45 -0
- package/index.d.ts +1 -1
- package/package.json +2 -2
- package/playground.html +10 -10
- package/src/cli.js +2 -2
- package/src/explain.js +1 -1
- package/src/parser.js +9 -7
- package/src/program.js +3 -3
- package/src/solver.js +2 -2
- package/test/conformance/README.md +2 -2
- package/test/conformance/cases/001_fact_output.eye +4 -0
- package/test/conformance/cases/002_rule_recursion.eye +7 -0
- package/test/conformance/cases/002_rule_recursion.query +1 -1
- package/test/conformance/cases/003_terms_and_readback.eye +16 -0
- package/test/conformance/cases/003_terms_and_readback.query +1 -1
- package/test/conformance/cases/004_conjunction_and_parentheses.eye +5 -0
- package/test/conformance/cases/004_conjunction_and_parentheses.query +1 -1
- package/test/conformance/cases/005_list_deconstruction.eye +6 -0
- package/test/conformance/cases/005_list_deconstruction.query +1 -1
- package/test/conformance/cases/006_comma_formula_data.eye +4 -0
- package/test/conformance/cases/006_comma_formula_data.query +1 -1
- package/test/conformance/cases/007_anonymous_variables.eye +5 -0
- package/test/conformance/cases/007_anonymous_variables.query +1 -1
- package/test/conformance/cases/008_graphic_atoms.eye +6 -0
- package/test/conformance/cases/008_graphic_atoms.query +1 -1
- package/test/conformance/cases/009_comments_and_whitespace.eye +5 -0
- package/test/conformance/cases/009_comments_and_whitespace.query +1 -1
- package/test/conformance/cases/010_variable_scope_and_reuse.eye +8 -0
- package/test/conformance/cases/010_variable_scope_and_reuse.query +1 -1
- package/test/conformance/cases/011_predicate_arity.eye +6 -0
- package/test/conformance/cases/011_predicate_arity.query +1 -1
- package/test/conformance/cases/012_nested_compound_unification.eye +5 -0
- package/test/conformance/cases/012_nested_compound_unification.query +1 -1
- package/test/conformance/cases/013_multiple_clauses_order.eye +6 -0
- package/test/conformance/cases/013_multiple_clauses_order.query +1 -1
- package/test/conformance/cases/014_failure_filters_answers.eye +7 -0
- package/test/conformance/cases/014_failure_filters_answers.query +1 -1
- package/test/conformance/cases/015_improper_list_unification.eye +6 -0
- package/test/conformance/cases/015_improper_list_unification.query +1 -1
- package/test/conformance/cases/016_arity_zero_atom.eye +4 -0
- package/test/conformance/cases/017_three_step_recursion.eye +8 -0
- package/test/conformance/cases/017_three_step_recursion.query +1 -1
- package/test/conformance/cases/018_quoted_atom_readback.eye +6 -0
- package/test/conformance/cases/018_quoted_atom_readback.query +1 -1
- package/test/conformance/cases/019_parenthesized_three_conjuncts.eye +7 -0
- package/test/conformance/cases/019_parenthesized_three_conjuncts.query +1 -1
- package/test/conformance/cases/020_nested_list_terms.eye +5 -0
- package/test/conformance/cases/020_nested_list_terms.query +1 -1
- package/test/conformance/cases/021_repeated_variable_head.eye +7 -0
- package/test/conformance/cases/022_rule_head_structure.eye +5 -0
- package/test/conformance/cases/023_quoted_escapes_readback.eye +5 -0
- package/test/conformance/cases/024_numeric_literal_readback.eye +6 -0
- package/test/conformance/cases/025_body_parentheses_with_formula_data.eye +5 -0
- package/test/conformance/cases/026_question_underscore_named_variable_reuse.eye +5 -0
- package/test/conformance/cases/027_default_derived_output.eye +5 -0
- package/test/conformance/cases/028_materialize_focus.eye +5 -0
- package/test/conformance/cases/029_arithmetic_and_comparison.eye +11 -0
- package/test/conformance/cases/029_arithmetic_and_comparison.query +1 -1
- package/test/conformance/cases/030_strings_and_atoms.eye +4 -0
- package/test/conformance/cases/030_strings_and_atoms.query +1 -1
- package/test/conformance/cases/031_lists_aggregation_ordering.eye +10 -0
- package/test/conformance/cases/031_lists_aggregation_ordering.query +1 -1
- package/test/conformance/cases/032_holds_parts.eye +4 -0
- package/test/conformance/cases/033_negation_once_generators.eye +7 -0
- package/test/conformance/cases/033_negation_once_generators.query +1 -1
- package/test/conformance/cases/034_equality_and_inequality.eye +6 -0
- package/test/conformance/cases/034_equality_and_inequality.query +1 -1
- package/test/conformance/cases/035_list_relations.eye +5 -0
- package/test/conformance/cases/035_list_relations.query +1 -1
- package/test/conformance/cases/036_append_splits.eye +3 -0
- package/test/conformance/cases/036_append_splits.query +1 -1
- package/test/conformance/cases/037_matching_and_comparison.query +1 -1
- package/test/conformance/cases/038_table_declaration.eye +8 -0
- package/test/conformance/cases/038_table_declaration.query +1 -0
- package/test/conformance/cases/039_numeric_functions.eye +9 -0
- package/test/conformance/cases/039_numeric_functions.query +1 -1
- package/test/conformance/cases/040_between_enumeration.eye +3 -0
- package/test/conformance/cases/040_between_enumeration.query +1 -1
- package/test/conformance/cases/041_smallest_divisor.eye +3 -0
- package/test/conformance/cases/041_smallest_divisor.query +1 -1
- package/test/conformance/cases/042_negation_filter.eye +7 -0
- package/test/conformance/cases/042_negation_filter.query +1 -1
- package/test/conformance/cases/043_once_user_predicate.eye +5 -0
- package/test/conformance/cases/043_once_user_predicate.query +1 -1
- package/test/conformance/cases/044_findall_user_goal.eye +6 -0
- package/test/conformance/cases/044_findall_user_goal.query +1 -1
- package/test/conformance/cases/045_sort_deduplicates_atoms.eye +3 -0
- package/test/conformance/cases/045_sort_deduplicates_atoms.query +1 -1
- package/test/conformance/cases/046_append_bound_prefix_suffix.eye +4 -0
- package/test/conformance/cases/046_append_bound_prefix_suffix.query +1 -1
- package/test/conformance/cases/047_nth0_index_generation.eye +3 -0
- package/test/conformance/cases/047_nth0_index_generation.query +1 -1
- package/test/conformance/cases/048_set_nth0_edges.eye +4 -0
- package/test/conformance/cases/048_set_nth0_edges.query +1 -1
- package/test/conformance/cases/049_select_duplicate_occurrences.eye +3 -0
- package/test/conformance/cases/049_select_duplicate_occurrences.query +1 -1
- package/test/conformance/cases/050_not_member_filter.eye +6 -0
- package/test/conformance/cases/050_not_member_filter.query +1 -1
- package/test/conformance/cases/051_nested_holds_parts.eye +4 -0
- package/test/conformance/cases/052_holds_member.eye +3 -0
- package/test/conformance/cases/053_materialize_excludes_source_fact.eye +6 -0
- package/test/conformance/cases/054_numeric_and_lexical_comparison.query +1 -1
- package/test/conformance/cases/055_string_matching_filters.eye +6 -0
- package/test/conformance/cases/055_string_matching_filters.query +1 -1
- package/test/conformance/cases/056_string_and_atom_concat.eye +3 -0
- package/test/conformance/cases/056_string_and_atom_concat.query +1 -1
- package/test/conformance/cases/057_countall_empty_and_nonempty.eye +4 -0
- package/test/conformance/cases/057_countall_empty_and_nonempty.query +1 -1
- package/test/conformance/cases/058_sumall_numeric_template.eye +5 -0
- package/test/conformance/cases/058_sumall_numeric_template.query +1 -1
- package/test/conformance/cases/059_aggregate_min_template.eye +5 -0
- package/test/conformance/cases/059_aggregate_min_template.query +1 -1
- package/test/conformance/cases/060_aggregate_max_compound_key.eye +5 -0
- package/test/conformance/cases/060_aggregate_max_compound_key.query +1 -1
- package/test/conformance/cases/061_date_difference.eye +4 -0
- package/test/conformance/cases/062_reusable_numeric_builtins.eye +10 -0
- package/test/conformance/cases/063_reusable_list_builtins.eye +11 -0
- package/test/conformance/cases/064_reusable_string_builtins.eye +12 -0
- package/test/conformance/cases/065_reusable_term_control_builtins.eye +11 -0
- package/test/conformance/cases/066_numeric_edges.eye +14 -0
- package/test/conformance/cases/067_list_edges.eye +10 -0
- package/test/conformance/cases/068_list_generation_order.eye +7 -0
- package/test/conformance/cases/069_list_summaries_and_sets.eye +9 -0
- package/test/conformance/cases/070_matches_named_captures.eye +13 -0
- package/test/conformance/cases/071_string_edges.eye +10 -0
- package/test/conformance/cases/072_string_conversions.eye +10 -0
- package/test/conformance/cases/073_term_introspection_edges.eye +10 -0
- package/test/conformance/cases/074_forall_edges.eye +10 -0
- package/test/conformance/cases/075_aggregation_edges.eye +12 -0
- package/test/conformance/cases/076_composed_reusable_builtins.eye +8 -0
- package/test/conformance/cases/077_recursive_path_with_lists.eye +10 -0
- package/test/conformance/cases/078_mutual_recursion_with_arithmetic.eye +7 -0
- package/test/conformance/cases/079_big_integer_arithmetic.eye +8 -0
- package/test/conformance/cases/080_rounding_modes.eye +10 -0
- package/test/conformance/cases/081_zero_safe_numeric_functions.eye +9 -0
- package/test/conformance/cases/083_between_modes_and_empty_ranges.eye +8 -0
- package/test/conformance/cases/084_append_and_select_composition.eye +7 -0
- package/test/conformance/cases/085_nth_and_update_edges.eye +8 -0
- package/test/conformance/cases/086_slicing_pipeline.eye +10 -0
- package/test/conformance/cases/087_sort_reverse_length.eye +8 -0
- package/test/conformance/cases/088_list_summaries_failures.eye +8 -0
- package/test/conformance/cases/089_string_split_join_pipeline.eye +7 -0
- package/test/conformance/cases/090_string_substring_replace_edges.eye +9 -0
- package/test/conformance/cases/091_string_case_and_trim.eye +7 -0
- package/test/conformance/cases/092_scalar_string_conversions.eye +9 -0
- package/test/conformance/cases/093_regex_named_captures_context.eye +8 -0
- package/test/conformance/cases/094_context_holds_enumeration.eye +7 -0
- package/test/conformance/cases/095_term_introspection_roundtrip.eye +8 -0
- package/test/conformance/cases/096_functor_scalar_edges.eye +8 -0
- package/test/conformance/cases/097_control_negation_once_forall.eye +13 -0
- package/test/conformance/cases/098_aggregation_nested_templates.eye +11 -0
- package/test/conformance/cases/099_materialize_multiple_arities.eye +8 -0
- package/test/conformance/cases/100_reusable_builtin_workflow.eye +10 -0
- package/test/conformance/cases/101_question_mark_variables.eye +7 -0
- package/test/conformance/cases/102_table_declaration.eye +11 -0
- package/test/conformance/expected/101_question_mark_variables.eye +3 -0
- package/test/conformance/expected/102_table_declaration.eye +6 -0
- package/test/run-conformance.mjs +4 -4
- package/test/run-examples.mjs +51 -51
- package/test/run-regression.mjs +157 -74
- package/examples/access-control-policy.pl +0 -52
- package/examples/ackermann.pl +0 -47
- package/examples/age.pl +0 -26
- package/examples/aliases-and-namespaces.pl +0 -20
- package/examples/alignment-demo.pl +0 -44
- package/examples/allen-interval-calculus.pl +0 -64
- package/examples/ancestor.pl +0 -22
- package/examples/animal.pl +0 -21
- package/examples/annotation.pl +0 -34
- package/examples/auroracare.pl +0 -309
- package/examples/backward.pl +0 -11
- package/examples/basic-monadic.pl +0 -10032
- package/examples/bayes-diagnosis.pl +0 -108
- package/examples/bayes-therapy.pl +0 -189
- package/examples/beam-deflection.pl +0 -48
- package/examples/binomial-vandermonde.pl +0 -49
- package/examples/blocks-world-planning.pl +0 -77
- package/examples/bmi.pl +0 -232
- package/examples/braking-safety-worlds.pl +0 -69
- package/examples/buck-converter-design.pl +0 -83
- package/examples/cache-performance.pl +0 -56
- package/examples/canary-release.pl +0 -51
- package/examples/cat-koko.pl +0 -24
- package/examples/catalan-convolution.pl +0 -37
- package/examples/chart-parser.pl +0 -65
- package/examples/clinical-trial-screening.pl +0 -97
- package/examples/collatz-1000.pl +0 -45
- package/examples/combinatorics-findall-sort.pl +0 -38
- package/examples/competitive-enzyme-kinetics.pl +0 -78
- package/examples/complex.pl +0 -133
- package/examples/composition-of-injective-functions-is-injective.pl +0 -50
- package/examples/context-association.pl +0 -53
- package/examples/context-schema-audit.pl +0 -46
- package/examples/continued-fraction-sqrt2.pl +0 -36
- package/examples/control-system.pl +0 -76
- package/examples/critical-path-schedule.pl +0 -82
- package/examples/cyclic-path.pl +0 -18
- package/examples/d3-group.pl +0 -99
- package/examples/dairy-energy-balance.pl +0 -66
- package/examples/data-negotiation.pl +0 -38
- package/examples/deep-taxonomy-10.pl +0 -115
- package/examples/deep-taxonomy-100.pl +0 -385
- package/examples/deep-taxonomy-1000.pl +0 -3085
- package/examples/deep-taxonomy-10000.pl +0 -30094
- package/examples/deep-taxonomy-100000.pl +0 -300184
- package/examples/delfour.pl +0 -281
- package/examples/deontic-logic.pl +0 -52
- package/examples/derived-backward-rule.pl +0 -30
- package/examples/derived-rule.pl +0 -27
- package/examples/diamond-property.pl +0 -38
- package/examples/dijkstra-findall-sort.pl +0 -43
- package/examples/dijkstra-risk-path.pl +0 -87
- package/examples/dijkstra.pl +0 -50
- package/examples/dining-philosophers.pl +0 -147
- package/examples/dog.pl +0 -25
- package/examples/dpv-odrl-purpose-mapping.pl +0 -48
- package/examples/drone-corridor-planner.pl +0 -48
- package/examples/easter-computus.pl +0 -88
- package/examples/electrical-rc-filter.pl +0 -37
- package/examples/epidemic-policy.pl +0 -66
- package/examples/equivalence-classes-overlap-implies-same-class.pl +0 -27
- package/examples/eulerian-path.pl +0 -87
- package/examples/ev-range-worlds.pl +0 -87
- package/examples/existential-rule.pl +0 -21
- package/examples/exoplanet-validation-worlds.pl +0 -94
- package/examples/expression-eval.pl +0 -45
- package/examples/family-cousins.pl +0 -67
- package/examples/fastpow.pl +0 -61
- package/examples/fft8-numeric.pl +0 -85
- package/examples/fibonacci.pl +0 -60
- package/examples/field-nitrogen-balance.pl +0 -73
- package/examples/flandor.pl +0 -296
- package/examples/floating-point.pl +0 -28
- package/examples/four-color-map.pl +0 -133
- package/examples/fundamental-theorem-arithmetic.pl +0 -119
- package/examples/gd-step-certified.pl +0 -162
- package/examples/gdpr-compliance.pl +0 -69
- package/examples/good-cobbler.pl +0 -16
- package/examples/gps.pl +0 -146
- package/examples/graph-reachability.pl +0 -33
- package/examples/graph.pl +0 -35
- package/examples/gray-code-counter.pl +0 -47
- package/examples/greatest-lower-bound-uniqueness.pl +0 -30
- package/examples/group-inverse-uniqueness.pl +0 -36
- package/examples/hamiltonian-path.pl +0 -51
- package/examples/hamming-code.pl +0 -109
- package/examples/hanoi.pl +0 -19
- package/examples/heat-loss.pl +0 -56
- package/examples/heron-theorem.pl +0 -42
- package/examples/ideal-gas-law.pl +0 -39
- package/examples/illegitimate-reasoning.pl +0 -88
- package/examples/integer-partitions.pl +0 -35
- package/examples/intuitionistic-logic-kripke.pl +0 -69
- package/examples/job-shop-scheduling.pl +0 -48
- package/examples/knapsack-optimization.pl +0 -46
- package/examples/knowledge-engineering-alignment-flow.pl +0 -46
- package/examples/law-of-cosines.pl +0 -37
- package/examples/least-squares-regression.pl +0 -85
- package/examples/linear-logic-resources.pl +0 -51
- package/examples/list-collection.pl +0 -35
- package/examples/lldm.pl +0 -80
- package/examples/manufacturing-quality-control.pl +0 -73
- package/examples/matrix-chain-order.pl +0 -79
- package/examples/microgrid-dispatch.pl +0 -89
- package/examples/missionaries-cannibals.pl +0 -53
- package/examples/modal-logic-kripke.pl +0 -45
- package/examples/modular-exponentiation.pl +0 -35
- package/examples/monkey-bananas.pl +0 -45
- package/examples/n-queens-8.pl +0 -35
- package/examples/network-sla.pl +0 -48
- package/examples/newton-raphson.pl +0 -48
- package/examples/nixon-diamond.pl +0 -37
- package/examples/observability-log-correlation.pl +0 -40
- package/examples/odrl-dpv-fpv-trust-flow.pl +0 -51
- package/examples/odrl-dpv-healthcare-risk-ranked.pl +0 -270
- package/examples/odrl-dpv-risk-ranked.pl +0 -320
- package/examples/orbital-transfer-design.pl +0 -116
- package/examples/path-discovery.pl +0 -45013
- package/examples/peano-arithmetic.pl +0 -33
- package/examples/peasant.pl +0 -29
- package/examples/pell-equation.pl +0 -34
- package/examples/pendulum-period.pl +0 -50
- package/examples/polynomial.pl +0 -124
- package/examples/proof/access-control-policy.pl +0 -158
- package/examples/proof/age.pl +0 -71
- package/examples/proof/aliases-and-namespaces.pl +0 -78
- package/examples/proof/ancestor.pl +0 -140
- package/examples/proof/animal.pl +0 -68
- package/examples/proof/annotation.pl +0 -80
- package/examples/proof/backward.pl +0 -22
- package/examples/proof/bayes-diagnosis.pl +0 -208
- package/examples/proof/beam-deflection.pl +0 -227
- package/examples/proof/cache-performance.pl +0 -310
- package/examples/proof/canary-release.pl +0 -172
- package/examples/proof/cat-koko.pl +0 -86
- package/examples/proof/chart-parser.pl +0 -474
- package/examples/proof/clinical-trial-screening.pl +0 -389
- package/examples/proof/composition-of-injective-functions-is-injective.pl +0 -258
- package/examples/proof/context-association.pl +0 -78
- package/examples/proof/data-negotiation.pl +0 -76
- package/examples/proof/deontic-logic.pl +0 -109
- package/examples/proof/derived-backward-rule.pl +0 -74
- package/examples/proof/derived-rule.pl +0 -43
- package/examples/proof/diamond-property.pl +0 -307
- package/examples/proof/dog.pl +0 -31
- package/examples/proof/dpv-odrl-purpose-mapping.pl +0 -348
- package/examples/proof/electrical-rc-filter.pl +0 -105
- package/examples/proof/epidemic-policy.pl +0 -774
- package/examples/proof/equivalence-classes-overlap-implies-same-class.pl +0 -1098
- package/examples/proof/existential-rule.pl +0 -40
- package/examples/proof/expression-eval.pl +0 -105
- package/examples/proof/floating-point.pl +0 -160
- package/examples/proof/gdpr-compliance.pl +0 -199
- package/examples/proof/good-cobbler.pl +0 -16
- package/examples/proof/graph-reachability.pl +0 -151
- package/examples/proof/greatest-lower-bound-uniqueness.pl +0 -150
- package/examples/proof/group-inverse-uniqueness.pl +0 -84
- package/examples/proof/hanoi.pl +0 -185
- package/examples/proof/heat-loss.pl +0 -228
- package/examples/proof/ideal-gas-law.pl +0 -151
- package/examples/proof/intuitionistic-logic-kripke.pl +0 -133
- package/examples/proof/linear-logic-resources.pl +0 -205
- package/examples/proof/list-collection.pl +0 -52
- package/examples/proof/modal-logic-kripke.pl +0 -125
- package/examples/proof/nixon-diamond.pl +0 -181
- package/examples/proof/proof-contrapositive.pl +0 -78
- package/examples/proof/reusable-builtins.pl +0 -124
- package/examples/proof/security-incident-correlation.pl +0 -270
- package/examples/proof/socket-age.pl +0 -32
- package/examples/proof/socket-family.pl +0 -59
- package/examples/proof/socrates.pl +0 -38
- package/examples/proof/term-tools.pl +0 -95
- package/examples/proof/witch.pl +0 -216
- package/examples/proof-contrapositive.pl +0 -27
- package/examples/quadratic-formula.pl +0 -56
- package/examples/radioactive-decay.pl +0 -58
- package/examples/reusable-builtins.pl +0 -36
- package/examples/riemann-hypothesis.pl +0 -110
- package/examples/security-incident-correlation.pl +0 -69
- package/examples/send-more-money.pl +0 -71
- package/examples/service-impact.pl +0 -41
- package/examples/sieve.pl +0 -20
- package/examples/skolem-functions.pl +0 -52
- package/examples/socket-age.pl +0 -39
- package/examples/socket-family.pl +0 -28
- package/examples/socrates.pl +0 -19
- package/examples/stable-marriage.pl +0 -92
- package/examples/statistics-summary.pl +0 -56
- package/examples/stirling-bell-numbers.pl +0 -32
- package/examples/sudoku-4x4.pl +0 -54
- package/examples/superdense-coding.pl +0 -84
- package/examples/term-tools.pl +0 -32
- package/examples/totient-summatory.pl +0 -33
- package/examples/trust-flow-provenance-threshold.pl +0 -47
- package/examples/turing.pl +0 -69
- package/examples/vector-similarity.pl +0 -60
- package/examples/vulnerability-impact.pl +0 -69
- package/examples/web-names.pl +0 -83
- package/examples/weighted-interval-scheduling.pl +0 -81
- package/examples/witch.pl +0 -38
- package/examples/wolf-goat-cabbage.pl +0 -56
- package/examples/zebra.pl +0 -45
- package/test/conformance/cases/001_fact_output.pl +0 -4
- package/test/conformance/cases/002_rule_recursion.pl +0 -7
- package/test/conformance/cases/003_terms_and_readback.pl +0 -16
- package/test/conformance/cases/004_conjunction_and_parentheses.pl +0 -5
- package/test/conformance/cases/005_list_deconstruction.pl +0 -6
- package/test/conformance/cases/006_comma_formula_data.pl +0 -4
- package/test/conformance/cases/007_anonymous_variables.pl +0 -5
- package/test/conformance/cases/008_graphic_atoms.pl +0 -6
- package/test/conformance/cases/009_comments_and_whitespace.pl +0 -5
- package/test/conformance/cases/010_variable_scope_and_reuse.pl +0 -8
- package/test/conformance/cases/011_predicate_arity.pl +0 -6
- package/test/conformance/cases/012_nested_compound_unification.pl +0 -5
- package/test/conformance/cases/013_multiple_clauses_order.pl +0 -6
- package/test/conformance/cases/014_failure_filters_answers.pl +0 -7
- package/test/conformance/cases/015_improper_list_unification.pl +0 -6
- package/test/conformance/cases/016_arity_zero_atom.pl +0 -4
- package/test/conformance/cases/017_three_step_recursion.pl +0 -8
- package/test/conformance/cases/018_quoted_atom_readback.pl +0 -6
- package/test/conformance/cases/019_parenthesized_three_conjuncts.pl +0 -7
- package/test/conformance/cases/020_nested_list_terms.pl +0 -5
- package/test/conformance/cases/021_repeated_variable_head.pl +0 -7
- package/test/conformance/cases/022_rule_head_structure.pl +0 -5
- package/test/conformance/cases/023_quoted_escapes_readback.pl +0 -5
- package/test/conformance/cases/024_numeric_literal_readback.pl +0 -6
- package/test/conformance/cases/025_body_parentheses_with_formula_data.pl +0 -5
- package/test/conformance/cases/026_underscore_named_variable_reuse.pl +0 -5
- package/test/conformance/cases/027_default_derived_output.pl +0 -5
- package/test/conformance/cases/028_materialize_focus.pl +0 -5
- package/test/conformance/cases/029_arithmetic_and_comparison.pl +0 -11
- package/test/conformance/cases/030_strings_and_atoms.pl +0 -4
- package/test/conformance/cases/031_lists_aggregation_ordering.pl +0 -10
- package/test/conformance/cases/032_holds_parts.pl +0 -4
- package/test/conformance/cases/033_negation_once_generators.pl +0 -7
- package/test/conformance/cases/034_equality_and_inequality.pl +0 -6
- package/test/conformance/cases/035_list_relations.pl +0 -5
- package/test/conformance/cases/036_append_splits.pl +0 -3
- package/test/conformance/cases/038_memoize_declaration.pl +0 -8
- package/test/conformance/cases/038_memoize_declaration.query +0 -1
- package/test/conformance/cases/039_numeric_functions.pl +0 -9
- package/test/conformance/cases/040_between_enumeration.pl +0 -3
- package/test/conformance/cases/041_smallest_divisor.pl +0 -3
- package/test/conformance/cases/042_negation_filter.pl +0 -7
- package/test/conformance/cases/043_once_user_predicate.pl +0 -5
- package/test/conformance/cases/044_findall_user_goal.pl +0 -6
- package/test/conformance/cases/045_sort_deduplicates_atoms.pl +0 -3
- package/test/conformance/cases/046_append_bound_prefix_suffix.pl +0 -4
- package/test/conformance/cases/047_nth0_index_generation.pl +0 -3
- package/test/conformance/cases/048_set_nth0_edges.pl +0 -4
- package/test/conformance/cases/049_select_duplicate_occurrences.pl +0 -3
- package/test/conformance/cases/050_not_member_filter.pl +0 -6
- package/test/conformance/cases/051_nested_holds_parts.pl +0 -4
- package/test/conformance/cases/052_holds_member.pl +0 -3
- package/test/conformance/cases/053_materialize_excludes_source_fact.pl +0 -6
- package/test/conformance/cases/055_string_matching_filters.pl +0 -6
- package/test/conformance/cases/056_string_and_atom_concat.pl +0 -3
- package/test/conformance/cases/057_countall_empty_and_nonempty.pl +0 -4
- package/test/conformance/cases/058_sumall_numeric_template.pl +0 -5
- package/test/conformance/cases/059_aggregate_min_template.pl +0 -5
- package/test/conformance/cases/060_aggregate_max_compound_key.pl +0 -5
- package/test/conformance/cases/061_date_difference.pl +0 -4
- package/test/conformance/cases/062_reusable_numeric_builtins.pl +0 -10
- package/test/conformance/cases/063_reusable_list_builtins.pl +0 -11
- package/test/conformance/cases/064_reusable_string_builtins.pl +0 -12
- package/test/conformance/cases/065_reusable_term_control_builtins.pl +0 -11
- package/test/conformance/cases/066_numeric_edges.pl +0 -14
- package/test/conformance/cases/067_list_edges.pl +0 -10
- package/test/conformance/cases/068_list_generation_order.pl +0 -7
- package/test/conformance/cases/069_list_summaries_and_sets.pl +0 -9
- package/test/conformance/cases/070_matches_named_captures.pl +0 -13
- package/test/conformance/cases/071_string_edges.pl +0 -10
- package/test/conformance/cases/072_string_conversions.pl +0 -10
- package/test/conformance/cases/073_term_introspection_edges.pl +0 -10
- package/test/conformance/cases/074_forall_edges.pl +0 -10
- package/test/conformance/cases/075_aggregation_edges.pl +0 -12
- package/test/conformance/cases/076_composed_reusable_builtins.pl +0 -8
- package/test/conformance/cases/077_recursive_path_with_lists.pl +0 -10
- package/test/conformance/cases/078_mutual_recursion_with_arithmetic.pl +0 -7
- package/test/conformance/cases/079_big_integer_arithmetic.pl +0 -8
- package/test/conformance/cases/080_rounding_modes.pl +0 -10
- package/test/conformance/cases/081_zero_safe_numeric_functions.pl +0 -9
- package/test/conformance/cases/083_between_modes_and_empty_ranges.pl +0 -8
- package/test/conformance/cases/084_append_and_select_composition.pl +0 -7
- package/test/conformance/cases/085_nth_and_update_edges.pl +0 -8
- package/test/conformance/cases/086_slicing_pipeline.pl +0 -10
- package/test/conformance/cases/087_sort_reverse_length.pl +0 -8
- package/test/conformance/cases/088_list_summaries_failures.pl +0 -8
- package/test/conformance/cases/089_string_split_join_pipeline.pl +0 -7
- package/test/conformance/cases/090_string_substring_replace_edges.pl +0 -9
- package/test/conformance/cases/091_string_case_and_trim.pl +0 -7
- package/test/conformance/cases/092_scalar_string_conversions.pl +0 -9
- package/test/conformance/cases/093_regex_named_captures_context.pl +0 -8
- package/test/conformance/cases/094_context_holds_enumeration.pl +0 -7
- package/test/conformance/cases/095_term_introspection_roundtrip.pl +0 -8
- package/test/conformance/cases/096_functor_scalar_edges.pl +0 -8
- package/test/conformance/cases/097_control_negation_once_forall.pl +0 -13
- package/test/conformance/cases/098_aggregation_nested_templates.pl +0 -11
- package/test/conformance/cases/099_materialize_multiple_arities.pl +0 -8
- package/test/conformance/cases/100_reusable_builtin_workflow.pl +0 -10
- /package/examples/output/{access-control-policy.pl → access-control-policy.eye} +0 -0
- /package/examples/output/{ackermann.pl → ackermann.eye} +0 -0
- /package/examples/output/{age.pl → age.eye} +0 -0
- /package/examples/output/{aliases-and-namespaces.pl → aliases-and-namespaces.eye} +0 -0
- /package/examples/output/{alignment-demo.pl → alignment-demo.eye} +0 -0
- /package/examples/output/{allen-interval-calculus.pl → allen-interval-calculus.eye} +0 -0
- /package/examples/output/{ancestor.pl → ancestor.eye} +0 -0
- /package/examples/output/{animal.pl → animal.eye} +0 -0
- /package/examples/output/{annotation.pl → annotation.eye} +0 -0
- /package/examples/output/{auroracare.pl → auroracare.eye} +0 -0
- /package/examples/output/{backward.pl → backward.eye} +0 -0
- /package/examples/output/{basic-monadic.pl → basic-monadic.eye} +0 -0
- /package/examples/output/{bayes-diagnosis.pl → bayes-diagnosis.eye} +0 -0
- /package/examples/output/{bayes-therapy.pl → bayes-therapy.eye} +0 -0
- /package/examples/output/{beam-deflection.pl → beam-deflection.eye} +0 -0
- /package/examples/output/{binomial-vandermonde.pl → binomial-vandermonde.eye} +0 -0
- /package/examples/output/{blocks-world-planning.pl → blocks-world-planning.eye} +0 -0
- /package/examples/output/{bmi.pl → bmi.eye} +0 -0
- /package/examples/output/{braking-safety-worlds.pl → braking-safety-worlds.eye} +0 -0
- /package/examples/output/{buck-converter-design.pl → buck-converter-design.eye} +0 -0
- /package/examples/output/{cache-performance.pl → cache-performance.eye} +0 -0
- /package/examples/output/{canary-release.pl → canary-release.eye} +0 -0
- /package/examples/output/{cat-koko.pl → cat-koko.eye} +0 -0
- /package/examples/output/{catalan-convolution.pl → catalan-convolution.eye} +0 -0
- /package/examples/output/{chart-parser.pl → chart-parser.eye} +0 -0
- /package/examples/output/{clinical-trial-screening.pl → clinical-trial-screening.eye} +0 -0
- /package/examples/output/{collatz-1000.pl → collatz-1000.eye} +0 -0
- /package/examples/output/{combinatorics-findall-sort.pl → combinatorics-findall-sort.eye} +0 -0
- /package/examples/output/{competitive-enzyme-kinetics.pl → competitive-enzyme-kinetics.eye} +0 -0
- /package/examples/output/{complex.pl → complex.eye} +0 -0
- /package/examples/output/{composition-of-injective-functions-is-injective.pl → composition-of-injective-functions-is-injective.eye} +0 -0
- /package/examples/output/{context-association.pl → context-association.eye} +0 -0
- /package/examples/output/{context-schema-audit.pl → context-schema-audit.eye} +0 -0
- /package/examples/output/{continued-fraction-sqrt2.pl → continued-fraction-sqrt2.eye} +0 -0
- /package/examples/output/{control-system.pl → control-system.eye} +0 -0
- /package/examples/output/{critical-path-schedule.pl → critical-path-schedule.eye} +0 -0
- /package/examples/output/{cyclic-path.pl → cyclic-path.eye} +0 -0
- /package/examples/output/{d3-group.pl → d3-group.eye} +0 -0
- /package/examples/output/{dairy-energy-balance.pl → dairy-energy-balance.eye} +0 -0
- /package/examples/output/{data-negotiation.pl → data-negotiation.eye} +0 -0
- /package/examples/output/{deep-taxonomy-10.pl → deep-taxonomy-10.eye} +0 -0
- /package/examples/output/{deep-taxonomy-100.pl → deep-taxonomy-100.eye} +0 -0
- /package/examples/output/{deep-taxonomy-1000.pl → deep-taxonomy-1000.eye} +0 -0
- /package/examples/output/{deep-taxonomy-10000.pl → deep-taxonomy-10000.eye} +0 -0
- /package/examples/output/{deep-taxonomy-100000.pl → deep-taxonomy-100000.eye} +0 -0
- /package/examples/output/{delfour.pl → delfour.eye} +0 -0
- /package/examples/output/{deontic-logic.pl → deontic-logic.eye} +0 -0
- /package/examples/output/{derived-backward-rule.pl → derived-backward-rule.eye} +0 -0
- /package/examples/output/{derived-rule.pl → derived-rule.eye} +0 -0
- /package/examples/output/{diamond-property.pl → diamond-property.eye} +0 -0
- /package/examples/output/{dijkstra-findall-sort.pl → dijkstra-findall-sort.eye} +0 -0
- /package/examples/output/{dijkstra-risk-path.pl → dijkstra-risk-path.eye} +0 -0
- /package/examples/output/{dijkstra.pl → dijkstra.eye} +0 -0
- /package/examples/output/{dining-philosophers.pl → dining-philosophers.eye} +0 -0
- /package/examples/output/{dog.pl → dog.eye} +0 -0
- /package/examples/output/{dpv-odrl-purpose-mapping.pl → dpv-odrl-purpose-mapping.eye} +0 -0
- /package/examples/output/{drone-corridor-planner.pl → drone-corridor-planner.eye} +0 -0
- /package/examples/output/{easter-computus.pl → easter-computus.eye} +0 -0
- /package/examples/output/{electrical-rc-filter.pl → electrical-rc-filter.eye} +0 -0
- /package/examples/output/{epidemic-policy.pl → epidemic-policy.eye} +0 -0
- /package/examples/output/{equivalence-classes-overlap-implies-same-class.pl → equivalence-classes-overlap-implies-same-class.eye} +0 -0
- /package/examples/output/{eulerian-path.pl → eulerian-path.eye} +0 -0
- /package/examples/output/{ev-range-worlds.pl → ev-range-worlds.eye} +0 -0
- /package/examples/output/{existential-rule.pl → existential-rule.eye} +0 -0
- /package/examples/output/{exoplanet-validation-worlds.pl → exoplanet-validation-worlds.eye} +0 -0
- /package/examples/output/{expression-eval.pl → expression-eval.eye} +0 -0
- /package/examples/output/{family-cousins.pl → family-cousins.eye} +0 -0
- /package/examples/output/{fastpow.pl → fastpow.eye} +0 -0
- /package/examples/output/{fft8-numeric.pl → fft8-numeric.eye} +0 -0
- /package/examples/output/{fibonacci.pl → fibonacci.eye} +0 -0
- /package/examples/output/{field-nitrogen-balance.pl → field-nitrogen-balance.eye} +0 -0
- /package/examples/output/{flandor.pl → flandor.eye} +0 -0
- /package/examples/output/{floating-point.pl → floating-point.eye} +0 -0
- /package/examples/output/{four-color-map.pl → four-color-map.eye} +0 -0
- /package/examples/output/{fundamental-theorem-arithmetic.pl → fundamental-theorem-arithmetic.eye} +0 -0
- /package/examples/output/{gd-step-certified.pl → gd-step-certified.eye} +0 -0
- /package/examples/output/{gdpr-compliance.pl → gdpr-compliance.eye} +0 -0
- /package/examples/output/{good-cobbler.pl → good-cobbler.eye} +0 -0
- /package/examples/output/{gps.pl → gps.eye} +0 -0
- /package/examples/output/{graph-reachability.pl → graph-reachability.eye} +0 -0
- /package/examples/output/{graph.pl → graph.eye} +0 -0
- /package/examples/output/{gray-code-counter.pl → gray-code-counter.eye} +0 -0
- /package/examples/output/{greatest-lower-bound-uniqueness.pl → greatest-lower-bound-uniqueness.eye} +0 -0
- /package/examples/output/{group-inverse-uniqueness.pl → group-inverse-uniqueness.eye} +0 -0
- /package/examples/output/{hamiltonian-path.pl → hamiltonian-path.eye} +0 -0
- /package/examples/output/{hamming-code.pl → hamming-code.eye} +0 -0
- /package/examples/output/{hanoi.pl → hanoi.eye} +0 -0
- /package/examples/output/{heat-loss.pl → heat-loss.eye} +0 -0
- /package/examples/output/{heron-theorem.pl → heron-theorem.eye} +0 -0
- /package/examples/output/{ideal-gas-law.pl → ideal-gas-law.eye} +0 -0
- /package/examples/output/{illegitimate-reasoning.pl → illegitimate-reasoning.eye} +0 -0
- /package/examples/output/{integer-partitions.pl → integer-partitions.eye} +0 -0
- /package/examples/output/{intuitionistic-logic-kripke.pl → intuitionistic-logic-kripke.eye} +0 -0
- /package/examples/output/{job-shop-scheduling.pl → job-shop-scheduling.eye} +0 -0
- /package/examples/output/{knapsack-optimization.pl → knapsack-optimization.eye} +0 -0
- /package/examples/output/{knowledge-engineering-alignment-flow.pl → knowledge-engineering-alignment-flow.eye} +0 -0
- /package/examples/output/{law-of-cosines.pl → law-of-cosines.eye} +0 -0
- /package/examples/output/{least-squares-regression.pl → least-squares-regression.eye} +0 -0
- /package/examples/output/{linear-logic-resources.pl → linear-logic-resources.eye} +0 -0
- /package/examples/output/{list-collection.pl → list-collection.eye} +0 -0
- /package/examples/output/{lldm.pl → lldm.eye} +0 -0
- /package/examples/output/{manufacturing-quality-control.pl → manufacturing-quality-control.eye} +0 -0
- /package/examples/output/{matrix-chain-order.pl → matrix-chain-order.eye} +0 -0
- /package/examples/output/{microgrid-dispatch.pl → microgrid-dispatch.eye} +0 -0
- /package/examples/output/{missionaries-cannibals.pl → missionaries-cannibals.eye} +0 -0
- /package/examples/output/{modal-logic-kripke.pl → modal-logic-kripke.eye} +0 -0
- /package/examples/output/{modular-exponentiation.pl → modular-exponentiation.eye} +0 -0
- /package/examples/output/{monkey-bananas.pl → monkey-bananas.eye} +0 -0
- /package/examples/output/{n-queens-8.pl → n-queens-8.eye} +0 -0
- /package/examples/output/{network-sla.pl → network-sla.eye} +0 -0
- /package/examples/output/{newton-raphson.pl → newton-raphson.eye} +0 -0
- /package/examples/output/{nixon-diamond.pl → nixon-diamond.eye} +0 -0
- /package/examples/output/{observability-log-correlation.pl → observability-log-correlation.eye} +0 -0
- /package/examples/output/{odrl-dpv-fpv-trust-flow.pl → odrl-dpv-fpv-trust-flow.eye} +0 -0
- /package/examples/output/{odrl-dpv-healthcare-risk-ranked.pl → odrl-dpv-healthcare-risk-ranked.eye} +0 -0
- /package/examples/output/{odrl-dpv-risk-ranked.pl → odrl-dpv-risk-ranked.eye} +0 -0
- /package/examples/output/{orbital-transfer-design.pl → orbital-transfer-design.eye} +0 -0
- /package/examples/output/{path-discovery.pl → path-discovery.eye} +0 -0
- /package/examples/output/{peano-arithmetic.pl → peano-arithmetic.eye} +0 -0
- /package/examples/output/{peasant.pl → peasant.eye} +0 -0
- /package/examples/output/{pell-equation.pl → pell-equation.eye} +0 -0
- /package/examples/output/{pendulum-period.pl → pendulum-period.eye} +0 -0
- /package/examples/output/{polynomial.pl → polynomial.eye} +0 -0
- /package/examples/output/{proof-contrapositive.pl → proof-contrapositive.eye} +0 -0
- /package/examples/output/{quadratic-formula.pl → quadratic-formula.eye} +0 -0
- /package/examples/output/{radioactive-decay.pl → radioactive-decay.eye} +0 -0
- /package/examples/output/{reusable-builtins.pl → reusable-builtins.eye} +0 -0
- /package/examples/output/{riemann-hypothesis.pl → riemann-hypothesis.eye} +0 -0
- /package/examples/output/{security-incident-correlation.pl → security-incident-correlation.eye} +0 -0
- /package/examples/output/{send-more-money.pl → send-more-money.eye} +0 -0
- /package/examples/output/{service-impact.pl → service-impact.eye} +0 -0
- /package/examples/output/{sieve.pl → sieve.eye} +0 -0
- /package/examples/output/{skolem-functions.pl → skolem-functions.eye} +0 -0
- /package/examples/output/{socket-age.pl → socket-age.eye} +0 -0
- /package/examples/output/{socket-family.pl → socket-family.eye} +0 -0
- /package/examples/output/{socrates.pl → socrates.eye} +0 -0
- /package/examples/output/{stable-marriage.pl → stable-marriage.eye} +0 -0
- /package/examples/output/{statistics-summary.pl → statistics-summary.eye} +0 -0
- /package/examples/output/{stirling-bell-numbers.pl → stirling-bell-numbers.eye} +0 -0
- /package/examples/output/{sudoku-4x4.pl → sudoku-4x4.eye} +0 -0
- /package/examples/output/{superdense-coding.pl → superdense-coding.eye} +0 -0
- /package/examples/output/{term-tools.pl → term-tools.eye} +0 -0
- /package/examples/output/{totient-summatory.pl → totient-summatory.eye} +0 -0
- /package/examples/output/{trust-flow-provenance-threshold.pl → trust-flow-provenance-threshold.eye} +0 -0
- /package/examples/output/{turing.pl → turing.eye} +0 -0
- /package/examples/output/{vector-similarity.pl → vector-similarity.eye} +0 -0
- /package/examples/output/{vulnerability-impact.pl → vulnerability-impact.eye} +0 -0
- /package/examples/output/{web-names.pl → web-names.eye} +0 -0
- /package/examples/output/{weighted-interval-scheduling.pl → weighted-interval-scheduling.eye} +0 -0
- /package/examples/output/{witch.pl → witch.eye} +0 -0
- /package/examples/output/{wolf-goat-cabbage.pl → wolf-goat-cabbage.eye} +0 -0
- /package/examples/output/{zebra.pl → zebra.eye} +0 -0
- /package/test/conformance/cases/{037_matching_and_comparison.pl → 037_matching_and_comparison.eye} +0 -0
- /package/test/conformance/cases/{054_numeric_and_lexical_comparison.pl → 054_numeric_and_lexical_comparison.eye} +0 -0
- /package/test/conformance/cases/{082_comparison_semantics.pl → 082_comparison_semantics.eye} +0 -0
- /package/test/conformance/expected/{001_fact_output.pl → 001_fact_output.eye} +0 -0
- /package/test/conformance/expected/{002_rule_recursion.pl → 002_rule_recursion.eye} +0 -0
- /package/test/conformance/expected/{003_terms_and_readback.pl → 003_terms_and_readback.eye} +0 -0
- /package/test/conformance/expected/{004_conjunction_and_parentheses.pl → 004_conjunction_and_parentheses.eye} +0 -0
- /package/test/conformance/expected/{005_list_deconstruction.pl → 005_list_deconstruction.eye} +0 -0
- /package/test/conformance/expected/{006_comma_formula_data.pl → 006_comma_formula_data.eye} +0 -0
- /package/test/conformance/expected/{007_anonymous_variables.pl → 007_anonymous_variables.eye} +0 -0
- /package/test/conformance/expected/{008_graphic_atoms.pl → 008_graphic_atoms.eye} +0 -0
- /package/test/conformance/expected/{009_comments_and_whitespace.pl → 009_comments_and_whitespace.eye} +0 -0
- /package/test/conformance/expected/{010_variable_scope_and_reuse.pl → 010_variable_scope_and_reuse.eye} +0 -0
- /package/test/conformance/expected/{011_predicate_arity.pl → 011_predicate_arity.eye} +0 -0
- /package/test/conformance/expected/{012_nested_compound_unification.pl → 012_nested_compound_unification.eye} +0 -0
- /package/test/conformance/expected/{013_multiple_clauses_order.pl → 013_multiple_clauses_order.eye} +0 -0
- /package/test/conformance/expected/{014_failure_filters_answers.pl → 014_failure_filters_answers.eye} +0 -0
- /package/test/conformance/expected/{015_improper_list_unification.pl → 015_improper_list_unification.eye} +0 -0
- /package/test/conformance/expected/{016_arity_zero_atom.pl → 016_arity_zero_atom.eye} +0 -0
- /package/test/conformance/expected/{017_three_step_recursion.pl → 017_three_step_recursion.eye} +0 -0
- /package/test/conformance/expected/{018_quoted_atom_readback.pl → 018_quoted_atom_readback.eye} +0 -0
- /package/test/conformance/expected/{019_parenthesized_three_conjuncts.pl → 019_parenthesized_three_conjuncts.eye} +0 -0
- /package/test/conformance/expected/{020_nested_list_terms.pl → 020_nested_list_terms.eye} +0 -0
- /package/test/conformance/expected/{021_repeated_variable_head.pl → 021_repeated_variable_head.eye} +0 -0
- /package/test/conformance/expected/{022_rule_head_structure.pl → 022_rule_head_structure.eye} +0 -0
- /package/test/conformance/expected/{023_quoted_escapes_readback.pl → 023_quoted_escapes_readback.eye} +0 -0
- /package/test/conformance/expected/{024_numeric_literal_readback.pl → 024_numeric_literal_readback.eye} +0 -0
- /package/test/conformance/expected/{025_body_parentheses_with_formula_data.pl → 025_body_parentheses_with_formula_data.eye} +0 -0
- /package/test/conformance/expected/{026_underscore_named_variable_reuse.pl → 026_question_underscore_named_variable_reuse.eye} +0 -0
- /package/test/conformance/expected/{027_default_derived_output.pl → 027_default_derived_output.eye} +0 -0
- /package/test/conformance/expected/{028_materialize_focus.pl → 028_materialize_focus.eye} +0 -0
- /package/test/conformance/expected/{029_arithmetic_and_comparison.pl → 029_arithmetic_and_comparison.eye} +0 -0
- /package/test/conformance/expected/{030_strings_and_atoms.pl → 030_strings_and_atoms.eye} +0 -0
- /package/test/conformance/expected/{031_lists_aggregation_ordering.pl → 031_lists_aggregation_ordering.eye} +0 -0
- /package/test/conformance/expected/{032_holds_parts.pl → 032_holds_parts.eye} +0 -0
- /package/test/conformance/expected/{033_negation_once_generators.pl → 033_negation_once_generators.eye} +0 -0
- /package/test/conformance/expected/{034_equality_and_inequality.pl → 034_equality_and_inequality.eye} +0 -0
- /package/test/conformance/expected/{035_list_relations.pl → 035_list_relations.eye} +0 -0
- /package/test/conformance/expected/{036_append_splits.pl → 036_append_splits.eye} +0 -0
- /package/test/conformance/expected/{037_matching_and_comparison.pl → 037_matching_and_comparison.eye} +0 -0
- /package/test/conformance/expected/{038_memoize_declaration.pl → 038_table_declaration.eye} +0 -0
- /package/test/conformance/expected/{039_numeric_functions.pl → 039_numeric_functions.eye} +0 -0
- /package/test/conformance/expected/{040_between_enumeration.pl → 040_between_enumeration.eye} +0 -0
- /package/test/conformance/expected/{041_smallest_divisor.pl → 041_smallest_divisor.eye} +0 -0
- /package/test/conformance/expected/{042_negation_filter.pl → 042_negation_filter.eye} +0 -0
- /package/test/conformance/expected/{043_once_user_predicate.pl → 043_once_user_predicate.eye} +0 -0
- /package/test/conformance/expected/{044_findall_user_goal.pl → 044_findall_user_goal.eye} +0 -0
- /package/test/conformance/expected/{045_sort_deduplicates_atoms.pl → 045_sort_deduplicates_atoms.eye} +0 -0
- /package/test/conformance/expected/{046_append_bound_prefix_suffix.pl → 046_append_bound_prefix_suffix.eye} +0 -0
- /package/test/conformance/expected/{047_nth0_index_generation.pl → 047_nth0_index_generation.eye} +0 -0
- /package/test/conformance/expected/{048_set_nth0_edges.pl → 048_set_nth0_edges.eye} +0 -0
- /package/test/conformance/expected/{049_select_duplicate_occurrences.pl → 049_select_duplicate_occurrences.eye} +0 -0
- /package/test/conformance/expected/{050_not_member_filter.pl → 050_not_member_filter.eye} +0 -0
- /package/test/conformance/expected/{051_nested_holds_parts.pl → 051_nested_holds_parts.eye} +0 -0
- /package/test/conformance/expected/{052_holds_member.pl → 052_holds_member.eye} +0 -0
- /package/test/conformance/expected/{053_materialize_excludes_source_fact.pl → 053_materialize_excludes_source_fact.eye} +0 -0
- /package/test/conformance/expected/{054_numeric_and_lexical_comparison.pl → 054_numeric_and_lexical_comparison.eye} +0 -0
- /package/test/conformance/expected/{055_string_matching_filters.pl → 055_string_matching_filters.eye} +0 -0
- /package/test/conformance/expected/{056_string_and_atom_concat.pl → 056_string_and_atom_concat.eye} +0 -0
- /package/test/conformance/expected/{057_countall_empty_and_nonempty.pl → 057_countall_empty_and_nonempty.eye} +0 -0
- /package/test/conformance/expected/{058_sumall_numeric_template.pl → 058_sumall_numeric_template.eye} +0 -0
- /package/test/conformance/expected/{059_aggregate_min_template.pl → 059_aggregate_min_template.eye} +0 -0
- /package/test/conformance/expected/{060_aggregate_max_compound_key.pl → 060_aggregate_max_compound_key.eye} +0 -0
- /package/test/conformance/expected/{061_date_difference.pl → 061_date_difference.eye} +0 -0
- /package/test/conformance/expected/{062_reusable_numeric_builtins.pl → 062_reusable_numeric_builtins.eye} +0 -0
- /package/test/conformance/expected/{063_reusable_list_builtins.pl → 063_reusable_list_builtins.eye} +0 -0
- /package/test/conformance/expected/{064_reusable_string_builtins.pl → 064_reusable_string_builtins.eye} +0 -0
- /package/test/conformance/expected/{065_reusable_term_control_builtins.pl → 065_reusable_term_control_builtins.eye} +0 -0
- /package/test/conformance/expected/{066_numeric_edges.pl → 066_numeric_edges.eye} +0 -0
- /package/test/conformance/expected/{067_list_edges.pl → 067_list_edges.eye} +0 -0
- /package/test/conformance/expected/{068_list_generation_order.pl → 068_list_generation_order.eye} +0 -0
- /package/test/conformance/expected/{069_list_summaries_and_sets.pl → 069_list_summaries_and_sets.eye} +0 -0
- /package/test/conformance/expected/{070_matches_named_captures.pl → 070_matches_named_captures.eye} +0 -0
- /package/test/conformance/expected/{071_string_edges.pl → 071_string_edges.eye} +0 -0
- /package/test/conformance/expected/{072_string_conversions.pl → 072_string_conversions.eye} +0 -0
- /package/test/conformance/expected/{073_term_introspection_edges.pl → 073_term_introspection_edges.eye} +0 -0
- /package/test/conformance/expected/{074_forall_edges.pl → 074_forall_edges.eye} +0 -0
- /package/test/conformance/expected/{075_aggregation_edges.pl → 075_aggregation_edges.eye} +0 -0
- /package/test/conformance/expected/{076_composed_reusable_builtins.pl → 076_composed_reusable_builtins.eye} +0 -0
- /package/test/conformance/expected/{077_recursive_path_with_lists.pl → 077_recursive_path_with_lists.eye} +0 -0
- /package/test/conformance/expected/{078_mutual_recursion_with_arithmetic.pl → 078_mutual_recursion_with_arithmetic.eye} +0 -0
- /package/test/conformance/expected/{079_big_integer_arithmetic.pl → 079_big_integer_arithmetic.eye} +0 -0
- /package/test/conformance/expected/{080_rounding_modes.pl → 080_rounding_modes.eye} +0 -0
- /package/test/conformance/expected/{081_zero_safe_numeric_functions.pl → 081_zero_safe_numeric_functions.eye} +0 -0
- /package/test/conformance/expected/{082_comparison_semantics.pl → 082_comparison_semantics.eye} +0 -0
- /package/test/conformance/expected/{083_between_modes_and_empty_ranges.pl → 083_between_modes_and_empty_ranges.eye} +0 -0
- /package/test/conformance/expected/{084_append_and_select_composition.pl → 084_append_and_select_composition.eye} +0 -0
- /package/test/conformance/expected/{085_nth_and_update_edges.pl → 085_nth_and_update_edges.eye} +0 -0
- /package/test/conformance/expected/{086_slicing_pipeline.pl → 086_slicing_pipeline.eye} +0 -0
- /package/test/conformance/expected/{087_sort_reverse_length.pl → 087_sort_reverse_length.eye} +0 -0
- /package/test/conformance/expected/{088_list_summaries_failures.pl → 088_list_summaries_failures.eye} +0 -0
- /package/test/conformance/expected/{089_string_split_join_pipeline.pl → 089_string_split_join_pipeline.eye} +0 -0
- /package/test/conformance/expected/{090_string_substring_replace_edges.pl → 090_string_substring_replace_edges.eye} +0 -0
- /package/test/conformance/expected/{091_string_case_and_trim.pl → 091_string_case_and_trim.eye} +0 -0
- /package/test/conformance/expected/{092_scalar_string_conversions.pl → 092_scalar_string_conversions.eye} +0 -0
- /package/test/conformance/expected/{093_regex_named_captures_context.pl → 093_regex_named_captures_context.eye} +0 -0
- /package/test/conformance/expected/{094_context_holds_enumeration.pl → 094_context_holds_enumeration.eye} +0 -0
- /package/test/conformance/expected/{095_term_introspection_roundtrip.pl → 095_term_introspection_roundtrip.eye} +0 -0
- /package/test/conformance/expected/{096_functor_scalar_edges.pl → 096_functor_scalar_edges.eye} +0 -0
- /package/test/conformance/expected/{097_control_negation_once_forall.pl → 097_control_negation_once_forall.eye} +0 -0
- /package/test/conformance/expected/{098_aggregation_nested_templates.pl → 098_aggregation_nested_templates.eye} +0 -0
- /package/test/conformance/expected/{099_materialize_multiple_arities.pl → 099_materialize_multiple_arities.eye} +0 -0
- /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
|
|
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
|
|
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
|
|
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 `
|
|
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(
|
|
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
|
-
```
|
|
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
|
|
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
|
|
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
|
-
```
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
_
|
|
130
|
+
```eyelang
|
|
131
|
+
?x
|
|
132
|
+
?person
|
|
133
|
+
?_thing
|
|
134
|
+
?_
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
-
Each
|
|
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
|
|
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` or `http://example` MUST also be quoted if they are meant as one atom constant:
|
|
142
142
|
|
|
143
|
-
```
|
|
143
|
+
```eyelang
|
|
144
144
|
pat
|
|
145
145
|
type
|
|
146
146
|
case_123
|
|
@@ -153,7 +153,7 @@ case_123
|
|
|
153
153
|
|
|
154
154
|
A quoted atom constant is enclosed in single quotes. A single quote inside a quoted atom constant is represented by doubling it:
|
|
155
155
|
|
|
156
|
-
```
|
|
156
|
+
```eyelang
|
|
157
157
|
'atom with spaces'
|
|
158
158
|
'needs''quote'
|
|
159
159
|
''
|
|
@@ -173,7 +173,7 @@ A string is enclosed in double quotes. The implementation supports common escape
|
|
|
173
173
|
|
|
174
174
|
Numbers are scalar terms. Integers, decimal numbers, and scientific notation are accepted:
|
|
175
175
|
|
|
176
|
-
```
|
|
176
|
+
```eyelang
|
|
177
177
|
0
|
|
178
178
|
-42
|
|
179
179
|
0.25
|
|
@@ -207,17 +207,17 @@ A clause head SHOULD be a compound term. Non-compound heads are parsed but are n
|
|
|
207
207
|
|
|
208
208
|
Arity-zero data is written as an atom constant, not as a zero-arity compound:
|
|
209
209
|
|
|
210
|
-
```
|
|
210
|
+
```eyelang
|
|
211
211
|
value(example, nil).
|
|
212
212
|
```
|
|
213
213
|
|
|
214
|
-
The syntax `nil()` is intentionally rejected so eyelang source and read-back output
|
|
214
|
+
The syntax `nil()` is intentionally rejected so eyelang source and read-back output use one representation for arity-zero data.
|
|
215
215
|
|
|
216
216
|
## 5. Terms
|
|
217
217
|
|
|
218
218
|
### 5.1 Variables
|
|
219
219
|
|
|
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.
|
|
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. Names preserve their spelling, so repeated `?x` occurrences in one clause refer to the same variable.
|
|
221
221
|
|
|
222
222
|
### 5.2 Atom constants, strings, and numbers
|
|
223
223
|
|
|
@@ -227,7 +227,7 @@ Atom constants, strings, and numbers are distinct scalar term kinds. Two scalar
|
|
|
227
227
|
|
|
228
228
|
A compound term has a functor name and arity:
|
|
229
229
|
|
|
230
|
-
```
|
|
230
|
+
```eyelang
|
|
231
231
|
parent(pat, jan)
|
|
232
232
|
pair(3, nested(atom, [x, y]))
|
|
233
233
|
```
|
|
@@ -240,7 +240,7 @@ The functor or predicate name is fixed syntactically and is written as an atom c
|
|
|
240
240
|
|
|
241
241
|
Lists use Prolog surface syntax and are represented internally with `./2` and `[]`:
|
|
242
242
|
|
|
243
|
-
```
|
|
243
|
+
```eyelang
|
|
244
244
|
[]
|
|
245
245
|
[a, b, c]
|
|
246
246
|
[a, b | tail]
|
|
@@ -250,7 +250,7 @@ Lists use Prolog surface syntax and are represented internally with `./2` and `[
|
|
|
250
250
|
|
|
251
251
|
Parenthesized comma terms may be goals or data:
|
|
252
252
|
|
|
253
|
-
```
|
|
253
|
+
```eyelang
|
|
254
254
|
(parent(pat, jan), parent(jan, emma))
|
|
255
255
|
(name(alice, "Alice"), knows(alice, bob))
|
|
256
256
|
```
|
|
@@ -261,19 +261,19 @@ When a comma term appears as a goal, it is evaluated as conjunction. When it app
|
|
|
261
261
|
|
|
262
262
|
A fact has no body:
|
|
263
263
|
|
|
264
|
-
```
|
|
264
|
+
```eyelang
|
|
265
265
|
parent(pat, jan).
|
|
266
266
|
```
|
|
267
267
|
|
|
268
268
|
A rule has a head and a body:
|
|
269
269
|
|
|
270
|
-
```
|
|
271
|
-
ancestor(
|
|
272
|
-
parent(
|
|
270
|
+
```eyelang
|
|
271
|
+
ancestor(?x, ?y) :-
|
|
272
|
+
parent(?x, ?y).
|
|
273
273
|
|
|
274
|
-
ancestor(
|
|
275
|
-
parent(
|
|
276
|
-
ancestor(
|
|
274
|
+
ancestor(?x, ?z) :-
|
|
275
|
+
parent(?x, ?y),
|
|
276
|
+
ancestor(?y, ?z).
|
|
277
277
|
```
|
|
278
278
|
|
|
279
279
|
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 +294,7 @@ A goal fails when no built-in case or user clause can prove it. eyelang has no e
|
|
|
294
294
|
|
|
295
295
|
### 7.3 Finite search expectation
|
|
296
296
|
|
|
297
|
-
Programs and selected output goals SHOULD be written so the relevant search space is finite. eyelang includes recursion guards and
|
|
297
|
+
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
298
|
|
|
299
299
|
## 8. Logical reading: Herbrand semantics
|
|
300
300
|
|
|
@@ -304,17 +304,17 @@ An atom constant by itself is not true or false. For example, `pat` is a term, n
|
|
|
304
304
|
|
|
305
305
|
A **Herbrand interpretation** for a program is a set of ground atomic formulas that are considered true. A source fact such as:
|
|
306
306
|
|
|
307
|
-
```
|
|
307
|
+
```eyelang
|
|
308
308
|
parent(pat, jan).
|
|
309
309
|
```
|
|
310
310
|
|
|
311
311
|
places the ground atomic formula `parent(pat, jan)` in the interpretation. A rule such as:
|
|
312
312
|
|
|
313
|
-
```
|
|
314
|
-
ancestor(
|
|
313
|
+
```eyelang
|
|
314
|
+
ancestor(?x, ?z) :- parent(?x, ?y), ancestor(?y, ?z).
|
|
315
315
|
```
|
|
316
316
|
|
|
317
|
-
is read universally over Herbrand terms: for every substitution of
|
|
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.
|
|
318
318
|
|
|
319
319
|
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
320
|
|
|
@@ -326,11 +326,11 @@ Variables do not range over external objects, records, pointers, or host-languag
|
|
|
326
326
|
|
|
327
327
|
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
328
|
|
|
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(
|
|
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))`.
|
|
330
330
|
|
|
331
331
|
### 8.3 Goal-directed execution versus model-theoretic meaning
|
|
332
332
|
|
|
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,
|
|
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, 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
334
|
|
|
335
335
|
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
336
|
|
|
@@ -338,9 +338,9 @@ Default CLI output is also a host behavior, not a separate semantics. It asks br
|
|
|
338
338
|
|
|
339
339
|
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
340
|
|
|
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,
|
|
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.
|
|
342
342
|
|
|
343
|
-
Negation-as-failure `not(
|
|
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.
|
|
344
344
|
|
|
345
345
|
## 9. Standard built-in predicates
|
|
346
346
|
|
|
@@ -354,36 +354,36 @@ Implementations MAY provide additional built-ins, but such built-ins are impleme
|
|
|
354
354
|
|
|
355
355
|
| Built-in | Meaning |
|
|
356
356
|
|---|---|
|
|
357
|
-
| `eq(
|
|
358
|
-
| `neq(
|
|
357
|
+
| `eq(?a, ?b)` | Succeeds when `?a` and `?b` unify. |
|
|
358
|
+
| `neq(?a, ?b)` | Succeeds when `?a` and `?b` do not unify. |
|
|
359
359
|
|
|
360
360
|
### 9.2 Arithmetic
|
|
361
361
|
|
|
362
362
|
| Built-in | Meaning |
|
|
363
363
|
|---|---|
|
|
364
|
-
| `neg(
|
|
365
|
-
| `abs(
|
|
366
|
-
| `sin(
|
|
367
|
-
| `asin(
|
|
368
|
-
| `sqrt(
|
|
369
|
-
| `floor(
|
|
370
|
-
| `exp(
|
|
371
|
-
| `add(
|
|
372
|
-
| `sub(
|
|
373
|
-
| `mul(
|
|
374
|
-
| `div(
|
|
375
|
-
| `mod(
|
|
376
|
-
| `pow(
|
|
377
|
-
| `min(
|
|
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. |
|
|
378
378
|
|
|
379
379
|
### 9.3 Comparison
|
|
380
380
|
|
|
381
381
|
| Built-in | Meaning |
|
|
382
382
|
|---|---|
|
|
383
|
-
| `lt(
|
|
384
|
-
| `gt(
|
|
385
|
-
| `le(
|
|
386
|
-
| `ge(
|
|
383
|
+
| `lt(?a, ?b)` | `?a < ?b`. |
|
|
384
|
+
| `gt(?a, ?b)` | `?a > ?b`. |
|
|
385
|
+
| `le(?a, ?b)` | `?a =< ?b`. |
|
|
386
|
+
| `ge(?a, ?b)` | `?a >= ?b`. |
|
|
387
387
|
|
|
388
388
|
Comparisons interpret numeric-looking terms numerically. Other scalar terms are compared lexically.
|
|
389
389
|
|
|
@@ -391,66 +391,66 @@ Comparisons interpret numeric-looking terms numerically. Other scalar terms are
|
|
|
391
391
|
|
|
392
392
|
| Built-in | Meaning |
|
|
393
393
|
|---|---|
|
|
394
|
-
| `local_time(
|
|
395
|
-
| `difference(
|
|
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. |
|
|
396
396
|
|
|
397
397
|
### 9.5 Generators
|
|
398
398
|
|
|
399
399
|
| Built-in | Meaning |
|
|
400
400
|
|---|---|
|
|
401
|
-
| `between(
|
|
402
|
-
| `smallest_divisor_from(
|
|
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`. |
|
|
403
403
|
|
|
404
404
|
### 9.6 Strings and atom constants
|
|
405
405
|
|
|
406
406
|
| Built-in | Meaning |
|
|
407
407
|
|---|---|
|
|
408
|
-
| `str_concat(
|
|
409
|
-
| `contains(
|
|
410
|
-
| `matches(
|
|
411
|
-
| `matches(
|
|
412
|
-
| `not_matches(
|
|
413
|
-
| `split(
|
|
414
|
-
| `join(
|
|
415
|
-
| `substring(
|
|
416
|
-
| `replace(
|
|
417
|
-
| `lowercase(
|
|
418
|
-
| `number_string(
|
|
419
|
-
| `atom_string(
|
|
420
|
-
| `term_string(
|
|
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. |
|
|
421
421
|
|
|
422
422
|
### 9.7 Lists
|
|
423
423
|
|
|
424
424
|
| Built-in | Meaning |
|
|
425
425
|
|---|---|
|
|
426
|
-
| `append(
|
|
427
|
-
| `nth0(
|
|
428
|
-
| `set_nth0(
|
|
429
|
-
| `head(
|
|
430
|
-
| `rest(
|
|
431
|
-
| `last(
|
|
432
|
-
| `take(
|
|
433
|
-
| `drop(
|
|
434
|
-
| `slice(
|
|
435
|
-
| `member(
|
|
436
|
-
| `select(
|
|
437
|
-
| `not_member(
|
|
438
|
-
| `reverse(
|
|
439
|
-
| `length(
|
|
440
|
-
| `sum_list(
|
|
441
|
-
| `min_list(
|
|
442
|
-
| `list_to_set(
|
|
443
|
-
| `sort(
|
|
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. |
|
|
444
444
|
|
|
445
445
|
### 9.8 Aggregation and ordering
|
|
446
446
|
|
|
447
447
|
| Built-in | Meaning |
|
|
448
448
|
|---|---|
|
|
449
|
-
| `findall(
|
|
450
|
-
| `countall(
|
|
451
|
-
| `sumall(
|
|
452
|
-
| `aggregate_min(
|
|
453
|
-
| `aggregate_max(
|
|
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. |
|
|
454
454
|
|
|
455
455
|
### 9.9 Context and term inspection
|
|
456
456
|
|
|
@@ -458,33 +458,33 @@ Context terms are data representations of atomic formulas and comma conjunctions
|
|
|
458
458
|
|
|
459
459
|
| Built-in | Meaning |
|
|
460
460
|
|---|---|
|
|
461
|
-
| `holds(
|
|
462
|
-
| `holds(
|
|
463
|
-
| `functor(
|
|
464
|
-
| `arg(
|
|
465
|
-
| `compound_name_arguments(
|
|
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. |
|
|
466
466
|
|
|
467
467
|
Example:
|
|
468
468
|
|
|
469
|
-
```
|
|
470
|
-
holds((name(alice, "Alice"), knows(alice, bob)), name(
|
|
471
|
-
holds((ready, name(alice, "Alice"), route(alice, bob, 7)),
|
|
469
|
+
```eyelang
|
|
470
|
+
holds((name(alice, "Alice"), knows(alice, bob)), name(?s, ?o)).
|
|
471
|
+
holds((ready, name(alice, "Alice"), route(alice, bob, 7)), ?name, ?args).
|
|
472
472
|
functor(route(alice, bob, 7), route, 3).
|
|
473
473
|
arg(2, route(alice, bob, 7), bob).
|
|
474
|
-
compound_name_arguments(
|
|
474
|
+
compound_name_arguments(?term, route, [alice, bob, 7]).
|
|
475
475
|
```
|
|
476
476
|
|
|
477
477
|
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
478
|
|
|
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,
|
|
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.eye`](../examples/context-schema-audit.eye).
|
|
480
480
|
|
|
481
481
|
### 9.10 Search control
|
|
482
482
|
|
|
483
483
|
| Built-in | Meaning |
|
|
484
484
|
|---|---|
|
|
485
|
-
| `not(
|
|
486
|
-
| `once(
|
|
487
|
-
| `forall(
|
|
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. |
|
|
488
488
|
|
|
489
489
|
## 10. Implementation-specific built-ins
|
|
490
490
|
|
|
@@ -494,7 +494,7 @@ Implementation-specific built-ins are not required for conformance to this speci
|
|
|
494
494
|
|
|
495
495
|
An implementation-specific built-in SHOULD obey the same surface-language discipline as standard built-ins:
|
|
496
496
|
|
|
497
|
-
- it is called using ordinary atomic-formula syntax, for example `some_extension(
|
|
497
|
+
- it is called using ordinary atomic-formula syntax, for example `some_extension(?a, ?b)`;
|
|
498
498
|
- its arguments and results are eyelang terms from the Herbrand universe;
|
|
499
499
|
- it succeeds, fails, and binds variables as a relation over eyelang terms;
|
|
500
500
|
- it SHOULD document its intended modes, especially which arguments must be ground before it runs deterministically;
|
|
@@ -508,36 +508,36 @@ An implementation that provides explanation output SHOULD make implementation-sp
|
|
|
508
508
|
|
|
509
509
|
Declarations are written as ordinary facts, but the host treats them specially.
|
|
510
510
|
|
|
511
|
-
### 11.1
|
|
511
|
+
### 11.1 Tabling
|
|
512
512
|
|
|
513
|
-
```
|
|
514
|
-
|
|
513
|
+
```eyelang
|
|
514
|
+
table(path, 2).
|
|
515
515
|
```
|
|
516
516
|
|
|
517
|
-
|
|
517
|
+
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
518
|
|
|
519
519
|
Example:
|
|
520
520
|
|
|
521
|
-
```
|
|
522
|
-
|
|
521
|
+
```eyelang
|
|
522
|
+
table(path, 2).
|
|
523
523
|
```
|
|
524
524
|
|
|
525
525
|
### 11.2 Default-output materialization
|
|
526
526
|
|
|
527
|
-
```
|
|
528
|
-
materialize(
|
|
527
|
+
```eyelang
|
|
528
|
+
materialize(answer, 2).
|
|
529
529
|
```
|
|
530
530
|
|
|
531
|
-
|
|
531
|
+
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
532
|
|
|
533
533
|
Example:
|
|
534
534
|
|
|
535
|
-
```
|
|
535
|
+
```eyelang
|
|
536
536
|
materialize(status, 2).
|
|
537
537
|
materialize(reason, 2).
|
|
538
538
|
```
|
|
539
539
|
|
|
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
|
|
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 tabled predicate answers MAY be reused within that run, but this reuse is controlled by `table/2`, not by materialization.
|
|
541
541
|
|
|
542
542
|
## 12. Eyelang Sockets
|
|
543
543
|
|
|
@@ -551,22 +551,22 @@ In this specification, sockets are a portable **programming pattern** expressed
|
|
|
551
551
|
|
|
552
552
|
The minimal socket vocabulary is:
|
|
553
553
|
|
|
554
|
-
```
|
|
555
|
-
socket(
|
|
556
|
-
plug(
|
|
557
|
-
provides(
|
|
558
|
-
requires(
|
|
554
|
+
```eyelang
|
|
555
|
+
socket(?name, ?contract).
|
|
556
|
+
plug(?provider, ?name).
|
|
557
|
+
provides(?signature).
|
|
558
|
+
requires(?signature).
|
|
559
559
|
```
|
|
560
560
|
|
|
561
|
-
`
|
|
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:
|
|
562
562
|
|
|
563
|
-
```
|
|
564
|
-
predicate(
|
|
563
|
+
```eyelang
|
|
564
|
+
predicate(?predicatename, ?arity)
|
|
565
565
|
```
|
|
566
566
|
|
|
567
567
|
For example:
|
|
568
568
|
|
|
569
|
-
```
|
|
569
|
+
```eyelang
|
|
570
570
|
socket(family_source, provides(predicate(parent, 2))).
|
|
571
571
|
plug(family_file, family_source).
|
|
572
572
|
```
|
|
@@ -577,7 +577,7 @@ This says that `family_source` is a named opening for knowledge of the shape `pa
|
|
|
577
577
|
|
|
578
578
|
A rule module can declare the knowledge it expects:
|
|
579
579
|
|
|
580
|
-
```
|
|
580
|
+
```eyelang
|
|
581
581
|
materialize(ancestor, 2).
|
|
582
582
|
|
|
583
583
|
socket(family_source, provides(predicate(parent, 2))).
|
|
@@ -586,12 +586,12 @@ plug(family_file, family_source).
|
|
|
586
586
|
parent(pat, jan).
|
|
587
587
|
parent(jan, emma).
|
|
588
588
|
|
|
589
|
-
ancestor(
|
|
590
|
-
parent(
|
|
589
|
+
ancestor(?x, ?y) :-
|
|
590
|
+
parent(?x, ?y).
|
|
591
591
|
|
|
592
|
-
ancestor(
|
|
593
|
-
parent(
|
|
594
|
-
ancestor(
|
|
592
|
+
ancestor(?x, ?z) :-
|
|
593
|
+
parent(?x, ?y),
|
|
594
|
+
ancestor(?y, ?z).
|
|
595
595
|
```
|
|
596
596
|
|
|
597
597
|
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 +622,7 @@ Default host output behavior is:
|
|
|
622
622
|
|
|
623
623
|
### 13.1 Explanation output
|
|
624
624
|
|
|
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(
|
|
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.
|
|
626
626
|
|
|
627
627
|
## 14. Conformance
|
|
628
628
|
|
|
@@ -635,19 +635,20 @@ A conforming eyelang implementation supports the standard language described abo
|
|
|
635
635
|
- lists and comma conjunctions;
|
|
636
636
|
- answer printing and read-back formatting;
|
|
637
637
|
- the standard built-ins listed in section 9;
|
|
638
|
-
- `
|
|
638
|
+
- `table/2` declarations;
|
|
639
639
|
- `materialize/2` declarations;
|
|
640
640
|
- default derived output;
|
|
641
641
|
- explanation output when the host exposes proof output.
|
|
642
642
|
|
|
643
643
|
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
644
|
|
|
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 `.
|
|
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 `.eye` so expected output remains eyelang-readable.
|
|
646
646
|
|
|
647
647
|
## 15. Relationship to ISO Prolog
|
|
648
648
|
|
|
649
|
-
eyelang source is intended to be
|
|
649
|
+
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
650
|
|
|
651
|
+
- `?x` variables are the only variable spelling; traditional Prolog `X` and `_` variables are rejected;
|
|
651
652
|
- no operators or operator declarations;
|
|
652
653
|
- no zero-arity compound syntax such as `nil()`;
|
|
653
654
|
- no cut;
|
|
@@ -658,39 +659,39 @@ eyelang source is intended to be a subset of familiar Prolog term and Horn-claus
|
|
|
658
659
|
- no variables in functor or predicate position;
|
|
659
660
|
- no occurs check in unification.
|
|
660
661
|
|
|
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
|
|
662
|
+
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 or graphic atom tokens SHOULD be written as quoted atoms, for example `'a-b'`.
|
|
662
663
|
|
|
663
664
|
## 16. Examples
|
|
664
665
|
|
|
665
666
|
### 16.1 Transitive closure
|
|
666
667
|
|
|
667
|
-
```
|
|
668
|
+
```eyelang
|
|
668
669
|
parent(pat, jan).
|
|
669
670
|
parent(jan, emma).
|
|
670
671
|
|
|
671
|
-
ancestor(
|
|
672
|
-
ancestor(
|
|
672
|
+
ancestor(?x, ?y) :- parent(?x, ?y).
|
|
673
|
+
ancestor(?x, ?z) :- parent(?x, ?y), ancestor(?y, ?z).
|
|
673
674
|
```
|
|
674
675
|
|
|
675
676
|
### 16.2 Arithmetic
|
|
676
677
|
|
|
677
|
-
```
|
|
678
|
-
square(
|
|
679
|
-
answer(three,
|
|
678
|
+
```eyelang
|
|
679
|
+
square(?x, ?y) :- mul(?x, ?x, ?y).
|
|
680
|
+
answer(three, ?y) :- square(3, ?y).
|
|
680
681
|
```
|
|
681
682
|
|
|
682
683
|
### 16.3 Lists
|
|
683
684
|
|
|
684
|
-
```
|
|
685
|
-
first([
|
|
686
|
-
answer(example,
|
|
685
|
+
```eyelang
|
|
686
|
+
first([?x | ?_rest], ?x).
|
|
687
|
+
answer(example, ?x) :- first([a, b, c], ?x).
|
|
687
688
|
```
|
|
688
689
|
|
|
689
690
|
### 16.4 Negation as failure
|
|
690
691
|
|
|
691
|
-
```
|
|
692
|
+
```eyelang
|
|
692
693
|
closed(b).
|
|
693
|
-
open(
|
|
694
|
+
open(?x) :- not(closed(?x)).
|
|
694
695
|
status(a, open) :- open(a).
|
|
695
696
|
```
|
|
696
697
|
|