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.
- package/README.md +8 -0
- package/examples/data/README.md +21 -0
- package/examples/data/symbiotic-knowledge-graph-input.nq +59 -0
- package/examples/data/symbiotic-knowledge-graph-output.nq +8 -0
- package/examples/data/symbiotic-knowledge-graph-output.pl +6 -0
- package/examples/data/symbiotic-knowledge-graph-rules.pl +386 -0
- package/examples/deck/README.md +6 -0
- package/examples/deck/symbiotic-knowledge-graphs.md +331 -0
- package/examples/output/symbiotic-knowledge-graph.pl +42 -0
- package/examples/symbiotic-knowledge-graph.pl +449 -0
- package/package.json +1 -1
- package/playground.html +1 -0
- package/the-art-of-eyeprolog.md +6 -1
- package/why-eyeprolog.md +10 -0
|
@@ -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
package/playground.html
CHANGED
package/the-art-of-eyeprolog.md
CHANGED
|
@@ -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 **
|
|
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
|