eyeling 1.34.4 → 1.34.5
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/docs/eyelang-guide.md +1 -1
- package/docs/eyelang-language-reference.md +16 -31
- package/package.json +1 -1
- package/test/eyelang/conformance/README.md +9 -11
- package/test/eyelang/conformance/cases/001_fact_output.pl +4 -0
- package/test/eyelang/conformance/cases/002_rule_recursion.pl +7 -0
- package/test/eyelang/conformance/cases/002_rule_recursion.query +1 -0
- package/test/eyelang/conformance/cases/003_terms_and_readback.pl +16 -0
- package/test/eyelang/conformance/cases/003_terms_and_readback.query +1 -0
- package/test/eyelang/conformance/cases/004_conjunction_and_parentheses.pl +5 -0
- package/test/eyelang/conformance/cases/004_conjunction_and_parentheses.query +1 -0
- package/test/eyelang/conformance/cases/005_list_deconstruction.pl +6 -0
- package/test/eyelang/conformance/cases/005_list_deconstruction.query +1 -0
- package/test/eyelang/conformance/cases/006_comma_formula_data.pl +4 -0
- package/test/eyelang/conformance/cases/006_comma_formula_data.query +1 -0
- package/test/eyelang/conformance/cases/007_anonymous_variables.pl +5 -0
- package/test/eyelang/conformance/cases/007_anonymous_variables.query +1 -0
- package/test/eyelang/conformance/cases/008_graphic_atoms.pl +6 -0
- package/test/eyelang/conformance/cases/008_graphic_atoms.query +1 -0
- package/test/eyelang/conformance/cases/009_comments_and_whitespace.pl +5 -0
- package/test/eyelang/conformance/cases/009_comments_and_whitespace.query +1 -0
- package/test/eyelang/conformance/cases/010_variable_scope_and_reuse.pl +8 -0
- package/test/eyelang/conformance/cases/010_variable_scope_and_reuse.query +1 -0
- package/test/eyelang/conformance/cases/011_predicate_arity.pl +6 -0
- package/test/eyelang/conformance/cases/011_predicate_arity.query +1 -0
- package/test/eyelang/conformance/cases/012_nested_compound_unification.pl +5 -0
- package/test/eyelang/conformance/cases/012_nested_compound_unification.query +1 -0
- package/test/eyelang/conformance/cases/013_multiple_clauses_order.pl +6 -0
- package/test/eyelang/conformance/cases/013_multiple_clauses_order.query +1 -0
- package/test/eyelang/conformance/cases/014_failure_filters_answers.pl +7 -0
- package/test/eyelang/conformance/cases/014_failure_filters_answers.query +1 -0
- package/test/eyelang/conformance/cases/015_improper_list_unification.pl +6 -0
- package/test/eyelang/conformance/cases/015_improper_list_unification.query +1 -0
- package/test/eyelang/conformance/cases/016_zero_arity_compound.pl +4 -0
- package/test/eyelang/conformance/cases/016_zero_arity_compound.query +1 -0
- package/test/eyelang/conformance/cases/017_three_step_recursion.pl +8 -0
- package/test/eyelang/conformance/cases/017_three_step_recursion.query +1 -0
- package/test/eyelang/conformance/cases/018_quoted_atom_readback.pl +6 -0
- package/test/eyelang/conformance/cases/018_quoted_atom_readback.query +1 -0
- package/test/eyelang/conformance/cases/019_parenthesized_three_conjuncts.pl +7 -0
- package/test/eyelang/conformance/cases/019_parenthesized_three_conjuncts.query +1 -0
- package/test/eyelang/conformance/cases/020_nested_list_terms.pl +5 -0
- package/test/eyelang/conformance/cases/020_nested_list_terms.query +1 -0
- package/test/eyelang/conformance/cases/021_repeated_variable_head.pl +7 -0
- package/test/eyelang/conformance/cases/022_rule_head_structure.pl +5 -0
- package/test/eyelang/conformance/cases/023_quoted_escapes_readback.pl +5 -0
- package/test/eyelang/conformance/cases/024_numeric_literal_readback.pl +6 -0
- package/test/eyelang/conformance/cases/025_body_parentheses_with_formula_data.pl +5 -0
- package/test/eyelang/conformance/cases/026_underscore_named_variable_reuse.pl +5 -0
- package/test/eyelang/conformance/cases/027_default_derived_output.pl +5 -0
- package/test/eyelang/conformance/cases/028_materialize_focus.pl +5 -0
- package/test/eyelang/conformance/cases/029_arithmetic_and_comparison.pl +11 -0
- package/test/eyelang/conformance/cases/029_arithmetic_and_comparison.query +1 -0
- package/test/eyelang/conformance/cases/030_strings_and_atoms.pl +4 -0
- package/test/eyelang/conformance/cases/030_strings_and_atoms.query +1 -0
- package/test/eyelang/conformance/cases/031_lists_aggregation_ordering.pl +10 -0
- package/test/eyelang/conformance/cases/031_lists_aggregation_ordering.query +1 -0
- package/test/eyelang/conformance/cases/032_holds_parts.pl +4 -0
- package/test/eyelang/conformance/cases/033_negation_once_generators.pl +7 -0
- package/test/eyelang/conformance/cases/033_negation_once_generators.query +1 -0
- package/test/eyelang/conformance/cases/034_equality_and_inequality.pl +6 -0
- package/test/eyelang/conformance/cases/034_equality_and_inequality.query +1 -0
- package/test/eyelang/conformance/cases/035_list_relations.pl +5 -0
- package/test/eyelang/conformance/cases/035_list_relations.query +1 -0
- package/test/eyelang/conformance/cases/036_append_splits.pl +3 -0
- package/test/eyelang/conformance/cases/036_append_splits.query +1 -0
- package/test/eyelang/conformance/cases/037_matching_and_comparison.pl +7 -0
- package/test/eyelang/conformance/cases/037_matching_and_comparison.query +1 -0
- package/test/eyelang/conformance/cases/038_memoize_declaration.pl +8 -0
- package/test/eyelang/conformance/cases/038_memoize_declaration.query +1 -0
- package/test/eyelang/conformance/cases/039_numeric_functions.pl +9 -0
- package/test/eyelang/conformance/cases/039_numeric_functions.query +1 -0
- package/test/eyelang/conformance/cases/040_between_enumeration.pl +3 -0
- package/test/eyelang/conformance/cases/040_between_enumeration.query +1 -0
- package/test/eyelang/conformance/cases/041_smallest_divisor.pl +3 -0
- package/test/eyelang/conformance/cases/041_smallest_divisor.query +1 -0
- package/test/eyelang/conformance/cases/042_negation_filter.pl +7 -0
- package/test/eyelang/conformance/cases/042_negation_filter.query +1 -0
- package/test/eyelang/conformance/cases/043_once_user_predicate.pl +5 -0
- package/test/eyelang/conformance/cases/043_once_user_predicate.query +1 -0
- package/test/eyelang/conformance/cases/044_findall_user_goal.pl +6 -0
- package/test/eyelang/conformance/cases/044_findall_user_goal.query +1 -0
- package/test/eyelang/conformance/cases/045_sort_deduplicates_atoms.pl +3 -0
- package/test/eyelang/conformance/cases/045_sort_deduplicates_atoms.query +1 -0
- package/test/eyelang/conformance/cases/046_append_bound_prefix_suffix.pl +4 -0
- package/test/eyelang/conformance/cases/046_append_bound_prefix_suffix.query +1 -0
- package/test/eyelang/conformance/cases/047_nth0_index_generation.pl +3 -0
- package/test/eyelang/conformance/cases/047_nth0_index_generation.query +1 -0
- package/test/eyelang/conformance/cases/048_set_nth0_edges.pl +4 -0
- package/test/eyelang/conformance/cases/048_set_nth0_edges.query +1 -0
- package/test/eyelang/conformance/cases/049_select_duplicate_occurrences.pl +3 -0
- package/test/eyelang/conformance/cases/049_select_duplicate_occurrences.query +1 -0
- package/test/eyelang/conformance/cases/050_not_member_filter.pl +6 -0
- package/test/eyelang/conformance/cases/050_not_member_filter.query +1 -0
- package/test/eyelang/conformance/cases/051_nested_holds_parts.pl +4 -0
- package/test/eyelang/conformance/cases/052_holds_member.pl +3 -0
- package/test/eyelang/conformance/cases/053_materialize_excludes_source_fact.pl +6 -0
- package/test/eyelang/conformance/cases/054_numeric_and_lexical_comparison.pl +5 -0
- package/test/eyelang/conformance/cases/054_numeric_and_lexical_comparison.query +1 -0
- package/test/eyelang/conformance/cases/055_string_matching_filters.pl +6 -0
- package/test/eyelang/conformance/cases/055_string_matching_filters.query +1 -0
- package/test/eyelang/conformance/cases/056_string_and_atom_concat.pl +3 -0
- package/test/eyelang/conformance/cases/056_string_and_atom_concat.query +1 -0
- package/test/eyelang/conformance/cases/057_countall_empty_and_nonempty.pl +4 -0
- package/test/eyelang/conformance/cases/057_countall_empty_and_nonempty.query +1 -0
- package/test/eyelang/conformance/cases/058_sumall_numeric_template.pl +5 -0
- package/test/eyelang/conformance/cases/058_sumall_numeric_template.query +1 -0
- package/test/eyelang/conformance/cases/059_aggregate_min_template.pl +5 -0
- package/test/eyelang/conformance/cases/059_aggregate_min_template.query +1 -0
- package/test/eyelang/conformance/cases/060_aggregate_max_compound_key.pl +5 -0
- package/test/eyelang/conformance/cases/060_aggregate_max_compound_key.query +1 -0
- package/test/eyelang/conformance/cases/061_date_difference.pl +4 -0
- package/test/eyelang/conformance/cases/062_reusable_numeric_builtins.pl +10 -0
- package/test/eyelang/conformance/cases/063_reusable_list_builtins.pl +11 -0
- package/test/eyelang/conformance/cases/064_reusable_string_builtins.pl +12 -0
- package/test/eyelang/conformance/cases/065_reusable_term_control_builtins.pl +11 -0
- package/test/eyelang/conformance/cases/066_numeric_edges.pl +14 -0
- package/test/eyelang/conformance/cases/067_list_edges.pl +10 -0
- package/test/eyelang/conformance/cases/068_list_generation_order.pl +7 -0
- package/test/eyelang/conformance/cases/069_list_summaries_and_sets.pl +9 -0
- package/test/eyelang/conformance/cases/070_matches_named_captures.pl +13 -0
- package/test/eyelang/conformance/cases/071_string_edges.pl +10 -0
- package/test/eyelang/conformance/cases/072_string_conversions.pl +10 -0
- package/test/eyelang/conformance/cases/073_term_introspection_edges.pl +10 -0
- package/test/eyelang/conformance/cases/074_forall_edges.pl +10 -0
- package/test/eyelang/conformance/cases/075_aggregation_edges.pl +12 -0
- package/test/eyelang/conformance/cases/076_composed_reusable_builtins.pl +8 -0
- package/test/eyelang/conformance/cases/077_recursive_path_with_lists.pl +10 -0
- package/test/eyelang/conformance/cases/078_mutual_recursion_with_arithmetic.pl +7 -0
- package/test/eyelang/conformance/cases/079_big_integer_arithmetic.pl +8 -0
- package/test/eyelang/conformance/cases/080_rounding_modes.pl +10 -0
- package/test/eyelang/conformance/cases/081_zero_safe_numeric_functions.pl +9 -0
- package/test/eyelang/conformance/cases/082_comparison_semantics.pl +10 -0
- package/test/eyelang/conformance/cases/083_between_modes_and_empty_ranges.pl +8 -0
- package/test/eyelang/conformance/cases/084_append_and_select_composition.pl +7 -0
- package/test/eyelang/conformance/cases/085_nth_and_update_edges.pl +8 -0
- package/test/eyelang/conformance/cases/086_slicing_pipeline.pl +10 -0
- package/test/eyelang/conformance/cases/087_sort_reverse_length.pl +8 -0
- package/test/eyelang/conformance/cases/088_list_summaries_failures.pl +8 -0
- package/test/eyelang/conformance/cases/089_string_split_join_pipeline.pl +7 -0
- package/test/eyelang/conformance/cases/090_string_substring_replace_edges.pl +9 -0
- package/test/eyelang/conformance/cases/091_string_case_and_trim.pl +7 -0
- package/test/eyelang/conformance/cases/092_scalar_string_conversions.pl +9 -0
- package/test/eyelang/conformance/cases/093_regex_named_captures_context.pl +8 -0
- package/test/eyelang/conformance/cases/094_context_holds_enumeration.pl +7 -0
- package/test/eyelang/conformance/cases/095_term_introspection_roundtrip.pl +8 -0
- package/test/eyelang/conformance/cases/096_functor_scalar_edges.pl +8 -0
- package/test/eyelang/conformance/cases/097_control_negation_once_forall.pl +13 -0
- package/test/eyelang/conformance/cases/098_aggregation_nested_templates.pl +11 -0
- package/test/eyelang/conformance/cases/099_materialize_multiple_arities.pl +8 -0
- package/test/eyelang/conformance/cases/100_reusable_builtin_workflow.pl +10 -0
- package/test/eyelang/conformance/expected/001_fact_output.pl +1 -0
- package/test/eyelang/conformance/expected/002_rule_recursion.pl +2 -0
- package/test/eyelang/conformance/expected/003_terms_and_readback.pl +13 -0
- package/test/eyelang/conformance/expected/004_conjunction_and_parentheses.pl +1 -0
- package/test/eyelang/conformance/expected/005_list_deconstruction.pl +2 -0
- package/test/eyelang/conformance/expected/006_comma_formula_data.pl +1 -0
- package/test/eyelang/conformance/expected/007_anonymous_variables.pl +1 -0
- package/test/eyelang/conformance/expected/008_graphic_atoms.pl +3 -0
- package/test/eyelang/conformance/expected/009_comments_and_whitespace.pl +2 -0
- package/test/eyelang/conformance/expected/010_variable_scope_and_reuse.pl +2 -0
- package/test/eyelang/conformance/expected/011_predicate_arity.pl +2 -0
- package/test/eyelang/conformance/expected/012_nested_compound_unification.pl +2 -0
- package/test/eyelang/conformance/expected/013_multiple_clauses_order.pl +2 -0
- package/test/eyelang/conformance/expected/014_failure_filters_answers.pl +1 -0
- package/test/eyelang/conformance/expected/015_improper_list_unification.pl +3 -0
- package/test/eyelang/conformance/expected/016_zero_arity_compound.pl +1 -0
- package/test/eyelang/conformance/expected/017_three_step_recursion.pl +3 -0
- package/test/eyelang/conformance/expected/018_quoted_atom_readback.pl +3 -0
- package/test/eyelang/conformance/expected/019_parenthesized_three_conjuncts.pl +1 -0
- package/test/eyelang/conformance/expected/020_nested_list_terms.pl +2 -0
- package/test/eyelang/conformance/expected/021_repeated_variable_head.pl +2 -0
- package/test/eyelang/conformance/expected/022_rule_head_structure.pl +2 -0
- package/test/eyelang/conformance/expected/023_quoted_escapes_readback.pl +2 -0
- package/test/eyelang/conformance/expected/024_numeric_literal_readback.pl +3 -0
- package/test/eyelang/conformance/expected/025_body_parentheses_with_formula_data.pl +1 -0
- package/test/eyelang/conformance/expected/026_underscore_named_variable_reuse.pl +1 -0
- package/test/eyelang/conformance/expected/027_default_derived_output.pl +3 -0
- package/test/eyelang/conformance/expected/028_materialize_focus.pl +1 -0
- package/test/eyelang/conformance/expected/029_arithmetic_and_comparison.pl +9 -0
- package/test/eyelang/conformance/expected/030_strings_and_atoms.pl +2 -0
- package/test/eyelang/conformance/expected/031_lists_aggregation_ordering.pl +9 -0
- package/test/eyelang/conformance/expected/032_holds_parts.pl +3 -0
- package/test/eyelang/conformance/expected/033_negation_once_generators.pl +2 -0
- package/test/eyelang/conformance/expected/034_equality_and_inequality.pl +4 -0
- package/test/eyelang/conformance/expected/035_list_relations.pl +4 -0
- package/test/eyelang/conformance/expected/036_append_splits.pl +3 -0
- package/test/eyelang/conformance/expected/037_matching_and_comparison.pl +5 -0
- package/test/eyelang/conformance/expected/038_memoize_declaration.pl +2 -0
- package/test/eyelang/conformance/expected/039_numeric_functions.pl +7 -0
- package/test/eyelang/conformance/expected/040_between_enumeration.pl +3 -0
- package/test/eyelang/conformance/expected/041_smallest_divisor.pl +1 -0
- package/test/eyelang/conformance/expected/042_negation_filter.pl +2 -0
- package/test/eyelang/conformance/expected/043_once_user_predicate.pl +1 -0
- package/test/eyelang/conformance/expected/044_findall_user_goal.pl +1 -0
- package/test/eyelang/conformance/expected/045_sort_deduplicates_atoms.pl +1 -0
- package/test/eyelang/conformance/expected/046_append_bound_prefix_suffix.pl +2 -0
- package/test/eyelang/conformance/expected/047_nth0_index_generation.pl +1 -0
- package/test/eyelang/conformance/expected/048_set_nth0_edges.pl +2 -0
- package/test/eyelang/conformance/expected/049_select_duplicate_occurrences.pl +2 -0
- package/test/eyelang/conformance/expected/050_not_member_filter.pl +1 -0
- package/test/eyelang/conformance/expected/051_nested_holds_parts.pl +3 -0
- package/test/eyelang/conformance/expected/052_holds_member.pl +2 -0
- package/test/eyelang/conformance/expected/053_materialize_excludes_source_fact.pl +1 -0
- package/test/eyelang/conformance/expected/054_numeric_and_lexical_comparison.pl +3 -0
- package/test/eyelang/conformance/expected/055_string_matching_filters.pl +2 -0
- package/test/eyelang/conformance/expected/056_string_and_atom_concat.pl +1 -0
- package/test/eyelang/conformance/expected/057_countall_empty_and_nonempty.pl +1 -0
- package/test/eyelang/conformance/expected/058_sumall_numeric_template.pl +1 -0
- package/test/eyelang/conformance/expected/059_aggregate_min_template.pl +1 -0
- package/test/eyelang/conformance/expected/060_aggregate_max_compound_key.pl +1 -0
- package/test/eyelang/conformance/expected/061_date_difference.pl +2 -0
- package/test/eyelang/conformance/expected/062_reusable_numeric_builtins.pl +8 -0
- package/test/eyelang/conformance/expected/063_reusable_list_builtins.pl +9 -0
- package/test/eyelang/conformance/expected/064_reusable_string_builtins.pl +10 -0
- package/test/eyelang/conformance/expected/065_reusable_term_control_builtins.pl +6 -0
- package/test/eyelang/conformance/expected/066_numeric_edges.pl +12 -0
- package/test/eyelang/conformance/expected/067_list_edges.pl +8 -0
- package/test/eyelang/conformance/expected/068_list_generation_order.pl +10 -0
- package/test/eyelang/conformance/expected/069_list_summaries_and_sets.pl +7 -0
- package/test/eyelang/conformance/expected/070_matches_named_captures.pl +1 -0
- package/test/eyelang/conformance/expected/071_string_edges.pl +8 -0
- package/test/eyelang/conformance/expected/072_string_conversions.pl +8 -0
- package/test/eyelang/conformance/expected/073_term_introspection_edges.pl +8 -0
- package/test/eyelang/conformance/expected/074_forall_edges.pl +5 -0
- package/test/eyelang/conformance/expected/075_aggregation_edges.pl +7 -0
- package/test/eyelang/conformance/expected/076_composed_reusable_builtins.pl +5 -0
- package/test/eyelang/conformance/expected/077_recursive_path_with_lists.pl +3 -0
- package/test/eyelang/conformance/expected/078_mutual_recursion_with_arithmetic.pl +7 -0
- package/test/eyelang/conformance/expected/079_big_integer_arithmetic.pl +6 -0
- package/test/eyelang/conformance/expected/080_rounding_modes.pl +8 -0
- package/test/eyelang/conformance/expected/081_zero_safe_numeric_functions.pl +7 -0
- package/test/eyelang/conformance/expected/082_comparison_semantics.pl +8 -0
- package/test/eyelang/conformance/expected/083_between_modes_and_empty_ranges.pl +8 -0
- package/test/eyelang/conformance/expected/084_append_and_select_composition.pl +10 -0
- package/test/eyelang/conformance/expected/085_nth_and_update_edges.pl +8 -0
- package/test/eyelang/conformance/expected/086_slicing_pipeline.pl +7 -0
- package/test/eyelang/conformance/expected/087_sort_reverse_length.pl +6 -0
- package/test/eyelang/conformance/expected/088_list_summaries_failures.pl +6 -0
- package/test/eyelang/conformance/expected/089_string_split_join_pipeline.pl +4 -0
- package/test/eyelang/conformance/expected/090_string_substring_replace_edges.pl +7 -0
- package/test/eyelang/conformance/expected/091_string_case_and_trim.pl +5 -0
- package/test/eyelang/conformance/expected/092_scalar_string_conversions.pl +7 -0
- package/test/eyelang/conformance/expected/093_regex_named_captures_context.pl +5 -0
- package/test/eyelang/conformance/expected/094_context_holds_enumeration.pl +8 -0
- package/test/eyelang/conformance/expected/095_term_introspection_roundtrip.pl +6 -0
- package/test/eyelang/conformance/expected/096_functor_scalar_edges.pl +6 -0
- package/test/eyelang/conformance/expected/097_control_negation_once_forall.pl +5 -0
- package/test/eyelang/conformance/expected/098_aggregation_nested_templates.pl +5 -0
- package/test/eyelang/conformance/expected/099_materialize_multiple_arities.pl +4 -0
- package/test/eyelang/conformance/expected/100_reusable_builtin_workflow.pl +6 -0
- package/test/eyelang/run-conformance.mjs +20 -22
package/docs/eyelang-guide.md
CHANGED
|
@@ -460,7 +460,7 @@ node test/eyelang/run-regression.mjs
|
|
|
460
460
|
node test/eyelang/run-examples.mjs
|
|
461
461
|
```
|
|
462
462
|
|
|
463
|
-
The conformance suite lives in [`test/eyelang/conformance/`](../test/eyelang/conformance/)
|
|
463
|
+
The conformance suite lives in [`test/eyelang/conformance/`](../test/eyelang/conformance/) as one flat eyelang corpus. Each case is a small `.pl` program with an exact expected stdout `.pl` file, and some cases also include a goal file for testing the embeddable solver, so other implementations can reuse the same cases. The suite covers the standard language surface from the language reference, including reusable built-ins. The regression suite lives in [`test/eyelang/run-regression.mjs`](../test/eyelang/run-regression.mjs) and covers CLI regressions, the public JavaScript API, and white-box invariants for parser, unification, and indexing behavior.
|
|
464
464
|
|
|
465
465
|
## Development and release
|
|
466
466
|
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
- [9.8 Aggregation and ordering](#98-aggregation-and-ordering)
|
|
42
42
|
- [9.9 Context terms](#99-context-terms)
|
|
43
43
|
- [9.10 Search control](#910-search-control)
|
|
44
|
-
- [10.
|
|
44
|
+
- [10. Implementation-specific built-ins](#10-implementation-specific-built-ins)
|
|
45
45
|
- [11. Declarations](#11-declarations)
|
|
46
46
|
- [11.1 Memoization](#111-memoization)
|
|
47
47
|
- [11.2 Default-output materialization](#112-default-output-materialization)
|
|
@@ -51,10 +51,7 @@
|
|
|
51
51
|
- [12.3 Sockets and AI agents](#123-sockets-and-ai-agents)
|
|
52
52
|
- [13. Output and read-back profile](#13-output-and-read-back-profile)
|
|
53
53
|
- [13.1 Explanation output](#131-explanation-output)
|
|
54
|
-
- [14. Conformance
|
|
55
|
-
- [14.1 Core language profile](#141-core-language-profile)
|
|
56
|
-
- [14.2 Standard built-in profile](#142-standard-built-in-profile)
|
|
57
|
-
- [14.3 Standard host profile](#143-standard-host-profile)
|
|
54
|
+
- [14. Conformance](#14-conformance)
|
|
58
55
|
- [15. Relationship to ISO Prolog](#15-relationship-to-iso-prolog)
|
|
59
56
|
- [16. Examples](#16-examples)
|
|
60
57
|
- [16.1 Transitive closure](#161-transitive-closure)
|
|
@@ -345,7 +342,7 @@ This section specifies the **standard built-ins** of the eyelang language. An im
|
|
|
345
342
|
|
|
346
343
|
A built-in call is still written as an atomic formula, but the relation is provided by the host implementation rather than by source clauses. Several built-ins are mode-sensitive: they are intended to run when their input arguments are sufficiently ground, and implementations may leave user-defined clauses visible when that mode is not yet satisfied.
|
|
347
344
|
|
|
348
|
-
Implementations MAY provide additional built-ins, but such built-ins are
|
|
345
|
+
Implementations MAY provide additional built-ins, but such built-ins are implementation-specific and are not part of this normative catalog. Implementation-specific built-ins are discussed separately in section 10.
|
|
349
346
|
|
|
350
347
|
### 9.1 Equality and unification
|
|
351
348
|
|
|
@@ -485,13 +482,13 @@ The N3 example [`context-schema-audit.n3`](../examples/context-schema-audit.n3)
|
|
|
485
482
|
| `once(Goal)` | Succeeds with at most the first solution of `Goal`. |
|
|
486
483
|
| `forall(Generator, Test)` | Succeeds when every solution of `Generator` also satisfies `Test`; succeeds vacuously when `Generator` has no solutions. |
|
|
487
484
|
|
|
488
|
-
## 10.
|
|
485
|
+
## 10. Implementation-specific built-ins
|
|
489
486
|
|
|
490
|
-
Implementations MAY provide additional built-ins beyond the standard predicates listed above. Such built-ins are **
|
|
487
|
+
Implementations MAY provide additional built-ins beyond the standard predicates listed above. Such built-ins are **implementation-specific built-ins**. They are useful for embedding eyelang in particular host environments, exposing efficient finite-domain solvers, or providing domain-specific relations for applications.
|
|
491
488
|
|
|
492
|
-
|
|
489
|
+
Implementation-specific built-ins are not required for conformance to this specification. A portable eyelang program SHOULD NOT depend on one unless the target implementation explicitly documents it.
|
|
493
490
|
|
|
494
|
-
An
|
|
491
|
+
An implementation-specific built-in SHOULD obey the same surface-language discipline as standard built-ins:
|
|
495
492
|
|
|
496
493
|
- it is called using ordinary atomic-formula syntax, for example `some_extension(A, B)`;
|
|
497
494
|
- its arguments and results are eyelang terms from the Herbrand universe;
|
|
@@ -499,9 +496,9 @@ An extension built-in SHOULD obey the same surface-language discipline as standa
|
|
|
499
496
|
- it SHOULD document its intended modes, especially which arguments must be ground before it runs deterministically;
|
|
500
497
|
- it MUST NOT change the meaning of ordinary facts, rules, unification, or standard built-ins.
|
|
501
498
|
|
|
502
|
-
For example, an implementation may include
|
|
499
|
+
For example, an implementation may include host-specific integrations or domain accelerators. Those modules may be valuable and may make applications much faster, but their predicate names, arities, algorithms, and modes are implementation-defined unless they are separately standardized.
|
|
503
500
|
|
|
504
|
-
An implementation that provides explanation output SHOULD make
|
|
501
|
+
An implementation that provides explanation output SHOULD make implementation-specific built-ins explainable at least as opaque successful or failed built-in calls, so that proof traces do not incorrectly report "no clauses" for a host-provided relation.
|
|
505
502
|
|
|
506
503
|
## 11. Declarations
|
|
507
504
|
|
|
@@ -623,37 +620,25 @@ Default host output behavior is:
|
|
|
623
620
|
|
|
624
621
|
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.
|
|
625
622
|
|
|
626
|
-
## 14. Conformance
|
|
623
|
+
## 14. Conformance
|
|
627
624
|
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
A conforming core language implementation supports:
|
|
625
|
+
A conforming eyelang implementation supports the standard language described above as one conformance surface rather than as separate core and extension profiles. This includes:
|
|
631
626
|
|
|
632
627
|
- lexical syntax described above;
|
|
633
628
|
- facts and definite clauses;
|
|
634
629
|
- first-order unification without occurs check;
|
|
635
630
|
- left-to-right goal-directed proof search;
|
|
636
631
|
- lists and comma conjunctions;
|
|
637
|
-
- answer printing
|
|
638
|
-
|
|
639
|
-
### 14.2 Standard built-in profile
|
|
640
|
-
|
|
641
|
-
A conforming standard built-in implementation supports the built-ins listed in section 9. These are the portable built-ins independent implementations should implement when they claim standard built-in compatibility.
|
|
642
|
-
|
|
643
|
-
### 14.3 Standard host profile
|
|
644
|
-
|
|
645
|
-
A conforming standard host also supports:
|
|
646
|
-
|
|
632
|
+
- answer printing and read-back formatting;
|
|
633
|
+
- the standard built-ins listed in section 9;
|
|
647
634
|
- `memoize/2` declarations;
|
|
648
635
|
- `materialize/2` declarations;
|
|
649
636
|
- default derived output;
|
|
650
|
-
- explanation output
|
|
651
|
-
- stdin, file, and URL inputs in the CLI.
|
|
652
|
-
|
|
653
|
-
Browser execution, package layout, and any extension built-ins described in implementation documentation are outside this specification unless separately standardized.
|
|
637
|
+
- explanation output when the host exposes proof output.
|
|
654
638
|
|
|
639
|
+
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.
|
|
655
640
|
|
|
656
|
-
Conformance cases
|
|
641
|
+
Conformance cases live in the repository under `test/eyelang/conformance/`. They are run by `npm test` before the example suite, and can be run alone with `node test/eyelang/run-conformance.mjs`. Each case has an input program under `conformance/cases/` and an exact expected standard-output file under `conformance/expected/`; both use `.pl` so expected output remains eyelang-readable.
|
|
657
642
|
|
|
658
643
|
## 15. Relationship to ISO Prolog
|
|
659
644
|
|
package/package.json
CHANGED
|
@@ -4,8 +4,8 @@ This directory contains the executable conformance cases for the eyelang languag
|
|
|
4
4
|
|
|
5
5
|
The suite is intentionally file-based so another implementation can run the same programs and compare exact standard output. A case consists of:
|
|
6
6
|
|
|
7
|
-
- `conformance/cases/<
|
|
8
|
-
- `conformance/expected/<
|
|
7
|
+
- `conformance/cases/<name>.pl` — input program;
|
|
8
|
+
- `conformance/expected/<name>.pl` — exact expected standard output, stored as eyelang-readable facts.
|
|
9
9
|
|
|
10
10
|
The current runner compares standard output from normal execution. Proof explanations are opt-in in the CLI and are not part of these conformance goldens. Standard error, performance, and resource limits are outside this suite.
|
|
11
11
|
|
|
@@ -23,23 +23,21 @@ Run only the conformance suite:
|
|
|
23
23
|
node test/eyelang/run-conformance.mjs
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
Run
|
|
26
|
+
Run matching conformance cases by passing a filename fragment:
|
|
27
27
|
|
|
28
28
|
```sh
|
|
29
|
-
node test/eyelang/run-conformance.mjs
|
|
30
|
-
node test/eyelang/run-conformance.mjs
|
|
29
|
+
node test/eyelang/run-conformance.mjs reusable
|
|
30
|
+
node test/eyelang/run-conformance.mjs 092_scalar_string_conversions
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
The runner executes materialized programs in-process through the public JavaScript API so small conformance cases avoid measuring Node startup overhead.
|
|
34
34
|
|
|
35
|
-
##
|
|
35
|
+
## Scope
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
The conformance corpus is a single eyelang suite. It covers the standard language described by the language reference: lexical syntax, facts, definite clauses, first-order terms, lists, conjunction, structured unification, left-to-right goal-directed proof search, materialized output, read-back printing, standard built-ins, declarations, and standard host behavior.
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
The profile name `extension` is a test-suite grouping name. It does not mean that these cases are outside the eyelang language reference; most of them correspond to the standard built-in profile and standard host profile in the [eyelang language reference](../../../docs/eyelang-language-reference.md).
|
|
39
|
+
The suite deliberately does not separate `core` and `extension` profiles. Reusable built-ins such as arithmetic, strings, lists, aggregation, context terms, term inspection, and search control are part of the standard eyelang conformance surface. Implementation-specific built-ins may still exist in downstream hosts, but they should have their own tests outside this corpus unless they are standardized.
|
|
42
40
|
|
|
43
41
|
## Updating expected output
|
|
44
42
|
|
|
45
|
-
There is no committed auto-accept mode. To update an expected file, run the matching case with the conformance runner, inspect the result, and replace the corresponding file under `conformance/expected
|
|
43
|
+
There is no committed auto-accept mode. To update an expected file, run the matching case with the conformance runner, inspect the result, and replace the corresponding file under `conformance/expected/` deliberately.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
% Reference 6, 7: definite clauses, conjunction, and recursive proof search.
|
|
2
|
+
materialize(ancestor, 2).
|
|
3
|
+
parent(pat, jan).
|
|
4
|
+
parent(jan, emma).
|
|
5
|
+
ancestor_any(X, Y) :- parent(X, Y).
|
|
6
|
+
ancestor_any(X, Z) :- parent(X, Y), ancestor_any(Y, Z).
|
|
7
|
+
ancestor(pat, Y) :- ancestor_any(pat, Y).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ancestor(pat, X)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
% Reference 3, 5, 11: scalars, compounds, lists, and read-back printing.
|
|
2
|
+
materialize(value, 2).
|
|
3
|
+
raw_value(atom, pat).
|
|
4
|
+
raw_value(quoted_atom, 'atom with spaces').
|
|
5
|
+
raw_value(quoted_quote, 'needs''quote').
|
|
6
|
+
raw_value(empty_atom, '').
|
|
7
|
+
raw_value(string, "line\nquote: \"ok\"").
|
|
8
|
+
raw_value(integer, -42).
|
|
9
|
+
raw_value(decimal, 0.25).
|
|
10
|
+
raw_value(scientific, 1.25e-3).
|
|
11
|
+
raw_value(compound, pair(3, nested(atom, [x, y]))).
|
|
12
|
+
raw_value(zero_arity, nil()).
|
|
13
|
+
raw_value(empty_list, []).
|
|
14
|
+
raw_value(proper_list, [a, b, c]).
|
|
15
|
+
raw_value(improper_list, [a, b | tail]).
|
|
16
|
+
value(K, V) :- raw_value(K, V).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
value(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ok(X, Y)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
value(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
% Reference 5.1, 7.1: variable occurrences are scoped per clause and reused within a clause.
|
|
2
|
+
edge(a, b).
|
|
3
|
+
edge(b, c).
|
|
4
|
+
edge(c, d).
|
|
5
|
+
two_step(X, Z) :- edge(X, Y), edge(Y, Z).
|
|
6
|
+
answer(from_a, Z) :- two_step(a, Z).
|
|
7
|
+
answer(from_b, Z) :- two_step(b, Z).
|
|
8
|
+
materialize(answer, 2).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(X, V)
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
% Reference 5.4: improper list surface syntax unifies with head-tail structure.
|
|
2
|
+
cell([head | tail], head, tail).
|
|
3
|
+
answer(list, L) :- cell(L, head, tail).
|
|
4
|
+
answer(head, H) :- cell([H | tail], H, tail).
|
|
5
|
+
answer(tail, T) :- cell([head | T], head, T).
|
|
6
|
+
materialize(answer, 2).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
% Reference 9.2, 9.3: arithmetic and comparison built-ins.
|
|
2
|
+
answer(sum, X) :- add(2, 3, X).
|
|
3
|
+
answer(diff, X) :- sub(7, 4, X).
|
|
4
|
+
answer(product, X) :- mul(6, 7, X).
|
|
5
|
+
answer(integer_division, X) :- div(7, 2, X).
|
|
6
|
+
answer(remainder, X) :- mod(7, 2, X).
|
|
7
|
+
answer(power, X) :- pow(2, 8, X).
|
|
8
|
+
answer(minimum, X) :- min(3, 9, X).
|
|
9
|
+
answer(less_than, true) :- lt(3, 9).
|
|
10
|
+
answer(greater_equal, true) :- ge(9, 9).
|
|
11
|
+
materialize(answer, 2).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
% Reference 9.7, 9.8: list, aggregation, and ordering built-ins.
|
|
2
|
+
answer(member, X) :- member(X, [a, b]).
|
|
3
|
+
answer(append, X) :- append([a], [b, c], X).
|
|
4
|
+
answer(nth0, X) :- nth0(1, [a, b, c], X).
|
|
5
|
+
answer(set_nth0, X) :- set_nth0(1, [a, b, c], x, X).
|
|
6
|
+
answer(reverse, X) :- reverse([a, b, c], X).
|
|
7
|
+
answer(length, N) :- length([a, b, c], N).
|
|
8
|
+
answer(findall, X) :- findall(N, between(1, 3, N), X).
|
|
9
|
+
answer(sort, X) :- sort([b, a, b], X).
|
|
10
|
+
materialize(answer, 2).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
% Reference 9.1: eq/2 unifies terms and neq/2 succeeds on non-unifiable terms.
|
|
2
|
+
answer(eq_variable, X) :- eq(X, pair(a, [b, c])).
|
|
3
|
+
answer(eq_nested, true) :- eq(pair(X, X), pair(same, same)).
|
|
4
|
+
answer(neq_atoms, true) :- neq(alice, bob).
|
|
5
|
+
answer(neq_structures, true) :- neq(pair(a), pair(a, b)).
|
|
6
|
+
materialize(answer, 2).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
% Reference 9.3, 9.6: lexical comparison and simple text matching.
|
|
2
|
+
answer(matches, true) :- matches("eyelang", "eye").
|
|
3
|
+
answer(not_matches, true) :- not_matches("eyelang", "cat").
|
|
4
|
+
answer(lex_lt, true) :- lt(alpha, beta).
|
|
5
|
+
answer(lex_gt, true) :- gt(beta, alpha).
|
|
6
|
+
answer(numeric_le, true) :- le(2, 2).
|
|
7
|
+
materialize(answer, 2).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
% Reference 10.1: memoize/2 is a declaration and does not change answers.
|
|
2
|
+
materialize(reach, 2).
|
|
3
|
+
memoize(reach_any, 2).
|
|
4
|
+
edge(a, b).
|
|
5
|
+
edge(b, c).
|
|
6
|
+
reach_any(X, Y) :- edge(X, Y).
|
|
7
|
+
reach_any(X, Z) :- edge(X, Y), reach_any(Y, Z).
|
|
8
|
+
reach(a, Y) :- reach_any(a, Y).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
reach(a, X)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
% Reference 9.2: scalar arithmetic functions return numeric values.
|
|
2
|
+
answer(neg, X) :- neg(5, X).
|
|
3
|
+
answer(abs, X) :- abs(-5, X).
|
|
4
|
+
answer(rounded, X) :- rounded(2.6, X).
|
|
5
|
+
answer(sin_zero, X) :- sin(0, X).
|
|
6
|
+
answer(cos_zero, X) :- cos(0, X).
|
|
7
|
+
answer(log_one, X) :- log(1, X).
|
|
8
|
+
answer(float_division, X) :- div(7.0, 2.0, X).
|
|
9
|
+
materialize(answer, 2).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
answer(K, V)
|