eyeling 1.16.4 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HANDBOOK.md +158 -7
- package/README.md +1 -1
- package/examples/auroracare.n3 +528 -0
- package/examples/control-system.n3 +222 -47
- package/examples/delfour.n3 +409 -0
- package/examples/easter.n3 +208 -78
- package/examples/gps.n3 +144 -53
- package/examples/ill-formed-literals.n3 +195 -0
- package/examples/output/auroracare.n3 +149 -0
- package/examples/output/control-system.n3 +19 -4
- package/examples/output/delfour.n3 +30 -0
- package/examples/output/digital-product-passport.n3 +1 -10
- package/examples/output/easter.n3 +150 -32
- package/examples/output/genetic-algorithm-knapsack.n3 +1 -3
- package/examples/output/genetic-algorithm.n3 +1 -3
- package/examples/output/gps.n3 +14 -5
- package/examples/output/ill-formed-literals.n3 +27 -0
- package/examples/output/interop-demo.n3 +1 -34
- package/examples/output/odrl-dpv-ehds-risk-ranked.n3 +21 -12
- package/examples/output/odrl-dpv-healthcare-risk-ranked.n3 +16 -116
- package/examples/output/odrl-dpv-risk-ranked.n3 +22 -13
- package/examples/output/odrl-risk-mitigation.n3 +17 -206
- package/examples/output/odrl-risk.n3 +5 -63
- package/examples/output/parcellocker.n3 +20 -0
- package/examples/output/sqrt2-cauchy.n3 +13 -57
- package/examples/output/sqrt2-dedekind.n3 +31 -108
- package/examples/parcellocker.n3 +164 -0
- package/eyeling.js +50 -28
- package/lib/builtins.js +1 -1
- package/lib/cli.js +33 -26
- package/lib/engine.js +14 -1
- package/lib/prelude.js +2 -0
- package/package.json +1 -1
- package/test/api.test.js +2 -2
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# ==========================
|
|
2
|
+
# Ill-formed literal checker
|
|
3
|
+
#
|
|
4
|
+
# Datatypes covered
|
|
5
|
+
# - xsd:boolean
|
|
6
|
+
# - integer family
|
|
7
|
+
# - xsd:decimal
|
|
8
|
+
# - xsd:float / xsd:double
|
|
9
|
+
# - xsd:date
|
|
10
|
+
# - xsd:dateTime
|
|
11
|
+
# - xsd:duration
|
|
12
|
+
# ==========================
|
|
13
|
+
|
|
14
|
+
@prefix : <http://example.org/#>.
|
|
15
|
+
@prefix list: <http://www.w3.org/2000/10/swap/list#>.
|
|
16
|
+
@prefix log: <http://www.w3.org/2000/10/swap/log#>.
|
|
17
|
+
@prefix math: <http://www.w3.org/2000/10/swap/math#>.
|
|
18
|
+
@prefix string: <http://www.w3.org/2000/10/swap/string#>.
|
|
19
|
+
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
|
|
20
|
+
|
|
21
|
+
# ---------
|
|
22
|
+
# Demo data
|
|
23
|
+
# ---------
|
|
24
|
+
|
|
25
|
+
# well-formed examples
|
|
26
|
+
:okInt :p "42"^^xsd:integer.
|
|
27
|
+
:okBool1 :p "true"^^xsd:boolean.
|
|
28
|
+
:okBool2 :p "0"^^xsd:boolean.
|
|
29
|
+
:okDecimal :p "-12.50"^^xsd:decimal.
|
|
30
|
+
:okDouble :p "6.022e23"^^xsd:double.
|
|
31
|
+
:okDate :p "2025-01-31"^^xsd:date.
|
|
32
|
+
:okDateTime :p "2025-01-31T23:59:59Z"^^xsd:dateTime.
|
|
33
|
+
:okDuration :p "PT900S"^^xsd:duration.
|
|
34
|
+
|
|
35
|
+
# ill-formed examples
|
|
36
|
+
:badInt1 :p "abc"^^xsd:integer.
|
|
37
|
+
:badInt2 :p "12.3"^^xsd:int.
|
|
38
|
+
:badBool :p "truish"^^xsd:boolean.
|
|
39
|
+
:badDecimal :p "12.3.4"^^xsd:decimal.
|
|
40
|
+
:badDouble :p "1e"^^xsd:double.
|
|
41
|
+
:badDate :p "yesterday"^^xsd:dateTime.
|
|
42
|
+
:badDateTime :p "not-a-datetime"^^xsd:dateTime.
|
|
43
|
+
:badDuration :p "not-a-duration"^^xsd:duration.
|
|
44
|
+
|
|
45
|
+
# ---------------------------------
|
|
46
|
+
# Rules: detect ill-formed literals
|
|
47
|
+
# ---------------------------------
|
|
48
|
+
|
|
49
|
+
# xsd:boolean
|
|
50
|
+
{
|
|
51
|
+
?s ?p ?lit.
|
|
52
|
+
?lit log:rawType log:Literal.
|
|
53
|
+
(?lex xsd:boolean) log:dtlit ?lit.
|
|
54
|
+
?lex string:notMatches "^(true|false|1|0)$".
|
|
55
|
+
}
|
|
56
|
+
=>
|
|
57
|
+
{
|
|
58
|
+
(?s ?p ?lit)
|
|
59
|
+
:illFormedLiteral true;
|
|
60
|
+
:datatype xsd:boolean;
|
|
61
|
+
:lexicalForm ?lex;
|
|
62
|
+
:reason "invalid xsd:boolean lexical form".
|
|
63
|
+
}.
|
|
64
|
+
|
|
65
|
+
# integer family
|
|
66
|
+
{
|
|
67
|
+
?s ?p ?lit.
|
|
68
|
+
?lit log:rawType log:Literal.
|
|
69
|
+
(?lex ?dt) log:dtlit ?lit.
|
|
70
|
+
?dt list:in (
|
|
71
|
+
xsd:integer
|
|
72
|
+
xsd:long
|
|
73
|
+
xsd:int
|
|
74
|
+
xsd:short
|
|
75
|
+
xsd:byte
|
|
76
|
+
xsd:nonNegativeInteger
|
|
77
|
+
xsd:positiveInteger
|
|
78
|
+
xsd:nonPositiveInteger
|
|
79
|
+
xsd:negativeInteger
|
|
80
|
+
xsd:unsignedLong
|
|
81
|
+
xsd:unsignedInt
|
|
82
|
+
xsd:unsignedShort
|
|
83
|
+
xsd:unsignedByte
|
|
84
|
+
).
|
|
85
|
+
?lex string:notMatches "^[+-]?[0-9]+$".
|
|
86
|
+
}
|
|
87
|
+
=>
|
|
88
|
+
{
|
|
89
|
+
(?s ?p ?lit)
|
|
90
|
+
:illFormedLiteral true;
|
|
91
|
+
:datatype ?dt;
|
|
92
|
+
:lexicalForm ?lex;
|
|
93
|
+
:reason "invalid integer-family lexical form".
|
|
94
|
+
}.
|
|
95
|
+
|
|
96
|
+
# xsd:decimal
|
|
97
|
+
{
|
|
98
|
+
?s ?p ?lit.
|
|
99
|
+
?lit log:rawType log:Literal.
|
|
100
|
+
(?lex xsd:decimal) log:dtlit ?lit.
|
|
101
|
+
?lex string:notMatches "^[+-]?(?:[0-9]+\\.[0-9]*|\\.[0-9]+|[0-9]+)$".
|
|
102
|
+
}
|
|
103
|
+
=>
|
|
104
|
+
{
|
|
105
|
+
(?s ?p ?lit)
|
|
106
|
+
:illFormedLiteral true;
|
|
107
|
+
:datatype xsd:decimal;
|
|
108
|
+
:lexicalForm ?lex;
|
|
109
|
+
:reason "invalid xsd:decimal lexical form".
|
|
110
|
+
}.
|
|
111
|
+
|
|
112
|
+
# xsd:float / xsd:double
|
|
113
|
+
{
|
|
114
|
+
?s ?p ?lit.
|
|
115
|
+
?lit log:rawType log:Literal.
|
|
116
|
+
(?lex ?dt) log:dtlit ?lit.
|
|
117
|
+
?dt list:in ( xsd:float xsd:double ).
|
|
118
|
+
?lex string:notMatches "^(?:NaN|INF|-INF|[+-]?(?:[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+)(?:[eE][+-]?[0-9]+)?)$".
|
|
119
|
+
}
|
|
120
|
+
=>
|
|
121
|
+
{
|
|
122
|
+
(?s ?p ?lit)
|
|
123
|
+
:illFormedLiteral true;
|
|
124
|
+
:datatype ?dt;
|
|
125
|
+
:lexicalForm ?lex;
|
|
126
|
+
:reason "invalid xsd:float/xsd:double lexical form".
|
|
127
|
+
}.
|
|
128
|
+
|
|
129
|
+
# xsd:date
|
|
130
|
+
{
|
|
131
|
+
?s ?p ?lit.
|
|
132
|
+
?lit log:rawType log:Literal.
|
|
133
|
+
(?lex xsd:date) log:dtlit ?lit.
|
|
134
|
+
1 log:notIncludes { ?lit math:equalTo ?lit. }.
|
|
135
|
+
}
|
|
136
|
+
=>
|
|
137
|
+
{
|
|
138
|
+
(?s ?p ?lit)
|
|
139
|
+
:illFormedLiteral true;
|
|
140
|
+
:datatype xsd:date;
|
|
141
|
+
:lexicalForm ?lex;
|
|
142
|
+
:reason "xsd:date literal is not parseable by the reasoner".
|
|
143
|
+
}.
|
|
144
|
+
|
|
145
|
+
# xsd:dateTime
|
|
146
|
+
{
|
|
147
|
+
?s ?p ?lit.
|
|
148
|
+
?lit log:rawType log:Literal.
|
|
149
|
+
(?lex xsd:dateTime) log:dtlit ?lit.
|
|
150
|
+
1 log:notIncludes { ?lit math:equalTo ?lit. }.
|
|
151
|
+
}
|
|
152
|
+
=>
|
|
153
|
+
{
|
|
154
|
+
(?s ?p ?lit)
|
|
155
|
+
:illFormedLiteral true;
|
|
156
|
+
:datatype xsd:dateTime;
|
|
157
|
+
:lexicalForm ?lex;
|
|
158
|
+
:reason "xsd:dateTime literal is not parseable by the reasoner".
|
|
159
|
+
}.
|
|
160
|
+
|
|
161
|
+
# xsd:duration
|
|
162
|
+
{
|
|
163
|
+
?s ?p ?lit.
|
|
164
|
+
?lit log:rawType log:Literal.
|
|
165
|
+
(?lex xsd:duration) log:dtlit ?lit.
|
|
166
|
+
1 log:notIncludes { ?lit math:equalTo ?lit. }.
|
|
167
|
+
}
|
|
168
|
+
=>
|
|
169
|
+
{
|
|
170
|
+
(?s ?p ?lit)
|
|
171
|
+
:illFormedLiteral true;
|
|
172
|
+
:datatype xsd:duration;
|
|
173
|
+
:lexicalForm ?lex;
|
|
174
|
+
:reason "xsd:duration literal is not parseable by the reasoner".
|
|
175
|
+
}.
|
|
176
|
+
|
|
177
|
+
# -----------------
|
|
178
|
+
# Output projection
|
|
179
|
+
# -----------------
|
|
180
|
+
|
|
181
|
+
{
|
|
182
|
+
?issue :illFormedLiteral true;
|
|
183
|
+
:datatype ?dt;
|
|
184
|
+
:lexicalForm ?lex;
|
|
185
|
+
:reason ?why.
|
|
186
|
+
}
|
|
187
|
+
log:query
|
|
188
|
+
{
|
|
189
|
+
?issue :datatype ?dt;
|
|
190
|
+
:lexicalForm ?lex;
|
|
191
|
+
:reason ?why.
|
|
192
|
+
}.
|
|
193
|
+
|
|
194
|
+
# Optional hard-fail mode:
|
|
195
|
+
# { ?issue :illFormedLiteral true. } => false.
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
AuroraCare — Purpose-based Medical Data Exchange
|
|
2
|
+
|
|
3
|
+
=== A – Primary care visit ===
|
|
4
|
+
Clinician in the patient's care team accessing the patient summary for primary care management.
|
|
5
|
+
|
|
6
|
+
Answer
|
|
7
|
+
PERMIT
|
|
8
|
+
|
|
9
|
+
Reason Why
|
|
10
|
+
Permitted: clinician in the patient's care team, and the primary-care policy matched.
|
|
11
|
+
|
|
12
|
+
Check
|
|
13
|
+
C1 SKIPPED - not a prohibited purpose
|
|
14
|
+
C2 OK - clinician
|
|
15
|
+
C3 OK - care-team linked
|
|
16
|
+
C4 SKIPPED
|
|
17
|
+
C5 OK - operator=isAnyOf, allowed=["https://example.org/health#PATIENT_SUMMARY","https://example.org/health#LAB_RESULTS"], requested=["https://example.org/health#PATIENT_SUMMARY"]
|
|
18
|
+
C6 SKIPPED - no prohibition matched
|
|
19
|
+
C7 OK - trace shows matching permission
|
|
20
|
+
C8 SKIPPED - no matched policy or no duties
|
|
21
|
+
C9 SKIPPED - policy has no environment constraint
|
|
22
|
+
C10 INFO - matched policy: urn:policy:primary-care-001
|
|
23
|
+
|
|
24
|
+
=== B – Quality improvement (in scope) ===
|
|
25
|
+
QI analyst using lab results + summary in a secure environment.
|
|
26
|
+
|
|
27
|
+
Answer
|
|
28
|
+
PERMIT
|
|
29
|
+
|
|
30
|
+
Reason Why
|
|
31
|
+
Permitted: ODRL/DPV policy matched for secondary use.
|
|
32
|
+
|
|
33
|
+
Check
|
|
34
|
+
C1 SKIPPED - not a prohibited purpose
|
|
35
|
+
C2 SKIPPED
|
|
36
|
+
C3 SKIPPED
|
|
37
|
+
C4 OK - opt-in present and policy matched
|
|
38
|
+
C5 OK - operator=isAllOf, allowed=["https://example.org/health#LAB_RESULTS","https://example.org/health#PATIENT_SUMMARY"], requested=["https://example.org/health#LAB_RESULTS","https://example.org/health#PATIENT_SUMMARY"]
|
|
39
|
+
C6 SKIPPED - no prohibition matched
|
|
40
|
+
C7 OK - trace shows matching permission
|
|
41
|
+
C8 INFO - duties attached: duty:https://w3id.org/dpv/legal/eu/ehds#requireConsent, duty:https://w3id.org/dpv/legal/eu/ehds#noExfiltration
|
|
42
|
+
C9 OK - operator=eq, allowed="secure_env", requested="secure_env"
|
|
43
|
+
C10 INFO - matched policy: urn:policy:qi-2025-aurora
|
|
44
|
+
|
|
45
|
+
=== C – Quality improvement (out of scope) ===
|
|
46
|
+
QI analyst with only lab results; policy expects labs + summary.
|
|
47
|
+
|
|
48
|
+
Answer
|
|
49
|
+
DENY
|
|
50
|
+
|
|
51
|
+
Reason Why
|
|
52
|
+
Denied: no policy matched (purpose, environment, TOMs, or categories out of scope).
|
|
53
|
+
|
|
54
|
+
Check
|
|
55
|
+
C1 SKIPPED - not a prohibited purpose
|
|
56
|
+
C2 SKIPPED
|
|
57
|
+
C3 SKIPPED
|
|
58
|
+
C4 OK - denied because opt-in missing or no policy match
|
|
59
|
+
C5 SKIPPED
|
|
60
|
+
C6 SKIPPED - no prohibition matched
|
|
61
|
+
C7 SKIPPED
|
|
62
|
+
C8 SKIPPED - no matched policy or no duties
|
|
63
|
+
C9 SKIPPED
|
|
64
|
+
C10 SKIPPED - no matched policy
|
|
65
|
+
|
|
66
|
+
=== D – Insurance management ===
|
|
67
|
+
Insurance bot attempting to use health data for insurance management (prohibited purpose).
|
|
68
|
+
|
|
69
|
+
Answer
|
|
70
|
+
DENY
|
|
71
|
+
|
|
72
|
+
Reason Why
|
|
73
|
+
Denied: the requested purpose (insurance management) is prohibited by policy.
|
|
74
|
+
|
|
75
|
+
Check
|
|
76
|
+
C1 OK - denied prohibited purpose
|
|
77
|
+
C2 SKIPPED
|
|
78
|
+
C3 SKIPPED
|
|
79
|
+
C4 SKIPPED
|
|
80
|
+
C5 SKIPPED
|
|
81
|
+
C6 OK - denied due to prohibition
|
|
82
|
+
C7 SKIPPED
|
|
83
|
+
C8 SKIPPED - no matched policy or no duties
|
|
84
|
+
C9 SKIPPED
|
|
85
|
+
C10 SKIPPED - no matched policy
|
|
86
|
+
|
|
87
|
+
=== E – GP checks labs ===
|
|
88
|
+
GP for the same patient checking lab results via the API gateway.
|
|
89
|
+
|
|
90
|
+
Answer
|
|
91
|
+
PERMIT
|
|
92
|
+
|
|
93
|
+
Reason Why
|
|
94
|
+
Permitted: clinician in the patient's care team, and the primary-care policy matched.
|
|
95
|
+
|
|
96
|
+
Check
|
|
97
|
+
C1 SKIPPED - not a prohibited purpose
|
|
98
|
+
C2 OK - clinician
|
|
99
|
+
C3 OK - care-team linked
|
|
100
|
+
C4 SKIPPED
|
|
101
|
+
C5 OK - operator=isAnyOf, allowed=["https://example.org/health#PATIENT_SUMMARY","https://example.org/health#LAB_RESULTS"], requested=["https://example.org/health#LAB_RESULTS"]
|
|
102
|
+
C6 SKIPPED - no prohibition matched
|
|
103
|
+
C7 OK - trace shows matching permission
|
|
104
|
+
C8 SKIPPED - no matched policy or no duties
|
|
105
|
+
C9 SKIPPED - policy has no environment constraint
|
|
106
|
+
C10 INFO - matched policy: urn:policy:primary-care-001
|
|
107
|
+
|
|
108
|
+
=== F – Research on anonymised dataset ===
|
|
109
|
+
Researcher using anonymised labs + summary in a secure environment, with opt-in.
|
|
110
|
+
|
|
111
|
+
Answer
|
|
112
|
+
PERMIT
|
|
113
|
+
|
|
114
|
+
Reason Why
|
|
115
|
+
Permitted: subject opted in and an ODRL/DPV policy matched (anonymised dataset in secure environment).
|
|
116
|
+
|
|
117
|
+
Check
|
|
118
|
+
C1 SKIPPED - not a prohibited purpose
|
|
119
|
+
C2 SKIPPED
|
|
120
|
+
C3 SKIPPED
|
|
121
|
+
C4 OK - opt-in present and policy matched
|
|
122
|
+
C5 OK - operator=isAnyOf, allowed=["https://example.org/health#LAB_RESULTS","https://example.org/health#PATIENT_SUMMARY","https://example.org/health#IMAGING_REPORT"], requested=["https://example.org/health#PATIENT_SUMMARY","https://example.org/health#LAB_RESULTS"]
|
|
123
|
+
C6 SKIPPED - no prohibition matched
|
|
124
|
+
C7 OK - trace shows matching permission
|
|
125
|
+
C8 INFO - duties attached: duty:https://w3id.org/dpv/legal/eu/ehds#annualOutcomeReport, duty:https://w3id.org/dpv/legal/eu/ehds#noReidentification, duty:https://w3id.org/dpv/legal/eu/ehds#noExfiltration
|
|
126
|
+
C9 OK - operator=eq, allowed="secure_env", requested="secure_env"
|
|
127
|
+
C10 INFO - matched policy: urn:policy:research-aurora-diabetes
|
|
128
|
+
|
|
129
|
+
=== G – AI training (opt-out) ===
|
|
130
|
+
Data user wants to train AI, but the subject opted out of AI training.
|
|
131
|
+
|
|
132
|
+
Answer
|
|
133
|
+
DENY
|
|
134
|
+
|
|
135
|
+
Reason Why
|
|
136
|
+
Denied: you opted out of your data being used to train AI systems.
|
|
137
|
+
|
|
138
|
+
Check
|
|
139
|
+
C1 SKIPPED - not a prohibited purpose
|
|
140
|
+
C2 SKIPPED
|
|
141
|
+
C3 SKIPPED
|
|
142
|
+
C4 OK - denied because opt-in missing or no policy match
|
|
143
|
+
C5 SKIPPED
|
|
144
|
+
C6 SKIPPED - no prohibition matched
|
|
145
|
+
C7 SKIPPED
|
|
146
|
+
C8 SKIPPED - no matched policy or no duties
|
|
147
|
+
C9 SKIPPED
|
|
148
|
+
C10 SKIPPED - no matched policy
|
|
149
|
+
|
|
@@ -1,5 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
|
|
1
|
+
Control System — ARC explanation of two control signals
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
Answer
|
|
4
|
+
Send both actuator commands now.
|
|
5
|
+
Actuator 1 command: 39.27346198678276
|
|
6
|
+
Actuator 2 command: 26.08
|
|
7
|
+
|
|
8
|
+
Reason Why
|
|
9
|
+
The first sensor pair is 6 and 11, so the reading is rising and the controller normalizes the gap 5 into 2.23606797749979. That normalized value creates a feedforward term of 43.82693235899588, while the known disturbance 35766 contributes a compensation term of 4.553470372213121. Subtracting that compensation gives actuator 1 the command 39.27346198678276. For actuator 2, the target is 5 units above the measured output, so the tracking error is positive. The observed state is -2 relative units below the measured output, so the differential correction is negative. That yields a proportional feedback part of 29, a nonlinear factor of 1.46, and a differential contribution of -2.92. Together they produce actuator 2 command 26.08.
|
|
10
|
+
|
|
11
|
+
Check
|
|
12
|
+
C1 OK - the first sensor pair is rising, so the normalization uses the rising-branch rule.
|
|
13
|
+
C2 OK - the normalized measurement is positive and smaller than the raw gap, which is consistent with a square-root normalization.
|
|
14
|
+
C3 OK - actuator 1 is lower than its proportional feedforward term because disturbance compensation is subtracted.
|
|
15
|
+
C4 OK - the target is above the measured output, so the tracking error is positive.
|
|
16
|
+
C5 OK - the observed state is below the measured output, so the differential error is negative.
|
|
17
|
+
C6 OK - actuator 2 is lower than its pure proportional term because the differential part reduces it.
|
|
18
|
+
C7 OK - actuator 1 matches an independently reconstructed feedforward calculation.
|
|
19
|
+
C8 OK - actuator 2 matches an independently reconstructed feedback calculation.
|
|
20
|
+
C9 OK - both actuator commands stay positive.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
=== Answer ===
|
|
2
|
+
The scanner is allowed to use a neutral shopping insight and recommends Low-Sugar Tea Biscuits instead of Classic Tea Biscuits.
|
|
3
|
+
case : delfour
|
|
4
|
+
decision : Allowed
|
|
5
|
+
scanned product : Classic Tea Biscuits
|
|
6
|
+
suggested alternative: Low-Sugar Tea Biscuits
|
|
7
|
+
|
|
8
|
+
=== Reason Why ===
|
|
9
|
+
The phone desensitizes a diabetes-related household condition into a scoped low-sugar need, wraps it in an expiring Insight + Policy envelope, signs it, and the scanner consumes that envelope for shopping assistance.
|
|
10
|
+
metric : sugar_g_per_serving
|
|
11
|
+
threshold : 10.0
|
|
12
|
+
scope : self-scanner @ pick_up_scanner
|
|
13
|
+
retailer : Delfour
|
|
14
|
+
signature alg : HMAC-SHA256
|
|
15
|
+
banner headline : Track sugar per serving while you scan
|
|
16
|
+
expires at : 2025-10-05T22:33:48.907185+00:00
|
|
17
|
+
reason.txt : Household requires low-sugar guidance (diabetes in POD). A neutral Insight is scoped to device 'self-scanner', event 'pick_up_scanner', retailer 'Delfour', and expires soon; the policy confines use to shopping assistance.
|
|
18
|
+
audit entries : 1
|
|
19
|
+
bus files written : 6
|
|
20
|
+
|
|
21
|
+
=== Check ===
|
|
22
|
+
signature verifies : yes
|
|
23
|
+
payload hash matches : yes
|
|
24
|
+
minimization strips sensitive terms: yes
|
|
25
|
+
scope complete : yes
|
|
26
|
+
authorization allowed : yes
|
|
27
|
+
high-sugar banner : yes
|
|
28
|
+
alternative lowers sugar : yes
|
|
29
|
+
duty timing consistent : yes
|
|
30
|
+
marketing prohibited : yes
|
|
@@ -1,10 +1 @@
|
|
|
1
|
-
|
|
2
|
-
@prefix log: <http://www.w3.org/2000/10/swap/log#> .
|
|
3
|
-
|
|
4
|
-
:ACME-X1000-SN123 :totalMassG 105 .
|
|
5
|
-
:ACME-X1000-SN123 :recycledMassG 14 .
|
|
6
|
-
:ACME-X1000-SN123 :recycledContentPct 13 .
|
|
7
|
-
:ACME-X1000-SN123 :lifecycleFootprint_gCO2e 52500 .
|
|
8
|
-
:ACME-X1000-SN123 :circularityHint :repairFriendly .
|
|
9
|
-
:ACME-X1000-SN123 :containsCriticalRawMaterial true .
|
|
10
|
-
:ACME-X1000-SN123 log:outputString "ACME X1000 SN123 | recycled=13% | lifecycle=52500 gCO2e | CRM=true | hint=http://example.org/dpp#repairFriendly\n" .
|
|
1
|
+
ACME X1000 SN123 | recycled=13% | lifecycle=52500 gCO2e | CRM=true | hint=http://example.org/dpp#repairFriendly
|
|
@@ -1,32 +1,150 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
1
|
+
Easter — Gregorian computus
|
|
2
|
+
|
|
3
|
+
=== 2026 ===
|
|
4
|
+
Answer
|
|
5
|
+
Easter Sunday falls on April 5.
|
|
6
|
+
|
|
7
|
+
Reason Why
|
|
8
|
+
For year 2026, the computus gives j=12, k=20, q=6, r=12, v=2, and final month/day numbers x=4, z=4. Because the day is z+1, the resulting Easter date is April 5.
|
|
9
|
+
|
|
10
|
+
Check
|
|
11
|
+
C1 OK - the Golden Number remainder j is inside the 0–18 cycle.
|
|
12
|
+
C2 OK - the epact-style remainder r is inside the 0–29 cycle.
|
|
13
|
+
C3 OK - the weekday adjustment v is inside the 0–6 cycle.
|
|
14
|
+
C4 OK - the final month is a valid Easter month (March or April).
|
|
15
|
+
C5 OK - the final date is inside the legal Gregorian Easter window.
|
|
16
|
+
Easter — Gregorian computus
|
|
17
|
+
|
|
18
|
+
=== 2027 ===
|
|
19
|
+
Answer
|
|
20
|
+
Easter Sunday falls on March 28.
|
|
21
|
+
|
|
22
|
+
Reason Why
|
|
23
|
+
For year 2027, the computus gives j=13, k=20, q=6, r=1, v=5, and final month/day numbers x=3, z=27. Because the day is z+1, the resulting Easter date is March 28.
|
|
24
|
+
|
|
25
|
+
Check
|
|
26
|
+
C1 OK - the Golden Number remainder j is inside the 0–18 cycle.
|
|
27
|
+
C2 OK - the epact-style remainder r is inside the 0–29 cycle.
|
|
28
|
+
C3 OK - the weekday adjustment v is inside the 0–6 cycle.
|
|
29
|
+
C4 OK - the final month is a valid Easter month (March or April).
|
|
30
|
+
C5 OK - the final date is inside the legal Gregorian Easter window.
|
|
31
|
+
Easter — Gregorian computus
|
|
32
|
+
|
|
33
|
+
=== 2028 ===
|
|
34
|
+
Answer
|
|
35
|
+
Easter Sunday falls on April 16.
|
|
36
|
+
|
|
37
|
+
Reason Why
|
|
38
|
+
For year 2028, the computus gives j=14, k=20, q=6, r=20, v=5, and final month/day numbers x=4, z=15. Because the day is z+1, the resulting Easter date is April 16.
|
|
39
|
+
|
|
40
|
+
Check
|
|
41
|
+
C1 OK - the Golden Number remainder j is inside the 0–18 cycle.
|
|
42
|
+
C2 OK - the epact-style remainder r is inside the 0–29 cycle.
|
|
43
|
+
C3 OK - the weekday adjustment v is inside the 0–6 cycle.
|
|
44
|
+
C4 OK - the final month is a valid Easter month (March or April).
|
|
45
|
+
C5 OK - the final date is inside the legal Gregorian Easter window.
|
|
46
|
+
Easter — Gregorian computus
|
|
47
|
+
|
|
48
|
+
=== 2029 ===
|
|
49
|
+
Answer
|
|
50
|
+
Easter Sunday falls on April 1.
|
|
51
|
+
|
|
52
|
+
Reason Why
|
|
53
|
+
For year 2029, the computus gives j=15, k=20, q=6, r=9, v=1, and final month/day numbers x=4, z=0. Because the day is z+1, the resulting Easter date is April 1.
|
|
54
|
+
|
|
55
|
+
Check
|
|
56
|
+
C1 OK - the Golden Number remainder j is inside the 0–18 cycle.
|
|
57
|
+
C2 OK - the epact-style remainder r is inside the 0–29 cycle.
|
|
58
|
+
C3 OK - the weekday adjustment v is inside the 0–6 cycle.
|
|
59
|
+
C4 OK - the final month is a valid Easter month (March or April).
|
|
60
|
+
C5 OK - the final date is inside the legal Gregorian Easter window.
|
|
61
|
+
Easter — Gregorian computus
|
|
62
|
+
|
|
63
|
+
=== 2030 ===
|
|
64
|
+
Answer
|
|
65
|
+
Easter Sunday falls on April 21.
|
|
66
|
+
|
|
67
|
+
Reason Why
|
|
68
|
+
For year 2030, the computus gives j=16, k=20, q=6, r=28, v=2, and final month/day numbers x=4, z=20. Because the day is z+1, the resulting Easter date is April 21.
|
|
69
|
+
|
|
70
|
+
Check
|
|
71
|
+
C1 OK - the Golden Number remainder j is inside the 0–18 cycle.
|
|
72
|
+
C2 OK - the epact-style remainder r is inside the 0–29 cycle.
|
|
73
|
+
C3 OK - the weekday adjustment v is inside the 0–6 cycle.
|
|
74
|
+
C4 OK - the final month is a valid Easter month (March or April).
|
|
75
|
+
C5 OK - the final date is inside the legal Gregorian Easter window.
|
|
76
|
+
Easter — Gregorian computus
|
|
77
|
+
|
|
78
|
+
=== 2031 ===
|
|
79
|
+
Answer
|
|
80
|
+
Easter Sunday falls on April 13.
|
|
81
|
+
|
|
82
|
+
Reason Why
|
|
83
|
+
For year 2031, the computus gives j=17, k=20, q=6, r=17, v=5, and final month/day numbers x=4, z=12. Because the day is z+1, the resulting Easter date is April 13.
|
|
84
|
+
|
|
85
|
+
Check
|
|
86
|
+
C1 OK - the Golden Number remainder j is inside the 0–18 cycle.
|
|
87
|
+
C2 OK - the epact-style remainder r is inside the 0–29 cycle.
|
|
88
|
+
C3 OK - the weekday adjustment v is inside the 0–6 cycle.
|
|
89
|
+
C4 OK - the final month is a valid Easter month (March or April).
|
|
90
|
+
C5 OK - the final date is inside the legal Gregorian Easter window.
|
|
91
|
+
Easter — Gregorian computus
|
|
92
|
+
|
|
93
|
+
=== 2032 ===
|
|
94
|
+
Answer
|
|
95
|
+
Easter Sunday falls on March 28.
|
|
96
|
+
|
|
97
|
+
Reason Why
|
|
98
|
+
For year 2032, the computus gives j=18, k=20, q=6, r=6, v=0, and final month/day numbers x=3, z=27. Because the day is z+1, the resulting Easter date is March 28.
|
|
99
|
+
|
|
100
|
+
Check
|
|
101
|
+
C1 OK - the Golden Number remainder j is inside the 0–18 cycle.
|
|
102
|
+
C2 OK - the epact-style remainder r is inside the 0–29 cycle.
|
|
103
|
+
C3 OK - the weekday adjustment v is inside the 0–6 cycle.
|
|
104
|
+
C4 OK - the final month is a valid Easter month (March or April).
|
|
105
|
+
C5 OK - the final date is inside the legal Gregorian Easter window.
|
|
106
|
+
Easter — Gregorian computus
|
|
107
|
+
|
|
108
|
+
=== 2033 ===
|
|
109
|
+
Answer
|
|
110
|
+
Easter Sunday falls on April 17.
|
|
111
|
+
|
|
112
|
+
Reason Why
|
|
113
|
+
For year 2033, the computus gives j=0, k=20, q=6, r=24, v=2, and final month/day numbers x=4, z=16. Because the day is z+1, the resulting Easter date is April 17.
|
|
114
|
+
|
|
115
|
+
Check
|
|
116
|
+
C1 OK - the Golden Number remainder j is inside the 0–18 cycle.
|
|
117
|
+
C2 OK - the epact-style remainder r is inside the 0–29 cycle.
|
|
118
|
+
C3 OK - the weekday adjustment v is inside the 0–6 cycle.
|
|
119
|
+
C4 OK - the final month is a valid Easter month (March or April).
|
|
120
|
+
C5 OK - the final date is inside the legal Gregorian Easter window.
|
|
121
|
+
Easter — Gregorian computus
|
|
122
|
+
|
|
123
|
+
=== 2034 ===
|
|
124
|
+
Answer
|
|
125
|
+
Easter Sunday falls on April 9.
|
|
126
|
+
|
|
127
|
+
Reason Why
|
|
128
|
+
For year 2034, the computus gives j=1, k=20, q=6, r=13, v=5, and final month/day numbers x=4, z=8. Because the day is z+1, the resulting Easter date is April 9.
|
|
129
|
+
|
|
130
|
+
Check
|
|
131
|
+
C1 OK - the Golden Number remainder j is inside the 0–18 cycle.
|
|
132
|
+
C2 OK - the epact-style remainder r is inside the 0–29 cycle.
|
|
133
|
+
C3 OK - the weekday adjustment v is inside the 0–6 cycle.
|
|
134
|
+
C4 OK - the final month is a valid Easter month (March or April).
|
|
135
|
+
C5 OK - the final date is inside the legal Gregorian Easter window.
|
|
136
|
+
Easter — Gregorian computus
|
|
137
|
+
|
|
138
|
+
=== 2035 ===
|
|
139
|
+
Answer
|
|
140
|
+
Easter Sunday falls on March 25.
|
|
141
|
+
|
|
142
|
+
Reason Why
|
|
143
|
+
For year 2035, the computus gives j=2, k=20, q=6, r=2, v=1, and final month/day numbers x=3, z=24. Because the day is z+1, the resulting Easter date is March 25.
|
|
144
|
+
|
|
145
|
+
Check
|
|
146
|
+
C1 OK - the Golden Number remainder j is inside the 0–18 cycle.
|
|
147
|
+
C2 OK - the epact-style remainder r is inside the 0–29 cycle.
|
|
148
|
+
C3 OK - the weekday adjustment v is inside the 0–6 cycle.
|
|
149
|
+
C4 OK - the final month is a valid Easter month (March or April).
|
|
150
|
+
C5 OK - the final date is inside the legal Gregorian Easter window.
|
package/examples/output/gps.n3
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
@prefix gps: <https://eyereasoner.github.io/eye/reasoning/gps/gps-schema#> .
|
|
3
|
-
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
|
|
1
|
+
GPS — Goal driven route planning
|
|
4
2
|
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
Answer
|
|
4
|
+
Take the direct route via Brugge.
|
|
5
|
+
Recommended route: Gent → Brugge → Oostende
|
|
6
|
+
|
|
7
|
+
Reason Why
|
|
8
|
+
From Gent to Oostende, the planner found two routes in this small map. The direct route (Gent → Brugge → Oostende) takes 2400 seconds at cost 0.01, with belief 0.9408 and comfort 0.99. The alternative (Gent → Kortrijk → Brugge → Oostende) takes 4100 seconds at cost 0.018, with belief 0.903168 and comfort 0.9801. So the direct route is faster, cheaper, more reliable, and slightly more comfortable.
|
|
9
|
+
|
|
10
|
+
Check
|
|
11
|
+
C1 OK - the direct Gent → Brugge → Oostende route was derived.
|
|
12
|
+
C2 OK - the alternative Gent → Kortrijk → Brugge → Oostende route was derived.
|
|
13
|
+
C3 OK - the recommended route is faster than the alternative.
|
|
14
|
+
C4 OK - the recommended route is cheaper than the alternative.
|
|
15
|
+
C5 OK - the recommended route has higher belief and comfort scores.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
@prefix : <http://example.org/#> .
|
|
2
|
+
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
|
|
3
|
+
|
|
4
|
+
(:badBool :p "truish"^^xsd:boolean) :datatype xsd:boolean .
|
|
5
|
+
(:badBool :p "truish"^^xsd:boolean) :lexicalForm "truish" .
|
|
6
|
+
(:badBool :p "truish"^^xsd:boolean) :reason "invalid xsd:boolean lexical form" .
|
|
7
|
+
(:badDate :p "yesterday"^^xsd:dateTime) :datatype xsd:dateTime .
|
|
8
|
+
(:badDate :p "yesterday"^^xsd:dateTime) :lexicalForm "yesterday" .
|
|
9
|
+
(:badDate :p "yesterday"^^xsd:dateTime) :reason "xsd:dateTime literal is not parseable by the reasoner" .
|
|
10
|
+
(:badDateTime :p "not-a-datetime"^^xsd:dateTime) :datatype xsd:dateTime .
|
|
11
|
+
(:badDateTime :p "not-a-datetime"^^xsd:dateTime) :lexicalForm "not-a-datetime" .
|
|
12
|
+
(:badDateTime :p "not-a-datetime"^^xsd:dateTime) :reason "xsd:dateTime literal is not parseable by the reasoner" .
|
|
13
|
+
(:badDecimal :p "12.3.4"^^xsd:decimal) :datatype xsd:decimal .
|
|
14
|
+
(:badDecimal :p "12.3.4"^^xsd:decimal) :lexicalForm "12.3.4" .
|
|
15
|
+
(:badDecimal :p "12.3.4"^^xsd:decimal) :reason "invalid xsd:decimal lexical form" .
|
|
16
|
+
(:badDouble :p "1e"^^xsd:double) :datatype xsd:double .
|
|
17
|
+
(:badDouble :p "1e"^^xsd:double) :lexicalForm "1e" .
|
|
18
|
+
(:badDouble :p "1e"^^xsd:double) :reason "invalid xsd:float/xsd:double lexical form" .
|
|
19
|
+
(:badDuration :p "not-a-duration"^^xsd:duration) :datatype xsd:duration .
|
|
20
|
+
(:badDuration :p "not-a-duration"^^xsd:duration) :lexicalForm "not-a-duration" .
|
|
21
|
+
(:badDuration :p "not-a-duration"^^xsd:duration) :reason "xsd:duration literal is not parseable by the reasoner" .
|
|
22
|
+
(:badInt1 :p "abc"^^xsd:integer) :datatype xsd:integer .
|
|
23
|
+
(:badInt1 :p "abc"^^xsd:integer) :lexicalForm "abc" .
|
|
24
|
+
(:badInt1 :p "abc"^^xsd:integer) :reason "invalid integer-family lexical form" .
|
|
25
|
+
(:badInt2 :p "12.3"^^xsd:int) :datatype xsd:int .
|
|
26
|
+
(:badInt2 :p "12.3"^^xsd:int) :lexicalForm "12.3" .
|
|
27
|
+
(:badInt2 :p "12.3"^^xsd:int) :reason "invalid integer-family lexical form" .
|