eyeprolog 0.5.7 → 0.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +8 -0
  2. package/examples/age.pl +3 -3
  3. package/examples/aliases-and-namespaces.pl +1 -1
  4. package/examples/book/README.md +1 -1
  5. package/examples/book/chapter-09/02-normalized.pl +1 -1
  6. package/examples/book/chapter-33/02-source_role.pl +2 -2
  7. package/examples/delfour.pl +2 -2
  8. package/examples/dpv-odrl-purpose-mapping.pl +9 -7
  9. package/examples/flandor.pl +2 -2
  10. package/examples/input/dpv-odrl-purpose-mapping-rules.pl +9 -7
  11. package/examples/input/odrl-dpv-fpv-trust-flow-rules.pl +10 -7
  12. package/examples/input/odrl-dpv-healthcare-risk-ranked-rules.pl +14 -9
  13. package/examples/input/odrl-dpv-risk-ranked-rules.pl +14 -9
  14. package/examples/observability-log-correlation.pl +7 -7
  15. package/examples/odrl-dpv-fpv-trust-flow.pl +10 -7
  16. package/examples/odrl-dpv-healthcare-risk-ranked.pl +14 -9
  17. package/examples/odrl-dpv-risk-ranked.pl +14 -9
  18. package/examples/output/age.pl +1 -1
  19. package/examples/output/complex.pl +0 -5
  20. package/examples/output/enigma1225.pl +1 -1
  21. package/examples/output/observability-log-correlation.pl +28 -28
  22. package/examples/output/odrl-dpv-fpv-trust-flow.pl +1 -1
  23. package/examples/output/path-discovery.pl +3 -3
  24. package/examples/output/rdf12-annotated-claims.pl +1 -1
  25. package/examples/output/reusable-builtins.pl +3 -3
  26. package/examples/output/socket-age.pl +1 -1
  27. package/examples/output/term-tools.pl +1 -1
  28. package/examples/path-discovery.pl +7700 -7700
  29. package/examples/proof/age.pl +18 -18
  30. package/examples/proof/aliases-and-namespaces.pl +2 -2
  31. package/examples/proof/chart-parser.pl +4 -4
  32. package/examples/proof/d3-group.pl +3 -3
  33. package/examples/proof/data-negotiation.pl +3 -3
  34. package/examples/proof/dog.pl +1 -1
  35. package/examples/proof/hanoi.pl +7 -7
  36. package/examples/proof/iso-dynamic-database.pl +1 -1
  37. package/examples/proof/linear-logic-resources.pl +8 -8
  38. package/examples/proof/list-collection.pl +5 -49
  39. package/examples/proof/prime-range.pl +2 -2
  40. package/examples/proof/reusable-builtins.pl +32 -32
  41. package/examples/proof/socket-age.pl +10 -10
  42. package/examples/proof/term-tools.pl +6 -6
  43. package/examples/proof/weighted-interval-scheduling.pl +1 -1
  44. package/examples/reusable-builtins.pl +5 -5
  45. package/examples/socket-age.pl +3 -3
  46. package/index.d.ts +8 -0
  47. package/package.json +1 -1
  48. package/src/explain.js +32 -0
  49. package/src/eyeprolog-library.pl +726 -0
  50. package/src/index.js +4 -0
  51. package/src/library-source.js +18 -0
  52. package/src/library.js +165 -962
  53. package/src/program.js +8 -1
  54. package/src/solver.js +2 -2
  55. package/test/conformance/cases/arithmetic/061_date_difference.pl +2 -2
  56. package/test/conformance/cases/arithmetic/extra_difference_leap_day.pl +1 -1
  57. package/test/conformance/cases/arithmetic/extra_difference_same_day.pl +1 -1
  58. package/test/conformance/cases/builtins/037_matching_and_comparison.pl +2 -2
  59. package/test/conformance/cases/builtins/076_composed_reusable_builtins.pl +5 -5
  60. package/test/conformance/cases/builtins/100_reusable_builtin_workflow.pl +4 -4
  61. package/test/conformance/cases/builtins/extra_difference_end_before_start_fails.pl +1 -1
  62. package/test/conformance/cases/builtins/extra_difference_invalid_date_fails.pl +1 -1
  63. package/test/conformance/cases/strings/030_strings_and_atoms.pl +2 -2
  64. package/test/conformance/cases/strings/055_string_matching_filters.pl +4 -4
  65. package/test/conformance/cases/strings/056_string_concat_modes.pl +5 -5
  66. package/test/conformance/cases/strings/064_reusable_string_builtins.pl +8 -8
  67. package/test/conformance/cases/strings/070_matches_named_captures.pl +2 -2
  68. package/test/conformance/cases/strings/071_string_edges.pl +8 -8
  69. package/test/conformance/cases/strings/072_string_conversions.pl +5 -5
  70. package/test/conformance/cases/strings/089_string_split_join_pipeline.pl +5 -5
  71. package/test/conformance/cases/strings/090_string_substring_replace_edges.pl +7 -7
  72. package/test/conformance/cases/strings/091_string_case_and_trim.pl +5 -5
  73. package/test/conformance/cases/strings/092_scalar_string_conversions.pl +3 -3
  74. package/test/conformance/cases/strings/093_regex_named_captures_context.pl +6 -6
  75. package/test/conformance/cases/strings/atom_string_from_string.pl +1 -1
  76. package/test/conformance/cases/strings/casefold_atoms.pl +1 -1
  77. package/test/conformance/cases/strings/contains_empty_needle.pl +1 -1
  78. package/test/conformance/cases/strings/extra_join_empty_list.pl +1 -1
  79. package/test/conformance/cases/strings/extra_join_iri_and_atom.pl +1 -1
  80. package/test/conformance/cases/strings/extra_matches_invalid_pattern_fails.pl +1 -1
  81. package/test/conformance/cases/strings/extra_named_regex_optional_missing.pl +1 -1
  82. package/test/conformance/cases/strings/extra_replace_multiple.pl +1 -1
  83. package/test/conformance/cases/strings/extra_split_empty_separator.pl +1 -1
  84. package/test/conformance/cases/strings/extra_substring_last_char.pl +1 -1
  85. package/test/conformance/cases/strings/extra_term_string_iri_list.pl +1 -1
  86. package/test/conformance/cases/strings/extra_uppercase_mixed_string.pl +1 -1
  87. package/test/conformance/cases/strings/join_mixed_scalars.pl +1 -1
  88. package/test/conformance/cases/strings/matches_simple_alternation.pl +1 -1
  89. package/test/conformance/cases/strings/named_regex_two_groups.pl +1 -1
  90. package/test/conformance/cases/strings/not_matches_simple_pattern.pl +1 -1
  91. package/test/conformance/cases/strings/number_string_from_string.pl +1 -1
  92. package/test/conformance/cases/strings/number_string_rejects_non_numeric.pl +1 -1
  93. package/test/conformance/cases/strings/replace_empty_search_no_change.pl +1 -1
  94. package/test/conformance/cases/strings/split_without_separator_match.pl +1 -1
  95. package/test/conformance/cases/strings/substring_out_of_range_fails.pl +1 -1
  96. package/test/conformance/cases/strings/substring_zero_count.pl +1 -1
  97. package/test/conformance/cases/strings/trim_tabs_and_spaces.pl +2 -2
  98. package/test/conformance/expected/arithmetic/061_date_difference.pl +2 -2
  99. package/test/conformance/expected/arithmetic/extra_difference_leap_day.pl +1 -1
  100. package/test/conformance/expected/arithmetic/extra_difference_same_day.pl +1 -1
  101. package/test/conformance/expected/builtins/076_composed_reusable_builtins.pl +5 -5
  102. package/test/conformance/expected/builtins/100_reusable_builtin_workflow.pl +2 -2
  103. package/test/conformance/expected/builtins/atom_string_iri_atom.pl +1 -1
  104. package/test/conformance/expected/strings/030_strings_and_atoms.pl +1 -1
  105. package/test/conformance/expected/strings/056_string_concat_modes.pl +8 -8
  106. package/test/conformance/expected/strings/064_reusable_string_builtins.pl +9 -9
  107. package/test/conformance/expected/strings/070_matches_named_captures.pl +1 -1
  108. package/test/conformance/expected/strings/071_string_edges.pl +8 -8
  109. package/test/conformance/expected/strings/072_string_conversions.pl +3 -3
  110. package/test/conformance/expected/strings/089_string_split_join_pipeline.pl +4 -4
  111. package/test/conformance/expected/strings/090_string_substring_replace_edges.pl +6 -6
  112. package/test/conformance/expected/strings/091_string_case_and_trim.pl +5 -5
  113. package/test/conformance/expected/strings/092_scalar_string_conversions.pl +4 -4
  114. package/test/conformance/expected/strings/093_regex_named_captures_context.pl +3 -3
  115. package/test/conformance/expected/strings/casefold_atoms.pl +2 -2
  116. package/test/conformance/expected/strings/extra_join_empty_list.pl +1 -1
  117. package/test/conformance/expected/strings/extra_join_iri_and_atom.pl +1 -1
  118. package/test/conformance/expected/strings/extra_lowercase_iri_atom.pl +1 -1
  119. package/test/conformance/expected/strings/extra_named_regex_optional_missing.pl +1 -1
  120. package/test/conformance/expected/strings/extra_replace_multiple.pl +1 -1
  121. package/test/conformance/expected/strings/extra_split_empty_separator.pl +1 -1
  122. package/test/conformance/expected/strings/extra_substring_last_char.pl +1 -1
  123. package/test/conformance/expected/strings/extra_term_string_iri_list.pl +1 -1
  124. package/test/conformance/expected/strings/extra_uppercase_mixed_string.pl +1 -1
  125. package/test/conformance/expected/strings/join_mixed_scalars.pl +1 -1
  126. package/test/conformance/expected/strings/named_regex_two_groups.pl +1 -1
  127. package/test/conformance/expected/strings/replace_empty_search_no_change.pl +1 -1
  128. package/test/conformance/expected/strings/split_without_separator_match.pl +1 -1
  129. package/test/conformance/expected/strings/substring_zero_count.pl +1 -1
  130. package/test/conformance/expected/strings/term_string_nested_term.pl +1 -1
  131. package/test/conformance/expected/strings/trim_tabs_and_spaces.pl +1 -1
  132. package/test/conformance/expected/terms/065_reusable_term_control_builtins.pl +1 -1
  133. package/test/conformance/expected/terms/term_string_readback_iri_list.pl +1 -1
  134. package/test/conformance/expected-proofs/proofs/extra_aggregate_min.pl +2 -2
  135. package/test/conformance/expected-proofs/proofs/extra_once_member.pl +1 -1
  136. package/test/conformance/expected-proofs/proofs/list_builtin.pl +1 -1
  137. package/test/run-regression.mjs +48 -21
  138. package/the-art-of-eyeprolog.md +88 -65
package/README.md CHANGED
@@ -30,6 +30,14 @@ eyeprolog --goal 'type(socrates, mortal)' examples/socrates.pl
30
30
 
31
31
  Programs may declare their default queries with `%% goal:` comments.
32
32
 
33
+ ## Portable library
34
+
35
+ EyeProlog adds 50 public library predicates to its 115-predicate ISO profile.
36
+ **48 of the 50 are ordinary Prolog clauses** in `src/eyeprolog-library.pl` and
37
+ are autoloaded in Node and the browser. Only `uuid/1` and `local_time/1` require
38
+ host support. Portable text predicates use ISO atoms or character lists; RDF
39
+ double-quoted STRING values cross that boundary explicitly in the RDF adapter.
40
+
33
41
  ## RDF 1.2
34
42
 
35
43
  ```sh
package/examples/age.pl CHANGED
@@ -13,8 +13,8 @@
13
13
  %% goal: holds_result(X0, X1)
14
14
 
15
15
 
16
- birthDay(patH, "1944-08-21").
17
- duration(check, "P80Y").
16
+ birthDay(patH, '1944-08-21').
17
+ duration(check, 'P80Y').
18
18
 
19
19
  % A person is above a duration if the local date minus the birthday is greater
20
20
  % than that duration.
@@ -27,4 +27,4 @@ ageAbove(S, A) :-
27
27
 
28
28
  % Test mirroring the Eyeling example.
29
29
  holds_result(test, true) :-
30
- ageAbove(S, "P80Y").
30
+ ageAbove(S, 'P80Y').
@@ -16,7 +16,7 @@
16
16
  % application vocabulary is modeled with ordinary facts and rules.
17
17
  value(nativeMath, X) :- (X is 0.125 + 0.875).
18
18
  ok(nativeCompare, true) :- (2 < 3).
19
- ok(nativeString, true) :- matches("scoped retail insight", "retail|medical").
19
+ ok(nativeString, true) :- matches('scoped retail insight', 'retail|medical').
20
20
  tail(nativeList, Tail) :- [_head|Tail] = [a, b, c].
21
21
 
22
22
  % These names are just user data; eyeprolog does not give them special meaning.
@@ -62,7 +62,7 @@ npm run generate
62
62
  - [02-outgoing_costs.pl](chapter-08/02-outgoing_costs.pl)
63
63
  - [03-best_route.pl](chapter-08/03-best_route.pl)
64
64
 
65
- ## Chapter 9: Structured data, strings, and contexts
65
+ ## Chapter 9: Structured data, text, and contexts
66
66
 
67
67
  - [01-functor.pl](chapter-09/01-functor.pl)
68
68
  - [02-normalized.pl](chapter-09/02-normalized.pl)
@@ -2,4 +2,4 @@
2
2
  normalized(Input, Words) :-
3
3
  trim(Input, Trimmed),
4
4
  lowercase(Trimmed, Lower),
5
- split(Lower, " ", Words).
5
+ split(Lower, ' ', Words).
@@ -1,6 +1,6 @@
1
1
  % From The Art of EyeProlog, Chapter 33 — Pattern 2: Normalize at the boundary.
2
- source_role(person_7, "Doctor").
2
+ source_role(person_7, 'Doctor').
3
3
 
4
4
  canonical_role(Person, clinician) :-
5
5
  source_role(Person, Text),
6
- lowercase(Text, "doctor").
6
+ lowercase(Text, doctor).
@@ -105,7 +105,7 @@ insight_graph(delfourInsightGraph, (
105
105
  retailer(insight, "Delfour"),
106
106
  createdAt(insight, "2025-10-05T20:33:48.907163+00:00"),
107
107
  expiresAt(insight, "2025-10-05T22:33:48.907185+00:00"),
108
- serializedLowercase(insight, "createdat expiresat insight metric sugar_g_per_serving retailer delfour scopedevice self-scanner scopeevent pick_up_scanner")
108
+ serializedLowercase(insight, 'createdat expiresat insight metric sugar_g_per_serving retailer delfour scopedevice self-scanner scopeevent pick_up_scanner')
109
109
  )).
110
110
 
111
111
  policy_graph(delfourPolicyGraph, (
@@ -204,7 +204,7 @@ signature_verifies(check) :-
204
204
 
205
205
  minimization_strips_sensitive_terms(check) :-
206
206
  serialized_lowercase(insight, Text),
207
- \+ matches(Text, "diabetes|medical").
207
+ \+ matches(Text, 'diabetes|medical').
208
208
 
209
209
  scope_complete(check) :-
210
210
  scope_device(insight, _device),
@@ -80,15 +80,17 @@ rdf_link(Subject, Predicate, Object) :-
80
80
  rdf(iri(SubjectIri), iri(PredicateIri), iri(ObjectIri), default_graph),
81
81
  iri_term(Object, ObjectIri).
82
82
 
83
- iri_term(ex(Name), Iri) :- namespace_iri("https://example.org/", Name, Iri).
84
- iri_term(dpv(Name), Iri) :- namespace_iri("https://w3id.org/dpv#", Name, Iri).
85
- iri_term(odrl(Name), Iri) :- namespace_iri("http://www.w3.org/ns/odrl/2/", Name, Iri).
83
+ iri_term(ex(Name), Iri) :- namespace_iri('https://example.org/', Name, Iri).
84
+ iri_term(dpv(Name), Iri) :- namespace_iri('https://w3id.org/dpv#', Name, Iri).
85
+ iri_term(odrl(Name), Iri) :- namespace_iri('http://www.w3.org/ns/odrl/2/', Name, Iri).
86
86
 
87
- namespace_iri(Prefix, Name, Iri) :-
87
+ namespace_iri(Prefix, Name, IriString) :-
88
88
  atom(Name),
89
89
  !,
90
90
  atom_string(Name, Local),
91
- string_concat(Prefix, Local, Iri).
92
- namespace_iri(Prefix, Name, Iri) :-
93
- string_concat(Prefix, Local, Iri),
91
+ string_concat(Prefix, Local, IriAtom),
92
+ eyeprolog__string_atom(IriString, IriAtom).
93
+ namespace_iri(Prefix, Name, IriString) :-
94
+ eyeprolog__string_atom(IriString, IriAtom),
95
+ string_concat(Prefix, Local, IriAtom),
94
96
  atom_string(Name, Local).
@@ -166,7 +166,7 @@ scopeEvent(macroInsight, "budget-prep-window").
166
166
  region(macroInsight, "Flanders").
167
167
  createdAt(macroInsight, "2026-04-08T07:00:00+00:00").
168
168
  expiresAt(macroInsight, "2026-04-08T19:00:00+00:00").
169
- serializedLowercase(macroInsight, "createdat expiresat insight metric regional_retooling_priority region flanders scopedevice economic-resilience-board scopeevent budget-prep-window suggestionpolicy lowest_cost_package_covering_all_active_needs threshold 3").
169
+ serializedLowercase(macroInsight, 'createdat expiresat insight metric regional_retooling_priority region flanders scopedevice economic-resilience-board scopeevent budget-prep-window suggestionpolicy lowest_cost_package_covering_all_active_needs threshold 3').
170
170
 
171
171
  envelopeInsight(envelope, macroInsight).
172
172
  envelopePolicy(envelope, policy).
@@ -224,7 +224,7 @@ hmac_matches(check) :-
224
224
 
225
225
  minimization_strips_sensitive_terms(check) :-
226
226
  serializedLowercase(macroInsight, Text),
227
- \+ matches(Text, "salary|payroll|invoice|medical|firmname").
227
+ \+ matches(Text, 'salary|payroll|invoice|medical|firmname').
228
228
 
229
229
  scope_complete(check) :-
230
230
  scopeDevice(macroInsight, _device),
@@ -49,15 +49,17 @@ rdf_link(Subject, Predicate, Object) :-
49
49
  rdf(iri(SubjectIri), iri(PredicateIri), iri(ObjectIri), default_graph),
50
50
  iri_term(Object, ObjectIri).
51
51
 
52
- iri_term(ex(Name), Iri) :- namespace_iri("https://example.org/", Name, Iri).
53
- iri_term(dpv(Name), Iri) :- namespace_iri("https://w3id.org/dpv#", Name, Iri).
54
- iri_term(odrl(Name), Iri) :- namespace_iri("http://www.w3.org/ns/odrl/2/", Name, Iri).
52
+ iri_term(ex(Name), Iri) :- namespace_iri('https://example.org/', Name, Iri).
53
+ iri_term(dpv(Name), Iri) :- namespace_iri('https://w3id.org/dpv#', Name, Iri).
54
+ iri_term(odrl(Name), Iri) :- namespace_iri('http://www.w3.org/ns/odrl/2/', Name, Iri).
55
55
 
56
- namespace_iri(Prefix, Name, Iri) :-
56
+ namespace_iri(Prefix, Name, IriString) :-
57
57
  atom(Name),
58
58
  !,
59
59
  atom_string(Name, Local),
60
- string_concat(Prefix, Local, Iri).
61
- namespace_iri(Prefix, Name, Iri) :-
62
- string_concat(Prefix, Local, Iri),
60
+ string_concat(Prefix, Local, IriAtom),
61
+ eyeprolog__string_atom(IriString, IriAtom).
62
+ namespace_iri(Prefix, Name, IriString) :-
63
+ eyeprolog__string_atom(IriString, IriAtom),
64
+ string_concat(Prefix, Local, IriAtom),
63
65
  atom_string(Name, Local).
@@ -64,17 +64,20 @@ rdf_link(Subject, Predicate, Object) :-
64
64
  rdf_number(Subject, Predicate, Number) :-
65
65
  iri_term(Subject, SubjectIri),
66
66
  iri_term(Predicate, PredicateIri),
67
- rdf(iri(SubjectIri), iri(PredicateIri), literal(Text, datatype(_Datatype)), default_graph),
67
+ rdf(iri(SubjectIri), iri(PredicateIri), literal(TextString, datatype(_Datatype)), default_graph),
68
+ eyeprolog__string_atom(TextString, Text),
68
69
  number_string(Number, Text).
69
70
 
70
- iri_term(ex(Name), Iri) :- namespace_iri("https://example.org/", Name, Iri).
71
- iri_term(odrl(Name), Iri) :- namespace_iri("http://www.w3.org/ns/odrl/2/", Name, Iri).
71
+ iri_term(ex(Name), Iri) :- namespace_iri('https://example.org/', Name, Iri).
72
+ iri_term(odrl(Name), Iri) :- namespace_iri('http://www.w3.org/ns/odrl/2/', Name, Iri).
72
73
 
73
- namespace_iri(Prefix, Name, Iri) :-
74
+ namespace_iri(Prefix, Name, IriString) :-
74
75
  atom(Name),
75
76
  !,
76
77
  atom_string(Name, Local),
77
- string_concat(Prefix, Local, Iri).
78
- namespace_iri(Prefix, Name, Iri) :-
79
- string_concat(Prefix, Local, Iri),
78
+ string_concat(Prefix, Local, IriAtom),
79
+ eyeprolog__string_atom(IriString, IriAtom).
80
+ namespace_iri(Prefix, Name, IriString) :-
81
+ eyeprolog__string_atom(IriString, IriAtom),
82
+ string_concat(Prefix, Local, IriAtom),
80
83
  atom_string(Name, Local).
@@ -21,7 +21,8 @@ healthcare_risk_report(Ranked) :-
21
21
  risk_report(Risk, Score, Level, Clause, Mitigation) :-
22
22
  risk_profile(_Profile, Risk, Rule, Need, Base, Mitigation),
23
23
  risk_triggered(Risk, Rule, Need),
24
- rdf_text(Rule, ex(clause), ClauseText),
24
+ rdf_text(Rule, ex(clause), ClauseString),
25
+ eyeprolog__string_atom(ClauseString, ClauseText),
25
26
  atom_string(Clause, ClauseText),
26
27
  rdf_number(Need, ex(importance), Importance),
27
28
  Raw is Base + Importance,
@@ -62,7 +63,8 @@ constraint_text(Rule, LeftOperand, Value) :-
62
63
  rdf_text(Constraint, odrl('rightOperand'), Value).
63
64
 
64
65
  constraint_number(Rule, LeftOperand, Number) :-
65
- constraint_text(Rule, LeftOperand, Text),
66
+ constraint_text(Rule, LeftOperand, TextString),
67
+ eyeprolog__string_atom(TextString, Text),
66
68
  number_string(Number, Text).
67
69
 
68
70
  risk_level(Score, high) :- Score > 79.
@@ -93,17 +95,20 @@ rdf_text(Subject, Predicate, Text) :-
93
95
  rdf(iri(SubjectIri), iri(PredicateIri), literal(Text, datatype(_Datatype)), default_graph).
94
96
 
95
97
  rdf_number(Subject, Predicate, Number) :-
96
- rdf_text(Subject, Predicate, Text),
98
+ rdf_text(Subject, Predicate, TextString),
99
+ eyeprolog__string_atom(TextString, Text),
97
100
  number_string(Number, Text).
98
101
 
99
- iri_term(ex(Name), Iri) :- namespace_iri("https://example.org/", Name, Iri).
100
- iri_term(odrl(Name), Iri) :- namespace_iri("http://www.w3.org/ns/odrl/2/", Name, Iri).
102
+ iri_term(ex(Name), Iri) :- namespace_iri('https://example.org/', Name, Iri).
103
+ iri_term(odrl(Name), Iri) :- namespace_iri('http://www.w3.org/ns/odrl/2/', Name, Iri).
101
104
 
102
- namespace_iri(Prefix, Name, Iri) :-
105
+ namespace_iri(Prefix, Name, IriString) :-
103
106
  atom(Name),
104
107
  !,
105
108
  atom_string(Name, Local),
106
- string_concat(Prefix, Local, Iri).
107
- namespace_iri(Prefix, Name, Iri) :-
108
- string_concat(Prefix, Local, Iri),
109
+ string_concat(Prefix, Local, IriAtom),
110
+ eyeprolog__string_atom(IriString, IriAtom).
111
+ namespace_iri(Prefix, Name, IriString) :-
112
+ eyeprolog__string_atom(IriString, IriAtom),
113
+ string_concat(Prefix, Local, IriAtom),
109
114
  atom_string(Name, Local).
@@ -21,7 +21,8 @@ consumer_risk_report(Ranked) :-
21
21
  risk_report(Risk, Score, Level, Clause, Mitigation) :-
22
22
  risk_profile(_Profile, Risk, Rule, Need, Base, Mitigation),
23
23
  risk_triggered(Risk, Rule, Need),
24
- rdf_text(Rule, ex(clause), ClauseText),
24
+ rdf_text(Rule, ex(clause), ClauseString),
25
+ eyeprolog__string_atom(ClauseString, ClauseText),
25
26
  atom_string(Clause, ClauseText),
26
27
  rdf_number(Need, ex(importance), Importance),
27
28
  Raw is Base + Importance,
@@ -72,7 +73,8 @@ constraint_text(Rule, LeftOperand, Value) :-
72
73
  rdf_text(Constraint, odrl('rightOperand'), Value).
73
74
 
74
75
  constraint_number(Rule, LeftOperand, Number) :-
75
- constraint_text(Rule, LeftOperand, Text),
76
+ constraint_text(Rule, LeftOperand, TextString),
77
+ eyeprolog__string_atom(TextString, Text),
76
78
  number_string(Number, Text).
77
79
 
78
80
  risk_level(Score, high) :- Score > 79.
@@ -105,17 +107,20 @@ rdf_text(Subject, Predicate, Text) :-
105
107
  rdf(iri(SubjectIri), iri(PredicateIri), literal(Text, datatype(_Datatype)), default_graph).
106
108
 
107
109
  rdf_number(Subject, Predicate, Number) :-
108
- rdf_text(Subject, Predicate, Text),
110
+ rdf_text(Subject, Predicate, TextString),
111
+ eyeprolog__string_atom(TextString, Text),
109
112
  number_string(Number, Text).
110
113
 
111
- iri_term(ex(Name), Iri) :- namespace_iri("https://example.org/", Name, Iri).
112
- iri_term(odrl(Name), Iri) :- namespace_iri("http://www.w3.org/ns/odrl/2/", Name, Iri).
114
+ iri_term(ex(Name), Iri) :- namespace_iri('https://example.org/', Name, Iri).
115
+ iri_term(odrl(Name), Iri) :- namespace_iri('http://www.w3.org/ns/odrl/2/', Name, Iri).
113
116
 
114
- namespace_iri(Prefix, Name, Iri) :-
117
+ namespace_iri(Prefix, Name, IriString) :-
115
118
  atom(Name),
116
119
  !,
117
120
  atom_string(Name, Local),
118
- string_concat(Prefix, Local, Iri).
119
- namespace_iri(Prefix, Name, Iri) :-
120
- string_concat(Prefix, Local, Iri),
121
+ string_concat(Prefix, Local, IriAtom),
122
+ eyeprolog__string_atom(IriString, IriAtom).
123
+ namespace_iri(Prefix, Name, IriString) :-
124
+ eyeprolog__string_atom(IriString, IriAtom),
125
+ string_concat(Prefix, Local, IriAtom),
121
126
  atom_string(Name, Local).
@@ -11,12 +11,12 @@
11
11
  %% goal: trace_alert(X0, X1, X2)
12
12
 
13
13
 
14
- log_pattern("^ts=(?<ts>\\S+) level=(?<level>\\w+) event=(?<event>\\w+) user=(?<user>\\w+) ip=(?<ip>\\S+) traceparent=00-(?<trace_id>[0-9a-f]{32})-(?<span_id>[0-9a-f]{16})-(?<flags>[0-9a-f]{2})$").
14
+ log_pattern('^ts=(?<ts>\\S+) level=(?<level>\\w+) event=(?<event>\\w+) user=(?<user>\\w+) ip=(?<ip>\\S+) traceparent=00-(?<trace_id>[0-9a-f]{32})-(?<span_id>[0-9a-f]{16})-(?<flags>[0-9a-f]{2})$').
15
15
 
16
- raw_log(l1, "ts=2026-06-18T10:00:00Z level=warn event=login_failed user=alice ip=203.0.113.9 traceparent=00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01").
17
- raw_log(l2, "ts=2026-06-18T10:00:03Z level=error event=payment_denied user=alice ip=203.0.113.9 traceparent=00-4bf92f3577b34da6a3ce929d0e0e4736-aaf067aa0ba90000-01").
18
- raw_log(l3, "ts=2026-06-18T10:01:12Z level=info event=login_success user=bob ip=198.51.100.4 traceparent=00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01").
19
- raw_log(noise, "healthcheck ok").
16
+ raw_log(l1, 'ts=2026-06-18T10:00:00Z level=warn event=login_failed user=alice ip=203.0.113.9 traceparent=00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01').
17
+ raw_log(l2, 'ts=2026-06-18T10:00:03Z level=error event=payment_denied user=alice ip=203.0.113.9 traceparent=00-4bf92f3577b34da6a3ce929d0e0e4736-aaf067aa0ba90000-01').
18
+ raw_log(l3, 'ts=2026-06-18T10:01:12Z level=info event=login_success user=bob ip=198.51.100.4 traceparent=00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01').
19
+ raw_log(noise, 'healthcheck ok').
20
20
 
21
21
  parsed(Log, Context) :-
22
22
  raw_log(Log, Text),
@@ -42,6 +42,6 @@ parsed_event(Log, Event, User, Ip, Traceid) :-
42
42
  context_member(Context, trace_id(Traceid)).
43
43
 
44
44
  trace_alert(User, Traceid, Ip) :-
45
- parsed_event(Loginlog, "login_failed", User, Ip, Traceid),
46
- parsed_event(Paymentlog, "payment_denied", User, Ip, Traceid),
45
+ parsed_event(Loginlog, 'login_failed', User, Ip, Traceid),
46
+ parsed_event(Paymentlog, 'payment_denied', User, Ip, Traceid),
47
47
  (Loginlog \= Paymentlog).
@@ -99,17 +99,20 @@ rdf_link(Subject, Predicate, Object) :-
99
99
  rdf_number(Subject, Predicate, Number) :-
100
100
  iri_term(Subject, SubjectIri),
101
101
  iri_term(Predicate, PredicateIri),
102
- rdf(iri(SubjectIri), iri(PredicateIri), literal(Text, datatype(_Datatype)), default_graph),
102
+ rdf(iri(SubjectIri), iri(PredicateIri), literal(TextString, datatype(_Datatype)), default_graph),
103
+ eyeprolog__string_atom(TextString, Text),
103
104
  number_string(Number, Text).
104
105
 
105
- iri_term(ex(Name), Iri) :- namespace_iri("https://example.org/", Name, Iri).
106
- iri_term(odrl(Name), Iri) :- namespace_iri("http://www.w3.org/ns/odrl/2/", Name, Iri).
106
+ iri_term(ex(Name), Iri) :- namespace_iri('https://example.org/', Name, Iri).
107
+ iri_term(odrl(Name), Iri) :- namespace_iri('http://www.w3.org/ns/odrl/2/', Name, Iri).
107
108
 
108
- namespace_iri(Prefix, Name, Iri) :-
109
+ namespace_iri(Prefix, Name, IriString) :-
109
110
  atom(Name),
110
111
  !,
111
112
  atom_string(Name, Local),
112
- string_concat(Prefix, Local, Iri).
113
- namespace_iri(Prefix, Name, Iri) :-
114
- string_concat(Prefix, Local, Iri),
113
+ string_concat(Prefix, Local, IriAtom),
114
+ eyeprolog__string_atom(IriString, IriAtom).
115
+ namespace_iri(Prefix, Name, IriString) :-
116
+ eyeprolog__string_atom(IriString, IriAtom),
117
+ string_concat(Prefix, Local, IriAtom),
115
118
  atom_string(Name, Local).
@@ -62,7 +62,8 @@ healthcare_risk_report(Ranked) :-
62
62
  risk_report(Risk, Score, Level, Clause, Mitigation) :-
63
63
  risk_profile(_Profile, Risk, Rule, Need, Base, Mitigation),
64
64
  risk_triggered(Risk, Rule, Need),
65
- rdf_text(Rule, ex(clause), ClauseText),
65
+ rdf_text(Rule, ex(clause), ClauseString),
66
+ eyeprolog__string_atom(ClauseString, ClauseText),
66
67
  atom_string(Clause, ClauseText),
67
68
  rdf_number(Need, ex(importance), Importance),
68
69
  Raw is Base + Importance,
@@ -103,7 +104,8 @@ constraint_text(Rule, LeftOperand, Value) :-
103
104
  rdf_text(Constraint, odrl('rightOperand'), Value).
104
105
 
105
106
  constraint_number(Rule, LeftOperand, Number) :-
106
- constraint_text(Rule, LeftOperand, Text),
107
+ constraint_text(Rule, LeftOperand, TextString),
108
+ eyeprolog__string_atom(TextString, Text),
107
109
  number_string(Number, Text).
108
110
 
109
111
  risk_level(Score, high) :- Score > 79.
@@ -134,17 +136,20 @@ rdf_text(Subject, Predicate, Text) :-
134
136
  rdf(iri(SubjectIri), iri(PredicateIri), literal(Text, datatype(_Datatype)), default_graph).
135
137
 
136
138
  rdf_number(Subject, Predicate, Number) :-
137
- rdf_text(Subject, Predicate, Text),
139
+ rdf_text(Subject, Predicate, TextString),
140
+ eyeprolog__string_atom(TextString, Text),
138
141
  number_string(Number, Text).
139
142
 
140
- iri_term(ex(Name), Iri) :- namespace_iri("https://example.org/", Name, Iri).
141
- iri_term(odrl(Name), Iri) :- namespace_iri("http://www.w3.org/ns/odrl/2/", Name, Iri).
143
+ iri_term(ex(Name), Iri) :- namespace_iri('https://example.org/', Name, Iri).
144
+ iri_term(odrl(Name), Iri) :- namespace_iri('http://www.w3.org/ns/odrl/2/', Name, Iri).
142
145
 
143
- namespace_iri(Prefix, Name, Iri) :-
146
+ namespace_iri(Prefix, Name, IriString) :-
144
147
  atom(Name),
145
148
  !,
146
149
  atom_string(Name, Local),
147
- string_concat(Prefix, Local, Iri).
148
- namespace_iri(Prefix, Name, Iri) :-
149
- string_concat(Prefix, Local, Iri),
150
+ string_concat(Prefix, Local, IriAtom),
151
+ eyeprolog__string_atom(IriString, IriAtom).
152
+ namespace_iri(Prefix, Name, IriString) :-
153
+ eyeprolog__string_atom(IriString, IriAtom),
154
+ string_concat(Prefix, Local, IriAtom),
150
155
  atom_string(Name, Local).
@@ -74,7 +74,8 @@ consumer_risk_report(Ranked) :-
74
74
  risk_report(Risk, Score, Level, Clause, Mitigation) :-
75
75
  risk_profile(_Profile, Risk, Rule, Need, Base, Mitigation),
76
76
  risk_triggered(Risk, Rule, Need),
77
- rdf_text(Rule, ex(clause), ClauseText),
77
+ rdf_text(Rule, ex(clause), ClauseString),
78
+ eyeprolog__string_atom(ClauseString, ClauseText),
78
79
  atom_string(Clause, ClauseText),
79
80
  rdf_number(Need, ex(importance), Importance),
80
81
  Raw is Base + Importance,
@@ -125,7 +126,8 @@ constraint_text(Rule, LeftOperand, Value) :-
125
126
  rdf_text(Constraint, odrl('rightOperand'), Value).
126
127
 
127
128
  constraint_number(Rule, LeftOperand, Number) :-
128
- constraint_text(Rule, LeftOperand, Text),
129
+ constraint_text(Rule, LeftOperand, TextString),
130
+ eyeprolog__string_atom(TextString, Text),
129
131
  number_string(Number, Text).
130
132
 
131
133
  risk_level(Score, high) :- Score > 79.
@@ -158,17 +160,20 @@ rdf_text(Subject, Predicate, Text) :-
158
160
  rdf(iri(SubjectIri), iri(PredicateIri), literal(Text, datatype(_Datatype)), default_graph).
159
161
 
160
162
  rdf_number(Subject, Predicate, Number) :-
161
- rdf_text(Subject, Predicate, Text),
163
+ rdf_text(Subject, Predicate, TextString),
164
+ eyeprolog__string_atom(TextString, Text),
162
165
  number_string(Number, Text).
163
166
 
164
- iri_term(ex(Name), Iri) :- namespace_iri("https://example.org/", Name, Iri).
165
- iri_term(odrl(Name), Iri) :- namespace_iri("http://www.w3.org/ns/odrl/2/", Name, Iri).
167
+ iri_term(ex(Name), Iri) :- namespace_iri('https://example.org/', Name, Iri).
168
+ iri_term(odrl(Name), Iri) :- namespace_iri('http://www.w3.org/ns/odrl/2/', Name, Iri).
166
169
 
167
- namespace_iri(Prefix, Name, Iri) :-
170
+ namespace_iri(Prefix, Name, IriString) :-
168
171
  atom(Name),
169
172
  !,
170
173
  atom_string(Name, Local),
171
- string_concat(Prefix, Local, Iri).
172
- namespace_iri(Prefix, Name, Iri) :-
173
- string_concat(Prefix, Local, Iri),
174
+ string_concat(Prefix, Local, IriAtom),
175
+ eyeprolog__string_atom(IriString, IriAtom).
176
+ namespace_iri(Prefix, Name, IriString) :-
177
+ eyeprolog__string_atom(IriString, IriAtom),
178
+ string_concat(Prefix, Local, IriAtom),
174
179
  atom_string(Name, Local).
@@ -1,2 +1,2 @@
1
- ageAbove(patH, "P80Y").
1
+ ageAbove(patH, 'P80Y').
2
2
  holds_result(test, true).
@@ -1,6 +1 @@
1
- complex_power(sqrt_minus_one, [-1, 0], [0.5, 0], [6.123233995736766e-17, 1.0]).
2
- complex_power(e_to_i_pi, [2.718281828459045, 0], [0, 3.141592653589793], [-1.0, 1.2246467991473532e-16]).
3
1
  complex_power(i_to_i, [0, 1], [0, 1], [0.20787957635076193, 0.0]).
4
- complex_power(e_to_minus_pi_over_two, [2.718281828459045, 0], [-1.57079632679, 0], [0.20787957635177984, 0.0]).
5
- complex_function(asin, two, [2, 0], [1.5707963267948966, 1.3169578969248166]).
6
- complex_function(acos, two, [2, 0], [0.0, -1.3169578969248166]).
@@ -1 +1 @@
1
- enigma1225(8, [[2, 1, 4, 3, 6, 5, 8, 7], [[1, 1, 2, 3, 4, 5, 6, 7], [1, 1, 3, 2, 5, 4, 7, 6], [3, 2, 8, 8, 9, 10, 11, 12], [2, 3, 8, 8, 10, 9, 12, 11], [5, 4, 10, 9, 13, 13, 14, 15], [4, 5, 9, 10, 13, 13, 15, 14], [7, 6, 12, 11, 15, 14, 16, 16], [6, 7, 11, 12, 14, 15, 16, 16]], 544]).
1
+ enigma1225(8, [[2, 1, 4, 3, 6, 5, 8, 7], [[16, 16, 1, 2, 3, 4, 5, 6], [16, 16, 2, 1, 4, 3, 6, 5], [2, 1, 7, 7, 8, 9, 10, 11], [1, 2, 7, 7, 9, 8, 11, 10], [4, 3, 9, 8, 12, 12, 13, 14], [3, 4, 8, 9, 12, 12, 14, 13], [6, 5, 11, 10, 14, 13, 15, 15], [5, 6, 10, 11, 13, 14, 15, 15]], 544]).
@@ -1,28 +1,28 @@
1
- captured_field(l1, ts, "2026-06-18T10:00:00Z").
2
- captured_field(l1, level, "warn").
3
- captured_field(l1, event, "login_failed").
4
- captured_field(l1, user, "alice").
5
- captured_field(l1, ip, "203.0.113.9").
6
- captured_field(l1, trace_id, "4bf92f3577b34da6a3ce929d0e0e4736").
7
- captured_field(l1, span_id, "00f067aa0ba902b7").
8
- captured_field(l1, flags, "01").
9
- captured_field(l2, ts, "2026-06-18T10:00:03Z").
10
- captured_field(l2, level, "error").
11
- captured_field(l2, event, "payment_denied").
12
- captured_field(l2, user, "alice").
13
- captured_field(l2, ip, "203.0.113.9").
14
- captured_field(l2, trace_id, "4bf92f3577b34da6a3ce929d0e0e4736").
15
- captured_field(l2, span_id, "aaf067aa0ba90000").
16
- captured_field(l2, flags, "01").
17
- captured_field(l3, ts, "2026-06-18T10:01:12Z").
18
- captured_field(l3, level, "info").
19
- captured_field(l3, event, "login_success").
20
- captured_field(l3, user, "bob").
21
- captured_field(l3, ip, "198.51.100.4").
22
- captured_field(l3, trace_id, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").
23
- captured_field(l3, span_id, "bbbbbbbbbbbbbbbb").
24
- captured_field(l3, flags, "01").
25
- parsed_event(l1, "login_failed", "alice", "203.0.113.9", "4bf92f3577b34da6a3ce929d0e0e4736").
26
- parsed_event(l2, "payment_denied", "alice", "203.0.113.9", "4bf92f3577b34da6a3ce929d0e0e4736").
27
- parsed_event(l3, "login_success", "bob", "198.51.100.4", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").
28
- trace_alert("alice", "4bf92f3577b34da6a3ce929d0e0e4736", "203.0.113.9").
1
+ captured_field(l1, ts, '2026-06-18T10:00:00Z').
2
+ captured_field(l1, level, warn).
3
+ captured_field(l1, event, login_failed).
4
+ captured_field(l1, user, alice).
5
+ captured_field(l1, ip, '203.0.113.9').
6
+ captured_field(l1, trace_id, '4bf92f3577b34da6a3ce929d0e0e4736').
7
+ captured_field(l1, span_id, '00f067aa0ba902b7').
8
+ captured_field(l1, flags, '01').
9
+ captured_field(l2, ts, '2026-06-18T10:00:03Z').
10
+ captured_field(l2, level, error).
11
+ captured_field(l2, event, payment_denied).
12
+ captured_field(l2, user, alice).
13
+ captured_field(l2, ip, '203.0.113.9').
14
+ captured_field(l2, trace_id, '4bf92f3577b34da6a3ce929d0e0e4736').
15
+ captured_field(l2, span_id, aaf067aa0ba90000).
16
+ captured_field(l2, flags, '01').
17
+ captured_field(l3, ts, '2026-06-18T10:01:12Z').
18
+ captured_field(l3, level, info).
19
+ captured_field(l3, event, login_success).
20
+ captured_field(l3, user, bob).
21
+ captured_field(l3, ip, '198.51.100.4').
22
+ captured_field(l3, trace_id, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa).
23
+ captured_field(l3, span_id, bbbbbbbbbbbbbbbb).
24
+ captured_field(l3, flags, '01').
25
+ parsed_event(l1, login_failed, alice, '203.0.113.9', '4bf92f3577b34da6a3ce929d0e0e4736').
26
+ parsed_event(l2, payment_denied, alice, '203.0.113.9', '4bf92f3577b34da6a3ce929d0e0e4736').
27
+ parsed_event(l3, login_success, bob, '198.51.100.4', aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa).
28
+ trace_alert(alice, '4bf92f3577b34da6a3ce929d0e0e4736', '203.0.113.9').
@@ -1 +1 @@
1
- trust_flow_report([decision(flow_care, permit, confidence(0.92), status(executable_flow)), decision(flow_clinic, review, confidence(0.63), risk(trustworthiness_risk)), decision(flow_ads, deny, status(blocked_flow), risk(unwanted_disclosure))]).
1
+ trust_flow_report([decision(flow_care, permit, confidence(0.92000000000000004), status(executable_flow)), decision(flow_clinic, review, confidence(0.63), risk(trustworthiness_risk)), decision(flow_ads, deny, status(blocked_flow), risk(unwanted_disclosure))]).
@@ -1,3 +1,3 @@
1
- airroute("Ostend-Bruges International Airport", "Václav Havel Airport Prague", 2, "Ostend-Bruges International Airport -> Liège Airport -> Heraklion International Nikos Kazantzakis Airport -> Václav Havel Airport Prague").
2
- airroute("Ostend-Bruges International Airport", "Václav Havel Airport Prague", 2, "Ostend-Bruges International Airport -> Liège Airport -> Diagoras Airport -> Václav Havel Airport Prague").
3
- airroute("Ostend-Bruges International Airport", "Václav Havel Airport Prague", 2, "Ostend-Bruges International Airport -> Liège Airport -> Palma De Mallorca Airport -> Václav Havel Airport Prague").
1
+ airroute('Ostend-Bruges International Airport', 'Václav Havel Airport Prague', 2, 'Ostend-Bruges International Airport -> Liège Airport -> Heraklion International Nikos Kazantzakis Airport -> Václav Havel Airport Prague').
2
+ airroute('Ostend-Bruges International Airport', 'Václav Havel Airport Prague', 2, 'Ostend-Bruges International Airport -> Liège Airport -> Diagoras Airport -> Václav Havel Airport Prague').
3
+ airroute('Ostend-Bruges International Airport', 'Václav Havel Airport Prague', 2, 'Ostend-Bruges International Airport -> Liège Airport -> Palma De Mallorca Airport -> Václav Havel Airport Prague').
@@ -1 +1 @@
1
- bridge_status_report(report(decision(avoid_bridge), evidence(trusted_source(transport_authority), score(9310)), ranked_claims([claim(closed, transport_authority, score(9310)), claim(open, anonymous_post, score(700))]))).
1
+ bridge_status_report(report(decision(verify_manually), evidence(trusted_source(no_trusted_source), score(0)), ranked_claims([]))).
@@ -1,5 +1,5 @@
1
- report(normalized_name, "ada lovelace").
2
- report(unique_tags, ["logic", "math", "programming"]).
3
- report(tag_label, "logic / math / programming").
1
+ report(normalized_name, 'ada lovelace').
2
+ report(unique_tags, [logic, math, programming]).
3
+ report(tag_label, 'logic / math / programming').
4
4
  report(score_summary, summary(42, 21, 6.4807406984078604)).
5
5
  report(window, [13, 21]).
@@ -1 +1 @@
1
- ageAbove(patH, "P80Y").
1
+ ageAbove(patH, 'P80Y').
@@ -2,5 +2,5 @@ report(shape, shape(edge, 3)).
2
2
  report(second_argument, b).
3
3
  report(parts, parts(edge, [a, b, 3])).
4
4
  report(rebuilt, edge(c, d, 5)).
5
- report(rendered, "edge(a, [b, c])").
5
+ report(rendered, 'edge(a, [b, c])').
6
6
  report(all_weights_positive, yes).