eyelang 0.5.1 → 0.5.2
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 +7 -7
- package/book-assets/cli-observation-loop.svg +1 -1
- package/book-assets/example-landscape.svg +1 -1
- package/book-assets/laboratory-progression.svg +1 -1
- package/book-assets/part-4-craft.svg +1 -1
- package/book-assets/rdf-adapter-pipeline.svg +3 -3
- package/book-assets/reference-navigation.svg +1 -1
- package/book-assets/review-lenses.svg +1 -1
- package/book-assets/title-page.svg +2 -2
- package/conformance-report.md +1 -1
- package/examples/book/README.md +4 -4
- package/examples/book/chapter-01/01-parent.pl +1 -1
- package/examples/book/chapter-01/02-child.pl +1 -1
- package/examples/book/chapter-02/01-measurement.pl +1 -1
- package/examples/book/chapter-02/02-label.pl +1 -1
- package/examples/book/chapter-03/01-eligible.pl +1 -1
- package/examples/book/chapter-03/02-adult.pl +1 -1
- package/examples/book/chapter-03/03-can_enter.pl +1 -1
- package/examples/book/chapter-03/04-high_score.pl +1 -1
- package/examples/book/chapter-03/05-parent.pl +1 -1
- package/examples/book/chapter-03/06-ancestor.pl +1 -1
- package/examples/book/chapter-03/07-different.pl +1 -1
- package/examples/book/chapter-03/08-has_parent.pl +1 -1
- package/examples/book/chapter-03/09-program.pl +1 -1
- package/examples/book/chapter-03/10-closed.pl +1 -1
- package/examples/book/chapter-03/11-p.pl +1 -1
- package/examples/book/chapter-04/01-path.pl +1 -1
- package/examples/book/chapter-05/01-first.pl +1 -1
- package/examples/book/chapter-05/02-reverse_acc.pl +1 -1
- package/examples/book/chapter-06/01-next.pl +1 -1
- package/examples/book/chapter-06/02-safe_reading.pl +1 -1
- package/examples/book/chapter-06/03-square.pl +1 -1
- package/examples/book/chapter-06/04-factorial.pl +1 -1
- package/examples/book/chapter-07/01-allowed.pl +1 -1
- package/examples/book/chapter-07/02-all_tests_pass.pl +1 -1
- package/examples/book/chapter-08/01-findall.pl +1 -1
- package/examples/book/chapter-08/02-outgoing_costs.pl +1 -1
- package/examples/book/chapter-08/03-best_route.pl +1 -1
- package/examples/book/chapter-09/01-functor.pl +1 -1
- package/examples/book/chapter-09/02-normalized.pl +1 -1
- package/examples/book/chapter-09/03-message.pl +1 -1
- package/examples/book/chapter-10/01-plan.pl +1 -1
- package/examples/book/chapter-11/01-why.pl +1 -1
- package/examples/book/chapter-12/01-invalid_probability.pl +1 -1
- package/examples/book/chapter-12/02-invalid_assignment.pl +1 -1
- package/examples/book/chapter-14/01-heating.pl +1 -1
- package/examples/book/chapter-15/01-rdf.pl +1 -1
- package/examples/book/chapter-16/01-socket.pl +1 -1
- package/examples/book/chapter-16/02-socket-2.pl +1 -1
- package/examples/book/chapter-17/01-path.pl +1 -1
- package/examples/book/chapter-17/02-adult.pl +1 -1
- package/examples/book/chapter-17/03-bad_member.pl +1 -1
- package/examples/book/chapter-17/04-item.pl +1 -1
- package/examples/book/chapter-18/01-routeable.pl +1 -1
- package/examples/book/chapter-18/02-routeable-2.pl +1 -1
- package/examples/book/chapter-18/03-prefix.pl +1 -1
- package/examples/book/chapter-18/04-candidate_pair.pl +1 -1
- package/examples/book/chapter-18/05-compatible_pair.pl +1 -1
- package/examples/book/chapter-19/01-factorial.pl +1 -1
- package/examples/book/chapter-19/02-invalid_limits.pl +1 -1
- package/examples/book/chapter-20/01-connected.pl +1 -1
- package/examples/book/chapter-20/02-within_thermal_limits.pl +1 -1
- package/examples/book/chapter-20/03-search.pl +1 -1
- package/examples/book/chapter-21/01-grandparent.pl +1 -1
- package/examples/book/chapter-21/02-loop_edge.pl +1 -1
- package/examples/book/chapter-21/03-eligible.pl +1 -1
- package/examples/book/chapter-21/04-grows.pl +1 -1
- package/examples/book/chapter-22/01-tree.pl +1 -1
- package/examples/book/chapter-22/02-tree_member.pl +1 -1
- package/examples/book/chapter-22/03-mirror.pl +1 -1
- package/examples/book/chapter-22/04-evaluate.pl +1 -1
- package/examples/book/chapter-22/05-lookup.pl +1 -1
- package/examples/book/chapter-22/06-simplify.pl +1 -1
- package/examples/book/chapter-23/01-adult.pl +1 -1
- package/examples/book/chapter-23/02-adult-2.pl +1 -1
- package/examples/book/chapter-23/03-can_board.pl +1 -1
- package/examples/book/chapter-23/04-traveler_in_good_standing.pl +1 -1
- package/examples/book/chapter-23/05-connection.pl +1 -1
- package/examples/book/chapter-23/06-rail_connection.pl +1 -1
- package/examples/book/chapter-23/07-sum_numbers.pl +1 -1
- package/examples/book/chapter-23/08-sum_numbers_acc.pl +1 -1
- package/examples/book/chapter-24/01-simple_path.pl +1 -1
- package/examples/book/chapter-24/02-reachable.pl +1 -1
- package/examples/book/chapter-24/03-best_plan.pl +1 -1
- package/examples/book/chapter-25/01-person.pl +1 -1
- package/examples/book/chapter-25/02-active_badge.pl +1 -1
- package/examples/book/chapter-25/03-in_good_standing.pl +1 -1
- package/examples/book/chapter-25/04-incompatible_status.pl +1 -1
- package/examples/book/chapter-26/01-mortal.pl +1 -1
- package/examples/book/chapter-26/02-triple.pl +1 -1
- package/examples/book/chapter-26/03-edge.pl +1 -1
- package/examples/book/chapter-27/01-natural.pl +1 -1
- package/examples/book/chapter-27/02-list_length.pl +1 -1
- package/examples/book/chapter-27/03-reverse_acc.pl +1 -1
- package/examples/book/chapter-28/01-program.pl +1 -1
- package/examples/book/chapter-28/02-triangle.pl +1 -1
- package/examples/book/chapter-28/03-rectangle.pl +1 -1
- package/examples/book/chapter-28/04-preserves_combine.pl +1 -1
- package/examples/book/chapter-29/01-noncommuting_pair.pl +1 -1
- package/examples/book/chapter-32/01-eligible.pl +1 -1
- package/examples/book/chapter-32/02-eligible-2.pl +1 -1
- package/examples/book/chapter-33/01-assigned_badge.pl +1 -1
- package/examples/book/chapter-33/02-source_role.pl +1 -1
- package/examples/book/chapter-33/03-chosen_pair.pl +1 -1
- package/examples/book/chapter-33/04-path.pl +1 -1
- package/examples/book/chapter-33/05-unregistered.pl +1 -1
- package/examples/book/chapter-33/06-step.pl +1 -1
- package/examples/book/chapter-33/07-depends.pl +1 -1
- package/examples/book/chapter-33/08-within_limit.pl +1 -1
- package/examples/book/chapter-33/09-invalid_badge_assignment.pl +1 -1
- package/examples/book/chapter-33/10-theory_version.pl +1 -1
- package/examples/book/chapter-34/01-travel_status.pl +1 -1
- package/examples/book/chapter-34/02-require_route.pl +1 -1
- package/examples/book/chapter-34/03-regional_total.pl +1 -1
- package/examples/book/chapter-35/01-term_shape.pl +1 -1
- package/examples/book/chapter-36/01-program.pl +1 -1
- package/examples/book/chapter-36/02-program-2.pl +1 -1
- package/examples/book/chapter-36/03-program-3.pl +1 -1
- package/examples/book/chapter-37/01-write_event.pl +1 -1
- package/examples/book/chapter-38/01-city.pl +1 -1
- package/examples/cdcl-sat-solver.pl +2 -2
- package/examples/collatz-1000.pl +1 -1
- package/examples/equality-saturation.pl +1 -1
- package/examples/existential-rule.pl +1 -1
- package/examples/herbrand-semantics.pl +1 -1
- package/examples/herbrand-witnesses.pl +1 -1
- package/examples/iso-integer-arithmetic.pl +1 -1
- package/examples/knowledge-engineering-alignment-flow.pl +1 -1
- package/examples/language.pl +2 -2
- package/examples/law-of-cosines.pl +1 -1
- package/examples/linear-logic-resources.pl +1 -1
- package/examples/markov-logic-network.pl +1 -1
- package/examples/matrix-noncommutativity.pl +1 -1
- package/examples/partial-evaluator.pl +1 -1
- package/examples/peano-calculus.pl +1 -1
- package/examples/prime-range.pl +1 -1
- package/examples/register-allocation.pl +1 -1
- package/examples/route-planning.pl +1 -1
- package/examples/sat-solver-dpll.pl +1 -1
- package/examples/symbolic-derivative.pl +1 -1
- package/examples/term-tools.pl +1 -1
- package/examples/trust-flow-provenance-threshold.pl +1 -1
- package/examples/vector-similarity.pl +1 -1
- package/examples/web-names.pl +1 -1
- package/examples/workplace-compliance.pl +1 -1
- package/index.d.ts +68 -68
- package/index.js +1 -1
- package/package.json +2 -2
- package/playground.html +10 -10
- package/src/cli.js +4 -4
- package/src/explain.js +4 -4
- package/src/index.js +4 -4
- package/src/iso.js +1 -1
- package/src/library.js +7 -7
- package/src/parser.js +1 -1
- package/src/playground-worker.js +2 -2
- package/src/solver.js +4 -4
- package/src/term.js +1 -1
- package/test/conformance/README.md +6 -6
- package/test/conformance/THIRD_PARTY.md +4 -4
- package/test/conformance/cases/iso/logtalk_abolish.pl +1 -1
- package/test/conformance/cases/iso/logtalk_arg_unification.pl +1 -1
- package/test/conformance/cases/iso/logtalk_assert_order.pl +1 -1
- package/test/conformance/cases/iso/logtalk_atom_chars.pl +1 -1
- package/test/conformance/cases/iso/logtalk_atom_codes.pl +1 -1
- package/test/conformance/cases/iso/logtalk_atom_concat.pl +1 -1
- package/test/conformance/cases/iso/logtalk_atom_length.pl +1 -1
- package/test/conformance/cases/iso/logtalk_bagof.pl +1 -1
- package/test/conformance/cases/iso/logtalk_char_code.pl +1 -1
- package/test/conformance/cases/iso/logtalk_clause.pl +1 -1
- package/test/conformance/cases/iso/logtalk_compare_standard_order.pl +1 -1
- package/test/conformance/cases/iso/logtalk_copy_term_semantics.pl +1 -1
- package/test/conformance/cases/iso/logtalk_current_predicate.pl +1 -1
- package/test/conformance/cases/iso/logtalk_current_streams.pl +1 -1
- package/test/conformance/cases/iso/logtalk_findall.pl +1 -1
- package/test/conformance/cases/iso/logtalk_number_chars.pl +1 -1
- package/test/conformance/cases/iso/logtalk_number_codes.pl +1 -1
- package/test/conformance/cases/iso/logtalk_occurs_check.pl +1 -1
- package/test/conformance/cases/iso/logtalk_once.pl +1 -1
- package/test/conformance/cases/iso/logtalk_operators.pl +1 -1
- package/test/conformance/cases/iso/logtalk_prolog_flags.pl +1 -1
- package/test/conformance/cases/iso/logtalk_repeat.pl +1 -1
- package/test/conformance/cases/iso/logtalk_retract.pl +1 -1
- package/test/conformance/cases/iso/logtalk_setof.pl +1 -1
- package/test/conformance/cases/iso/logtalk_sub_atom.pl +1 -1
- package/test/conformance/cases/iso/logtalk_term_comparison.pl +1 -1
- package/test/conformance/cases/iso/logtalk_term_variables.pl +1 -1
- package/test/conformance/cases/iso/logtalk_univ.pl +1 -1
- package/test/conformance/cases/strings/064_reusable_string_builtins.pl +3 -3
- package/test/conformance/cases/strings/071_string_edges.pl +1 -1
- package/test/conformance/errors/iso/logtalk_abolish_arity_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_abolish_bad_indicator.pl +1 -1
- package/test/conformance/errors/iso/logtalk_abolish_name_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_abolish_negative_arity.pl +1 -1
- package/test/conformance/errors/iso/logtalk_abolish_unbound.pl +1 -1
- package/test/conformance/errors/iso/logtalk_abolish_unbound_arity.pl +1 -1
- package/test/conformance/errors/iso/logtalk_arg_index_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_arg_number.pl +1 -1
- package/test/conformance/errors/iso/logtalk_asserta_bad_body.pl +1 -1
- package/test/conformance/errors/iso/logtalk_asserta_noncallable.pl +1 -1
- package/test/conformance/errors/iso/logtalk_assertz_noncallable.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_chars_atom_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_chars_character_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_chars_improper.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_chars_list_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_chars_unbound.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_codes_atom_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_codes_bad_code.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_codes_integer_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_codes_list_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_codes_unbound.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_concat_left_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_concat_right_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_concat_unbound.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_concat_whole_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_length_atom_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_length_integer_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_length_negative.pl +1 -1
- package/test/conformance/errors/iso/logtalk_atom_length_unbound.pl +1 -1
- package/test/conformance/errors/iso/logtalk_bagof_improper.pl +1 -1
- package/test/conformance/errors/iso/logtalk_bagof_nonlist.pl +1 -1
- package/test/conformance/errors/iso/logtalk_char_code_character_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_char_code_integer_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_char_code_negative.pl +1 -1
- package/test/conformance/errors/iso/logtalk_char_code_number_character.pl +1 -1
- package/test/conformance/errors/iso/logtalk_char_code_unbound.pl +1 -1
- package/test/conformance/errors/iso/logtalk_clause_noncallable_body.pl +1 -1
- package/test/conformance/errors/iso/logtalk_clause_noncallable_head.pl +1 -1
- package/test/conformance/errors/iso/logtalk_compare_order_domain.pl +1 -1
- package/test/conformance/errors/iso/logtalk_compare_order_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_current_flag_compound.pl +1 -1
- package/test/conformance/errors/iso/logtalk_current_flag_name_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_current_flag_unknown.pl +1 -1
- package/test/conformance/errors/iso/logtalk_current_input_bad_stream.pl +1 -1
- package/test/conformance/errors/iso/logtalk_current_op_bad_specifier.pl +1 -1
- package/test/conformance/errors/iso/logtalk_current_op_high_priority.pl +1 -1
- package/test/conformance/errors/iso/logtalk_current_output_bad_stream.pl +1 -1
- package/test/conformance/errors/iso/logtalk_current_predicate_bad_name.pl +1 -1
- package/test/conformance/errors/iso/logtalk_current_predicate_negative_arity.pl +1 -1
- package/test/conformance/errors/iso/logtalk_current_predicate_scalar.pl +1 -1
- package/test/conformance/errors/iso/logtalk_findall_improper.pl +1 -1
- package/test/conformance/errors/iso/logtalk_findall_nonlist.pl +1 -1
- package/test/conformance/errors/iso/logtalk_functor_arity_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_functor_compound_name.pl +1 -1
- package/test/conformance/errors/iso/logtalk_functor_float_name.pl +1 -1
- package/test/conformance/errors/iso/logtalk_number_chars_character_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_number_chars_list_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_number_chars_number_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_number_chars_partial.pl +1 -1
- package/test/conformance/errors/iso/logtalk_number_chars_syntax.pl +1 -1
- package/test/conformance/errors/iso/logtalk_number_chars_unbound.pl +1 -1
- package/test/conformance/errors/iso/logtalk_number_codes_bad_code.pl +1 -1
- package/test/conformance/errors/iso/logtalk_number_codes_list_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_number_codes_number_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_number_codes_partial.pl +1 -1
- package/test/conformance/errors/iso/logtalk_number_codes_syntax.pl +1 -1
- package/test/conformance/errors/iso/logtalk_number_codes_unbound.pl +1 -1
- package/test/conformance/errors/iso/logtalk_once_noncallable.pl +1 -1
- package/test/conformance/errors/iso/logtalk_once_unbound.pl +1 -1
- package/test/conformance/errors/iso/logtalk_op_bad_specifier.pl +1 -1
- package/test/conformance/errors/iso/logtalk_op_high_priority.pl +1 -1
- package/test/conformance/errors/iso/logtalk_op_negative_priority.pl +1 -1
- package/test/conformance/errors/iso/logtalk_op_priority_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_op_unbound_name.pl +1 -1
- package/test/conformance/errors/iso/logtalk_op_unbound_priority.pl +1 -1
- package/test/conformance/errors/iso/logtalk_op_unbound_specifier.pl +1 -1
- package/test/conformance/errors/iso/logtalk_retract_unbound.pl +1 -1
- package/test/conformance/errors/iso/logtalk_retract_unbound_head.pl +1 -1
- package/test/conformance/errors/iso/logtalk_set_flag_name_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_set_flag_unbound_name.pl +1 -1
- package/test/conformance/errors/iso/logtalk_set_flag_unbound_value.pl +1 -1
- package/test/conformance/errors/iso/logtalk_set_flag_unknown.pl +1 -1
- package/test/conformance/errors/iso/logtalk_set_flag_value.pl +1 -1
- package/test/conformance/errors/iso/logtalk_setof_nonlist.pl +1 -1
- package/test/conformance/errors/iso/logtalk_sub_atom_before_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_sub_atom_negative.pl +1 -1
- package/test/conformance/errors/iso/logtalk_sub_atom_result_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_sub_atom_source_type.pl +1 -1
- package/test/conformance/errors/iso/logtalk_sub_atom_unbound.pl +1 -1
- package/test/conformance/errors/iso/logtalk_term_variables_improper.pl +1 -1
- package/test/conformance/errors/iso/logtalk_term_variables_nonlist.pl +1 -1
- package/test/conformance/errors/iso/logtalk_univ_head_compound.pl +1 -1
- package/test/conformance/errors/iso/logtalk_univ_head_float.pl +1 -1
- package/test/conformance/errors/iso/logtalk_univ_head_integer.pl +1 -1
- package/test/conformance/errors/iso/logtalk_univ_single_compound.pl +1 -1
- package/test/conformance/expected/strings/064_reusable_string_builtins.pl +1 -1
- package/test/run-conformance-report.mjs +4 -4
- package/test/run-conformance.mjs +3 -3
- package/test/run-playground.mjs +3 -3
- package/test/run-rdf-tools.mjs +15 -15
- package/test/run-regression.mjs +35 -35
- package/the-art-of-eyelang.md +136 -136
- package/tools/README.md +2 -2
- package/tools/extract-book-examples.mjs +4 -4
- package/tools/pl-to-rdf.mjs +2 -2
- package/tools/rdf-codec.mjs +8 -8
- package/tools/rdf-to-pl.mjs +9 -9
- package/why-eyelang.md +47 -47
package/tools/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# RDF round-trip tools
|
|
2
2
|
|
|
3
|
-
These tools translate RDF files into ordinary
|
|
3
|
+
These tools translate RDF files into ordinary Eyelang and queried `rdf/4`
|
|
4
4
|
facts back into RDF 1.2 N-Quads. Input formats are selected automatically from
|
|
5
5
|
the file extension. Supported inputs include RDF 1.2 Turtle, TriG, N-Triples,
|
|
6
6
|
N-Quads and RDF/XML, plus JSON-LD, RDFa, Microdata, Notation3 and SHACL Compact
|
|
7
|
-
Syntax.
|
|
7
|
+
Syntax. Eyelang remains RDF-agnostic.
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
node tools/rdf-to-pl.mjs --rules rules.pl data.nq -o program.pl
|
|
@@ -48,11 +48,11 @@ for (const match of book.matchAll(/^(## \d+\. ([^\n]+)|# ([^\n]+)|```eyelang\n([
|
|
|
48
48
|
|
|
49
49
|
const files = new Map();
|
|
50
50
|
const readme = [
|
|
51
|
-
'# The Art of
|
|
51
|
+
'# The Art of Eyelang — inline examples',
|
|
52
52
|
'',
|
|
53
53
|
'These files are generated from the complete `eyelang` code blocks in',
|
|
54
|
-
'[The Art of
|
|
55
|
-
'retain the source text from the book. Goal fragments and non-
|
|
54
|
+
'[The Art of Eyelang](../../the-art-of-eyelang.md). They are grouped by chapter and',
|
|
55
|
+
'retain the source text from the book. Goal fragments and non-Eyelang blocks are',
|
|
56
56
|
'not extracted.',
|
|
57
57
|
'',
|
|
58
58
|
'Regenerate them from the repository root with:',
|
|
@@ -79,7 +79,7 @@ for (const item of chapters) {
|
|
|
79
79
|
const heading = example.section ? ` — ${example.section}` : '';
|
|
80
80
|
files.set(
|
|
81
81
|
relative,
|
|
82
|
-
`% From The Art of
|
|
82
|
+
`% From The Art of Eyelang, Chapter ${item.number}${heading}.\n${example.source}\n`,
|
|
83
83
|
);
|
|
84
84
|
readme.push(`- [${filename}](${relative})${heading}`);
|
|
85
85
|
total += 1;
|
package/tools/pl-to-rdf.mjs
CHANGED
|
@@ -6,7 +6,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
6
6
|
import { Program } from '../src/program.js';
|
|
7
7
|
import { eyeLangQuadToNQuad } from './rdf-codec.mjs';
|
|
8
8
|
|
|
9
|
-
export function
|
|
9
|
+
export function extractEyelangRdf(source) {
|
|
10
10
|
const program = Program.parse(String(source), { sourceMetadata: false });
|
|
11
11
|
const lines = []; const seen = new Set();
|
|
12
12
|
for (const c of program.clauses) {
|
|
@@ -20,7 +20,7 @@ async function main(argv) {
|
|
|
20
20
|
let input = '-'; let output = '-';
|
|
21
21
|
for (let i = 0; i < argv.length; i++) { const a = argv[i]; if (a === '-h' || a === '--help') return usage(); if (a === '-o' || a === '--output') output = required(argv, ++i, a); else if (a.startsWith('-') && a !== '-') throw new Error(`unknown option: ${a}`); else if (input === '-') input = a; else throw new Error(`unexpected argument: ${a}`); }
|
|
22
22
|
const source = input === '-' ? await stdin() : await fs.readFile(input, 'utf8');
|
|
23
|
-
const result =
|
|
23
|
+
const result = extractEyelangRdf(source);
|
|
24
24
|
if (output === '-') process.stdout.write(result); else await fs.writeFile(output, result);
|
|
25
25
|
}
|
|
26
26
|
function usage() { process.stdout.write('Usage: node tools/pl-to-rdf.mjs [options] [input.pl|-]\n\n -o, --output FILE Write N-Quads to FILE\n'); }
|
package/tools/rdf-codec.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Lossless RDF 1.2 <-> ordinary
|
|
1
|
+
// Lossless RDF 1.2 <-> ordinary Eyelang term encoding.
|
|
2
2
|
export const XSD_STRING = 'http://www.w3.org/2001/XMLSchema#string';
|
|
3
3
|
export const RDF_LANG_STRING = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#langString';
|
|
4
4
|
export const RDF_DIR_LANG_STRING = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#dirLangString';
|
|
@@ -170,15 +170,15 @@ export function fromRdfJs(term, scope = 'input') {
|
|
|
170
170
|
throw new Error(`unsupported RDF/JS term type: ${term.termType}`);
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
-
export function
|
|
174
|
-
return `${predicate}(${
|
|
173
|
+
export function quadToEyelang(q, predicate = 'rdf') {
|
|
174
|
+
return `${predicate}(${toEyelang(q.subject)}, ${toEyelang(q.predicate)}, ${toEyelang(q.object)}, ${toEyelang(q.graph)}).`;
|
|
175
175
|
}
|
|
176
176
|
|
|
177
|
-
export function
|
|
177
|
+
export function toEyelang(t) {
|
|
178
178
|
if (t.kind === 'namedNode') return `iri(${quote(t.value)})`;
|
|
179
179
|
if (t.kind === 'blankNode') return `bnode(${quote(t.scope)}, ${quote(t.value)})`;
|
|
180
180
|
if (t.kind === 'defaultGraph') return 'default_graph';
|
|
181
|
-
if (t.kind === 'triple') return `triple(${
|
|
181
|
+
if (t.kind === 'triple') return `triple(${toEyelang(t.subject)}, ${toEyelang(t.predicate)}, ${toEyelang(t.object)})`;
|
|
182
182
|
if (t.kind === 'literal') {
|
|
183
183
|
const annotation = t.language
|
|
184
184
|
? (t.direction ? `lang(${quote(t.language)}, ${t.direction})` : `lang(${quote(t.language)})`)
|
|
@@ -190,18 +190,18 @@ export function toEyeLang(t) {
|
|
|
190
190
|
|
|
191
191
|
export function eyeLangQuadToNQuad(term) {
|
|
192
192
|
if (term?.type !== 'compound' || term.name !== 'rdf' || term.args.length !== 4) throw new Error('expected rdf/4 fact');
|
|
193
|
-
const [subject, predicate, object, graph] = term.args.map(
|
|
193
|
+
const [subject, predicate, object, graph] = term.args.map(fromEyelang);
|
|
194
194
|
assertTriple(subject, predicate, object);
|
|
195
195
|
if (!['namedNode', 'blankNode', 'defaultGraph'].includes(graph.kind)) throw new Error('invalid RDF graph');
|
|
196
196
|
return `${toNQ(subject)} ${toNQ(predicate)} ${toNQ(object)}${graph.kind === 'defaultGraph' ? '' : ` ${toNQ(graph)}`} .`;
|
|
197
197
|
}
|
|
198
198
|
|
|
199
|
-
export function
|
|
199
|
+
export function fromEyelang(t) {
|
|
200
200
|
if (t?.type === 'atom' && t.name === 'default_graph') return { kind: 'defaultGraph' };
|
|
201
201
|
if (compound(t, 'iri', 1)) return { kind: 'namedNode', value: scalar(t.args[0], 'IRI') };
|
|
202
202
|
if (compound(t, 'bnode', 2)) return { kind: 'blankNode', scope: scalar(t.args[0], 'blank-node scope'), value: scalar(t.args[1], 'blank-node label') };
|
|
203
203
|
if (compound(t, 'triple', 3)) {
|
|
204
|
-
const [subject, predicate, object] = t.args.map(
|
|
204
|
+
const [subject, predicate, object] = t.args.map(fromEyelang);
|
|
205
205
|
assertTriple(subject, predicate, object);
|
|
206
206
|
return { kind: 'triple', subject, predicate, object };
|
|
207
207
|
}
|
package/tools/rdf-to-pl.mjs
CHANGED
|
@@ -3,19 +3,19 @@ import fs from 'node:fs/promises';
|
|
|
3
3
|
import process from 'node:process';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
6
|
-
import { parseNQuads,
|
|
6
|
+
import { parseNQuads, quadToEyelang } from './rdf-codec.mjs';
|
|
7
7
|
import { parseRdf } from './rdf-input.mjs';
|
|
8
8
|
|
|
9
|
-
export function
|
|
10
|
-
return
|
|
9
|
+
export function compileRdfToEyelang(rdf, { scope = 'input', rules = '', includeSource = false } = {}) {
|
|
10
|
+
return compileQuadsToEyelang(parseNQuads(rdf, { scope }), { rules, includeSource });
|
|
11
11
|
}
|
|
12
|
-
export async function
|
|
12
|
+
export async function compileRdfDocumentToEyelang(rdf, { scope = 'input', rules = '', includeSource = false, inputPath, contentType, baseIRI } = {}) {
|
|
13
13
|
const quads = await parseRdf(rdf, { scope, path: inputPath, contentType, baseIRI });
|
|
14
|
-
return
|
|
14
|
+
return compileQuadsToEyelang(quads, { rules, includeSource });
|
|
15
15
|
}
|
|
16
|
-
export function
|
|
16
|
+
export function compileQuadsToEyelang(quads, { rules = '', includeSource = false } = {}) {
|
|
17
17
|
const predicate = includeSource ? 'source_rdf' : 'rdf';
|
|
18
|
-
const facts = quads.map((q) =>
|
|
18
|
+
const facts = quads.map((q) => quadToEyelang(q, predicate));
|
|
19
19
|
const parts = ['% Generated by tools/rdf-to-pl.mjs.', "% Run with: eyelang --goal 'rdf(S, P, O, G)' program.pl."];
|
|
20
20
|
if (includeSource) parts.push('rdf(S, P, O, G) :- source_rdf(S, P, O, G).');
|
|
21
21
|
if (facts.length) parts.push(facts.join('\n'));
|
|
@@ -39,7 +39,7 @@ async function main(argv) {
|
|
|
39
39
|
}
|
|
40
40
|
const rdf = await read(input);
|
|
41
41
|
const rules = rulesFile ? await fs.readFile(rulesFile, 'utf8') : '';
|
|
42
|
-
const result = await
|
|
42
|
+
const result = await compileRdfDocumentToEyelang(rdf, {
|
|
43
43
|
scope: scope ?? (input === '-' ? 'stdin' : path.basename(input)), rules, includeSource,
|
|
44
44
|
inputPath: input === '-' ? undefined : input,
|
|
45
45
|
contentType: format,
|
|
@@ -47,7 +47,7 @@ async function main(argv) {
|
|
|
47
47
|
});
|
|
48
48
|
if (output === '-') process.stdout.write(result); else await fs.writeFile(output, result);
|
|
49
49
|
}
|
|
50
|
-
function usage() { process.stdout.write('Usage: node tools/rdf-to-pl.mjs [options] [input|-]\n\n --format TYPE RDF media type or extension (required for stdin)\n --base IRI Base IRI for relative references\n --rules FILE Append
|
|
50
|
+
function usage() { process.stdout.write('Usage: node tools/rdf-to-pl.mjs [options] [input|-]\n\n --format TYPE RDF media type or extension (required for stdin)\n --base IRI Base IRI for relative references\n --rules FILE Append Eyelang rules using rdf/4\n --include-source Emit source and derived quads\n --scope NAME Set blank-node scope\n -o, --output FILE Write program to FILE\n'); }
|
|
51
51
|
function required(a, i, o) { if (a[i] == null) throw new Error(`${o} requires a value`); return a[i]; }
|
|
52
52
|
function read(f) { if (f !== '-') return fs.readFile(f, 'utf8'); return new Promise((resolve, reject) => { let s = ''; process.stdin.setEncoding('utf8'); process.stdin.on('data', (c) => { s += c; }); process.stdin.on('end', () => resolve(s)); process.stdin.on('error', reject); }); }
|
|
53
53
|
if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) main(process.argv.slice(2)).catch((e) => { process.stderr.write(`rdf-to-pl: ${e.message}\n`); process.exitCode = 1; });
|
package/why-eyelang.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
# Why
|
|
1
|
+
# Why Eyelang?
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Eyelang combines ISO Prolog and W3C RDF 1.2 to turn portable rules and linked data into answers with inspectable proofs.
|
|
4
4
|
|
|
5
5
|
The name reflects this dual standards foundation: ISO Prolog provides the executable rule language, while RDF provides the interoperable linked-data model.
|
|
6
6
|
|
|
7
7
|
Its central design choice is **composition rather than invention**: use an established international standard for the rule language, use the Web's standard graph data model, and define the smallest practical bridge between them.
|
|
8
8
|
|
|
9
|
-
> **
|
|
9
|
+
> **Eyelang arguably provides one of the strongest standards-based foundations for Web rules because it combines ISO Prolog as the rule language with the W3C RDF 1.2 data model and defines the missing operational bridge between them—including RDF term mappings, named graphs, triple terms, serialization, querying, and proofs.**
|
|
10
10
|
|
|
11
|
-
This is a strong architectural claim, not a claim that the complete
|
|
11
|
+
This is a strong architectural claim, not a claim that the complete Eyelang system is itself an ISO or W3C standard.
|
|
12
12
|
|
|
13
13
|
## A standards-based foundation for Web rules
|
|
14
14
|
|
|
@@ -16,19 +16,19 @@ A Web rule system needs both a rule language and a data model.
|
|
|
16
16
|
|
|
17
17
|
[ISO/IEC 13211-1](https://www.iso.org/standard/21413.html) standardizes the Prolog general core, including its syntax, semantic rules, data representation, input and output, and processor behavior. The standard is intended to promote the portability of Prolog programs and data across processors.
|
|
18
18
|
|
|
19
|
-
[RDF 1.2](https://www.w3.org/TR/rdf12-concepts/) defines the graph data model used by
|
|
19
|
+
[RDF 1.2](https://www.w3.org/TR/rdf12-concepts/) defines the graph data model used by Eyelang for linked data. It includes IRIs, blank nodes, literals, datasets, named graphs, and triple terms. RDF 1.2 is currently a W3C Candidate Recommendation, while RDF 1.1 remains the latest completed Recommendation.
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Eyelang brings these foundations together:
|
|
22
22
|
|
|
23
23
|
- ISO Prolog supplies predicates, clauses, variables, unification, recursion, arithmetic, control, and standard errors.
|
|
24
24
|
- RDF 1.2 supplies globally identified resources and an interoperable graph data model.
|
|
25
|
-
-
|
|
25
|
+
- Eyelang defines lossless mappings between RDF values and Prolog terms.
|
|
26
26
|
- RDF files can be converted to ordinary `rdf/4` facts, queried with rules, and serialized back to RDF datasets.
|
|
27
27
|
- Named graphs, the default graph, scoped blank nodes, literals, directional language strings, and nested triple terms remain distinguishable.
|
|
28
28
|
- Derived answers can carry inspectable proofs.
|
|
29
29
|
- The same parser, solver, term model, and proof machinery run from the command line, JavaScript, and the browser.
|
|
30
30
|
|
|
31
|
-
The exact status wording matters.
|
|
31
|
+
The exact status wording matters. Eyelang is grounded in a current ISO International Standard and the W3C RDF 1.2 standards track. It should not imply that RDF 1.2 has already completed the W3C Recommendation process.
|
|
32
32
|
|
|
33
33
|
## The missing bridge
|
|
34
34
|
|
|
@@ -52,31 +52,31 @@ RDF does not specify:
|
|
|
52
52
|
- operational query execution; or
|
|
53
53
|
- proof construction for arbitrary rule derivations.
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
Eyelang fills that gap with an explicit Prolog–RDF integration profile. The profile belongs to Eyelang's documented and tested behavior; it is not itself an ISO or W3C standard.
|
|
56
56
|
|
|
57
57
|
That limitation should be stated plainly:
|
|
58
58
|
|
|
59
|
-
> **
|
|
59
|
+
> **Eyelang is standards-based, but its Prolog–RDF integration profile has not itself been standardized by ISO or W3C.**
|
|
60
60
|
|
|
61
61
|
## Why composition matters
|
|
62
62
|
|
|
63
63
|
A new rule language must establish its own syntax, semantics, implementation model, tooling, teaching material, and interoperability story. It can also become isolated if its original implementation or community disappears.
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
Eyelang instead composes standards that remain useful independently:
|
|
66
66
|
|
|
67
67
|
- Prolog programs retain a recognizable logic-programming model.
|
|
68
68
|
- RDF data remains usable by existing RDF processors and Web tooling.
|
|
69
69
|
- Standard constructs keep their standard meanings.
|
|
70
|
-
-
|
|
70
|
+
- Eyelang-specific behavior can be identified, documented, tested, and changed without redefining the language core.
|
|
71
71
|
- The integration boundary is small enough to audit.
|
|
72
72
|
|
|
73
|
-
This is why removing hidden extensions strengthens
|
|
73
|
+
This is why removing hidden extensions strengthens Eyelang.
|
|
74
74
|
|
|
75
|
-
For example, `false/0` is the ISO built-in predicate that always fails.
|
|
75
|
+
For example, `false/0` is the ISO built-in predicate that always fails. Eyelang does not overload clauses headed by `false` as automatically executed inference fuses. Integrity checks are ordinary predicates that the host invokes explicitly. The standardized construct keeps its standardized meaning, and application policy remains visible.
|
|
76
76
|
|
|
77
77
|
The governing design rule is:
|
|
78
78
|
|
|
79
|
-
> **Standards define the core.
|
|
79
|
+
> **Standards define the core. Eyelang extensions must be explicit, minimal, documented, and testable.**
|
|
80
80
|
|
|
81
81
|
## Compared with alternatives
|
|
82
82
|
|
|
@@ -95,9 +95,9 @@ That design gives N3 distinctive strengths:
|
|
|
95
95
|
|
|
96
96
|
N3 is therefore not merely an RDF serialization with rule syntax added. It offers an integrated model in which data, rules, and quoted graphs belong to the same language.
|
|
97
97
|
|
|
98
|
-
Its standards position differs from
|
|
98
|
+
Its standards position differs from Eyelang's. The W3C N3 Community Group develops language, built-in, and semantics specifications, but Community Group reports are not W3C Standards and are not currently on the W3C Standards Track. N3 also defines a complete logic notation beyond RDF, so interoperability depends on processors agreeing on that additional syntax, semantics, and built-in vocabulary.
|
|
99
99
|
|
|
100
|
-
|
|
100
|
+
Eyelang explores a complementary standards architecture:
|
|
101
101
|
|
|
102
102
|
- ISO Prolog is the rule language;
|
|
103
103
|
- RDF 1.2 is the external graph data model;
|
|
@@ -107,13 +107,13 @@ EyeLang explores a complementary standards architecture:
|
|
|
107
107
|
|
|
108
108
|
The trade-off is clear.
|
|
109
109
|
|
|
110
|
-
N3 is stronger when rules should themselves be Web data, or when quoted formulae and graph-level metareasoning are central.
|
|
110
|
+
N3 is stronger when rules should themselves be Web data, or when quoted formulae and graph-level metareasoning are central. Eyelang is stronger when users want conventional Prolog syntax and semantics, an ISO-defined language core, direct term-level programming, or a sharply separated interface between executable logic and RDF data.
|
|
111
111
|
|
|
112
|
-
The two approaches can interoperate at the language and data-model level. N3 can serve as a Web-native exchange and publication form, while compatible rules or data are translated into
|
|
112
|
+
The two approaches can interoperate at the language and data-model level. N3 can serve as a Web-native exchange and publication form, while compatible rules or data are translated into Eyelang for ISO-Prolog execution. Eyelang conclusions and proofs can in turn be serialized as RDF or N3.
|
|
113
113
|
|
|
114
114
|
In brief:
|
|
115
115
|
|
|
116
|
-
> **Notation3 provides an integrated, Web-native language for data and rules;
|
|
116
|
+
> **Notation3 provides an integrated, Web-native language for data and rules; Eyelang separates an ISO-standard rule language from the RDF data model and makes the bridge explicit.**
|
|
117
117
|
|
|
118
118
|
### RIF
|
|
119
119
|
|
|
@@ -126,13 +126,13 @@ RIF therefore has the stronger claim when the requirement is:
|
|
|
126
126
|
- a normative interchange syntax and semantics; or
|
|
127
127
|
- compatibility defined within one integrated W3C specification family.
|
|
128
128
|
|
|
129
|
-
|
|
129
|
+
Eyelang takes a different architectural approach. It reuses ISO Prolog as the executable rule language and RDF as the data model instead of defining another complete family of rule dialects.
|
|
130
130
|
|
|
131
|
-
That may be more durable for executable Web rules because both foundations are mature and independently useful. The trade-off is that
|
|
131
|
+
That may be more durable for executable Web rules because both foundations are mature and independently useful. The trade-off is that Eyelang's bridge between them is an implementation profile rather than a formally standardized interchange specification.
|
|
132
132
|
|
|
133
133
|
In brief:
|
|
134
134
|
|
|
135
|
-
> **RIF is stronger as a standardized interchange framework;
|
|
135
|
+
> **RIF is stronger as a standardized interchange framework; Eyelang may be stronger as a small executable architecture built by composing existing standards.**
|
|
136
136
|
|
|
137
137
|
### SHACL 1.2 Rules
|
|
138
138
|
|
|
@@ -155,26 +155,26 @@ SHACL 1.2 Rules has important advantages:
|
|
|
155
155
|
- Stratification gives a well-defined outcome for supported rule sets.
|
|
156
156
|
- It is being developed on the W3C Recommendation track.
|
|
157
157
|
|
|
158
|
-
Its present limitations relative to
|
|
158
|
+
Its present limitations relative to Eyelang are different rather than absolute:
|
|
159
159
|
|
|
160
160
|
- As of August 2026, SHACL 1.2 Rules is a W3C Working Draft, not yet a Recommendation.
|
|
161
161
|
- Its primary abstraction is RDF graph inference, not a general ISO Prolog programming environment.
|
|
162
162
|
- Its rule language and evaluation model are deliberately constrained around RDF triple production.
|
|
163
|
-
- The current specification standardizes inference and query results, but not an
|
|
164
|
-
- Applications needing arbitrary Prolog terms, reusable procedural abstractions, standard Prolog control, or direct JavaScript predicate integration may find
|
|
163
|
+
- The current specification standardizes inference and query results, but not an Eyelang-style derivation-proof artifact.
|
|
164
|
+
- Applications needing arbitrary Prolog terms, reusable procedural abstractions, standard Prolog control, or direct JavaScript predicate integration may find Eyelang more natural.
|
|
165
165
|
|
|
166
166
|
SHACL 1.2 Rules is therefore not merely a competitor. It is also a potential interoperability target.
|
|
167
167
|
|
|
168
|
-
|
|
168
|
+
Eyelang could eventually:
|
|
169
169
|
|
|
170
170
|
- import a useful SHACL 1.2 Rules profile;
|
|
171
171
|
- export compatible RDF-producing rules where semantics align;
|
|
172
172
|
- execute SHACL-derived rule sets through its RDF mapping; or
|
|
173
|
-
- attach
|
|
173
|
+
- attach Eyelang proofs to triples inferred from compatible SHACL rules.
|
|
174
174
|
|
|
175
175
|
The positioning should remain balanced:
|
|
176
176
|
|
|
177
|
-
> **SHACL 1.2 Rules is stronger as an RDF-native rules specification on the W3C Recommendation track.
|
|
177
|
+
> **SHACL 1.2 Rules is stronger as an RDF-native rules specification on the W3C Recommendation track. Eyelang is stronger where applications need an established general-purpose logic language, direct Prolog execution, richer term-level computation, and inspectable derivations.**
|
|
178
178
|
|
|
179
179
|
### SPARQL
|
|
180
180
|
|
|
@@ -182,7 +182,7 @@ The positioning should remain balanced:
|
|
|
182
182
|
|
|
183
183
|
SPARQL should be preferred when the task is fundamentally an interoperable RDF query or update.
|
|
184
184
|
|
|
185
|
-
|
|
185
|
+
Eyelang is preferable when the task depends on:
|
|
186
186
|
|
|
187
187
|
- recursive rules beyond property-path navigation;
|
|
188
188
|
- reusable predicates;
|
|
@@ -191,7 +191,7 @@ EyeLang is preferable when the task depends on:
|
|
|
191
191
|
- rule-level composition; or
|
|
192
192
|
- proof-producing derivations.
|
|
193
193
|
|
|
194
|
-
The two approaches are complementary. RDF data queried by SPARQL can also be reasoned over by
|
|
194
|
+
The two approaches are complementary. RDF data queried by SPARQL can also be reasoned over by Eyelang, and Eyelang results can be serialized back into RDF.
|
|
195
195
|
|
|
196
196
|
### Full Prolog systems
|
|
197
197
|
|
|
@@ -205,7 +205,7 @@ They are preferable when an application needs:
|
|
|
205
205
|
- mature debugging and development tools; or
|
|
206
206
|
- a complete general-purpose Prolog platform.
|
|
207
207
|
|
|
208
|
-
|
|
208
|
+
Eyelang does not need to compete on feature count. Its distinction is the deliberately small and visible combination of:
|
|
209
209
|
|
|
210
210
|
- a tested ISO Prolog core profile;
|
|
211
211
|
- lossless RDF 1.2 term and dataset handling;
|
|
@@ -213,7 +213,7 @@ EyeLang does not need to compete on feature count. Its distinction is the delibe
|
|
|
213
213
|
- JavaScript and browser embedding; and
|
|
214
214
|
- one implementation path across command-line, server, and browser use.
|
|
215
215
|
|
|
216
|
-
A general Prolog system can provide RDF through libraries.
|
|
216
|
+
A general Prolog system can provide RDF through libraries. Eyelang makes the Prolog–RDF boundary part of its central language and interoperability story.
|
|
217
217
|
|
|
218
218
|
### Custom RDF rule engines
|
|
219
219
|
|
|
@@ -221,33 +221,33 @@ Custom engines can optimize aggressively for one domain, data model, or deployme
|
|
|
221
221
|
|
|
222
222
|
Their cost is often a proprietary semantic model.
|
|
223
223
|
|
|
224
|
-
|
|
224
|
+
Eyelang avoids requiring users to adopt an isolated rule language. Its programs begin with recognizable Prolog, and its data begins with recognizable RDF. Eyelang-specific behavior remains concentrated in the bridge between them.
|
|
225
225
|
|
|
226
|
-
## What
|
|
226
|
+
## What Eyelang should claim
|
|
227
227
|
|
|
228
228
|
A concise positioning statement is:
|
|
229
229
|
|
|
230
|
-
> **
|
|
230
|
+
> **Eyelang combines a conformance-tested ISO Prolog profile with W3C RDF 1.2 linked data, explicit extensions, and inspectable proofs in a lightweight JavaScript implementation.**
|
|
231
231
|
|
|
232
232
|
A stronger comparative statement is:
|
|
233
233
|
|
|
234
|
-
> **
|
|
234
|
+
> **Eyelang arguably provides one of the strongest standards-based foundations for executable Web rules because it composes ISO Prolog and RDF 1.2 instead of introducing another complete rule language.**
|
|
235
235
|
|
|
236
236
|
Both claims require qualifications:
|
|
237
237
|
|
|
238
|
-
-
|
|
238
|
+
- Eyelang implements a tested ISO compatibility profile; it is not formally certified by ISO.
|
|
239
239
|
- RDF 1.2 is currently a W3C Candidate Recommendation.
|
|
240
240
|
- SHACL 1.2 Rules is currently a W3C Working Draft.
|
|
241
|
-
-
|
|
242
|
-
- Proof production is an
|
|
241
|
+
- Eyelang's Prolog–RDF integration profile is not itself an ISO or W3C standard.
|
|
242
|
+
- Proof production is an Eyelang capability, not a feature inherited from ISO Prolog or RDF.
|
|
243
243
|
|
|
244
244
|
These qualifications make the standards argument more credible, not less.
|
|
245
245
|
|
|
246
|
-
## What
|
|
246
|
+
## What Eyelang should not become
|
|
247
247
|
|
|
248
248
|
The standards-based position creates a useful filter for future features.
|
|
249
249
|
|
|
250
|
-
|
|
250
|
+
Eyelang should resist:
|
|
251
251
|
|
|
252
252
|
- silently changing the meaning of ISO predicates;
|
|
253
253
|
- adding advisory syntax that the runtime does not use;
|
|
@@ -266,7 +266,7 @@ Syntax or semantics outside those categories should need a strong justification.
|
|
|
266
266
|
|
|
267
267
|
## The durable idea
|
|
268
268
|
|
|
269
|
-
|
|
269
|
+
Eyelang's most important contribution is not a novel rule syntax.
|
|
270
270
|
|
|
271
271
|
It is the proposition that Web rules can be built by joining two established foundations:
|
|
272
272
|
|
|
@@ -275,9 +275,9 @@ It is the proposition that Web rules can be built by joining two established fou
|
|
|
275
275
|
|
|
276
276
|
RIF demonstrates the value of formal rule interchange. SHACL 1.2 Rules demonstrates renewed demand for standardized RDF-native inference. SPARQL demonstrates the value of a shared graph-query language.
|
|
277
277
|
|
|
278
|
-
|
|
278
|
+
Eyelang occupies a complementary position: a small executable system in which standard Prolog rules operate directly over faithfully represented RDF data and produce answers that can be explained.
|
|
279
279
|
|
|
280
|
-
That is a focused and defensible reason for
|
|
280
|
+
That is a focused and defensible reason for Eyelang to exist.
|
|
281
281
|
|
|
282
282
|
## References
|
|
283
283
|
|
|
@@ -289,5 +289,5 @@ That is a focused and defensible reason for EyeLang to exist.
|
|
|
289
289
|
- [SHACL 1.2 Core](https://www.w3.org/TR/shacl12-core/)
|
|
290
290
|
- [Rule Interchange Format overview](https://www.w3.org/TR/rif-overview/)
|
|
291
291
|
- [SPARQL 1.1 Query Language](https://www.w3.org/TR/sparql11-query/)
|
|
292
|
-
- [The Art of
|
|
293
|
-
- [
|
|
292
|
+
- [The Art of Eyelang](the-art-of-eyelang.md)
|
|
293
|
+
- [Eyelang README](README.md)
|