eyeprolog 1.6.21 → 1.6.22

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.
Files changed (50) hide show
  1. package/arc-in-eyeprolog.md +21 -8
  2. package/book-assets/aggregation-market.svg +21 -4
  3. package/book-assets/and-or-binding-trace.svg +22 -3
  4. package/book-assets/arithmetic-binding-flow.svg +16 -1
  5. package/book-assets/auditable-decision-service.svg +18 -1
  6. package/book-assets/bounded-experimental-math.svg +21 -2
  7. package/book-assets/cli-observation-loop.svg +17 -0
  8. package/book-assets/context-data-boundary.svg +18 -2
  9. package/book-assets/correctness-obligations.svg +17 -1
  10. package/book-assets/debugging-four-lenses.svg +19 -2
  11. package/book-assets/example-landscape.svg +33 -6
  12. package/book-assets/finite-search-funnel.svg +31 -6
  13. package/book-assets/herbrand-world.svg +17 -2
  14. package/book-assets/integrity-check-control-panel.svg +18 -3
  15. package/book-assets/iso-control-board.svg +21 -2
  16. package/book-assets/iso-state-operator-console.svg +21 -2
  17. package/book-assets/iso-stream-roundtrip.svg +17 -1
  18. package/book-assets/iso-term-prism.svg +16 -1
  19. package/book-assets/knowledge-engineering-workflow.svg +19 -3
  20. package/book-assets/laboratory-progression.svg +18 -0
  21. package/book-assets/lists-train.svg +16 -2
  22. package/book-assets/logic-and-control.svg +31 -10
  23. package/book-assets/negation-guest-registry.svg +17 -2
  24. package/book-assets/part-1-relations.svg +34 -6
  25. package/book-assets/part-2-search.svg +25 -4
  26. package/book-assets/part-3-trustworthy-reasoning.svg +35 -6
  27. package/book-assets/part-4-craft.svg +37 -10
  28. package/book-assets/part-5-relational-design.svg +18 -1
  29. package/book-assets/part-6-mathematics.svg +31 -6
  30. package/book-assets/part-7-laboratory.svg +19 -2
  31. package/book-assets/part-8-standard-prolog.svg +35 -5
  32. package/book-assets/pattern-selection-map.svg +16 -1
  33. package/book-assets/program-construction-loop.svg +16 -1
  34. package/book-assets/program-transformation-workbench.svg +21 -2
  35. package/book-assets/proof-and-search.svg +14 -1
  36. package/book-assets/proof-as-computation.svg +17 -1
  37. package/book-assets/recursion-induction-ladder.svg +19 -2
  38. package/book-assets/recursion-tabling-railway.svg +13 -1
  39. package/book-assets/reference-navigation.svg +16 -0
  40. package/book-assets/relational-test-spectrum.svg +16 -1
  41. package/book-assets/review-lenses.svg +18 -0
  42. package/book-assets/syntax-relations.svg +18 -2
  43. package/book-assets/termination-map.svg +15 -1
  44. package/book-assets/title-page.svg +30 -1
  45. package/book-assets/unification.svg +16 -2
  46. package/package.json +1 -1
  47. package/test/run-proof-checking.mjs +0 -0
  48. package/test/run-properties.mjs +0 -0
  49. package/the-art-of-eyeprolog.md +5 -4
  50. package/why-eyeprolog.md +3 -3
@@ -9,8 +9,25 @@
9
9
  .line{fill:none;stroke:#537487;stroke-width:2.5}.title{fill:#9D8200;font:bold 24px Georgia,serif}
10
10
  .label{fill:#17324D;font:17px Georgia,serif}.code{fill:#DDF7FB;font:15px ui-monospace,SFMono-Regular,Consolas,monospace}
11
11
  .darkcode{fill:#17324D;font:14px ui-monospace,SFMono-Regular,Consolas,monospace}
12
+
13
+ .f-537487{fill:#537487}
14
+ @media (prefers-color-scheme: dark) {
15
+ .bg{fill:#272015}
16
+ .bench{fill:#36301D}
17
+ .paper{fill:#221E12;stroke:#82AEDA;stroke-width:2}
18
+ .screen{fill:#31475C;stroke:#88BCDC;stroke-width:4}
19
+ .green{fill:#152427;stroke:#6EC4D5;stroke-width:2}
20
+ .gold{fill:#2A2717;stroke:#CEB556;stroke-width:2}
21
+ .red{fill:#272015;stroke:#D3BD66;stroke-width:2}
22
+ .line{fill:none;stroke:#81A0B1;stroke-width:2.5}
23
+ .title{fill:#EBE5CA;font:bold 24px Georgia,serif}
24
+ .label{fill:#D7E3F0;font:17px Georgia,serif}
25
+ .code{fill:#E1F1F4;font:15px ui-monospace,SFMono-Regular,Consolas,monospace}
26
+ .darkcode{fill:#D7E3F0;font:14px ui-monospace,SFMono-Regular,Consolas,monospace}
27
+ .f-537487{fill:#2C3D47}
28
+ }
12
29
  </style>
13
- <marker id="arrow" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path d="M0 0L8 4L0 8Z" fill="#537487"/></marker>
30
+ <marker id="arrow" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path d="M0 0L8 4L0 8Z" class="f-537487"/></marker>
14
31
  </defs>
15
32
  <rect width="900" height="470" class="bg"/><rect y="350" width="900" height="120" class="bench"/>
16
33
  <text class="title" x="450" y="35" text-anchor="middle">THE REASONING LABORATORY</text>
@@ -18,7 +35,7 @@
18
35
  <text class="code" x="340" y="108">theory.pl</text>
19
36
  <text class="code" x="340" y="143">answer(X) :-</text><text class="code" x="365" y="166">evidence(X),</text><text class="code" x="365" y="189">within_limit(X).</text>
20
37
  <text class="code" x="340" y="225">eyeprolog --goal 'answer(X)' program.pl</text>
21
- <path d="M415 262L450 300L485 262Z" fill="#537487"/><rect x="380" y="298" width="140" height="12" rx="6" fill="#537487"/>
38
+ <path d="M415 262L450 300L485 262Z" class="f-537487"/><rect x="380" y="298" width="140" height="12" rx="6" class="f-537487"/>
22
39
 
23
40
  <rect class="paper" x="38" y="75" width="210" height="110" rx="8"/>
24
41
  <text class="label" x="143" y="103" text-anchor="middle">1 · PREDICT</text>
@@ -12,15 +12,45 @@
12
12
  .screen-code{fill:#DDF7FB;font:12px ui-monospace,SFMono-Regular,Consolas,monospace}
13
13
  .small-label{fill:#17324D;font:bold 14px Georgia,serif}.small-ink{fill:#17324D;font:14px Georgia,serif}
14
14
  .line{fill:none;stroke:#537487;stroke-width:2.5;stroke-linecap:round}.wire{fill:none;stroke:#C8A100;stroke-width:3}
15
+
16
+ .f-537487{fill:#537487}
17
+ .f-C8A100{fill:#C8A100}
18
+ .f-DDF7FB{fill:#DDF7FB}
19
+ .f-FFFDF8{fill:#FFFDF8}
20
+ .s-17324D{stroke:#17324D}
21
+ @media (prefers-color-scheme: dark) {
22
+ .wall{fill:#142325}
23
+ .floor{fill:#272015}
24
+ .bench{fill:#36301D;stroke:#D6C572;stroke-width:3}
25
+ .paper{fill:#221E12;stroke:#82AEDA;stroke-width:2}
26
+ .screen{fill:#334F5F;stroke:#82AEDA;stroke-width:3}
27
+ .green{fill:#152427;stroke:#6EC4D5;stroke-width:2}
28
+ .gold{fill:#2A2717;stroke:#CEB556;stroke-width:2}
29
+ .red{fill:#272015;stroke:#D3BD66;stroke-width:2}
30
+ .blue{fill:#152427;stroke:#81A0B1;stroke-width:2}
31
+ .ink{fill:#D7E3F0;font:16px Georgia,serif}
32
+ .label{fill:#D7E3F0;font:bold 15px Georgia,serif}
33
+ .code{fill:#152427;font:14px ui-monospace,SFMono-Regular,Consolas,monospace}
34
+ .screen-code{fill:#E1F1F4;font:12px ui-monospace,SFMono-Regular,Consolas,monospace}
35
+ .small-label{fill:#D7E3F0;font:bold 14px Georgia,serif}
36
+ .small-ink{fill:#D7E3F0;font:14px Georgia,serif}
37
+ .line{fill:none;stroke:#81A0B1;stroke-width:2.5;stroke-linecap:round}
38
+ .wire{fill:none;stroke:#D3BD66;stroke-width:3}
39
+ .f-537487{fill:#2C3D47}
40
+ .f-C8A100{fill:#4D472A}
41
+ .f-DDF7FB{fill:#152427}
42
+ .f-FFFDF8{fill:#221E12}
43
+ .s-17324D{stroke:#82AEDA}
44
+ }
15
45
  </style>
16
- <marker id="arrow" markerWidth="7" markerHeight="7" refX="6" refY="3.5" orient="auto"><path d="M0 0L7 3.5L0 7Z" fill="#C8A100"/></marker>
46
+ <marker id="arrow" markerWidth="7" markerHeight="7" refX="6" refY="3.5" orient="auto"><path d="M0 0L7 3.5L0 7Z" class="f-C8A100"/></marker>
17
47
  </defs>
18
48
  <rect width="900" height="300" class="wall"/><rect y="300" width="900" height="140" class="floor"/>
19
49
  <rect class="bench" x="55" y="270" width="790" height="42" rx="5"/><rect class="bench" x="100" y="310" width="24" height="110"/><rect class="bench" x="776" y="310" width="24" height="110"/>
20
50
 
21
51
  <g transform="translate(82 68)">
22
52
  <path class="paper" d="M0 20Q60 0 120 20V170Q60 150 0 170Z"/><path class="paper" d="M120 20Q180 0 240 20V170Q180 150 120 170Z"/>
23
- <line x1="120" y1="20" x2="120" y2="170" stroke="#17324D" stroke-width="2"/>
53
+ <line x1="120" y1="20" x2="120" y2="170" stroke-width="2" class="s-17324D"/>
24
54
  <text class="label" x="120" y="48" text-anchor="middle">ISO PROLOG</text>
25
55
  <text class="ink" x="120" y="76" text-anchor="middle">control · terms</text><text class="ink" x="120" y="100" text-anchor="middle">state · operators</text><text class="ink" x="120" y="124" text-anchor="middle">streams · errors</text>
26
56
  </g>
@@ -32,7 +62,7 @@
32
62
  <text class="screen-code" x="24" y="102">assertz(task(verify)).</text>
33
63
  <text class="screen-code" x="24" y="134">read_term(Stream, Term, Options).</text>
34
64
  <text class="screen-code" x="24" y="166">Result = standard_practice.</text>
35
- <path d="M105 185L90 215H210L195 185Z" fill="#537487" stroke="#17324D" stroke-width="2"/>
65
+ <path d="M105 185L90 215H210L195 185Z" stroke-width="2" class="f-537487 s-17324D"/>
36
66
  </g>
37
67
 
38
68
  <g transform="translate(690 62)">
@@ -45,8 +75,8 @@
45
75
  <path class="wire" marker-end="url(#arrow)" d="M665 150C675 150 678 150 686 150"/>
46
76
 
47
77
  <g transform="translate(270 325)">
48
- <circle cx="0" cy="-28" r="18" fill="#FFFDF8" stroke="#17324D" stroke-width="2"/>
49
- <path d="M-28 0Q0-25 28 0L22 72H-22Z" fill="#DDF7FB" stroke="#17324D" stroke-width="2"/>
78
+ <circle cx="0" cy="-28" r="18" stroke-width="2" class="f-FFFDF8 s-17324D"/>
79
+ <path d="M-28 0Q0-25 28 0L22 72H-22Z" stroke-width="2" class="f-DDF7FB s-17324D"/>
50
80
  <path class="line" d="M-12 72L-15 105M12 72L15 105"/>
51
81
  </g>
52
82
  <rect class="blue" x="350" y="337" width="400" height="66" rx="10"/>
@@ -4,7 +4,22 @@
4
4
  <defs><style>
5
5
  .bg{fill:#FFF9E8}.core{fill:#2C657A;stroke:#17324D;stroke-width:3}.box{fill:#FFFDF8;stroke:#17324D;stroke-width:2}.green{fill:#DDF7FB;stroke:#008EAA;stroke-width:2}.gold{fill:#FFF4BF;stroke:#E2BA22;stroke-width:2}.rose{fill:#FFF0D6;stroke:#C8A100;stroke-width:2}.blue{fill:#DDF7FB;stroke:#537487;stroke-width:2}
6
6
  .title{fill:#C8A100;font:bold 24px Georgia,serif}.label{fill:#17324D;font:bold 13px Georgia,serif}.light{fill:#FFFDF8;font:bold 16px Georgia,serif}.prose{fill:#405E70;font:13px Georgia,serif}.line{fill:none;stroke:#537487;stroke-width:2.5}
7
- </style></defs>
7
+
8
+ @media (prefers-color-scheme: dark) {
9
+ .bg{fill:#242014}
10
+ .core{fill:#2C4852;stroke:#82AEDA;stroke-width:3}
11
+ .box{fill:#221E12;stroke:#82AEDA;stroke-width:2}
12
+ .green{fill:#152427;stroke:#6EC4D5;stroke-width:2}
13
+ .gold{fill:#2A2717;stroke:#CEB556;stroke-width:2}
14
+ .rose{fill:#272015;stroke:#D3BD66;stroke-width:2}
15
+ .blue{fill:#152427;stroke:#81A0B1;stroke-width:2}
16
+ .title{fill:#E7E0C1;font:bold 24px Georgia,serif}
17
+ .label{fill:#D7E3F0;font:bold 13px Georgia,serif}
18
+ .light{fill:#F4EFE1;font:bold 16px Georgia,serif}
19
+ .prose{fill:#CDDBE3;font:13px Georgia,serif}
20
+ .line{fill:none;stroke:#81A0B1;stroke-width:2.5}
21
+ }
22
+ </style></defs>
8
23
  <rect class="bg" width="900" height="460"/><text class="title" x="450" y="38" text-anchor="middle">A PATTERN STARTS WITH A NAMED DESIGN PROBLEM</text>
9
24
  <rect class="core" x="335" y="175" width="230" height="100" rx="18"/><text class="light" x="450" y="211" text-anchor="middle">WHAT IS GOING WRONG?</text><text class="light" x="450" y="243" text-anchor="middle">choose by consequence</text>
10
25
  <path class="line" d="M335 195L245 130M450 175V120M565 195L655 130M335 255L245 335M450 275V345M565 255L655 335"/>
@@ -4,7 +4,22 @@
4
4
  <defs><style>
5
5
  .bg{fill:#FFF9E8}.box{fill:#FFFDF8;stroke:#17324D;stroke-width:2}.green{fill:#DDF7FB;stroke:#008EAA;stroke-width:2}.gold{fill:#FFF4BF;stroke:#E2BA22;stroke-width:2}.rose{fill:#FFF0D6;stroke:#C8A100;stroke-width:2}
6
6
  .title{fill:#C8A100;font:bold 24px Georgia,serif}.label{fill:#17324D;font:bold 14px Georgia,serif}.code{fill:#102A3A;font:13px ui-monospace,monospace}.prose{fill:#405E70;font:14px Georgia,serif}.line{fill:none;stroke:#537487;stroke-width:3}
7
- </style><marker id="a" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path d="M0 0L8 4L0 8Z" fill="#537487"/></marker></defs>
7
+
8
+ .f-537487{fill:#537487}
9
+ @media (prefers-color-scheme: dark) {
10
+ .bg{fill:#242014}
11
+ .box{fill:#221E12;stroke:#82AEDA;stroke-width:2}
12
+ .green{fill:#152427;stroke:#6EC4D5;stroke-width:2}
13
+ .gold{fill:#2A2717;stroke:#CEB556;stroke-width:2}
14
+ .rose{fill:#272015;stroke:#D3BD66;stroke-width:2}
15
+ .title{fill:#E7E0C1;font:bold 24px Georgia,serif}
16
+ .label{fill:#D7E3F0;font:bold 14px Georgia,serif}
17
+ .code{fill:#DCEAF2;font:13px ui-monospace,monospace}
18
+ .prose{fill:#CDDBE3;font:14px Georgia,serif}
19
+ .line{fill:none;stroke:#81A0B1;stroke-width:3}
20
+ .f-537487{fill:#2C3D47}
21
+ }
22
+ </style><marker id="a" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path d="M0 0L8 4L0 8Z" class="f-537487"/></marker></defs>
8
23
  <rect class="bg" width="900" height="460"/><text class="title" x="450" y="38" text-anchor="middle">CONSTRUCT THE RELATION FROM MEANING</text>
9
24
  <rect class="green" x="35" y="105" width="175" height="115" rx="10"/><text class="label" x="122" y="137" text-anchor="middle">GROUND SENTENCE</text><text class="code" x="122" y="177" text-anchor="middle">routeable(p7,north)</text><text class="prose" x="122" y="203" text-anchor="middle">read it aloud</text>
10
25
  <rect class="box" x="255" y="105" width="175" height="115" rx="10"/><text class="label" x="342" y="137" text-anchor="middle">EXAMPLES</text><text class="prose" x="342" y="172" text-anchor="middle">small positive</text><text class="prose" x="342" y="196" text-anchor="middle">next + near miss</text>
@@ -9,10 +9,29 @@
9
9
  .title{fill:#C8A100;font:bold 24px Georgia,serif}.label{fill:#17324D;font:bold 17px Georgia,serif}
10
10
  .prose{fill:#405E70;font:15px Georgia,serif}.code{fill:#102A3A;font:14px ui-monospace,SFMono-Regular,Consolas,monospace}
11
11
  .light{fill:#DDF7FB;font:15px ui-monospace,SFMono-Regular,Consolas,monospace}.line{fill:none;stroke:#537487;stroke-width:2.5}
12
+
13
+ .f-537487{fill:#537487}
14
+ .f-FFF9E8{fill:#FFF9E8}
15
+ @media (prefers-color-scheme: dark) {
16
+ .paper{fill:#221E12;stroke:#82AEDA;stroke-width:2}
17
+ .source{fill:#31475C;stroke:#88BCDC;stroke-width:3}
18
+ .green{fill:#152427;stroke:#6EC4D5;stroke-width:2}
19
+ .gold{fill:#2A2717;stroke:#CEB556;stroke-width:2}
20
+ .rose{fill:#272015;stroke:#D3BD66;stroke-width:2}
21
+ .blue{fill:#152427;stroke:#81A0B1;stroke-width:2}
22
+ .title{fill:#E7E0C1;font:bold 24px Georgia,serif}
23
+ .label{fill:#D7E3F0;font:bold 17px Georgia,serif}
24
+ .prose{fill:#CDDBE3;font:15px Georgia,serif}
25
+ .code{fill:#DCEAF2;font:14px ui-monospace,SFMono-Regular,Consolas,monospace}
26
+ .light{fill:#E1F1F4;font:15px ui-monospace,SFMono-Regular,Consolas,monospace}
27
+ .line{fill:none;stroke:#81A0B1;stroke-width:2.5}
28
+ .f-537487{fill:#2C3D47}
29
+ .f-FFF9E8{fill:#242014}
30
+ }
12
31
  </style>
13
- <marker id="arrow" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path d="M0 0L8 4L0 8Z" fill="#537487"/></marker>
32
+ <marker id="arrow" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path d="M0 0L8 4L0 8Z" class="f-537487"/></marker>
14
33
  </defs>
15
- <rect width="900" height="500" fill="#FFF9E8"/>
34
+ <rect width="900" height="500" class="f-FFF9E8"/>
16
35
  <text class="title" x="450" y="35" text-anchor="middle">THE TRANSFORMATION WORKBENCH</text>
17
36
  <rect class="source" x="315" y="75" width="270" height="115" rx="12"/>
18
37
  <text class="light" x="450" y="108" text-anchor="middle">original relation</text>
@@ -11,9 +11,22 @@
11
11
  .text{fill:#102A3A;font:14px ui-monospace,SFMono-Regular,Consolas,monospace}
12
12
  .prose{fill:#405E70;font:17px Georgia,serif}
13
13
  .line{stroke:#537487;stroke-width:2}
14
+
15
+ .f-FFF9E8{fill:#FFF9E8}
16
+ @media (prefers-color-scheme: dark) {
17
+ .paper{fill:#221E12;stroke:#82AEDA;stroke-width:2}
18
+ .goal{fill:#142325;stroke:#6EC4D5;stroke-width:2}
19
+ .fail{fill:#272015;stroke:#D3BD66;stroke-width:2}
20
+ .repeat{fill:#2A2717;stroke:#CEB556;stroke-width:2}
21
+ .title{fill:#E7E0C1;font:bold 23px Georgia,serif}
22
+ .text{fill:#DCEAF2;font:14px ui-monospace,SFMono-Regular,Consolas,monospace}
23
+ .prose{fill:#CDDBE3;font:17px Georgia,serif}
24
+ .line{stroke:#81A0B1;stroke-width:2}
25
+ .f-FFF9E8{fill:#242014}
26
+ }
14
27
  </style>
15
28
  </defs>
16
- <rect width="900" height="500" fill="#FFF9E8"/>
29
+ <rect width="900" height="500" class="f-FFF9E8"/>
17
30
  <rect class="paper" x="25" y="40" width="390" height="410" rx="10"/>
18
31
  <text class="title" x="220" y="78" text-anchor="middle">PROOF TREE</text>
19
32
  <text class="prose" x="220" y="103" text-anchor="middle">only the successful support for one answer</text>
@@ -4,7 +4,23 @@
4
4
  <defs><style>
5
5
  .bg{fill:#FFF9E8}.paper{fill:#FFFDF8;stroke:#17324D;stroke-width:2}.green{fill:#DDF7FB;stroke:#008EAA;stroke-width:2}.gold{fill:#FFF4BF;stroke:#E2BA22;stroke-width:2}.dark{fill:#2C657A;stroke:#17324D;stroke-width:3}
6
6
  .title{fill:#C8A100;font:bold 24px Georgia,serif}.label{fill:#17324D;font:bold 17px Georgia,serif}.code{fill:#102A3A;font:14px ui-monospace,monospace}.light{fill:#FFFDF8;font:14px ui-monospace,monospace}.prose{fill:#405E70;font:15px Georgia,serif}.line{fill:none;stroke:#537487;stroke-width:3}
7
- </style><marker id="a" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path d="M0 0L8 4L0 8Z" fill="#537487"/></marker></defs>
7
+
8
+ .f-537487{fill:#537487}
9
+ @media (prefers-color-scheme: dark) {
10
+ .bg{fill:#242014}
11
+ .paper{fill:#221E12;stroke:#82AEDA;stroke-width:2}
12
+ .green{fill:#152427;stroke:#6EC4D5;stroke-width:2}
13
+ .gold{fill:#2A2717;stroke:#CEB556;stroke-width:2}
14
+ .dark{fill:#2C4852;stroke:#82AEDA;stroke-width:3}
15
+ .title{fill:#E7E0C1;font:bold 24px Georgia,serif}
16
+ .label{fill:#D7E3F0;font:bold 17px Georgia,serif}
17
+ .code{fill:#DCEAF2;font:14px ui-monospace,monospace}
18
+ .light{fill:#F4EFE1;font:14px ui-monospace,monospace}
19
+ .prose{fill:#CDDBE3;font:15px Georgia,serif}
20
+ .line{fill:none;stroke:#81A0B1;stroke-width:3}
21
+ .f-537487{fill:#2C3D47}
22
+ }
23
+ </style><marker id="a" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path d="M0 0L8 4L0 8Z" class="f-537487"/></marker></defs>
8
24
  <rect class="bg" width="900" height="430"/><text class="title" x="450" y="38" text-anchor="middle">A SUCCESSFUL QUERY RETURNS TWO KINDS OF WITNESS</text>
9
25
  <rect class="paper" x="30" y="115" width="220" height="135" rx="10"/><text class="label" x="140" y="148" text-anchor="middle">QUESTION</text><text class="code" x="140" y="188" text-anchor="middle">∃ X . mortal(X)</text><text class="prose" x="140" y="222" text-anchor="middle">does someone satisfy it?</text>
10
26
  <path class="line" marker-end="url(#a)" d="M250 182H322"/><rect class="dark" x="330" y="90" width="240" height="185" rx="12"/><text class="light" x="450" y="126" text-anchor="middle">THEORY + SEARCH</text><text class="light" x="450" y="164" text-anchor="middle">man(socrates)</text><text class="light" x="450" y="194" text-anchor="middle">mortal(X) :- man(X)</text><text class="light" x="450" y="235" text-anchor="middle">unify · reduce · derive</text>
@@ -8,10 +8,27 @@
8
8
  .title{fill:#C8A100;font:bold 24px Georgia,serif}.label{fill:#17324D;font:bold 18px Georgia,serif}
9
9
  .prose{fill:#405E70;font:16px Georgia,serif}.code{fill:#102A3A;font:15px ui-monospace,SFMono-Regular,Consolas,monospace}
10
10
  .line{fill:none;stroke:#537487;stroke-width:2.5}.rung{stroke:#E2BA22;stroke-width:4}
11
+
12
+ .f-537487{fill:#537487}
13
+ .f-FFF9E8{fill:#FFF9E8}
14
+ @media (prefers-color-scheme: dark) {
15
+ .paper{fill:#221E12;stroke:#82AEDA;stroke-width:2}
16
+ .green{fill:#152427;stroke:#6EC4D5;stroke-width:2}
17
+ .gold{fill:#2A2717;stroke:#CEB556;stroke-width:2}
18
+ .blue{fill:#152427;stroke:#81A0B1;stroke-width:2}
19
+ .title{fill:#E7E0C1;font:bold 24px Georgia,serif}
20
+ .label{fill:#D7E3F0;font:bold 18px Georgia,serif}
21
+ .prose{fill:#CDDBE3;font:16px Georgia,serif}
22
+ .code{fill:#DCEAF2;font:15px ui-monospace,SFMono-Regular,Consolas,monospace}
23
+ .line{fill:none;stroke:#81A0B1;stroke-width:2.5}
24
+ .rung{stroke:#CEB556;stroke-width:4}
25
+ .f-537487{fill:#2C3D47}
26
+ .f-FFF9E8{fill:#242014}
27
+ }
11
28
  </style>
12
- <marker id="arrow" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path d="M0 0L8 4L0 8Z" fill="#537487"/></marker>
29
+ <marker id="arrow" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path d="M0 0L8 4L0 8Z" class="f-537487"/></marker>
13
30
  </defs>
14
- <rect width="900" height="520" fill="#FFF9E8"/>
31
+ <rect width="900" height="520" class="f-FFF9E8"/>
15
32
  <text class="title" x="450" y="35" text-anchor="middle">RECURSION IS INDUCTION IN MOTION</text>
16
33
  <text class="label" x="210" y="74" text-anchor="middle">PROGRAM</text>
17
34
  <text class="label" x="690" y="74" text-anchor="middle">PROOF</text>
@@ -5,7 +5,19 @@
5
5
  .map{fill:#EAF8FA}.land{fill:#FFF0D6}.rail{fill:none;stroke:#2C657A;stroke-width:8}.tie{fill:none;stroke:#FFFDF8;stroke-width:2;stroke-dasharray:4 8}
6
6
  .station{fill:#FFFDF8;stroke:#17324D;stroke-width:3}.known{fill:#DDF7FB;stroke:#008EAA;stroke-width:4}
7
7
  .text{fill:#17324D;font:16px ui-monospace,monospace}.ledger{fill:#FFFDF8;stroke:#17324D;stroke-width:2}.check{fill:#008EAA}
8
- </style>
8
+
9
+ @media (prefers-color-scheme: dark) {
10
+ .map{fill:#142325}
11
+ .land{fill:#272015}
12
+ .rail{fill:none;stroke:#77B6CE;stroke-width:8}
13
+ .tie{fill:none;stroke:#A0802E;stroke-width:2;stroke-dasharray:4 8}
14
+ .station{fill:#221E12;stroke:#82AEDA;stroke-width:3}
15
+ .known{fill:#152427;stroke:#6EC4D5;stroke-width:4}
16
+ .text{fill:#D7E3F0;font:16px ui-monospace,monospace}
17
+ .ledger{fill:#221E12;stroke:#82AEDA;stroke-width:2}
18
+ .check{fill:#2C4C52}
19
+ }
20
+ </style>
9
21
  <rect width="900" height="380" class="map"/><path class="land" d="M0 270 Q170 210 330 280 T650 245 T900 275 V380 H0Z"/>
10
22
  <circle class="known" cx="48" cy="42" r="10"/><text class="text" x="68" y="48">answer already tabled</text>
11
23
  <path class="rail" d="M75 250 C180 130 290 115 390 190 S580 300 700 190 S800 105 845 145"/>
@@ -6,6 +6,22 @@
6
6
  .bg{fill:#FFF9E8}.question{fill:#17324D;stroke:#102A3A;stroke-width:3}.card{stroke:#537487;stroke-width:2}.practice{fill:#DDF7FB}.guide{fill:#FFF4BF}
7
7
  .line{fill:none;stroke:#537487;stroke-width:3;stroke-linecap:round}.arrow{fill:#537487}.title{fill:#9D8200;font:bold 24px Georgia,serif}
8
8
  .q{fill:#FFFDF8;font:bold 19px Georgia,serif}.qsmall{fill:#FFFDF8;font:15px Georgia,serif}.chapter{fill:#102A3A;font:bold 18px Georgia,serif}.small{fill:#405E70;font:15px Georgia,serif}.caption{fill:#405E70;font:italic 16px Georgia,serif}
9
+
10
+ @media (prefers-color-scheme: dark) {
11
+ .bg{fill:#242014}
12
+ .question{fill:#31475C;stroke:#88BCDC;stroke-width:3}
13
+ .card{stroke:#81A0B1;stroke-width:2}
14
+ .practice{fill:#152427}
15
+ .guide{fill:#2A2717}
16
+ .line{fill:none;stroke:#81A0B1;stroke-width:3;stroke-linecap:round}
17
+ .arrow{fill:#2C3D47}
18
+ .title{fill:#EBE5CA;font:bold 24px Georgia,serif}
19
+ .q{fill:#F4EFE1;font:bold 19px Georgia,serif}
20
+ .qsmall{fill:#F4EFE1;font:15px Georgia,serif}
21
+ .chapter{fill:#DCEAF2;font:bold 18px Georgia,serif}
22
+ .small{fill:#CDDBE3;font:15px Georgia,serif}
23
+ .caption{fill:#CDDBE3;font:italic 16px Georgia,serif}
24
+ }
9
25
  </style>
10
26
  </defs>
11
27
  <rect width="900" height="500" class="bg"/>
@@ -4,7 +4,22 @@
4
4
  <defs><style>
5
5
  .bg{fill:#FFF9E8}.core{fill:#2C657A;stroke:#17324D;stroke-width:3}.box{fill:#FFFDF8;stroke:#17324D;stroke-width:2}.green{fill:#DDF7FB;stroke:#008EAA;stroke-width:2}.gold{fill:#FFF4BF;stroke:#E2BA22;stroke-width:2}.rose{fill:#FFF0D6;stroke:#C8A100;stroke-width:2}.blue{fill:#DDF7FB;stroke:#537487;stroke-width:2}
6
6
  .title{fill:#C8A100;font:bold 24px Georgia,serif}.label{fill:#17324D;font:bold 13px Georgia,serif}.light{fill:#FFFDF8;font:bold 16px Georgia,serif}.prose{fill:#405E70;font:13px Georgia,serif}.line{fill:none;stroke:#537487;stroke-width:2.5}
7
- </style></defs>
7
+
8
+ @media (prefers-color-scheme: dark) {
9
+ .bg{fill:#242014}
10
+ .core{fill:#2C4852;stroke:#82AEDA;stroke-width:3}
11
+ .box{fill:#221E12;stroke:#82AEDA;stroke-width:2}
12
+ .green{fill:#152427;stroke:#6EC4D5;stroke-width:2}
13
+ .gold{fill:#2A2717;stroke:#CEB556;stroke-width:2}
14
+ .rose{fill:#272015;stroke:#D3BD66;stroke-width:2}
15
+ .blue{fill:#152427;stroke:#81A0B1;stroke-width:2}
16
+ .title{fill:#E7E0C1;font:bold 24px Georgia,serif}
17
+ .label{fill:#D7E3F0;font:bold 13px Georgia,serif}
18
+ .light{fill:#F4EFE1;font:bold 16px Georgia,serif}
19
+ .prose{fill:#CDDBE3;font:13px Georgia,serif}
20
+ .line{fill:none;stroke:#81A0B1;stroke-width:2.5}
21
+ }
22
+ </style></defs>
8
23
  <rect class="bg" width="900" height="460"/><text class="title" x="450" y="38" text-anchor="middle">TEST THE RELATION, NOT JUST ONE CALL</text>
9
24
  <rect class="core" x="340" y="170" width="220" height="105" rx="18"/><text class="light" x="450" y="207" text-anchor="middle">PUBLIC RELATION</text><text class="light" x="450" y="241" text-anchor="middle">path/2 contract</text>
10
25
  <path class="line" d="M340 190L230 125M450 170V105M560 190L670 125M340 250L230 335M450 275V355M560 250L670 335"/>
@@ -5,6 +5,24 @@
5
5
  <style>
6
6
  .bg{fill:#FFF9E8}.artifact{fill:#17324D;stroke:#102A3A;stroke-width:3}.lens{stroke-width:2}.meaning{fill:#DDF7FB;stroke:#008EAA}.logic{fill:#BFEAF1;stroke:#2C657A}.control{fill:#FFF4BF;stroke:#E2BA22}.evidence{fill:#FFF0D6;stroke:#C8A100}.boundary{fill:#DDF7FB;stroke:#2C657A}
7
7
  .line{fill:none;stroke:#537487;stroke-width:2.5}.cycle{fill:none;stroke:#9D8200;stroke-width:3;stroke-linecap:round}.arrow{fill:#9D8200}.title{fill:#9D8200;font:bold 24px Georgia,serif}.label{fill:#102A3A;font:bold 17px Georgia,serif}.small{fill:#405E70;font:15px Georgia,serif}.code{fill:#FFFDF8;font:17px ui-monospace,SFMono-Regular,Consolas,monospace}.verb{fill:#9D8200;font:bold 15px Georgia,serif}
8
+
9
+ @media (prefers-color-scheme: dark) {
10
+ .bg{fill:#242014}
11
+ .artifact{fill:#31475C;stroke:#88BCDC;stroke-width:3}
12
+ .meaning{fill:#152427;stroke:#6EC4D5}
13
+ .logic{fill:#18292C;stroke:#77B6CE}
14
+ .control{fill:#2A2717;stroke:#CEB556}
15
+ .evidence{fill:#272015;stroke:#D3BD66}
16
+ .boundary{fill:#152427;stroke:#77B6CE}
17
+ .line{fill:none;stroke:#81A0B1;stroke-width:2.5}
18
+ .cycle{fill:none;stroke:#D6C572;stroke-width:3;stroke-linecap:round}
19
+ .arrow{fill:#544D2D}
20
+ .title{fill:#EBE5CA;font:bold 24px Georgia,serif}
21
+ .label{fill:#DCEAF2;font:bold 17px Georgia,serif}
22
+ .small{fill:#CDDBE3;font:15px Georgia,serif}
23
+ .code{fill:#F4EFE1;font:17px ui-monospace,SFMono-Regular,Consolas,monospace}
24
+ .verb{fill:#EBE5CA;font:bold 15px Georgia,serif}
25
+ }
8
26
  </style>
9
27
  </defs>
10
28
  <rect width="900" height="470" class="bg"/>
@@ -8,10 +8,26 @@
8
8
  .title{fill:#C8A100;font:bold 24px Georgia,serif}.label{fill:#17324D;font:bold 17px Georgia,serif}
9
9
  .prose{fill:#405E70;font:16px Georgia,serif}.code{fill:#102A3A;font:15px ui-monospace,SFMono-Regular,Consolas,monospace}
10
10
  .line{fill:none;stroke:#537487;stroke-width:2;stroke-linecap:round}
11
+
12
+ .f-537487{fill:#537487}
13
+ .f-FFF9E8{fill:#FFF9E8}
14
+ @media (prefers-color-scheme: dark) {
15
+ .paper{fill:#221E12;stroke:#82AEDA;stroke-width:2}
16
+ .tree{fill:#152427;stroke:#6EC4D5;stroke-width:2}
17
+ .gold{fill:#2A2717;stroke:#CEB556;stroke-width:2}
18
+ .blue{fill:#152427;stroke:#81A0B1;stroke-width:2}
19
+ .title{fill:#E7E0C1;font:bold 24px Georgia,serif}
20
+ .label{fill:#D7E3F0;font:bold 17px Georgia,serif}
21
+ .prose{fill:#CDDBE3;font:16px Georgia,serif}
22
+ .code{fill:#DCEAF2;font:15px ui-monospace,SFMono-Regular,Consolas,monospace}
23
+ .line{fill:none;stroke:#81A0B1;stroke-width:2;stroke-linecap:round}
24
+ .f-537487{fill:#2C3D47}
25
+ .f-FFF9E8{fill:#242014}
26
+ }
11
27
  </style>
12
- <marker id="arrow" markerWidth="6" markerHeight="6" refX="5.5" refY="3" orient="auto"><path d="M0 0L6 3L0 6Z" fill="#537487"/></marker>
28
+ <marker id="arrow" markerWidth="6" markerHeight="6" refX="5.5" refY="3" orient="auto"><path d="M0 0L6 3L0 6Z" class="f-537487"/></marker>
13
29
  </defs>
14
- <rect width="900" height="500" fill="#FFF9E8"/>
30
+ <rect width="900" height="500" class="f-FFF9E8"/>
15
31
  <text class="title" x="450" y="35" text-anchor="middle">ONE TERM, SEVERAL RELATIONS</text>
16
32
  <rect class="paper" x="285" y="65" width="350" height="320" rx="12"/>
17
33
  <text class="label" x="450" y="95" text-anchor="middle">SYNTAX AS DATA</text>
@@ -4,7 +4,21 @@
4
4
  <defs><style>
5
5
  .bg{fill:#FFF9E8}.good{fill:#DDF7FB;stroke:#008EAA;stroke-width:2}.table{fill:#DDF7FB;stroke:#537487;stroke-width:2}.bad{fill:#FFF0D6;stroke:#C8A100;stroke-width:2}
6
6
  .title{fill:#C8A100;font:bold 24px Georgia,serif}.label{fill:#17324D;font:bold 15px Georgia,serif}.code{fill:#102A3A;font:14px ui-monospace,monospace}.prose{fill:#405E70;font:15px Georgia,serif}.line{fill:none;stroke:#537487;stroke-width:2.5}
7
- </style><marker id="a" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path d="M0 0L8 4L0 8Z" fill="#537487"/></marker></defs>
7
+
8
+ .f-537487{fill:#537487}
9
+ @media (prefers-color-scheme: dark) {
10
+ .bg{fill:#242014}
11
+ .good{fill:#152427;stroke:#6EC4D5;stroke-width:2}
12
+ .table{fill:#152427;stroke:#81A0B1;stroke-width:2}
13
+ .bad{fill:#272015;stroke:#D3BD66;stroke-width:2}
14
+ .title{fill:#E7E0C1;font:bold 24px Georgia,serif}
15
+ .label{fill:#D7E3F0;font:bold 15px Georgia,serif}
16
+ .code{fill:#DCEAF2;font:14px ui-monospace,monospace}
17
+ .prose{fill:#CDDBE3;font:15px Georgia,serif}
18
+ .line{fill:none;stroke:#81A0B1;stroke-width:2.5}
19
+ .f-537487{fill:#2C3D47}
20
+ }
21
+ </style><marker id="a" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path d="M0 0L8 4L0 8Z" class="f-537487"/></marker></defs>
8
22
  <rect class="bg" width="900" height="440"/><text class="title" x="450" y="38" text-anchor="middle">ASK WHAT MAKES THE CALL SPACE FINITE</text>
9
23
  <rect class="good" x="30" y="80" width="260" height="285" rx="12"/><text class="label" x="160" y="115" text-anchor="middle">DECREASING STRUCTURE</text><text class="code" x="160" y="155" text-anchor="middle">[a,b,c] → [b,c]</text><text class="code" x="160" y="190" text-anchor="middle">→ [c] → []</text><path class="line" marker-end="url(#a)" d="M160 210V250"/><text class="prose" x="160" y="280" text-anchor="middle">well-founded measure:</text><text class="code" x="160" y="306" text-anchor="middle">list length ↓</text><text class="label" x="160" y="345" text-anchor="middle">TERMINATES</text>
10
24
  <rect class="table" x="320" y="80" width="260" height="285" rx="12"/><text class="label" x="450" y="115" text-anchor="middle">FINITE TABLED DOMAIN</text><text class="code" x="450" y="155" text-anchor="middle">path(a, ?)</text><text class="code" x="450" y="188" text-anchor="middle">{b,c,d}</text><path class="line" marker-end="url(#a)" d="M450 210V250"/><text class="prose" x="450" y="280" text-anchor="middle">repeated calls reuse</text><text class="code" x="450" y="306" text-anchor="middle">fixed-point answers</text><text class="label" x="450" y="345" text-anchor="middle">TERMINATES</text>
@@ -50,10 +50,39 @@
50
50
  font-size: 28px;
51
51
  letter-spacing: 3px;
52
52
  }
53
+
54
+ .f-FFFDF8{fill:#FFFDF8}
55
+ @media (prefers-color-scheme: dark) {
56
+ .title-small{
57
+ fill: #D7E3F0;
58
+ font-family: Georgia, 'Times New Roman', serif;
59
+ font-size: 52px;
60
+ letter-spacing: 8px;
61
+ }
62
+ .title-main{
63
+ fill: #D7E3F0;
64
+ font-family: Georgia, 'Times New Roman', serif;
65
+ font-size: 108px;
66
+ font-weight: 600;
67
+ letter-spacing: -3px;
68
+ }
69
+ .subtitle{
70
+ fill: #CDDDE3;
71
+ font-family: Georgia, 'Times New Roman', serif;
72
+ font-size: 30px;
73
+ }
74
+ .author{
75
+ fill: #D7E3F0;
76
+ font-family: Georgia, 'Times New Roman', serif;
77
+ font-size: 28px;
78
+ letter-spacing: 3px;
79
+ }
80
+ .f-FFFDF8{fill:#221E12}
81
+ }
53
82
  </style>
54
83
  </defs>
55
84
 
56
- <rect width="1000" height="1450" fill="#fffdf8"/>
85
+ <rect width="1000" height="1450" class="f-FFFDF8"/>
57
86
 
58
87
  <!-- Native SVG rendering of the original EYE rainbow mark. -->
59
88
  <svg x="340" y="180" width="320" height="320" viewBox="0 0 68 68"
@@ -3,7 +3,7 @@
3
3
  <desc id="desc">The terms reading(Sensor,91) and reading(temp,Value) align, yielding Sensor equals temp and Value equals 91.</desc>
4
4
  <defs>
5
5
  <marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto">
6
- <path d="M0,0 L0,6 L9,3 z" fill="#405E70"/>
6
+ <path d="M0,0 L0,6 L9,3 z" class="f-405E70"/>
7
7
  </marker>
8
8
  <style>
9
9
  .node{fill:#FFFDF8;stroke:#17324D;stroke-width:2}
@@ -13,9 +13,23 @@
13
13
  .title{fill:#C8A100;font:bold 22px Georgia,serif}
14
14
  .line{stroke:#537487;stroke-width:2}
15
15
  .bind{stroke:#E2BA22;stroke-width:2.5;stroke-dasharray:7 6;fill:none;marker-end:url(#arrow)}
16
+
17
+ .f-405E70{fill:#405E70}
18
+ .f-FFF9E8{fill:#FFF9E8}
19
+ @media (prefers-color-scheme: dark) {
20
+ .node{fill:#221E12;stroke:#82AEDA;stroke-width:2}
21
+ .var{fill:#2A2717;stroke:#CEB556;stroke-width:2}
22
+ .value{fill:#142325;stroke:#6EC4D5;stroke-width:2}
23
+ .text{fill:#DCEAF2;font:17px ui-monospace,SFMono-Regular,Consolas,monospace}
24
+ .title{fill:#E7E0C1;font:bold 22px Georgia,serif}
25
+ .line{stroke:#81A0B1;stroke-width:2}
26
+ .bind{stroke:#CEB556;stroke-width:2.5;stroke-dasharray:7 6;fill:none;marker-end:url(#arrow)}
27
+ .f-405E70{fill:#2D424F}
28
+ .f-FFF9E8{fill:#242014}
29
+ }
16
30
  </style>
17
31
  </defs>
18
- <rect width="900" height="500" fill="#FFF9E8"/>
32
+ <rect width="900" height="500" class="f-FFF9E8"/>
19
33
  <text class="title" x="235" y="42" text-anchor="middle">first term</text>
20
34
  <text class="title" x="665" y="42" text-anchor="middle">second term</text>
21
35
 
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.6.21",
6
+ "version": "1.6.22",
7
7
  "description": "EyeProlog turns facts and rules into answers and proofs.",
8
8
  "type": "module",
9
9
  "main": "./index.js",
File without changes
File without changes
@@ -130,9 +130,10 @@ Code displays serve three different purposes:
130
130
  - a `sh` or `js` block is a host command or embedding example.
131
131
 
132
132
  Top-level programs under [`examples/`](https://github.com/eyereasoner/eyeprolog/tree/main/examples/) are the complete runnable
133
- cases. Their exact outputs live under `examples/output/`; selected proof
134
- outputs live under `examples/proof/`. Use `examples/book/` to copy a particular
135
- display and the top-level corpus for end-to-end experiments.
133
+ cases. Their exact outputs live under `examples/output/`, the proof of each
134
+ under `examples/proof/`, and the result of checking that proof under
135
+ `examples/check/`. Use `examples/book/` to copy a particular display and the
136
+ top-level corpus for end-to-end experiments.
136
137
 
137
138
  ### The promise of this book
138
139
 
@@ -10424,7 +10425,7 @@ hand.
10424
10425
 
10425
10426
  #### Running and extending the corpus
10426
10427
 
10427
- Run all 235 normal answer goldens and the 103 selected proof goldens with:
10428
+ Run all 236 answer goldens and all 236 proof goldens with:
10428
10429
 
10429
10430
  ```sh
10430
10431
  node test/run-examples.mjs
package/why-eyeprolog.md CHANGED
@@ -270,9 +270,9 @@ separately in the result, and reported as what the check still rests on rather
270
270
  than what it establishes.
271
271
 
272
272
  The packaged corpus makes the proportion visible. Every one of the 235
273
- examples carries a proof: 36423 steps, of which 20746 are verified against
274
- their source clause, 14720 are recomputed independently, and 952 — 2.6% —
275
- remain obligations. `npm test` re-checks all of them on every run, and the
273
+ examples carries a proof: 36432 steps, of which 20753 are verified against
274
+ their source clause, 14720 are recomputed independently, 76 are carried by the
275
+ goals they wrap, and 878 — 2.4% — remain obligations, each one named. `npm test` re-checks all of them on every run, and the
276
276
  proof directory is read from disk rather than from a list, so a document cannot
277
277
  be added without being checked. An unverified proof is worse than none, because
278
278
  it still looks like evidence.