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.
- package/README.md +8 -0
- package/examples/age.pl +3 -3
- package/examples/aliases-and-namespaces.pl +1 -1
- package/examples/book/README.md +1 -1
- package/examples/book/chapter-09/02-normalized.pl +1 -1
- package/examples/book/chapter-33/02-source_role.pl +2 -2
- package/examples/delfour.pl +2 -2
- package/examples/dpv-odrl-purpose-mapping.pl +9 -7
- package/examples/flandor.pl +2 -2
- package/examples/input/dpv-odrl-purpose-mapping-rules.pl +9 -7
- package/examples/input/odrl-dpv-fpv-trust-flow-rules.pl +10 -7
- package/examples/input/odrl-dpv-healthcare-risk-ranked-rules.pl +14 -9
- package/examples/input/odrl-dpv-risk-ranked-rules.pl +14 -9
- package/examples/observability-log-correlation.pl +7 -7
- package/examples/odrl-dpv-fpv-trust-flow.pl +10 -7
- package/examples/odrl-dpv-healthcare-risk-ranked.pl +14 -9
- package/examples/odrl-dpv-risk-ranked.pl +14 -9
- package/examples/output/age.pl +1 -1
- package/examples/output/complex.pl +0 -5
- package/examples/output/enigma1225.pl +1 -1
- package/examples/output/observability-log-correlation.pl +28 -28
- package/examples/output/odrl-dpv-fpv-trust-flow.pl +1 -1
- package/examples/output/path-discovery.pl +3 -3
- package/examples/output/rdf12-annotated-claims.pl +1 -1
- package/examples/output/reusable-builtins.pl +3 -3
- package/examples/output/socket-age.pl +1 -1
- package/examples/output/term-tools.pl +1 -1
- package/examples/path-discovery.pl +7700 -7700
- package/examples/proof/age.pl +18 -18
- package/examples/proof/aliases-and-namespaces.pl +2 -2
- package/examples/proof/chart-parser.pl +4 -4
- package/examples/proof/d3-group.pl +3 -3
- package/examples/proof/data-negotiation.pl +3 -3
- package/examples/proof/dog.pl +1 -1
- package/examples/proof/hanoi.pl +7 -7
- package/examples/proof/iso-dynamic-database.pl +1 -1
- package/examples/proof/linear-logic-resources.pl +8 -8
- package/examples/proof/list-collection.pl +5 -49
- package/examples/proof/prime-range.pl +2 -2
- package/examples/proof/reusable-builtins.pl +32 -32
- package/examples/proof/socket-age.pl +10 -10
- package/examples/proof/term-tools.pl +6 -6
- package/examples/proof/weighted-interval-scheduling.pl +1 -1
- package/examples/reusable-builtins.pl +5 -5
- package/examples/socket-age.pl +3 -3
- package/index.d.ts +8 -0
- package/package.json +1 -1
- package/src/explain.js +32 -0
- package/src/eyeprolog-library.pl +726 -0
- package/src/index.js +4 -0
- package/src/library-source.js +18 -0
- package/src/library.js +165 -962
- package/src/program.js +8 -1
- package/src/solver.js +2 -2
- package/test/conformance/cases/arithmetic/061_date_difference.pl +2 -2
- package/test/conformance/cases/arithmetic/extra_difference_leap_day.pl +1 -1
- package/test/conformance/cases/arithmetic/extra_difference_same_day.pl +1 -1
- package/test/conformance/cases/builtins/037_matching_and_comparison.pl +2 -2
- package/test/conformance/cases/builtins/076_composed_reusable_builtins.pl +5 -5
- package/test/conformance/cases/builtins/100_reusable_builtin_workflow.pl +4 -4
- package/test/conformance/cases/builtins/extra_difference_end_before_start_fails.pl +1 -1
- package/test/conformance/cases/builtins/extra_difference_invalid_date_fails.pl +1 -1
- package/test/conformance/cases/strings/030_strings_and_atoms.pl +2 -2
- package/test/conformance/cases/strings/055_string_matching_filters.pl +4 -4
- package/test/conformance/cases/strings/056_string_concat_modes.pl +5 -5
- package/test/conformance/cases/strings/064_reusable_string_builtins.pl +8 -8
- package/test/conformance/cases/strings/070_matches_named_captures.pl +2 -2
- package/test/conformance/cases/strings/071_string_edges.pl +8 -8
- package/test/conformance/cases/strings/072_string_conversions.pl +5 -5
- package/test/conformance/cases/strings/089_string_split_join_pipeline.pl +5 -5
- package/test/conformance/cases/strings/090_string_substring_replace_edges.pl +7 -7
- package/test/conformance/cases/strings/091_string_case_and_trim.pl +5 -5
- package/test/conformance/cases/strings/092_scalar_string_conversions.pl +3 -3
- package/test/conformance/cases/strings/093_regex_named_captures_context.pl +6 -6
- package/test/conformance/cases/strings/atom_string_from_string.pl +1 -1
- package/test/conformance/cases/strings/casefold_atoms.pl +1 -1
- package/test/conformance/cases/strings/contains_empty_needle.pl +1 -1
- package/test/conformance/cases/strings/extra_join_empty_list.pl +1 -1
- package/test/conformance/cases/strings/extra_join_iri_and_atom.pl +1 -1
- package/test/conformance/cases/strings/extra_matches_invalid_pattern_fails.pl +1 -1
- package/test/conformance/cases/strings/extra_named_regex_optional_missing.pl +1 -1
- package/test/conformance/cases/strings/extra_replace_multiple.pl +1 -1
- package/test/conformance/cases/strings/extra_split_empty_separator.pl +1 -1
- package/test/conformance/cases/strings/extra_substring_last_char.pl +1 -1
- package/test/conformance/cases/strings/extra_term_string_iri_list.pl +1 -1
- package/test/conformance/cases/strings/extra_uppercase_mixed_string.pl +1 -1
- package/test/conformance/cases/strings/join_mixed_scalars.pl +1 -1
- package/test/conformance/cases/strings/matches_simple_alternation.pl +1 -1
- package/test/conformance/cases/strings/named_regex_two_groups.pl +1 -1
- package/test/conformance/cases/strings/not_matches_simple_pattern.pl +1 -1
- package/test/conformance/cases/strings/number_string_from_string.pl +1 -1
- package/test/conformance/cases/strings/number_string_rejects_non_numeric.pl +1 -1
- package/test/conformance/cases/strings/replace_empty_search_no_change.pl +1 -1
- package/test/conformance/cases/strings/split_without_separator_match.pl +1 -1
- package/test/conformance/cases/strings/substring_out_of_range_fails.pl +1 -1
- package/test/conformance/cases/strings/substring_zero_count.pl +1 -1
- package/test/conformance/cases/strings/trim_tabs_and_spaces.pl +2 -2
- package/test/conformance/expected/arithmetic/061_date_difference.pl +2 -2
- package/test/conformance/expected/arithmetic/extra_difference_leap_day.pl +1 -1
- package/test/conformance/expected/arithmetic/extra_difference_same_day.pl +1 -1
- package/test/conformance/expected/builtins/076_composed_reusable_builtins.pl +5 -5
- package/test/conformance/expected/builtins/100_reusable_builtin_workflow.pl +2 -2
- package/test/conformance/expected/builtins/atom_string_iri_atom.pl +1 -1
- package/test/conformance/expected/strings/030_strings_and_atoms.pl +1 -1
- package/test/conformance/expected/strings/056_string_concat_modes.pl +8 -8
- package/test/conformance/expected/strings/064_reusable_string_builtins.pl +9 -9
- package/test/conformance/expected/strings/070_matches_named_captures.pl +1 -1
- package/test/conformance/expected/strings/071_string_edges.pl +8 -8
- package/test/conformance/expected/strings/072_string_conversions.pl +3 -3
- package/test/conformance/expected/strings/089_string_split_join_pipeline.pl +4 -4
- package/test/conformance/expected/strings/090_string_substring_replace_edges.pl +6 -6
- package/test/conformance/expected/strings/091_string_case_and_trim.pl +5 -5
- package/test/conformance/expected/strings/092_scalar_string_conversions.pl +4 -4
- package/test/conformance/expected/strings/093_regex_named_captures_context.pl +3 -3
- package/test/conformance/expected/strings/casefold_atoms.pl +2 -2
- package/test/conformance/expected/strings/extra_join_empty_list.pl +1 -1
- package/test/conformance/expected/strings/extra_join_iri_and_atom.pl +1 -1
- package/test/conformance/expected/strings/extra_lowercase_iri_atom.pl +1 -1
- package/test/conformance/expected/strings/extra_named_regex_optional_missing.pl +1 -1
- package/test/conformance/expected/strings/extra_replace_multiple.pl +1 -1
- package/test/conformance/expected/strings/extra_split_empty_separator.pl +1 -1
- package/test/conformance/expected/strings/extra_substring_last_char.pl +1 -1
- package/test/conformance/expected/strings/extra_term_string_iri_list.pl +1 -1
- package/test/conformance/expected/strings/extra_uppercase_mixed_string.pl +1 -1
- package/test/conformance/expected/strings/join_mixed_scalars.pl +1 -1
- package/test/conformance/expected/strings/named_regex_two_groups.pl +1 -1
- package/test/conformance/expected/strings/replace_empty_search_no_change.pl +1 -1
- package/test/conformance/expected/strings/split_without_separator_match.pl +1 -1
- package/test/conformance/expected/strings/substring_zero_count.pl +1 -1
- package/test/conformance/expected/strings/term_string_nested_term.pl +1 -1
- package/test/conformance/expected/strings/trim_tabs_and_spaces.pl +1 -1
- package/test/conformance/expected/terms/065_reusable_term_control_builtins.pl +1 -1
- package/test/conformance/expected/terms/term_string_readback_iri_list.pl +1 -1
- package/test/conformance/expected-proofs/proofs/extra_aggregate_min.pl +2 -2
- package/test/conformance/expected-proofs/proofs/extra_once_member.pl +1 -1
- package/test/conformance/expected-proofs/proofs/list_builtin.pl +1 -1
- package/test/run-regression.mjs +48 -21
- 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,
|
|
17
|
-
duration(check,
|
|
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,
|
|
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(
|
|
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.
|
package/examples/book/README.md
CHANGED
|
@@ -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,
|
|
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)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
% From The Art of EyeProlog, Chapter 33 — Pattern 2: Normalize at the boundary.
|
|
2
|
-
source_role(person_7,
|
|
2
|
+
source_role(person_7, 'Doctor').
|
|
3
3
|
|
|
4
4
|
canonical_role(Person, clinician) :-
|
|
5
5
|
source_role(Person, Text),
|
|
6
|
-
lowercase(Text,
|
|
6
|
+
lowercase(Text, doctor).
|
package/examples/delfour.pl
CHANGED
|
@@ -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,
|
|
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,
|
|
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(
|
|
84
|
-
iri_term(dpv(Name), Iri) :- namespace_iri(
|
|
85
|
-
iri_term(odrl(Name), Iri) :- namespace_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,
|
|
87
|
+
namespace_iri(Prefix, Name, IriString) :-
|
|
88
88
|
atom(Name),
|
|
89
89
|
!,
|
|
90
90
|
atom_string(Name, Local),
|
|
91
|
-
string_concat(Prefix, Local,
|
|
92
|
-
|
|
93
|
-
|
|
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).
|
package/examples/flandor.pl
CHANGED
|
@@ -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,
|
|
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,
|
|
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(
|
|
53
|
-
iri_term(dpv(Name), Iri) :- namespace_iri(
|
|
54
|
-
iri_term(odrl(Name), Iri) :- namespace_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,
|
|
56
|
+
namespace_iri(Prefix, Name, IriString) :-
|
|
57
57
|
atom(Name),
|
|
58
58
|
!,
|
|
59
59
|
atom_string(Name, Local),
|
|
60
|
-
string_concat(Prefix, Local,
|
|
61
|
-
|
|
62
|
-
|
|
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(
|
|
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(
|
|
71
|
-
iri_term(odrl(Name), Iri) :- namespace_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,
|
|
74
|
+
namespace_iri(Prefix, Name, IriString) :-
|
|
74
75
|
atom(Name),
|
|
75
76
|
!,
|
|
76
77
|
atom_string(Name, Local),
|
|
77
|
-
string_concat(Prefix, Local,
|
|
78
|
-
|
|
79
|
-
|
|
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),
|
|
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,
|
|
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,
|
|
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(
|
|
100
|
-
iri_term(odrl(Name), Iri) :- namespace_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,
|
|
105
|
+
namespace_iri(Prefix, Name, IriString) :-
|
|
103
106
|
atom(Name),
|
|
104
107
|
!,
|
|
105
108
|
atom_string(Name, Local),
|
|
106
|
-
string_concat(Prefix, Local,
|
|
107
|
-
|
|
108
|
-
|
|
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),
|
|
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,
|
|
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,
|
|
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(
|
|
112
|
-
iri_term(odrl(Name), Iri) :- namespace_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,
|
|
117
|
+
namespace_iri(Prefix, Name, IriString) :-
|
|
115
118
|
atom(Name),
|
|
116
119
|
!,
|
|
117
120
|
atom_string(Name, Local),
|
|
118
|
-
string_concat(Prefix, Local,
|
|
119
|
-
|
|
120
|
-
|
|
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(
|
|
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,
|
|
17
|
-
raw_log(l2,
|
|
18
|
-
raw_log(l3,
|
|
19
|
-
raw_log(noise,
|
|
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,
|
|
46
|
-
parsed_event(Paymentlog,
|
|
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(
|
|
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(
|
|
106
|
-
iri_term(odrl(Name), Iri) :- namespace_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,
|
|
109
|
+
namespace_iri(Prefix, Name, IriString) :-
|
|
109
110
|
atom(Name),
|
|
110
111
|
!,
|
|
111
112
|
atom_string(Name, Local),
|
|
112
|
-
string_concat(Prefix, Local,
|
|
113
|
-
|
|
114
|
-
|
|
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),
|
|
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,
|
|
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,
|
|
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(
|
|
141
|
-
iri_term(odrl(Name), Iri) :- namespace_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,
|
|
146
|
+
namespace_iri(Prefix, Name, IriString) :-
|
|
144
147
|
atom(Name),
|
|
145
148
|
!,
|
|
146
149
|
atom_string(Name, Local),
|
|
147
|
-
string_concat(Prefix, Local,
|
|
148
|
-
|
|
149
|
-
|
|
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),
|
|
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,
|
|
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,
|
|
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(
|
|
165
|
-
iri_term(odrl(Name), Iri) :- namespace_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,
|
|
170
|
+
namespace_iri(Prefix, Name, IriString) :-
|
|
168
171
|
atom(Name),
|
|
169
172
|
!,
|
|
170
173
|
atom_string(Name, Local),
|
|
171
|
-
string_concat(Prefix, Local,
|
|
172
|
-
|
|
173
|
-
|
|
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).
|
package/examples/output/age.pl
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
ageAbove(patH,
|
|
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
|
+
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,
|
|
2
|
-
captured_field(l1, level,
|
|
3
|
-
captured_field(l1, event,
|
|
4
|
-
captured_field(l1, user,
|
|
5
|
-
captured_field(l1, ip,
|
|
6
|
-
captured_field(l1, trace_id,
|
|
7
|
-
captured_field(l1, span_id,
|
|
8
|
-
captured_field(l1, flags,
|
|
9
|
-
captured_field(l2, ts,
|
|
10
|
-
captured_field(l2, level,
|
|
11
|
-
captured_field(l2, event,
|
|
12
|
-
captured_field(l2, user,
|
|
13
|
-
captured_field(l2, ip,
|
|
14
|
-
captured_field(l2, trace_id,
|
|
15
|
-
captured_field(l2, span_id,
|
|
16
|
-
captured_field(l2, flags,
|
|
17
|
-
captured_field(l3, ts,
|
|
18
|
-
captured_field(l3, level,
|
|
19
|
-
captured_field(l3, event,
|
|
20
|
-
captured_field(l3, user,
|
|
21
|
-
captured_field(l3, ip,
|
|
22
|
-
captured_field(l3, trace_id,
|
|
23
|
-
captured_field(l3, span_id,
|
|
24
|
-
captured_field(l3, flags,
|
|
25
|
-
parsed_event(l1,
|
|
26
|
-
parsed_event(l2,
|
|
27
|
-
parsed_event(l3,
|
|
28
|
-
trace_alert(
|
|
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.
|
|
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(
|
|
2
|
-
airroute(
|
|
3
|
-
airroute(
|
|
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(
|
|
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,
|
|
2
|
-
report(unique_tags, [
|
|
3
|
-
report(tag_label,
|
|
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,
|
|
1
|
+
ageAbove(patH, 'P80Y').
|