eyeling 1.16.3 → 1.16.4
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 +0 -1
- package/package.json +2 -3
- package/arctifacts/README.md +0 -59
- package/arctifacts/ackermann.html +0 -678
- package/arctifacts/auroracare.html +0 -1297
- package/arctifacts/bike-trip.html +0 -752
- package/arctifacts/binomial-theorem.html +0 -631
- package/arctifacts/bmi.html +0 -511
- package/arctifacts/building-performance.html +0 -750
- package/arctifacts/clinical-care.html +0 -726
- package/arctifacts/collatz.html +0 -403
- package/arctifacts/complex.html +0 -321
- package/arctifacts/control-system.html +0 -482
- package/arctifacts/delfour.html +0 -849
- package/arctifacts/earthquake-epicenter.html +0 -982
- package/arctifacts/eco-route.html +0 -662
- package/arctifacts/euclid-infinitude.html +0 -564
- package/arctifacts/euler-identity.html +0 -667
- package/arctifacts/exoplanet-transit.html +0 -1000
- package/arctifacts/faltings-theorem.html +0 -1046
- package/arctifacts/fibonacci.html +0 -299
- package/arctifacts/fundamental-theorem-arithmetic.html +0 -398
- package/arctifacts/godel-numbering.html +0 -743
- package/arctifacts/gps-bike.html +0 -759
- package/arctifacts/gps-clinical-bench.html +0 -792
- package/arctifacts/graph-french.html +0 -449
- package/arctifacts/grass-molecular.html +0 -592
- package/arctifacts/group-theory.html +0 -740
- package/arctifacts/health-info.html +0 -833
- package/arctifacts/kaprekar-constant.html +0 -576
- package/arctifacts/lee.html +0 -805
- package/arctifacts/linked-lists.html +0 -502
- package/arctifacts/lldm.html +0 -612
- package/arctifacts/matrix-multiplication.html +0 -502
- package/arctifacts/matrix.html +0 -651
- package/arctifacts/newton-raphson.html +0 -944
- package/arctifacts/peano-factorial.html +0 -456
- package/arctifacts/pi.html +0 -363
- package/arctifacts/polynomial.html +0 -646
- package/arctifacts/prime.html +0 -366
- package/arctifacts/pythagorean-theorem.html +0 -468
- package/arctifacts/rest-path.html +0 -469
- package/arctifacts/roots-of-unity.html +0 -363
- package/arctifacts/turing.html +0 -409
- package/arctifacts/wind-turbines.html +0 -726
|
@@ -1,469 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
-
<title>REST‑path</title>
|
|
7
|
-
<style>
|
|
8
|
-
:root {
|
|
9
|
-
--bg: #ffffff;
|
|
10
|
-
--ink: #111827;
|
|
11
|
-
--muted: #6b7280;
|
|
12
|
-
--panel: #f8fafc;
|
|
13
|
-
--border: #e5e7eb;
|
|
14
|
-
--accent: #0ea5e9;
|
|
15
|
-
--good: #16a34a;
|
|
16
|
-
--amber: #f59e0b;
|
|
17
|
-
--blue: #3b82f6;
|
|
18
|
-
--mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;
|
|
19
|
-
--ui:
|
|
20
|
-
system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', 'Apple Color Emoji',
|
|
21
|
-
'Segoe UI Emoji';
|
|
22
|
-
}
|
|
23
|
-
body {
|
|
24
|
-
margin: 0;
|
|
25
|
-
background: var(--bg);
|
|
26
|
-
color: var(--ink);
|
|
27
|
-
font: 15px/1.55 var(--ui);
|
|
28
|
-
}
|
|
29
|
-
.wrap {
|
|
30
|
-
max-width: 980px;
|
|
31
|
-
margin: 36px auto;
|
|
32
|
-
padding: 0 16px;
|
|
33
|
-
}
|
|
34
|
-
header {
|
|
35
|
-
display: flex;
|
|
36
|
-
align-items: center;
|
|
37
|
-
justify-content: space-between;
|
|
38
|
-
margin-bottom: 16px;
|
|
39
|
-
}
|
|
40
|
-
h1 {
|
|
41
|
-
font-size: 22px;
|
|
42
|
-
margin: 0;
|
|
43
|
-
letter-spacing: 0.2px;
|
|
44
|
-
}
|
|
45
|
-
.pill {
|
|
46
|
-
display: inline-flex;
|
|
47
|
-
align-items: center;
|
|
48
|
-
gap: 8px;
|
|
49
|
-
padding: 6px 10px;
|
|
50
|
-
border: 1px solid var(--border);
|
|
51
|
-
border-radius: 999px;
|
|
52
|
-
color: var(--muted);
|
|
53
|
-
background: #fff;
|
|
54
|
-
}
|
|
55
|
-
.row {
|
|
56
|
-
display: flex;
|
|
57
|
-
flex-direction: column;
|
|
58
|
-
gap: 16px;
|
|
59
|
-
}
|
|
60
|
-
.card {
|
|
61
|
-
background: var(--panel);
|
|
62
|
-
border: 1px solid var(--border);
|
|
63
|
-
border-radius: 14px;
|
|
64
|
-
overflow: hidden;
|
|
65
|
-
}
|
|
66
|
-
.head {
|
|
67
|
-
display: flex;
|
|
68
|
-
align-items: center;
|
|
69
|
-
justify-content: space-between;
|
|
70
|
-
padding: 10px 12px;
|
|
71
|
-
border-bottom: 1px solid var(--border);
|
|
72
|
-
}
|
|
73
|
-
.head h2 {
|
|
74
|
-
font-size: 13px;
|
|
75
|
-
text-transform: uppercase;
|
|
76
|
-
letter-spacing: 0.08em;
|
|
77
|
-
color: var(--muted);
|
|
78
|
-
margin: 0;
|
|
79
|
-
}
|
|
80
|
-
.body {
|
|
81
|
-
padding: 12px;
|
|
82
|
-
}
|
|
83
|
-
pre {
|
|
84
|
-
white-space: pre-wrap;
|
|
85
|
-
background: #fff;
|
|
86
|
-
border: 1px solid var(--border);
|
|
87
|
-
border-radius: 10px;
|
|
88
|
-
padding: 12px;
|
|
89
|
-
overflow: auto;
|
|
90
|
-
font-family: var(--mono);
|
|
91
|
-
font-size: 13.25px;
|
|
92
|
-
}
|
|
93
|
-
button {
|
|
94
|
-
all: unset;
|
|
95
|
-
background: #fff;
|
|
96
|
-
border: 1px solid var(--border);
|
|
97
|
-
padding: 8px 12px;
|
|
98
|
-
border-radius: 10px;
|
|
99
|
-
cursor: pointer;
|
|
100
|
-
}
|
|
101
|
-
button:hover {
|
|
102
|
-
border-color: #cbd5e1;
|
|
103
|
-
}
|
|
104
|
-
.arc-grid {
|
|
105
|
-
display: flex;
|
|
106
|
-
flex-direction: column;
|
|
107
|
-
gap: 12px;
|
|
108
|
-
}
|
|
109
|
-
.arc-card {
|
|
110
|
-
background: #fff;
|
|
111
|
-
border: 1px solid var(--border);
|
|
112
|
-
border-radius: 14px;
|
|
113
|
-
overflow: hidden;
|
|
114
|
-
}
|
|
115
|
-
.arc-card .ac-head {
|
|
116
|
-
display: flex;
|
|
117
|
-
align-items: center;
|
|
118
|
-
gap: 8px;
|
|
119
|
-
padding: 10px 12px;
|
|
120
|
-
border-bottom: 1px solid var(--border);
|
|
121
|
-
font-size: 12px;
|
|
122
|
-
letter-spacing: 0.08em;
|
|
123
|
-
text-transform: uppercase;
|
|
124
|
-
color: var(--muted);
|
|
125
|
-
}
|
|
126
|
-
.arc-card .ac-body {
|
|
127
|
-
padding: 12px;
|
|
128
|
-
}
|
|
129
|
-
.arc-card.answer {
|
|
130
|
-
border-left: 4px solid var(--good);
|
|
131
|
-
}
|
|
132
|
-
.arc-card.reason {
|
|
133
|
-
border-left: 4px solid var(--blue);
|
|
134
|
-
}
|
|
135
|
-
.arc-card.check {
|
|
136
|
-
border-left: 4px solid var(--amber);
|
|
137
|
-
}
|
|
138
|
-
</style>
|
|
139
|
-
</head>
|
|
140
|
-
<body>
|
|
141
|
-
<div class="wrap">
|
|
142
|
-
<header>
|
|
143
|
-
<h1>REST‑path</h1>
|
|
144
|
-
<div class="pill" id="status">Ready</div>
|
|
145
|
-
</header>
|
|
146
|
-
|
|
147
|
-
<div class="card" style="margin-bottom: 16px">
|
|
148
|
-
<div class="body">
|
|
149
|
-
<p>
|
|
150
|
-
<strong>What this is?</strong> A self‑contained harness of the <em>REST‑path</em> example. It starts from
|
|
151
|
-
the fact <code><x> ex:rel1 <y></code>, creates three lanes, promotes them across
|
|
152
|
-
<code>rel2…rel10</code> in nine steps while emitting an HTTP GET per step on lane‑1, and finally asserts
|
|
153
|
-
<code><x> ex:relGoal <y></code>. ARC cards below summarize the result, proof, and checks.
|
|
154
|
-
</p>
|
|
155
|
-
</div>
|
|
156
|
-
</div>
|
|
157
|
-
|
|
158
|
-
<div class="row">
|
|
159
|
-
<div class="card">
|
|
160
|
-
<div class="head">
|
|
161
|
-
<h2>Controls</h2>
|
|
162
|
-
<div style="display: flex; gap: 8px; align-items: center">
|
|
163
|
-
<button onclick="run()">▶ Run</button>
|
|
164
|
-
<button onclick="downloadARC()">⬇ Export .txt</button>
|
|
165
|
-
</div>
|
|
166
|
-
</div>
|
|
167
|
-
<div class="body">Deterministic run (no inputs). Auto‑runs on load.</div>
|
|
168
|
-
</div>
|
|
169
|
-
|
|
170
|
-
<div class="card">
|
|
171
|
-
<div class="head"><h2>ARC Output</h2></div>
|
|
172
|
-
<div class="body">
|
|
173
|
-
<div class="arc-grid">
|
|
174
|
-
<div class="arc-card answer">
|
|
175
|
-
<div class="ac-head">Answer</div>
|
|
176
|
-
<div class="ac-body"><pre id="ans">(no run yet)</pre></div>
|
|
177
|
-
</div>
|
|
178
|
-
<div class="arc-card reason">
|
|
179
|
-
<div class="ac-head">Reason why</div>
|
|
180
|
-
<div class="ac-body"><pre id="why">(no run yet)</pre></div>
|
|
181
|
-
</div>
|
|
182
|
-
<div class="arc-card check">
|
|
183
|
-
<div class="ac-head">Check (harness)</div>
|
|
184
|
-
<div class="ac-body"><pre id="chk">(no run yet)</pre></div>
|
|
185
|
-
</div>
|
|
186
|
-
</div>
|
|
187
|
-
</div>
|
|
188
|
-
</div>
|
|
189
|
-
</div>
|
|
190
|
-
</div>
|
|
191
|
-
|
|
192
|
-
<script>
|
|
193
|
-
// ------- Tiny RDF-like KB -------
|
|
194
|
-
class KB {
|
|
195
|
-
constructor() {
|
|
196
|
-
this._triples = new Set();
|
|
197
|
-
this._gens = { req: 1, resp: 1, a: 1, b: 1 };
|
|
198
|
-
}
|
|
199
|
-
key(s, p, o) {
|
|
200
|
-
return s + '|' + p + '|' + o;
|
|
201
|
-
}
|
|
202
|
-
add(s, p, o) {
|
|
203
|
-
this._triples.add(this.key(s, p, o));
|
|
204
|
-
}
|
|
205
|
-
ask(s = null, p = null, o = null) {
|
|
206
|
-
const out = [];
|
|
207
|
-
for (const k of this._triples) {
|
|
208
|
-
const [S, P, O] = k.split('|');
|
|
209
|
-
if ((s === null || s === S) && (p === null || p === P) && (o === null || o === O)) out.push([S, P, O]);
|
|
210
|
-
}
|
|
211
|
-
return out;
|
|
212
|
-
}
|
|
213
|
-
has(s = null, p = null, o = null) {
|
|
214
|
-
return this.ask(s, p, o).length > 0;
|
|
215
|
-
}
|
|
216
|
-
fresh(stem) {
|
|
217
|
-
return '_:' + stem + this._gens[stem]++;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
// ------- Pretty proof scaffold -------
|
|
222
|
-
class Conclusion {
|
|
223
|
-
constructor(kind, payload) {
|
|
224
|
-
this.kind = kind;
|
|
225
|
-
this.payload = payload;
|
|
226
|
-
}
|
|
227
|
-
pretty() {
|
|
228
|
-
return String(this.payload);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
class Step {
|
|
232
|
-
constructor(id, rule, premises, conclusion, notes = null) {
|
|
233
|
-
this.id = id;
|
|
234
|
-
this.rule = rule;
|
|
235
|
-
this.premises = premises;
|
|
236
|
-
this.conclusion = conclusion;
|
|
237
|
-
this.notes = notes;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
class Proof {
|
|
241
|
-
constructor() {
|
|
242
|
-
this.steps = [];
|
|
243
|
-
}
|
|
244
|
-
add(rule, premises, conclusion, notes = null) {
|
|
245
|
-
const id = this.steps.length + 1;
|
|
246
|
-
this.steps.push(new Step(id, rule, premises, conclusion, notes));
|
|
247
|
-
return id;
|
|
248
|
-
}
|
|
249
|
-
pretty() {
|
|
250
|
-
const lines = [];
|
|
251
|
-
for (const s of this.steps) {
|
|
252
|
-
const prem = s.premises && s.premises.length ? ` [${s.premises.join(', ')}]` : '';
|
|
253
|
-
const note = s.notes ? ` // ${s.notes}` : '';
|
|
254
|
-
lines.push(`[${s.id}] ${s.rule}${prem}: ${s.conclusion.pretty()}${note}`);
|
|
255
|
-
}
|
|
256
|
-
return lines.join('\n');
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// ------- Rule applications -------
|
|
261
|
-
const X = '<x>',
|
|
262
|
-
Y = '<y>'; // IRI placeholders to mirror reference printout
|
|
263
|
-
|
|
264
|
-
function apply_step1(kb, proof) {
|
|
265
|
-
const req = kb.fresh('req'),
|
|
266
|
-
resp = kb.fresh('resp');
|
|
267
|
-
const a2 = kb.fresh('a'),
|
|
268
|
-
b2 = kb.fresh('b');
|
|
269
|
-
const a3 = kb.fresh('a'),
|
|
270
|
-
b3 = kb.fresh('b');
|
|
271
|
-
|
|
272
|
-
kb.add(req, 'http:methodName', '"GET"');
|
|
273
|
-
kb.add(req, 'http:requestURI', X);
|
|
274
|
-
kb.add(req, 'http:resp', resp);
|
|
275
|
-
kb.add(resp, 'http:body', Y);
|
|
276
|
-
|
|
277
|
-
kb.add(X, 'ex:rel2', Y);
|
|
278
|
-
kb.add(a2, 'ex:rel2', b2);
|
|
279
|
-
kb.add(a3, 'ex:rel2', b3);
|
|
280
|
-
|
|
281
|
-
proof.add(
|
|
282
|
-
'Step-1 (rel1→rel2)',
|
|
283
|
-
[],
|
|
284
|
-
new Conclusion(
|
|
285
|
-
'text',
|
|
286
|
-
`emit GET(req=${req}, uri=${X}, body=${Y}); create lanes: (a1,b1)=(${X},${Y}), (a2,b2)=(${a2},${b2}), (a3,b3)=(${a3},${b3})`,
|
|
287
|
-
),
|
|
288
|
-
'Existential a2,b2,a3,b3',
|
|
289
|
-
);
|
|
290
|
-
return [
|
|
291
|
-
[X, Y],
|
|
292
|
-
[a2, b2],
|
|
293
|
-
[a3, b3],
|
|
294
|
-
];
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
function apply_mid_step(kb, k, lanes_k, proof) {
|
|
298
|
-
const [a1, b1] = lanes_k[0];
|
|
299
|
-
const req = kb.fresh('req'),
|
|
300
|
-
resp = kb.fresh('resp');
|
|
301
|
-
kb.add(req, 'http:methodName', '"GET"');
|
|
302
|
-
kb.add(req, 'http:requestURI', a1);
|
|
303
|
-
kb.add(req, 'http:resp', resp);
|
|
304
|
-
kb.add(resp, 'http:body', b1);
|
|
305
|
-
|
|
306
|
-
const lanes_next = [];
|
|
307
|
-
for (const [ai, bi] of lanes_k) {
|
|
308
|
-
kb.add(ai, `ex:rel${k + 1}`, bi);
|
|
309
|
-
lanes_next.push([ai, bi]);
|
|
310
|
-
}
|
|
311
|
-
proof.add(
|
|
312
|
-
`Step-${k} (rel${k}→rel${k + 1})`,
|
|
313
|
-
[],
|
|
314
|
-
new Conclusion('text', `emit GET(req=${req}, uri=${a1}, body=${b1}); promote 3 lanes to rel${k + 1}`),
|
|
315
|
-
);
|
|
316
|
-
return lanes_next;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
function apply_final_step(kb, lanes9, proof) {
|
|
320
|
-
const [a1, b1] = lanes9[0];
|
|
321
|
-
const req = kb.fresh('req'),
|
|
322
|
-
resp = kb.fresh('resp');
|
|
323
|
-
kb.add(req, 'http:methodName', '"GET"');
|
|
324
|
-
kb.add(req, 'http:requestURI', a1);
|
|
325
|
-
kb.add(req, 'http:resp', resp);
|
|
326
|
-
kb.add(resp, 'http:body', b1);
|
|
327
|
-
|
|
328
|
-
for (const [ai, bi] of lanes9) {
|
|
329
|
-
kb.add(ai, 'ex:rel10', bi);
|
|
330
|
-
}
|
|
331
|
-
kb.add(X, 'ex:relGoal', Y);
|
|
332
|
-
proof.add(
|
|
333
|
-
'Step-9 (rel9→rel10 + relGoal)',
|
|
334
|
-
[],
|
|
335
|
-
new Conclusion(
|
|
336
|
-
'text',
|
|
337
|
-
`emit GET(req=${req}, uri=${a1}, body=${b1}); promote to rel10; assert relGoal(${X},${Y})`,
|
|
338
|
-
),
|
|
339
|
-
);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
// ------- Pipeline orchestration -------
|
|
343
|
-
function run_pipeline() {
|
|
344
|
-
const kb = new KB();
|
|
345
|
-
const proof = new Proof();
|
|
346
|
-
|
|
347
|
-
// seed fact and goal sketch to match reference style
|
|
348
|
-
kb.add(X, 'ex:rel1', Y);
|
|
349
|
-
proof.add('Facts', [], new Conclusion('text', `${X} ex:rel1 ${Y}`));
|
|
350
|
-
proof.add('Goal', [], new Conclusion('text', `{ ${X} ex:relGoal ${Y} }`));
|
|
351
|
-
proof.add(
|
|
352
|
-
'Premise-Rule',
|
|
353
|
-
[],
|
|
354
|
-
new Conclusion(
|
|
355
|
-
'text',
|
|
356
|
-
'Chain: rel1→rel2 (create 3 lanes), then relk→rel{k+1} for k=2..9; final also asserts relGoal',
|
|
357
|
-
),
|
|
358
|
-
'Each step emits a GET on lane-1',
|
|
359
|
-
);
|
|
360
|
-
|
|
361
|
-
const lanes2 = apply_step1(kb, proof);
|
|
362
|
-
let lanes = lanes2;
|
|
363
|
-
for (let k = 2; k <= 8; k++) lanes = apply_mid_step(kb, k, lanes, proof);
|
|
364
|
-
apply_final_step(kb, lanes, proof);
|
|
365
|
-
|
|
366
|
-
return { kb, proof };
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
// ------- Formatting helpers -------
|
|
370
|
-
function list_gets(kb) {
|
|
371
|
-
const gets = kb.ask(null, 'http:methodName', '"GET"').sort((a, b) => a[0].localeCompare(b[0]));
|
|
372
|
-
const out = [];
|
|
373
|
-
for (const [req] of gets) {
|
|
374
|
-
const uri = (kb.ask(req, 'http:requestURI', null)[0] || ['', '', '?'])[2];
|
|
375
|
-
const resp = (kb.ask(req, 'http:resp', null)[0] || ['', '', ''])[2];
|
|
376
|
-
const body = resp ? (kb.ask(resp, 'http:body', null)[0] || ['', '', '?'])[2] : '?';
|
|
377
|
-
out.push([req, uri, body]);
|
|
378
|
-
}
|
|
379
|
-
return out;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
// ------- ARC sections (no duplicate headings) -------
|
|
383
|
-
function arc_answer(kb) {
|
|
384
|
-
const parts = [];
|
|
385
|
-
const goals = kb.ask(null, 'ex:relGoal', null).sort();
|
|
386
|
-
for (const [s, _, o] of goals) {
|
|
387
|
-
parts.push(`${s} ex:relGoal ${o}`);
|
|
388
|
-
}
|
|
389
|
-
const gets = list_gets(kb);
|
|
390
|
-
parts.push('', 'Emitted GET requests: ' + gets.length);
|
|
391
|
-
for (const [req, uri, body] of gets) {
|
|
392
|
-
parts.push(` ${req}: GET ${uri} → body ${body}`);
|
|
393
|
-
}
|
|
394
|
-
return parts.join('\n');
|
|
395
|
-
}
|
|
396
|
-
function arc_reason(proof) {
|
|
397
|
-
return proof.pretty();
|
|
398
|
-
}
|
|
399
|
-
function arc_check(kb, proof) {
|
|
400
|
-
const parts = [];
|
|
401
|
-
|
|
402
|
-
// (1) Exactly one relGoal and it is (<x>,<y>)
|
|
403
|
-
const goals = kb.ask(null, 'ex:relGoal', null);
|
|
404
|
-
if (!(goals.length === 1 && goals[0][0] === X && goals[0][2] === Y)) {
|
|
405
|
-
parts.push('✗ Unexpected ex:relGoal facts: ' + JSON.stringify(goals));
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
// (2) Exactly 9 GETs; lane‑1 uses <x>/<y>
|
|
409
|
-
const gets = list_gets(kb);
|
|
410
|
-
if (gets.length !== 9) parts.push(`✗ Expected 9 GETs, found ${gets.length}`);
|
|
411
|
-
for (const [_, uri, body] of gets) {
|
|
412
|
-
if (!(uri === X && body === Y)) parts.push('✗ GET should use lane‑1 URI <x> and body <y>');
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
// (3) For each level k=2..10 exactly 3 lanes; lane‑1 present
|
|
416
|
-
for (let k = 2; k <= 10; k++) {
|
|
417
|
-
const triples = kb.ask(null, `ex:rel${k}`, null);
|
|
418
|
-
if (triples.length !== 3) parts.push(`✗ Expected 3 lanes at rel${k}, found ${triples.length}`);
|
|
419
|
-
if (!triples.some((t) => t[0] === X && t[2] === Y)) parts.push(`✗ Missing lane‑1 at rel${k}`);
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
// (4) Proof shape
|
|
423
|
-
if (proof.steps.length !== 12) parts.push(`✗ Unexpected number of proof steps: ${proof.steps.length}`);
|
|
424
|
-
if (!proof.steps[0].rule.startsWith('Facts')) parts.push('✗ First proof step should record Facts');
|
|
425
|
-
if (!(proof.steps[1].rule === 'Goal')) parts.push('✗ Second proof step should record Goal');
|
|
426
|
-
if (!(proof.steps[2].rule.indexOf('Premise-Rule') >= 0))
|
|
427
|
-
parts.push('✗ Third step should sketch the rule chain');
|
|
428
|
-
for (let i = 1; i <= 9; i++) {
|
|
429
|
-
const s = proof.steps[2 + i];
|
|
430
|
-
if (!s.rule.startsWith(`Step-${i}`)) parts.push(`✗ Expected Step-${i}, got ${s.rule}`);
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
if (parts.length === 0) {
|
|
434
|
-
parts.push('OK: goal fact, GET count/linking, lane counts per level, and proof shape verified.');
|
|
435
|
-
}
|
|
436
|
-
return parts.join('\n');
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
// ------- Runner + UI -------
|
|
440
|
-
function run() {
|
|
441
|
-
const { kb, proof } = run_pipeline();
|
|
442
|
-
document.getElementById('ans').textContent = arc_answer(kb);
|
|
443
|
-
document.getElementById('why').textContent = arc_reason(proof);
|
|
444
|
-
document.getElementById('chk').textContent = arc_check(kb, proof);
|
|
445
|
-
document.getElementById('status').textContent = 'Computed';
|
|
446
|
-
}
|
|
447
|
-
function downloadARC() {
|
|
448
|
-
const blob = new Blob(
|
|
449
|
-
[
|
|
450
|
-
'Answer\n------\n',
|
|
451
|
-
document.getElementById('ans').textContent,
|
|
452
|
-
'\n\n',
|
|
453
|
-
'Reason why\n----------\n',
|
|
454
|
-
document.getElementById('why').textContent,
|
|
455
|
-
'\n\n',
|
|
456
|
-
'Check (harness)\n---------------\n',
|
|
457
|
-
document.getElementById('chk').textContent,
|
|
458
|
-
],
|
|
459
|
-
{ type: 'text/plain' },
|
|
460
|
-
);
|
|
461
|
-
const a = document.createElement('a');
|
|
462
|
-
a.href = URL.createObjectURL(blob);
|
|
463
|
-
a.download = 'restpath_output.txt';
|
|
464
|
-
a.click();
|
|
465
|
-
}
|
|
466
|
-
window.addEventListener('DOMContentLoaded', run);
|
|
467
|
-
</script>
|
|
468
|
-
</body>
|
|
469
|
-
</html>
|