eyeprolog 1.3.97 → 1.3.99

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.
@@ -0,0 +1,449 @@
1
+ % Generated by rdf-prolog-roundtrip.
2
+
3
+ % RDF terms use rdf(Subject, Predicate, Object, Graph).
4
+
5
+ rdf(iri('https://example.org/city/facility/central-hall'), iri('https://example.org/vocab/kind'), iri('https://example.org/city/class/cooling-center'), iri('https://example.org/graph/city-facilities')).
6
+ rdf(iri('https://example.org/city/facility/central-hall'), iri('https://example.org/vocab/neighbourhood'), iri('https://example.org/city/neighbourhood/central'), iri('https://example.org/graph/city-facilities')).
7
+ rdf(iri('https://example.org/city/facility/central-hall'), iri('https://example.org/vocab/status'), iri('https://example.org/city/state/open'), iri('https://example.org/graph/city-facilities')).
8
+ rdf(iri('https://example.org/city/facility/central-hall'), iri('https://example.org/vocab/cooling'), iri('https://example.org/city/state/available'), iri('https://example.org/graph/city-facilities')).
9
+ rdf(iri('https://example.org/city/facility/central-hall'), iri('https://example.org/vocab/capacity'), literal('140', datatype('http://www.w3.org/2001/XMLSchema#integer')), iri('https://example.org/graph/city-facilities')).
10
+ rdf(iri('https://example.org/city/facility/central-hall'), iri('https://example.org/vocab/wheelchairAccess'), iri('https://example.org/city/value/yes'), iri('https://example.org/graph/city-facilities')).
11
+ rdf(iri('https://example.org/city/facility/north-library'), iri('https://example.org/vocab/kind'), iri('https://example.org/city/class/cooling-center'), iri('https://example.org/graph/city-facilities')).
12
+ rdf(iri('https://example.org/city/facility/north-library'), iri('https://example.org/vocab/neighbourhood'), iri('https://example.org/city/neighbourhood/north'), iri('https://example.org/graph/city-facilities')).
13
+ rdf(iri('https://example.org/city/facility/north-library'), iri('https://example.org/vocab/status'), iri('https://example.org/city/state/open'), iri('https://example.org/graph/city-facilities')).
14
+ rdf(iri('https://example.org/city/facility/north-library'), iri('https://example.org/vocab/cooling'), iri('https://example.org/city/state/available'), iri('https://example.org/graph/city-facilities')).
15
+ rdf(iri('https://example.org/city/facility/north-library'), iri('https://example.org/vocab/capacity'), literal('80', datatype('http://www.w3.org/2001/XMLSchema#integer')), iri('https://example.org/graph/city-facilities')).
16
+ rdf(iri('https://example.org/city/facility/north-library'), iri('https://example.org/vocab/wheelchairAccess'), iri('https://example.org/city/value/yes'), iri('https://example.org/graph/city-facilities')).
17
+ rdf(iri('https://example.org/city/facility/riverside-school'), iri('https://example.org/vocab/kind'), iri('https://example.org/city/class/school'), iri('https://example.org/graph/city-facilities')).
18
+ rdf(iri('https://example.org/city/facility/riverside-school'), iri('https://example.org/vocab/neighbourhood'), iri('https://example.org/city/neighbourhood/riverside'), iri('https://example.org/graph/city-facilities')).
19
+ rdf(iri('https://example.org/city/facility/riverside-school'), iri('https://example.org/vocab/status'), iri('https://example.org/city/state/open'), iri('https://example.org/graph/city-facilities')).
20
+ rdf(iri('https://example.org/city/facility/riverside-school'), iri('https://example.org/vocab/cooling'), iri('https://example.org/city/state/available'), iri('https://example.org/graph/city-facilities')).
21
+ rdf(iri('https://example.org/city/facility/riverside-school'), iri('https://example.org/vocab/capacity'), literal('90', datatype('http://www.w3.org/2001/XMLSchema#integer')), iri('https://example.org/graph/city-facilities')).
22
+ rdf(iri('https://example.org/city/facility/riverside-school'), iri('https://example.org/vocab/wheelchairAccess'), iri('https://example.org/city/value/yes'), iri('https://example.org/graph/city-facilities')).
23
+ rdf(iri('https://example.org/city/neighbourhood/riverside'), iri('https://example.org/vocab/expectedDemand'), literal('70', datatype('http://www.w3.org/2001/XMLSchema#integer')), iri('https://example.org/graph/emergency-plan')).
24
+ rdf(iri('https://example.org/city/neighbourhood/riverside'), iri('https://example.org/vocab/mobileUnitAvailable'), iri('https://example.org/city/value/yes'), iri('https://example.org/graph/emergency-plan')).
25
+ rdf(iri('https://example.org/city/route/7'), iri('https://example.org/vocab/connects'), iri('https://example.org/city/facility/north-library'), iri('https://example.org/graph/transit-plan')).
26
+ rdf(iri('https://example.org/city/route/8'), iri('https://example.org/vocab/connects'), iri('https://example.org/city/facility/central-hall'), iri('https://example.org/graph/transit-plan')).
27
+ rdf(iri('https://example.org/city/route/7'), iri('https://example.org/vocab/status'), iri('https://example.org/city/state/running'), iri('https://example.org/graph/transit-plan')).
28
+ rdf(iri('https://example.org/city/route/8'), iri('https://example.org/vocab/status'), iri('https://example.org/city/state/running'), iri('https://example.org/graph/transit-plan')).
29
+ rdf(iri('https://example.org/city/facility/central-hall'), iri('https://example.org/vocab/power'), iri('https://example.org/city/state/unstable'), iri('https://example.org/graph/power-sensors')).
30
+ rdf(iri('https://example.org/city/evidence/transit-api-20260827'), iri('https://example.org/vocab/evidenceKind'), iri('https://example.org/city/evidence-kind/official-feed'), iri('https://example.org/graph/evidence-registry')).
31
+ rdf(iri('https://example.org/city/evidence/transit-api-20260827'), iri('https://example.org/vocab/publisher'), iri('https://example.org/city/publisher/city-transit'), iri('https://example.org/graph/evidence-registry')).
32
+ rdf(iri('https://example.org/city/evidence/facilities-bulletin-20260827'), iri('https://example.org/vocab/evidenceKind'), iri('https://example.org/city/evidence-kind/official-document'), iri('https://example.org/graph/evidence-registry')).
33
+ rdf(iri('https://example.org/city/evidence/facilities-bulletin-20260827'), iri('https://example.org/vocab/publisher'), iri('https://example.org/city/publisher/city-facilities'), iri('https://example.org/graph/evidence-registry')).
34
+ rdf(iri('https://example.org/city/evidence/community-post-4812'), iri('https://example.org/vocab/evidenceKind'), iri('https://example.org/city/evidence-kind/public-report'), iri('https://example.org/graph/evidence-registry')).
35
+ rdf(iri('https://example.org/city/evidence/community-post-4812'), iri('https://example.org/vocab/publisher'), iri('https://example.org/city/publisher/resident-network'), iri('https://example.org/graph/evidence-registry')).
36
+ rdf(iri('https://example.org/city/evidence/volunteer-message-112'), iri('https://example.org/vocab/evidenceKind'), iri('https://example.org/city/evidence-kind/public-report'), iri('https://example.org/graph/evidence-registry')).
37
+ rdf(iri('https://example.org/city/evidence/volunteer-message-112'), iri('https://example.org/vocab/publisher'), iri('https://example.org/city/publisher/volunteer-coordinator'), iri('https://example.org/graph/evidence-registry')).
38
+ rdf(iri('https://example.org/city/proposal/p1'), iri('https://example.org/vocab/statement'), triple(iri('https://example.org/city/route/7'), iri('https://example.org/vocab/status'), iri('https://example.org/city/state/suspended')), iri('https://example.org/graph/ai-proposals')).
39
+ rdf(iri('https://example.org/city/proposal/p1'), iri('https://example.org/vocab/agent'), iri('https://example.org/city/agent/language-agent'), iri('https://example.org/graph/ai-proposals')).
40
+ rdf(iri('https://example.org/city/proposal/p1'), iri('https://example.org/vocab/evidence'), iri('https://example.org/city/evidence/transit-api-20260827'), iri('https://example.org/graph/ai-proposals')).
41
+ rdf(iri('https://example.org/city/proposal/p1'), iri('https://example.org/vocab/confidencePercent'), literal('99', datatype('http://www.w3.org/2001/XMLSchema#integer')), iri('https://example.org/graph/ai-proposals')).
42
+ rdf(iri('https://example.org/city/proposal/p2'), iri('https://example.org/vocab/statement'), triple(iri('https://example.org/city/facility/riverside-school'), iri('https://example.org/vocab/emergencyDesignation'), iri('https://example.org/city/class/cooling-center')), iri('https://example.org/graph/ai-proposals')).
43
+ rdf(iri('https://example.org/city/proposal/p2'), iri('https://example.org/vocab/agent'), iri('https://example.org/city/agent/language-agent'), iri('https://example.org/graph/ai-proposals')).
44
+ rdf(iri('https://example.org/city/proposal/p2'), iri('https://example.org/vocab/evidence'), iri('https://example.org/city/evidence/facilities-bulletin-20260827'), iri('https://example.org/graph/ai-proposals')).
45
+ rdf(iri('https://example.org/city/proposal/p2'), iri('https://example.org/vocab/confidencePercent'), literal('93', datatype('http://www.w3.org/2001/XMLSchema#integer')), iri('https://example.org/graph/ai-proposals')).
46
+ rdf(iri('https://example.org/city/proposal/p3'), iri('https://example.org/vocab/statement'), triple(iri('https://example.org/city/facility/central-hall'), iri('https://example.org/vocab/status'), iri('https://example.org/city/state/closed')), iri('https://example.org/graph/ai-proposals')).
47
+ rdf(iri('https://example.org/city/proposal/p3'), iri('https://example.org/vocab/agent'), iri('https://example.org/city/agent/language-agent'), iri('https://example.org/graph/ai-proposals')).
48
+ rdf(iri('https://example.org/city/proposal/p3'), iri('https://example.org/vocab/evidence'), iri('https://example.org/city/evidence/community-post-4812'), iri('https://example.org/graph/ai-proposals')).
49
+ rdf(iri('https://example.org/city/proposal/p3'), iri('https://example.org/vocab/confidencePercent'), literal('78', datatype('http://www.w3.org/2001/XMLSchema#integer')), iri('https://example.org/graph/ai-proposals')).
50
+ rdf(iri('https://example.org/city/proposal/p4'), iri('https://example.org/vocab/statement'), triple(iri('https://example.org/city/facility/north-library'), iri('https://example.org/vocab/capacity'), literal('40', datatype('http://www.w3.org/2001/XMLSchema#integer'))), iri('https://example.org/graph/ai-proposals')).
51
+ rdf(iri('https://example.org/city/proposal/p4'), iri('https://example.org/vocab/agent'), iri('https://example.org/city/agent/language-agent'), iri('https://example.org/graph/ai-proposals')).
52
+ rdf(iri('https://example.org/city/proposal/p4'), iri('https://example.org/vocab/evidence'), iri('https://example.org/city/evidence/volunteer-message-112'), iri('https://example.org/graph/ai-proposals')).
53
+ rdf(iri('https://example.org/city/proposal/p4'), iri('https://example.org/vocab/confidencePercent'), literal('66', datatype('http://www.w3.org/2001/XMLSchema#integer')), iri('https://example.org/graph/ai-proposals')).
54
+ rdf(iri('https://example.org/city/review/r2'), iri('https://example.org/vocab/aboutProposal'), iri('https://example.org/city/proposal/p2'), iri('https://example.org/graph/human-review')).
55
+ rdf(iri('https://example.org/city/review/r2'), iri('https://example.org/vocab/reviewer'), iri('https://example.org/city/actor/emergency-coordinator'), iri('https://example.org/graph/human-review')).
56
+ rdf(iri('https://example.org/city/review/r2'), iri('https://example.org/vocab/decision'), iri('https://example.org/city/decision/accept'), iri('https://example.org/graph/human-review')).
57
+ rdf(iri('https://example.org/city/review/r2'), iri('https://example.org/vocab/note'), literal('facility bulletin verified by phone', datatype('http://www.w3.org/2001/XMLSchema#string')), iri('https://example.org/graph/human-review')).
58
+ rdf(iri('https://example.org/city/review/r3'), iri('https://example.org/vocab/aboutProposal'), iri('https://example.org/city/proposal/p3'), iri('https://example.org/graph/human-review')).
59
+ rdf(iri('https://example.org/city/review/r3'), iri('https://example.org/vocab/reviewer'), iri('https://example.org/city/actor/operations-officer'), iri('https://example.org/graph/human-review')).
60
+ rdf(iri('https://example.org/city/review/r3'), iri('https://example.org/vocab/decision'), iri('https://example.org/city/decision/reject'), iri('https://example.org/graph/human-review')).
61
+ rdf(iri('https://example.org/city/review/r3'), iri('https://example.org/vocab/note'), literal('official operations desk confirms Central Hall is open', datatype('http://www.w3.org/2001/XMLSchema#string')), iri('https://example.org/graph/human-review')).
62
+
63
+ % Rules
64
+ % Symbiotic knowledge graph rules for EyeProlog.
65
+ %
66
+ % The source rdf/4 facts above are generated by rdf-prolog-roundtrip from
67
+ % symbiotic-knowledge-graph-input.nq. RDF stays the interchange and storage
68
+ % model; these rules provide the explicit reasoning and governance layer.
69
+
70
+ %% goal: proposal_state(X0, X1)
71
+ %% goal: conflict(X0, X1, X2, X3)
72
+ %% goal: knowledge_gain(X0, X1, X2)
73
+ %% goal: recommended_action(X0, X1, X2)
74
+ %% goal: decision_reason(X0, X1, X2)
75
+ %% goal: audit(X0, X1, X2, X3, X4)
76
+ %% goal: feedback_signal(X0, X1, X2)
77
+ %% goal: symbiosis_gain(X0, X1)
78
+ %% goal: knowledge_exchange(X0, X1)
79
+ %% goal: pipeline_step(X0, X1)
80
+ %% goal: cognitive_parallel(X0, X1)
81
+
82
+ % --- RDF vocabulary ----------------------------------------------------------
83
+
84
+ v(statement, iri('https://example.org/vocab/statement')).
85
+ v(agent, iri('https://example.org/vocab/agent')).
86
+ v(evidence, iri('https://example.org/vocab/evidence')).
87
+ v(confidence_percent, iri('https://example.org/vocab/confidencePercent')).
88
+ v(evidence_kind, iri('https://example.org/vocab/evidenceKind')).
89
+ v(about_proposal, iri('https://example.org/vocab/aboutProposal')).
90
+ v(reviewer, iri('https://example.org/vocab/reviewer')).
91
+ v(decision, iri('https://example.org/vocab/decision')).
92
+ v(note, iri('https://example.org/vocab/note')).
93
+ v(kind, iri('https://example.org/vocab/kind')).
94
+ v(neighbourhood, iri('https://example.org/vocab/neighbourhood')).
95
+ v(status, iri('https://example.org/vocab/status')).
96
+ v(cooling, iri('https://example.org/vocab/cooling')).
97
+ v(capacity, iri('https://example.org/vocab/capacity')).
98
+ v(wheelchair_access, iri('https://example.org/vocab/wheelchairAccess')).
99
+ v(expected_demand, iri('https://example.org/vocab/expectedDemand')).
100
+ v(mobile_unit_available, iri('https://example.org/vocab/mobileUnitAvailable')).
101
+ v(connects, iri('https://example.org/vocab/connects')).
102
+ v(power, iri('https://example.org/vocab/power')).
103
+ v(emergency_designation, iri('https://example.org/vocab/emergencyDesignation')).
104
+
105
+ graph(ai_proposals, iri('https://example.org/graph/ai-proposals')).
106
+ graph(human_review, iri('https://example.org/graph/human-review')).
107
+ graph(evidence_registry, iri('https://example.org/graph/evidence-registry')).
108
+ graph(accepted_knowledge, iri('https://example.org/graph/accepted-knowledge')).
109
+ graph(derived_decisions, iri('https://example.org/graph/derived-decisions')).
110
+
111
+ curated_graph(iri('https://example.org/graph/city-facilities')).
112
+ curated_graph(iri('https://example.org/graph/emergency-plan')).
113
+ curated_graph(iri('https://example.org/graph/transit-plan')).
114
+ curated_graph(iri('https://example.org/graph/power-sensors')).
115
+
116
+ curated(S, P, O) :- rdf(S, P, O, G), curated_graph(G).
117
+
118
+ integer_literal(literal(Text, datatype('http://www.w3.org/2001/XMLSchema#integer')), Number) :-
119
+ atom_chars(Text, Chars),
120
+ number_chars(Number, Chars).
121
+
122
+ % --- Candidate knowledge carried as RDF 1.2 triple terms --------------------
123
+
124
+ proposal(Id, Agent, Evidence, S, P, O, Confidence) :-
125
+ graph(ai_proposals, G),
126
+ v(statement, StatementP),
127
+ v(agent, AgentP),
128
+ v(evidence, EvidenceP),
129
+ v(confidence_percent, ConfidenceP),
130
+ rdf(Id, StatementP, triple(S, P, O), G),
131
+ rdf(Id, AgentP, Agent, G),
132
+ rdf(Id, EvidenceP, Evidence, G),
133
+ rdf(Id, ConfidenceP, ConfidenceLiteral, G),
134
+ integer_literal(ConfidenceLiteral, Confidence).
135
+
136
+ evidence_kind(Evidence, Kind) :-
137
+ graph(evidence_registry, G),
138
+ v(evidence_kind, Predicate),
139
+ rdf(Evidence, Predicate, Kind, G).
140
+
141
+ human_review(Id, Reviewer, Decision, Note) :-
142
+ graph(human_review, G),
143
+ v(about_proposal, AboutP),
144
+ v(reviewer, ReviewerP),
145
+ v(decision, DecisionP),
146
+ v(note, NoteP),
147
+ rdf(Review, AboutP, Id, G),
148
+ rdf(Review, ReviewerP, Reviewer, G),
149
+ rdf(Review, DecisionP, DecisionIri, G),
150
+ rdf(Review, NoteP, literal(Note, datatype('http://www.w3.org/2001/XMLSchema#string')), G),
151
+ decision_atom(DecisionIri, Decision).
152
+
153
+ decision_atom(iri('https://example.org/city/decision/accept'), accept).
154
+ decision_atom(iri('https://example.org/city/decision/reject'), reject).
155
+
156
+ % --- Trust, conflict, and review policy --------------------------------------
157
+
158
+ auto_eligible(iri('https://example.org/city/evidence-kind/official-feed')).
159
+ replaceable(P) :- v(status, P).
160
+
161
+ authoritative_override(Evidence, Predicate) :-
162
+ evidence_kind(Evidence, Kind),
163
+ auto_eligible(Kind),
164
+ replaceable(Predicate).
165
+
166
+ opposite(iri('https://example.org/city/state/open'), iri('https://example.org/city/state/closed')).
167
+ opposite(iri('https://example.org/city/state/closed'), iri('https://example.org/city/state/open')).
168
+ opposite(iri('https://example.org/city/state/running'), iri('https://example.org/city/state/suspended')).
169
+ opposite(iri('https://example.org/city/state/suspended'), iri('https://example.org/city/state/running')).
170
+
171
+ conflict_iri(Id, Subject, Predicate, Existing) :-
172
+ proposal(Id, _Agent, _Evidence, Subject, Predicate, Proposed, _Confidence),
173
+ curated(Subject, Predicate, Existing),
174
+ opposite(Proposed, Existing).
175
+
176
+ proposal_state_iri(Id, auto_accepted) :-
177
+ proposal(Id, _Agent, Evidence, Subject, Predicate, _Object, Confidence),
178
+ evidence_kind(Evidence, Kind),
179
+ auto_eligible(Kind),
180
+ Confidence >= 95,
181
+ ( \+ conflict_iri(Id, Subject, Predicate, _Existing)
182
+ ; authoritative_override(Evidence, Predicate)
183
+ ).
184
+
185
+ proposal_state_iri(Id, human_accepted) :-
186
+ proposal(Id, _Agent, _Evidence, _S, _P, _O, _Confidence),
187
+ human_review(Id, _Reviewer, accept, _Note).
188
+
189
+ proposal_state_iri(Id, human_rejected) :-
190
+ proposal(Id, _Agent, _Evidence, _S, _P, _O, _Confidence),
191
+ human_review(Id, _Reviewer, reject, _Note).
192
+
193
+ proposal_state_iri(Id, needs_review) :-
194
+ proposal(Id, _Agent, _Evidence, _S, _P, _O, _Confidence),
195
+ \+ proposal_state_iri(Id, auto_accepted),
196
+ \+ human_review(Id, _Reviewer, _Decision, _Note).
197
+
198
+ % --- Stage-aware operational graph ------------------------------------------
199
+
200
+ stage(before_review).
201
+ stage(after_review).
202
+
203
+ accepted(before_review, Id) :- proposal_state_iri(Id, auto_accepted).
204
+ accepted(after_review, Id) :- proposal_state_iri(Id, auto_accepted).
205
+ accepted(after_review, Id) :- proposal_state_iri(Id, human_accepted).
206
+
207
+ has_accepted_override(Stage, S, P) :-
208
+ replaceable(P),
209
+ proposal(Id, _Agent, _Evidence, S, P, _O, _Confidence),
210
+ accepted(Stage, Id).
211
+
212
+ known(Stage, S, P, O) :-
213
+ curated(S, P, O),
214
+ \+ has_accepted_override(Stage, S, P).
215
+
216
+ known(Stage, S, P, O) :-
217
+ proposal(Id, _Agent, _Evidence, S, P, O, _Confidence),
218
+ accepted(Stage, Id).
219
+
220
+ knowledge_gain_iri(S, P, O) :-
221
+ known(after_review, S, P, O),
222
+ \+ known(before_review, S, P, O).
223
+
224
+ % --- Operational reasoning ---------------------------------------------------
225
+
226
+ cooling_center(Stage, Center) :-
227
+ v(kind, P),
228
+ known(Stage, Center, P, iri('https://example.org/city/class/cooling-center')).
229
+ cooling_center(Stage, Center) :-
230
+ v(emergency_designation, P),
231
+ known(Stage, Center, P, iri('https://example.org/city/class/cooling-center')).
232
+
233
+ numeric_value(Stage, S, Predicate, Number) :-
234
+ known(Stage, S, Predicate, Literal),
235
+ integer_literal(Literal, Number).
236
+
237
+ sufficient_capacity(Stage, Center, Neighbourhood) :-
238
+ v(capacity, CapacityP),
239
+ v(expected_demand, DemandP),
240
+ numeric_value(Stage, Center, CapacityP, Capacity),
241
+ numeric_value(Stage, Neighbourhood, DemandP, Demand),
242
+ Capacity >= Demand.
243
+
244
+ operational_center(Stage, Center, Neighbourhood) :-
245
+ cooling_center(Stage, Center),
246
+ v(status, StatusP),
247
+ v(cooling, CoolingP),
248
+ v(wheelchair_access, AccessP),
249
+ v(power, PowerP),
250
+ known(Stage, Center, StatusP, iri('https://example.org/city/state/open')),
251
+ known(Stage, Center, CoolingP, iri('https://example.org/city/state/available')),
252
+ known(Stage, Center, AccessP, iri('https://example.org/city/value/yes')),
253
+ sufficient_capacity(Stage, Center, Neighbourhood),
254
+ \+ known(Stage, Center, PowerP, iri('https://example.org/city/state/unstable')).
255
+
256
+ local_center(Stage, Neighbourhood, Center) :-
257
+ operational_center(Stage, Center, Neighbourhood),
258
+ v(neighbourhood, NeighbourhoodP),
259
+ known(Stage, Center, NeighbourhoodP, Neighbourhood).
260
+
261
+ reachable_center(Stage, Neighbourhood, Center) :-
262
+ operational_center(Stage, Center, Neighbourhood),
263
+ v(connects, ConnectsP),
264
+ v(status, StatusP),
265
+ known(Stage, Route, ConnectsP, Center),
266
+ known(Stage, Route, StatusP, iri('https://example.org/city/state/running')).
267
+
268
+ recommended_action_iri(Stage, Neighbourhood, open_local_center(Center)) :-
269
+ stage(Stage),
270
+ local_center(Stage, Neighbourhood, Center).
271
+
272
+ recommended_action_iri(Stage, Neighbourhood, use_transit_to(Center)) :-
273
+ stage(Stage),
274
+ \+ local_center(Stage, Neighbourhood, _Local),
275
+ reachable_center(Stage, Neighbourhood, Center).
276
+
277
+ recommended_action_iri(Stage, Neighbourhood, deploy_mobile_unit) :-
278
+ stage(Stage),
279
+ \+ local_center(Stage, Neighbourhood, _Local),
280
+ \+ reachable_center(Stage, Neighbourhood, _Remote),
281
+ v(mobile_unit_available, MobileP),
282
+ known(Stage, Neighbourhood, MobileP, iri('https://example.org/city/value/yes')).
283
+
284
+ % --- Friendly checked output -------------------------------------------------
285
+
286
+ short(iri('https://example.org/city/proposal/p1'), p1).
287
+ short(iri('https://example.org/city/proposal/p2'), p2).
288
+ short(iri('https://example.org/city/proposal/p3'), p3).
289
+ short(iri('https://example.org/city/proposal/p4'), p4).
290
+ short(iri('https://example.org/city/agent/language-agent'), language_agent).
291
+ short(iri('https://example.org/city/evidence/transit-api-20260827'), transit_api_20260827).
292
+ short(iri('https://example.org/city/evidence/facilities-bulletin-20260827'), facilities_bulletin_20260827).
293
+ short(iri('https://example.org/city/evidence/community-post-4812'), community_post_4812).
294
+ short(iri('https://example.org/city/evidence/volunteer-message-112'), volunteer_message_112).
295
+ short(iri('https://example.org/city/actor/emergency-coordinator'), emergency_coordinator).
296
+ short(iri('https://example.org/city/actor/operations-officer'), operations_officer).
297
+ short(iri('https://example.org/city/facility/central-hall'), central_hall).
298
+ short(iri('https://example.org/city/facility/north-library'), north_library).
299
+ short(iri('https://example.org/city/facility/riverside-school'), riverside_school).
300
+ short(iri('https://example.org/city/neighbourhood/riverside'), riverside).
301
+ short(iri('https://example.org/city/route/7'), route_7).
302
+ short(iri('https://example.org/vocab/status'), status).
303
+ short(iri('https://example.org/vocab/emergencyDesignation'), emergency_designation).
304
+ short(iri('https://example.org/city/state/running'), running).
305
+ short(iri('https://example.org/city/state/open'), open).
306
+ short(iri('https://example.org/city/class/cooling-center'), cooling_center).
307
+
308
+ proposal_state(Id, State) :-
309
+ proposal_state_iri(IdIri, State),
310
+ short(IdIri, Id).
311
+
312
+ conflict(Id, Subject, Predicate, Existing) :-
313
+ conflict_iri(IdIri, SubjectIri, PredicateIri, ExistingIri),
314
+ short(IdIri, Id),
315
+ short(SubjectIri, Subject),
316
+ short(PredicateIri, Predicate),
317
+ short(ExistingIri, Existing).
318
+
319
+ knowledge_gain(Subject, Predicate, Object) :-
320
+ knowledge_gain_iri(SubjectIri, PredicateIri, ObjectIri),
321
+ short(SubjectIri, Subject),
322
+ short(PredicateIri, Predicate),
323
+ short(ObjectIri, Object).
324
+
325
+ friendly_action(deploy_mobile_unit, deploy_mobile_unit).
326
+ friendly_action(open_local_center(CenterIri), open_local_center(Center)) :- short(CenterIri, Center).
327
+ friendly_action(use_transit_to(CenterIri), use_transit_to(Center)) :- short(CenterIri, Center).
328
+
329
+ recommended_action(Stage, Neighbourhood, Action) :-
330
+ recommended_action_iri(Stage, NeighbourhoodIri, ActionIri),
331
+ short(NeighbourhoodIri, Neighbourhood),
332
+ friendly_action(ActionIri, Action).
333
+
334
+ decision_reason(before_review, riverside,
335
+ "Route 7 is suspended, Central Hall has unstable power, and Riverside School is not yet an approved cooling centre; deploy the mobile unit.") :-
336
+ recommended_action(before_review, riverside, deploy_mobile_unit).
337
+
338
+ decision_reason(after_review, riverside,
339
+ "Human review confirms Riverside School as an emergency cooling centre; its verified capacity and accessibility satisfy Riverside demand locally.") :-
340
+ recommended_action(after_review, riverside, open_local_center(riverside_school)).
341
+
342
+ review_summary(Id, human(Reviewer, Decision)) :-
343
+ human_review(Id, ReviewerIri, Decision, _Note),
344
+ short(ReviewerIri, Reviewer).
345
+ review_summary(Id, automatic) :- proposal_state_iri(Id, auto_accepted).
346
+ review_summary(Id, pending) :- proposal_state_iri(Id, needs_review).
347
+
348
+ audit(Id, Agent, Evidence, State, Review) :-
349
+ proposal(IdIri, AgentIri, EvidenceIri, _S, _P, _O, _Confidence),
350
+ proposal_state_iri(IdIri, State),
351
+ review_summary(IdIri, Review),
352
+ short(IdIri, Id),
353
+ short(AgentIri, Agent),
354
+ short(EvidenceIri, Evidence).
355
+
356
+ feedback_signal(language_agent, Id, accepted_by_human) :-
357
+ proposal_state_iri(IdIri, human_accepted), short(IdIri, Id).
358
+ feedback_signal(language_agent, Id, rejected_by_human) :-
359
+ proposal_state_iri(IdIri, human_rejected), short(IdIri, Id).
360
+ feedback_signal(language_agent, Id, unresolved) :-
361
+ proposal_state_iri(IdIri, needs_review), short(IdIri, Id).
362
+
363
+ symbiosis_gain(graph, accepted_machine_knowledge) :- proposal_state(p2, human_accepted).
364
+ symbiosis_gain(agent, better_operational_answer) :-
365
+ recommended_action(after_review, riverside, open_local_center(riverside_school)).
366
+ symbiosis_gain(human, inspectable_reason) :- decision_reason(after_review, riverside, _Reason).
367
+ symbiosis_gain(governance, rejected_claim_remains_outside_operational_graph) :-
368
+ proposal_state(p3, human_rejected).
369
+ symbiosis_gain(rdf, accepted_and_derived_knowledge_can_be_published_back) :-
370
+ result_rdf(_, _, _, _).
371
+
372
+ knowledge_exchange(X, Y) :- knowledge_exchange_fact(X, Y).
373
+ knowledge_exchange_fact(machine_to_graph, candidate(p2, riverside_school, emergency_designation, cooling_center)).
374
+ knowledge_exchange_fact(graph_to_machine, constraint(central_hall, power, unstable)).
375
+ knowledge_exchange_fact(human_to_machine, review(p2, accept)).
376
+ knowledge_exchange_fact(human_to_machine, review(p3, reject)).
377
+ knowledge_exchange_fact(machine_to_human, recommendation(after_review, riverside, open_local_center(riverside_school))).
378
+ knowledge_exchange_fact(rdf_to_prolog, ordinary_rdf4_facts).
379
+ knowledge_exchange_fact(prolog_to_rdf, materialized_ground_rdf4).
380
+
381
+ pipeline_step(N, Description) :- pipeline_step_fact(N, Description).
382
+ pipeline_step_fact(1, 'RDF 1.2 N-Quads: named graphs keep source and governance boundaries explicit').
383
+ pipeline_step_fact(2, 'rdf-prolog-roundtrip: RDF becomes ordinary rdf/4 Prolog facts without a solver').
384
+ pipeline_step_fact(3, 'EyeProlog: ISO Prolog rules validate candidates, apply review policy, and derive actions').
385
+ pipeline_step_fact(4, 'EyeProlog: result_rdf/4 materializes accepted knowledge and decisions as ground RDF-shaped facts').
386
+ pipeline_step_fact(5, 'rdf-prolog-roundtrip: ground rdf/4 facts become RDF again for publication or federation').
387
+
388
+ cognitive_parallel(Prolog, Human) :- cognitive_parallel_fact(Prolog, Human).
389
+ cognitive_parallel_fact(fact, remembered_assertion).
390
+ cognitive_parallel_fact(rule, reusable_generalization).
391
+ cognitive_parallel_fact(query, explicit_question).
392
+ cognitive_parallel_fact(variable_binding, filling_in_an_answer).
393
+ cognitive_parallel_fact(backtracking, considering_alternatives).
394
+ cognitive_parallel_fact(proof, giving_reasons).
395
+ cognitive_parallel_fact(review, correcting_shared_knowledge).
396
+
397
+ % --- Materialization boundary back to RDF -----------------------------------
398
+
399
+ result_rdf(
400
+ iri('https://example.org/city/facility/riverside-school'),
401
+ iri('https://example.org/vocab/emergencyDesignation'),
402
+ iri('https://example.org/city/class/cooling-center'),
403
+ iri('https://example.org/graph/accepted-knowledge')) :-
404
+ proposal_state(p2, human_accepted).
405
+
406
+ result_rdf(
407
+ iri('https://example.org/city/proposal/p2'),
408
+ iri('https://example.org/vocab/reviewOutcome'),
409
+ iri('https://example.org/city/decision/accept'),
410
+ iri('https://example.org/graph/human-review')) :-
411
+ proposal_state(p2, human_accepted).
412
+
413
+ result_rdf(
414
+ iri('https://example.org/city/proposal/p3'),
415
+ iri('https://example.org/vocab/reviewOutcome'),
416
+ iri('https://example.org/city/decision/reject'),
417
+ iri('https://example.org/graph/human-review')) :-
418
+ proposal_state(p3, human_rejected).
419
+
420
+ result_rdf(
421
+ iri('https://example.org/city/decision/before-review'),
422
+ iri('https://example.org/vocab/recommendedAction'),
423
+ iri('https://example.org/city/action/deploy-mobile-unit'),
424
+ iri('https://example.org/graph/derived-decisions')) :-
425
+ recommended_action(before_review, riverside, deploy_mobile_unit).
426
+
427
+ result_rdf(
428
+ iri('https://example.org/city/decision/after-review'),
429
+ iri('https://example.org/vocab/recommendedAction'),
430
+ iri('https://example.org/city/action/open-local-center'),
431
+ iri('https://example.org/graph/derived-decisions')) :-
432
+ recommended_action(after_review, riverside, open_local_center(riverside_school)).
433
+
434
+ result_rdf(
435
+ iri('https://example.org/city/decision/after-review'),
436
+ iri('https://example.org/vocab/selectedFacility'),
437
+ iri('https://example.org/city/facility/riverside-school'),
438
+ iri('https://example.org/graph/derived-decisions')) :-
439
+ recommended_action(after_review, riverside, open_local_center(riverside_school)).
440
+
441
+ write_results :-
442
+ result_rdf(S, P, O, G),
443
+ write_term(rdf(S, P, O, G), [quoted(true)]),
444
+ write('.'),
445
+ nl,
446
+ fail.
447
+ write_results.
448
+
449
+ :- set_prolog_flag(unknown, fail).
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.3.97",
6
+ "version": "1.3.99",
7
7
  "description": "EyeProlog turns facts and rules into answers and proofs.",
8
8
  "type": "module",
9
9
  "main": "./index.js",
package/playground.html CHANGED
@@ -633,6 +633,7 @@
633
633
  "statistics-summary",
634
634
  "stirling-bell-numbers",
635
635
  "superdense-coding",
636
+ "symbiotic-knowledge-graph",
636
637
  "symbolic-derivative",
637
638
  "takeuchi",
638
639
  "term-tools",
@@ -7288,7 +7288,7 @@ Review questions:
7288
7288
  </figure>
7289
7289
 
7290
7290
  The [examples directory](https://github.com/eyereasoner/eyeprolog/tree/main/examples/) is the book's executable companion. The
7291
- top-level directory contains **214 self-contained runnable programs**. Every
7291
+ top-level directory contains **215 self-contained runnable programs**. Every
7292
7292
  source program has an exact answer file under
7293
7293
  [examples/output](https://github.com/eyereasoner/eyeprolog/tree/main/examples/output/), and **61 selected programs** have a checked
7294
7294
  explanation under [examples/proof](https://github.com/eyereasoner/eyeprolog/tree/main/examples/proof/). The thematic tables below link every top-level program and open the program
@@ -7605,12 +7605,16 @@ When studying a policy proof, circle every premise imported from outside the
7605
7605
  theory. The derivation validates the transition from those premises to the
7606
7606
  decision; it does not authenticate the source by itself.
7607
7607
 
7608
+ This explicit separation between premises, rules, questions, alternatives, and proofs is also why Prolog is a natural human-facing layer. It is not a model of the whole brain, but its computational vocabulary is unusually close to the way people communicate deliberate reasoning: assert something, state a generalization, ask a question, consider another answer, reject an alternative, and explain why. The symbiotic KG example uses that closeness as an interface between machine proposals and human judgment rather than treating the model's latent state as the shared source of truth.
7609
+
7608
7610
  #### RDF 1.2 and policy roundtrips
7609
7611
 
7610
7612
  These programs combine generated `rdf/4` source facts with ISO Prolog rules
7611
7613
  adapted from the `rdf-prolog-roundtrip` example corpus. Each query materializes
7612
7614
  ground RDF-shaped results that can be serialized back to RDF.
7613
7615
 
7616
+ The [Symbiotic Knowledge Graphs](https://github.com/eyereasoner/eyeprolog/blob/main/examples/deck/symbiotic-knowledge-graphs.md) example extends the same boundary into a human/AI feedback loop. Named graphs preserve source and governance context, RDF 1.2 triple terms carry AI-proposed statements without asserting them, EyeProlog decides which claims become operational knowledge, and `result_rdf/4` materializes accepted knowledge and derived decisions for conversion back to RDF.
7617
+
7614
7618
  | Program | Roundtrip idea | Checked answer |
7615
7619
  | --- | --- | --- |
7616
7620
  | [DPV–ODRL purpose mapping](https://github.com/eyereasoner/eyeprolog/blob/main/examples/dpv-odrl-purpose-mapping.pl) | Verify six correspondences between a DPV process and an ODRL policy. | [answers](https://github.com/eyereasoner/eyeprolog/blob/main/examples/output/dpv-odrl-purpose-mapping.pl) |
@@ -7628,6 +7632,7 @@ ground RDF-shaped results that can be serialized back to RDF.
7628
7632
  | [RDF 1.2 TriG named graph](https://github.com/eyereasoner/eyeprolog/blob/main/examples/rdf12-trig-named-graph.pl) | Derive ancestor relationships inside the source named graph. | [answers](https://github.com/eyereasoner/eyeprolog/blob/main/examples/output/rdf12-trig-named-graph.pl) |
7629
7633
  | [RDF 1.2 TriG triple term](https://github.com/eyereasoner/eyeprolog/blob/main/examples/rdf12-trig-triple-term.pl) | Project a triple term while retaining its named-graph context. | [answers](https://github.com/eyereasoner/eyeprolog/blob/main/examples/output/rdf12-trig-triple-term.pl) |
7630
7634
  | [RDF 1.2 triple term](https://github.com/eyereasoner/eyeprolog/blob/main/examples/rdf12-triple-term.pl) | Project a triple term into an ordinary asserted relationship. | [answers](https://github.com/eyereasoner/eyeprolog/blob/main/examples/output/rdf12-triple-term.pl) |
7635
+ | [Symbiotic Knowledge Graphs](https://github.com/eyereasoner/eyeprolog/blob/main/examples/symbiotic-knowledge-graph.pl) | Roundtrip a city heatwave KG through RDF 1.2 triple-term proposals, human review, explicit Prolog governance, and materialized decisions. | [answers](https://github.com/eyereasoner/eyeprolog/blob/main/examples/output/symbiotic-knowledge-graph.pl) · [deck](https://github.com/eyereasoner/eyeprolog/blob/main/examples/deck/symbiotic-knowledge-graphs.md) |
7631
7636
 
7632
7637
  #### Science, engineering, and numerical models
7633
7638
 
package/why-eyeprolog.md CHANGED
@@ -29,6 +29,12 @@ graph reachability, policy decisions, validation rules, parsers, schedules,
29
29
  constraints, and explanations. Because the program says what relationships
30
30
  must hold, its logical structure remains visible to readers and tools.
31
31
 
32
+ ## Close to the explicit surface of human reasoning
33
+
34
+ Prolog's attraction is not only standardization. Among widely used computational formalisms, it is arguably unusually close to the *explicit, communicable* surface of human cognition: facts resemble assertions, rules resemble reusable generalizations, queries resemble questions, variable bindings fill in answers, backtracking considers alternatives, and proofs give reasons.
35
+
36
+ That is not a claim that the brain literally executes Prolog. Human cognition includes perception, emotion, embodiment, analogy, learning, uncertainty, and many processes that Horn-clause reasoning does not model. The narrower engineering point is powerful enough: when people externalize what they know and why they think something follows, Prolog preserves those objects of thought directly instead of hiding them behind imperative state changes or opaque vectors. That makes it a strong reasoning layer for systems in which humans and machines must inspect and revise shared knowledge together.
37
+
32
38
  ## Why the ISO standard matters
33
39
 
34
40
  [ISO/IEC 13211-1](https://www.iso.org/standard/21413.html) defines Prolog's
@@ -83,6 +89,10 @@ Prolog programs, intermediate results can be saved and tested, and the final
83
89
  facts can return to RDF without making the reasoning engine responsible for
84
90
  every RDF syntax.
85
91
 
92
+ The [Symbiotic Knowledge Graphs example](examples/deck/symbiotic-knowledge-graphs.md) makes that boundary operational. Its RDF input keeps official sources, sensor data, AI proposals, and human review in separate named graphs. RDF 1.2 triple terms represent machine proposals without asserting them as truth. EyeProlog decides what can be accepted automatically, what requires human judgment, and what operational action follows. Only ground `result_rdf/4` conclusions are published back through `prolog-to-rdf`.
93
+
94
+ This is a concrete model of human/AI/KG symbiosis: the graph constrains the agent, the agent proposes additions to the graph, people resolve governed uncertainty, and the accepted result improves the next decision while staying interoperable RDF.
95
+
86
96
  This combination is compelling when interoperability, reproducibility,
87
97
  long-term maintenance, or independent verification matter. It also opens RDF
88
98
  data to relational programming, constraints, recursion, collections, and