eyeling 1.24.0 → 1.24.1

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 (154) hide show
  1. package/README.md +4 -4
  2. package/package.json +1 -1
  3. package/see/README.md +10 -11
  4. package/see/examples/age.js +10 -10
  5. package/see/examples/annotation.js +10 -10
  6. package/see/examples/backward.js +10 -10
  7. package/see/examples/backward_recursion.js +10 -10
  8. package/see/examples/bayes_diagnosis.js +10 -10
  9. package/see/examples/bayes_therapy.js +10 -10
  10. package/see/examples/bmi.js +10 -10
  11. package/see/examples/builtin_coverage.js +10 -10
  12. package/see/examples/collection.js +10 -10
  13. package/see/examples/complex.js +10 -10
  14. package/see/examples/complex_matrix_stability.js +10 -10
  15. package/see/examples/composition_of_injective_functions_is_injective.js +10 -10
  16. package/see/examples/control_system.js +10 -10
  17. package/see/examples/crypto_builtins_tests.js +10 -10
  18. package/see/examples/delfour.js +10 -10
  19. package/see/examples/digital_product_passport.js +10 -10
  20. package/see/examples/dijkstra.js +10 -10
  21. package/see/examples/dijkstra_risk_path.js +10 -10
  22. package/see/examples/doc/age.md +1 -1
  23. package/see/examples/doc/annotation.md +1 -1
  24. package/see/examples/doc/backward.md +1 -1
  25. package/see/examples/doc/backward_recursion.md +1 -1
  26. package/see/examples/doc/bayes_diagnosis.md +1 -1
  27. package/see/examples/doc/bayes_therapy.md +1 -1
  28. package/see/examples/doc/bmi.md +1 -1
  29. package/see/examples/doc/builtin_coverage.md +1 -1
  30. package/see/examples/doc/collection.md +1 -1
  31. package/see/examples/doc/complex.md +1 -1
  32. package/see/examples/doc/complex_matrix_stability.md +1 -1
  33. package/see/examples/doc/composition_of_injective_functions_is_injective.md +1 -1
  34. package/see/examples/doc/control_system.md +1 -1
  35. package/see/examples/doc/crypto_builtins_tests.md +1 -1
  36. package/see/examples/doc/delfour.md +1 -1
  37. package/see/examples/doc/digital_product_passport.md +1 -1
  38. package/see/examples/doc/dijkstra.md +1 -1
  39. package/see/examples/doc/dijkstra_risk_path.md +1 -1
  40. package/see/examples/doc/dog.md +1 -1
  41. package/see/examples/doc/eco_route_insight.md +1 -1
  42. package/see/examples/doc/equals.md +1 -1
  43. package/see/examples/doc/equivalence_classes_overlap_implies_same_class.md +1 -1
  44. package/see/examples/doc/euler_identity.md +1 -1
  45. package/see/examples/doc/ev_roundtrip_planner.md +1 -1
  46. package/see/examples/doc/existential_rule.md +1 -1
  47. package/see/examples/doc/expression_eval.md +1 -1
  48. package/see/examples/doc/family_cousins.md +1 -1
  49. package/see/examples/doc/fastpow.md +1 -1
  50. package/see/examples/doc/fibonacci.md +1 -1
  51. package/see/examples/doc/french_cities.md +1 -1
  52. package/see/examples/doc/fundamental_theorem_arithmetic.md +1 -1
  53. package/see/examples/doc/genetic_knapsack_selection.md +1 -1
  54. package/see/examples/doc/goldbach_1000.md +1 -1
  55. package/see/examples/doc/good_cobbler.md +1 -1
  56. package/see/examples/doc/gps.md +1 -1
  57. package/see/examples/doc/gray_code_counter.md +1 -1
  58. package/see/examples/doc/greatest_lower_bound_uniqueness.md +1 -1
  59. package/see/examples/doc/group_inverse_uniqueness.md +1 -1
  60. package/see/examples/doc/hadamard_approx.md +1 -1
  61. package/see/examples/doc/hanoi.md +1 -1
  62. package/see/examples/doc/odrl_dpv_risk_ranked.md +1 -1
  63. package/see/examples/doc/path_discovery.md +1 -1
  64. package/see/examples/doc/rc_discharge_envelope.md +1 -1
  65. package/see/examples/doc/rdf_message_flow.md +1 -1
  66. package/see/examples/doc/rdf_messages.md +1 -1
  67. package/see/examples/doc/school_placement_audit.md +1 -1
  68. package/see/examples/doc/smoke_arithmetic.md +1 -1
  69. package/see/examples/doc/socrates.md +1 -1
  70. package/see/examples/doc/wind_turbine.md +1 -1
  71. package/see/examples/doc/witch.md +1 -1
  72. package/see/examples/dog.js +10 -10
  73. package/see/examples/eco_route_insight.js +10 -10
  74. package/see/examples/equals.js +10 -10
  75. package/see/examples/equivalence_classes_overlap_implies_same_class.js +10 -10
  76. package/see/examples/euler_identity.js +10 -10
  77. package/see/examples/ev_roundtrip_planner.js +10 -10
  78. package/see/examples/existential_rule.js +10 -10
  79. package/see/examples/expression_eval.js +10 -10
  80. package/see/examples/family_cousins.js +10 -10
  81. package/see/examples/fastpow.js +10 -10
  82. package/see/examples/fibonacci.js +10 -10
  83. package/see/examples/french_cities.js +10 -10
  84. package/see/examples/fundamental_theorem_arithmetic.js +10 -10
  85. package/see/examples/genetic_knapsack_selection.js +10 -10
  86. package/see/examples/goldbach_1000.js +10 -10
  87. package/see/examples/good_cobbler.js +10 -10
  88. package/see/examples/gps.js +10 -10
  89. package/see/examples/gray_code_counter.js +10 -10
  90. package/see/examples/greatest_lower_bound_uniqueness.js +10 -10
  91. package/see/examples/group_inverse_uniqueness.js +10 -10
  92. package/see/examples/hadamard_approx.js +10 -10
  93. package/see/examples/hanoi.js +10 -10
  94. package/see/examples/odrl_dpv_risk_ranked.js +10 -10
  95. package/see/examples/output/age.md +3 -3
  96. package/see/examples/output/annotation.md +4 -4
  97. package/see/examples/output/backward.md +3 -3
  98. package/see/examples/output/backward_recursion.md +3 -3
  99. package/see/examples/output/bayes_diagnosis.md +1 -1
  100. package/see/examples/output/bayes_therapy.md +1 -1
  101. package/see/examples/output/bmi.md +1 -1
  102. package/see/examples/output/builtin_coverage.md +3 -3
  103. package/see/examples/output/collection.md +3 -3
  104. package/see/examples/output/complex.md +4 -4
  105. package/see/examples/output/complex_matrix_stability.md +1 -1
  106. package/see/examples/output/composition_of_injective_functions_is_injective.md +3 -3
  107. package/see/examples/output/control_system.md +3 -3
  108. package/see/examples/output/crypto_builtins_tests.md +3 -3
  109. package/see/examples/output/delfour.md +1 -1
  110. package/see/examples/output/digital_product_passport.md +1 -1
  111. package/see/examples/output/dijkstra.md +3 -3
  112. package/see/examples/output/dijkstra_risk_path.md +1 -1
  113. package/see/examples/output/dog.md +3 -3
  114. package/see/examples/output/eco_route_insight.md +1 -1
  115. package/see/examples/output/equals.md +3 -3
  116. package/see/examples/output/equivalence_classes_overlap_implies_same_class.md +3 -3
  117. package/see/examples/output/euler_identity.md +3 -3
  118. package/see/examples/output/ev_roundtrip_planner.md +1 -1
  119. package/see/examples/output/existential_rule.md +3 -3
  120. package/see/examples/output/expression_eval.md +3 -3
  121. package/see/examples/output/family_cousins.md +3 -3
  122. package/see/examples/output/fastpow.md +1 -1
  123. package/see/examples/output/fibonacci.md +1 -1
  124. package/see/examples/output/french_cities.md +3 -3
  125. package/see/examples/output/fundamental_theorem_arithmetic.md +1 -1
  126. package/see/examples/output/genetic_knapsack_selection.md +1 -1
  127. package/see/examples/output/goldbach_1000.md +1 -1
  128. package/see/examples/output/good_cobbler.md +4 -4
  129. package/see/examples/output/gps.md +1 -1
  130. package/see/examples/output/gray_code_counter.md +1 -1
  131. package/see/examples/output/greatest_lower_bound_uniqueness.md +3 -3
  132. package/see/examples/output/group_inverse_uniqueness.md +3 -3
  133. package/see/examples/output/hadamard_approx.md +3 -3
  134. package/see/examples/output/hanoi.md +3 -3
  135. package/see/examples/output/odrl_dpv_risk_ranked.md +3 -3
  136. package/see/examples/output/path_discovery.md +3 -3
  137. package/see/examples/output/rc_discharge_envelope.md +1 -1
  138. package/see/examples/output/rdf_message_flow.md +1 -1
  139. package/see/examples/output/rdf_messages.md +1 -1
  140. package/see/examples/output/school_placement_audit.md +1 -1
  141. package/see/examples/output/smoke_arithmetic.md +1 -1
  142. package/see/examples/output/socrates.md +3 -3
  143. package/see/examples/output/wind_turbine.md +1 -1
  144. package/see/examples/output/witch.md +3 -3
  145. package/see/examples/path_discovery.js +10 -10
  146. package/see/examples/rc_discharge_envelope.js +10 -10
  147. package/see/examples/rdf_message_flow.js +10 -10
  148. package/see/examples/rdf_messages.js +10 -10
  149. package/see/examples/school_placement_audit.js +10 -10
  150. package/see/examples/smoke_arithmetic.js +10 -10
  151. package/see/examples/socrates.js +10 -10
  152. package/see/examples/wind_turbine.js +10 -10
  153. package/see/examples/witch.js +10 -10
  154. package/see/see.js +381 -93
@@ -1040,19 +1040,19 @@ function renderStructuredOutput({ title, graph, queries = [], rules = [], initia
1040
1040
  const lines = [];
1041
1041
  lines.push('# ' + title);
1042
1042
  lines.push('');
1043
- lines.push('## Insight');
1043
+ lines.push('## Entailment');
1044
1044
  if (mode === 'query') {
1045
1045
  lines.push('The compiled query selected ' + selected.length + ' fact(s) after the rule closure was computed.');
1046
1046
  } else if (mode === 'formula') {
1047
- lines.push('The derivation produced ' + selected.length + ' formula-valued conclusion(s).');
1047
+ lines.push('The derivation produced ' + selected.length + ' formula-valued entailment(s).');
1048
1048
  } else {
1049
1049
  lines.push('The derivation produced ' + derived.length + ' new fact(s) from ' + initialFacts.length + ' stated fact(s).');
1050
1050
  }
1051
- if (keyFact) lines.push('Main conclusion: **' + factSentence(keyFact) + '**');
1051
+ if (keyFact) lines.push('Main entailment: **' + factSentence(keyFact) + '**');
1052
1052
  const bullets = selected.slice(-6).reverse();
1053
1053
  if (bullets.length) {
1054
1054
  lines.push('');
1055
- lines.push('Selected conclusions:');
1055
+ lines.push('Selected entailments:');
1056
1056
  for (const fact of bullets) lines.push('- ' + codeFact(fact));
1057
1057
  }
1058
1058
  lines.push('');
@@ -1114,15 +1114,15 @@ function dedupeExplanationHeadings(text) {
1114
1114
  function normalizePublicReport(markdown, title) {
1115
1115
  let text = String(markdown || '').trimEnd();
1116
1116
  if (!/^\s*#\s+/m.test(text)) text = '# ' + title + '\n\n' + text;
1117
- if (!/^##\s+Insight\s*$/mi.test(text)) {
1118
- text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Insight\n');
1117
+ if (!/^##\s+Entailment\s*$/mi.test(text)) {
1118
+ text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Entailment\n');
1119
1119
  }
1120
1120
  if (!/^##\s+Explanation\s*$/mi.test(text)) {
1121
1121
  text += '\n\n## Explanation\nNo additional explanation was provided by the generated output.';
1122
1122
  }
1123
1123
  text = text.replace(/^##\s+([^\n]+?)\s*$/gm, (line, heading) => {
1124
1124
  const normalized = heading.trim().toLowerCase();
1125
- if (normalized === 'insight' || normalized === 'explanation') return '## ' + (normalized === 'insight' ? 'Insight' : 'Explanation');
1125
+ if (normalized === 'insight' || normalized === 'conclusion' || normalized === 'entailment' || normalized === 'explanation') return '## ' + (normalized === 'explanation' ? 'Explanation' : 'Entailment');
1126
1126
  return '**' + heading.trim() + '**';
1127
1127
  });
1128
1128
  text = dedupeExplanationHeadings(text);
@@ -1131,13 +1131,13 @@ function normalizePublicReport(markdown, title) {
1131
1131
  function markdownize(raw, title) {
1132
1132
  let text = String(raw || '');
1133
1133
  text = text
1134
- .replace(/===\s*Answer\s*===/g, '## Insight')
1134
+ .replace(/===\s*Answer\s*===/g, '## Entailment')
1135
1135
  .replace(/===\s*Reason\s+Why\s*===/gi, '## Explanation')
1136
1136
  .replace(/===\s*Explanation\s*===/gi, '## Explanation')
1137
1137
  .replace(/===\s*([^=]+?)\s*===/g, (_, h) => '**' + h.trim() + '**');
1138
1138
  text = text.replace(/^C(\d+)\s+OK\s*-\s*/gm, 'C$1: ');
1139
1139
  text = dedupeExplanationHeadings(text);
1140
- if (!text.trim()) text = '## Insight\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1140
+ if (!text.trim()) text = '## Entailment\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1141
1141
  return normalizePublicReport(text, title);
1142
1142
  }
1143
1143
  function authoredSupportAppendix(graph, queries, rules, initialFacts, trace) {
@@ -1673,7 +1673,7 @@ const QUERIES = [
1673
1673
  ]
1674
1674
  }
1675
1675
  ];
1676
- const DOC_MARKDOWN = "# Goldbach 1000\n\nGenerated by `see.js` from a Notation3 source file.\n\nN3-compiled version of the bounded Goldbach SEE example. It keeps the bounded\nresult as committed data and uses rules to verify the representative witness\nequations that are shown in the report.\n\n## Compilation summary\n\n- Example name: `goldbach_1000`\n- Input facts emitted: 28\n- Forward rules compiled: 3\n- Backward predicate rules compiled: 0\n- Fuses compiled: 1\n- Predicate count: 16\n\n## Built-ins used\n\n- `log:notIncludes`\n- `log:outputString`\n- `math:sum`\n- `string:format`\n\n## Runtime model\n\nThe generated `examples/goldbach_1000.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/goldbach_1000.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/goldbach-1000.trig` or `examples/input/goldbach_1000.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/goldbach_1000.js` produces a SEE-style Markdown report with an **Insight** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
1676
+ const DOC_MARKDOWN = "# Goldbach 1000\n\nGenerated by `see.js` from a Notation3 source file.\n\nN3-compiled version of the bounded Goldbach SEE example. It keeps the bounded\nresult as committed data and uses rules to verify the representative witness\nequations that are shown in the report.\n\n## Compilation summary\n\n- Example name: `goldbach_1000`\n- Input facts emitted: 28\n- Forward rules compiled: 3\n- Backward predicate rules compiled: 0\n- Fuses compiled: 1\n- Predicate count: 16\n\n## Built-ins used\n\n- `log:notIncludes`\n- `log:outputString`\n- `math:sum`\n- `string:format`\n\n## Runtime model\n\nThe generated `examples/goldbach_1000.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/goldbach_1000.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/goldbach-1000.trig` or `examples/input/goldbach_1000.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/goldbach_1000.js` produces a SEE-style Markdown report with an **Entailment** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
1677
1677
  function seeMetadata(data) { return (data && data.__see) || {}; }
1678
1678
  function trustedDerivation(data) { const meta = seeMetadata(data); const facts = data && Array.isArray(data.facts) ? data.facts : []; const expectedFacts = EXPECTED_INPUT_FACTS || Number(meta.InputFacts || 0); if (meta.SourceSHA256 && meta.SourceSHA256 !== "f40ec2cb172140ebdb5632a0abf0f0498be1183564755aaf76748545a2b49158") throw new Error('input evidence does not match the N3 source compiled into this example'); const result = saturate(facts, RULES); const rawOutput = renderRawOutput(result.graph, QUERIES, RULES, facts); fail('Compiled N3 derivation failed', { 'input evidence metadata is present and matches compiled source': meta.SourceSHA256 === "f40ec2cb172140ebdb5632a0abf0f0498be1183564755aaf76748545a2b49158", 'input evidence facts were loaded': expectedFacts > 0 ? facts.length === expectedFacts : facts.length >= 0, 'compiled rules were loaded': RULES.length === 4, 'compiled query directives were loaded': QUERIES.length === 1, 'a derivation fixpoint was reached': result.graph.facts.length >= facts.length, 'query or output facts were produced': rawOutput.length > 0 }); return { ...result, rawOutput, inputFacts: facts }; }
1679
1679
  function snapshotMarkdown(markdown) { return markdown.split(/\n/).map((line) => line ? line + ' \n' : '\n').join(''); }
@@ -1040,19 +1040,19 @@ function renderStructuredOutput({ title, graph, queries = [], rules = [], initia
1040
1040
  const lines = [];
1041
1041
  lines.push('# ' + title);
1042
1042
  lines.push('');
1043
- lines.push('## Insight');
1043
+ lines.push('## Entailment');
1044
1044
  if (mode === 'query') {
1045
1045
  lines.push('The compiled query selected ' + selected.length + ' fact(s) after the rule closure was computed.');
1046
1046
  } else if (mode === 'formula') {
1047
- lines.push('The derivation produced ' + selected.length + ' formula-valued conclusion(s).');
1047
+ lines.push('The derivation produced ' + selected.length + ' formula-valued entailment(s).');
1048
1048
  } else {
1049
1049
  lines.push('The derivation produced ' + derived.length + ' new fact(s) from ' + initialFacts.length + ' stated fact(s).');
1050
1050
  }
1051
- if (keyFact) lines.push('Main conclusion: **' + factSentence(keyFact) + '**');
1051
+ if (keyFact) lines.push('Main entailment: **' + factSentence(keyFact) + '**');
1052
1052
  const bullets = selected.slice(-6).reverse();
1053
1053
  if (bullets.length) {
1054
1054
  lines.push('');
1055
- lines.push('Selected conclusions:');
1055
+ lines.push('Selected entailments:');
1056
1056
  for (const fact of bullets) lines.push('- ' + codeFact(fact));
1057
1057
  }
1058
1058
  lines.push('');
@@ -1114,15 +1114,15 @@ function dedupeExplanationHeadings(text) {
1114
1114
  function normalizePublicReport(markdown, title) {
1115
1115
  let text = String(markdown || '').trimEnd();
1116
1116
  if (!/^\s*#\s+/m.test(text)) text = '# ' + title + '\n\n' + text;
1117
- if (!/^##\s+Insight\s*$/mi.test(text)) {
1118
- text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Insight\n');
1117
+ if (!/^##\s+Entailment\s*$/mi.test(text)) {
1118
+ text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Entailment\n');
1119
1119
  }
1120
1120
  if (!/^##\s+Explanation\s*$/mi.test(text)) {
1121
1121
  text += '\n\n## Explanation\nNo additional explanation was provided by the generated output.';
1122
1122
  }
1123
1123
  text = text.replace(/^##\s+([^\n]+?)\s*$/gm, (line, heading) => {
1124
1124
  const normalized = heading.trim().toLowerCase();
1125
- if (normalized === 'insight' || normalized === 'explanation') return '## ' + (normalized === 'insight' ? 'Insight' : 'Explanation');
1125
+ if (normalized === 'insight' || normalized === 'conclusion' || normalized === 'entailment' || normalized === 'explanation') return '## ' + (normalized === 'explanation' ? 'Explanation' : 'Entailment');
1126
1126
  return '**' + heading.trim() + '**';
1127
1127
  });
1128
1128
  text = dedupeExplanationHeadings(text);
@@ -1131,13 +1131,13 @@ function normalizePublicReport(markdown, title) {
1131
1131
  function markdownize(raw, title) {
1132
1132
  let text = String(raw || '');
1133
1133
  text = text
1134
- .replace(/===\s*Answer\s*===/g, '## Insight')
1134
+ .replace(/===\s*Answer\s*===/g, '## Entailment')
1135
1135
  .replace(/===\s*Reason\s+Why\s*===/gi, '## Explanation')
1136
1136
  .replace(/===\s*Explanation\s*===/gi, '## Explanation')
1137
1137
  .replace(/===\s*([^=]+?)\s*===/g, (_, h) => '**' + h.trim() + '**');
1138
1138
  text = text.replace(/^C(\d+)\s+OK\s*-\s*/gm, 'C$1: ');
1139
1139
  text = dedupeExplanationHeadings(text);
1140
- if (!text.trim()) text = '## Insight\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1140
+ if (!text.trim()) text = '## Entailment\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1141
1141
  return normalizePublicReport(text, title);
1142
1142
  }
1143
1143
  function authoredSupportAppendix(graph, queries, rules, initialFacts, trace) {
@@ -1271,7 +1271,7 @@ const RULES = [
1271
1271
  }
1272
1272
  ];
1273
1273
  const QUERIES = [];
1274
- const DOC_MARKDOWN = "# Good cobbler\n\nGenerated by `see.js` from a Notation3 source file.\n\nExample from https://shs.hal.science/halshs-04148373/document\nUsing term logic http://intrologic.stanford.edu/chapters/chapter_11.html\n\n## Compilation summary\n\n- Example name: `good_cobbler`\n- Input facts emitted: 1\n- Forward rules compiled: 1\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 1\n\n## Built-ins used\n\n- none\n\n## Runtime model\n\nThe generated `examples/good_cobbler.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/good_cobbler.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/good-cobbler.trig` or `examples/input/good_cobbler.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/good_cobbler.js` produces a SEE-style Markdown report with an **Insight** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
1274
+ const DOC_MARKDOWN = "# Good cobbler\n\nGenerated by `see.js` from a Notation3 source file.\n\nExample from https://shs.hal.science/halshs-04148373/document\nUsing term logic http://intrologic.stanford.edu/chapters/chapter_11.html\n\n## Compilation summary\n\n- Example name: `good_cobbler`\n- Input facts emitted: 1\n- Forward rules compiled: 1\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 1\n\n## Built-ins used\n\n- none\n\n## Runtime model\n\nThe generated `examples/good_cobbler.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/good_cobbler.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/good-cobbler.trig` or `examples/input/good_cobbler.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/good_cobbler.js` produces a SEE-style Markdown report with an **Entailment** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
1275
1275
  function seeMetadata(data) { return (data && data.__see) || {}; }
1276
1276
  function trustedDerivation(data) { const meta = seeMetadata(data); const facts = data && Array.isArray(data.facts) ? data.facts : []; const expectedFacts = EXPECTED_INPUT_FACTS || Number(meta.InputFacts || 0); if (meta.SourceSHA256 && meta.SourceSHA256 !== "7aeddb38a902b2684ba8824e3ec909e24716520433e9fbd31f6a0238cc1bd686") throw new Error('input evidence does not match the N3 source compiled into this example'); const result = saturate(facts, RULES); const rawOutput = renderRawOutput(result.graph, QUERIES, RULES, facts); fail('Compiled N3 derivation failed', { 'input evidence metadata is present and matches compiled source': meta.SourceSHA256 === "7aeddb38a902b2684ba8824e3ec909e24716520433e9fbd31f6a0238cc1bd686", 'input evidence facts were loaded': expectedFacts > 0 ? facts.length === expectedFacts : facts.length >= 0, 'compiled rules were loaded': RULES.length === 1, 'compiled query directives were loaded': QUERIES.length === 0, 'a derivation fixpoint was reached': result.graph.facts.length >= facts.length, 'query or output facts were produced': rawOutput.length > 0 }); return { ...result, rawOutput, inputFacts: facts }; }
1277
1277
  function snapshotMarkdown(markdown) { return markdown.split(/\n/).map((line) => line ? line + ' \n' : '\n').join(''); }
@@ -1040,19 +1040,19 @@ function renderStructuredOutput({ title, graph, queries = [], rules = [], initia
1040
1040
  const lines = [];
1041
1041
  lines.push('# ' + title);
1042
1042
  lines.push('');
1043
- lines.push('## Insight');
1043
+ lines.push('## Entailment');
1044
1044
  if (mode === 'query') {
1045
1045
  lines.push('The compiled query selected ' + selected.length + ' fact(s) after the rule closure was computed.');
1046
1046
  } else if (mode === 'formula') {
1047
- lines.push('The derivation produced ' + selected.length + ' formula-valued conclusion(s).');
1047
+ lines.push('The derivation produced ' + selected.length + ' formula-valued entailment(s).');
1048
1048
  } else {
1049
1049
  lines.push('The derivation produced ' + derived.length + ' new fact(s) from ' + initialFacts.length + ' stated fact(s).');
1050
1050
  }
1051
- if (keyFact) lines.push('Main conclusion: **' + factSentence(keyFact) + '**');
1051
+ if (keyFact) lines.push('Main entailment: **' + factSentence(keyFact) + '**');
1052
1052
  const bullets = selected.slice(-6).reverse();
1053
1053
  if (bullets.length) {
1054
1054
  lines.push('');
1055
- lines.push('Selected conclusions:');
1055
+ lines.push('Selected entailments:');
1056
1056
  for (const fact of bullets) lines.push('- ' + codeFact(fact));
1057
1057
  }
1058
1058
  lines.push('');
@@ -1114,15 +1114,15 @@ function dedupeExplanationHeadings(text) {
1114
1114
  function normalizePublicReport(markdown, title) {
1115
1115
  let text = String(markdown || '').trimEnd();
1116
1116
  if (!/^\s*#\s+/m.test(text)) text = '# ' + title + '\n\n' + text;
1117
- if (!/^##\s+Insight\s*$/mi.test(text)) {
1118
- text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Insight\n');
1117
+ if (!/^##\s+Entailment\s*$/mi.test(text)) {
1118
+ text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Entailment\n');
1119
1119
  }
1120
1120
  if (!/^##\s+Explanation\s*$/mi.test(text)) {
1121
1121
  text += '\n\n## Explanation\nNo additional explanation was provided by the generated output.';
1122
1122
  }
1123
1123
  text = text.replace(/^##\s+([^\n]+?)\s*$/gm, (line, heading) => {
1124
1124
  const normalized = heading.trim().toLowerCase();
1125
- if (normalized === 'insight' || normalized === 'explanation') return '## ' + (normalized === 'insight' ? 'Insight' : 'Explanation');
1125
+ if (normalized === 'insight' || normalized === 'conclusion' || normalized === 'entailment' || normalized === 'explanation') return '## ' + (normalized === 'explanation' ? 'Explanation' : 'Entailment');
1126
1126
  return '**' + heading.trim() + '**';
1127
1127
  });
1128
1128
  text = dedupeExplanationHeadings(text);
@@ -1131,13 +1131,13 @@ function normalizePublicReport(markdown, title) {
1131
1131
  function markdownize(raw, title) {
1132
1132
  let text = String(raw || '');
1133
1133
  text = text
1134
- .replace(/===\s*Answer\s*===/g, '## Insight')
1134
+ .replace(/===\s*Answer\s*===/g, '## Entailment')
1135
1135
  .replace(/===\s*Reason\s+Why\s*===/gi, '## Explanation')
1136
1136
  .replace(/===\s*Explanation\s*===/gi, '## Explanation')
1137
1137
  .replace(/===\s*([^=]+?)\s*===/g, (_, h) => '**' + h.trim() + '**');
1138
1138
  text = text.replace(/^C(\d+)\s+OK\s*-\s*/gm, 'C$1: ');
1139
1139
  text = dedupeExplanationHeadings(text);
1140
- if (!text.trim()) text = '## Insight\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1140
+ if (!text.trim()) text = '## Entailment\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1141
1141
  return normalizePublicReport(text, title);
1142
1142
  }
1143
1143
  function authoredSupportAppendix(graph, queries, rules, initialFacts, trace) {
@@ -2688,7 +2688,7 @@ const RULES = [
2688
2688
  }
2689
2689
  ];
2690
2690
  const QUERIES = [];
2691
- const DOC_MARKDOWN = "# GPS route planning\n\nGenerated by `see.js` from a Notation3 source file.\n\nGoal-driven path planning over a tiny western-Belgium map. The N3 source is\nadapted from Eyeling's GPS example and compiles to a standalone SEE example.\n\n## Compilation summary\n\n- Example name: `gps`\n- Input facts emitted: 8\n- Forward rules compiled: 5\n- Backward predicate rules compiled: 2\n- Fuses compiled: 4\n- Predicate count: 21\n\n## Built-ins used\n\n- `list:append`\n- `log:outputString`\n- `math:greaterThan`\n- `math:lessThan`\n- `math:notGreaterThan`\n- `math:notLessThan`\n- `math:product`\n- `math:sum`\n- `string:format`\n\n## Runtime model\n\nThe generated `examples/gps.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/gps.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/gps.trig` or `examples/input/gps.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/gps.js` produces a SEE-style Markdown report with an **Insight** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
2691
+ const DOC_MARKDOWN = "# GPS route planning\n\nGenerated by `see.js` from a Notation3 source file.\n\nGoal-driven path planning over a tiny western-Belgium map. The N3 source is\nadapted from Eyeling's GPS example and compiles to a standalone SEE example.\n\n## Compilation summary\n\n- Example name: `gps`\n- Input facts emitted: 8\n- Forward rules compiled: 5\n- Backward predicate rules compiled: 2\n- Fuses compiled: 4\n- Predicate count: 21\n\n## Built-ins used\n\n- `list:append`\n- `log:outputString`\n- `math:greaterThan`\n- `math:lessThan`\n- `math:notGreaterThan`\n- `math:notLessThan`\n- `math:product`\n- `math:sum`\n- `string:format`\n\n## Runtime model\n\nThe generated `examples/gps.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/gps.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/gps.trig` or `examples/input/gps.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/gps.js` produces a SEE-style Markdown report with an **Entailment** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
2692
2692
  function seeMetadata(data) { return (data && data.__see) || {}; }
2693
2693
  function trustedDerivation(data) { const meta = seeMetadata(data); const facts = data && Array.isArray(data.facts) ? data.facts : []; const expectedFacts = EXPECTED_INPUT_FACTS || Number(meta.InputFacts || 0); if (meta.SourceSHA256 && meta.SourceSHA256 !== "3ca7a57d4a2d06215e852e74b51d71f6b0aa36230eb172fa3e17465052c06404") throw new Error('input evidence does not match the N3 source compiled into this example'); const result = saturate(facts, RULES); const rawOutput = renderRawOutput(result.graph, QUERIES, RULES, facts); fail('Compiled N3 derivation failed', { 'input evidence metadata is present and matches compiled source': meta.SourceSHA256 === "3ca7a57d4a2d06215e852e74b51d71f6b0aa36230eb172fa3e17465052c06404", 'input evidence facts were loaded': expectedFacts > 0 ? facts.length === expectedFacts : facts.length >= 0, 'compiled rules were loaded': RULES.length === 11, 'compiled query directives were loaded': QUERIES.length === 0, 'a derivation fixpoint was reached': result.graph.facts.length >= facts.length, 'query or output facts were produced': rawOutput.length > 0 }); return { ...result, rawOutput, inputFacts: facts }; }
2694
2694
  function snapshotMarkdown(markdown) { return markdown.split(/\n/).map((line) => line ? line + ' \n' : '\n').join(''); }
@@ -1040,19 +1040,19 @@ function renderStructuredOutput({ title, graph, queries = [], rules = [], initia
1040
1040
  const lines = [];
1041
1041
  lines.push('# ' + title);
1042
1042
  lines.push('');
1043
- lines.push('## Insight');
1043
+ lines.push('## Entailment');
1044
1044
  if (mode === 'query') {
1045
1045
  lines.push('The compiled query selected ' + selected.length + ' fact(s) after the rule closure was computed.');
1046
1046
  } else if (mode === 'formula') {
1047
- lines.push('The derivation produced ' + selected.length + ' formula-valued conclusion(s).');
1047
+ lines.push('The derivation produced ' + selected.length + ' formula-valued entailment(s).');
1048
1048
  } else {
1049
1049
  lines.push('The derivation produced ' + derived.length + ' new fact(s) from ' + initialFacts.length + ' stated fact(s).');
1050
1050
  }
1051
- if (keyFact) lines.push('Main conclusion: **' + factSentence(keyFact) + '**');
1051
+ if (keyFact) lines.push('Main entailment: **' + factSentence(keyFact) + '**');
1052
1052
  const bullets = selected.slice(-6).reverse();
1053
1053
  if (bullets.length) {
1054
1054
  lines.push('');
1055
- lines.push('Selected conclusions:');
1055
+ lines.push('Selected entailments:');
1056
1056
  for (const fact of bullets) lines.push('- ' + codeFact(fact));
1057
1057
  }
1058
1058
  lines.push('');
@@ -1114,15 +1114,15 @@ function dedupeExplanationHeadings(text) {
1114
1114
  function normalizePublicReport(markdown, title) {
1115
1115
  let text = String(markdown || '').trimEnd();
1116
1116
  if (!/^\s*#\s+/m.test(text)) text = '# ' + title + '\n\n' + text;
1117
- if (!/^##\s+Insight\s*$/mi.test(text)) {
1118
- text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Insight\n');
1117
+ if (!/^##\s+Entailment\s*$/mi.test(text)) {
1118
+ text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Entailment\n');
1119
1119
  }
1120
1120
  if (!/^##\s+Explanation\s*$/mi.test(text)) {
1121
1121
  text += '\n\n## Explanation\nNo additional explanation was provided by the generated output.';
1122
1122
  }
1123
1123
  text = text.replace(/^##\s+([^\n]+?)\s*$/gm, (line, heading) => {
1124
1124
  const normalized = heading.trim().toLowerCase();
1125
- if (normalized === 'insight' || normalized === 'explanation') return '## ' + (normalized === 'insight' ? 'Insight' : 'Explanation');
1125
+ if (normalized === 'insight' || normalized === 'conclusion' || normalized === 'entailment' || normalized === 'explanation') return '## ' + (normalized === 'explanation' ? 'Explanation' : 'Entailment');
1126
1126
  return '**' + heading.trim() + '**';
1127
1127
  });
1128
1128
  text = dedupeExplanationHeadings(text);
@@ -1131,13 +1131,13 @@ function normalizePublicReport(markdown, title) {
1131
1131
  function markdownize(raw, title) {
1132
1132
  let text = String(raw || '');
1133
1133
  text = text
1134
- .replace(/===\s*Answer\s*===/g, '## Insight')
1134
+ .replace(/===\s*Answer\s*===/g, '## Entailment')
1135
1135
  .replace(/===\s*Reason\s+Why\s*===/gi, '## Explanation')
1136
1136
  .replace(/===\s*Explanation\s*===/gi, '## Explanation')
1137
1137
  .replace(/===\s*([^=]+?)\s*===/g, (_, h) => '**' + h.trim() + '**');
1138
1138
  text = text.replace(/^C(\d+)\s+OK\s*-\s*/gm, 'C$1: ');
1139
1139
  text = dedupeExplanationHeadings(text);
1140
- if (!text.trim()) text = '## Insight\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1140
+ if (!text.trim()) text = '## Entailment\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1141
1141
  return normalizePublicReport(text, title);
1142
1142
  }
1143
1143
  function authoredSupportAppendix(graph, queries, rules, initialFacts, trace) {
@@ -1516,7 +1516,7 @@ const RULES = [
1516
1516
  }
1517
1517
  ];
1518
1518
  const QUERIES = [];
1519
- const DOC_MARKDOWN = "# Gray Code Counter\n\nGenerated by `see.js` from a Notation3 source file.\n\nN3-compiled version of the 4-bit Gray counter SEE example. The example keeps\nthe known reflected Gray-code sequence as data, derives its visited-state count\nwith a list builtin, and derives the published invariants before rendering the\nSEE report.\n\n## Compilation summary\n\n- Example name: `gray_code_counter`\n- Input facts emitted: 7\n- Forward rules compiled: 3\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 12\n\n## Built-ins used\n\n- `list:length`\n- `log:outputString`\n- `string:format`\n\n## Runtime model\n\nThe generated `examples/gray_code_counter.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/gray_code_counter.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/gray-code-counter.trig` or `examples/input/gray_code_counter.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/gray_code_counter.js` produces a SEE-style Markdown report with an **Insight** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
1519
+ const DOC_MARKDOWN = "# Gray Code Counter\n\nGenerated by `see.js` from a Notation3 source file.\n\nN3-compiled version of the 4-bit Gray counter SEE example. The example keeps\nthe known reflected Gray-code sequence as data, derives its visited-state count\nwith a list builtin, and derives the published invariants before rendering the\nSEE report.\n\n## Compilation summary\n\n- Example name: `gray_code_counter`\n- Input facts emitted: 7\n- Forward rules compiled: 3\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 12\n\n## Built-ins used\n\n- `list:length`\n- `log:outputString`\n- `string:format`\n\n## Runtime model\n\nThe generated `examples/gray_code_counter.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/gray_code_counter.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/gray-code-counter.trig` or `examples/input/gray_code_counter.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/gray_code_counter.js` produces a SEE-style Markdown report with an **Entailment** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
1520
1520
  function seeMetadata(data) { return (data && data.__see) || {}; }
1521
1521
  function trustedDerivation(data) { const meta = seeMetadata(data); const facts = data && Array.isArray(data.facts) ? data.facts : []; const expectedFacts = EXPECTED_INPUT_FACTS || Number(meta.InputFacts || 0); if (meta.SourceSHA256 && meta.SourceSHA256 !== "61f77dc563c8a38d612cf4fba812e6066f00449e27b9bc620e866a52e08ea4d2") throw new Error('input evidence does not match the N3 source compiled into this example'); const result = saturate(facts, RULES); const rawOutput = renderRawOutput(result.graph, QUERIES, RULES, facts); fail('Compiled N3 derivation failed', { 'input evidence metadata is present and matches compiled source': meta.SourceSHA256 === "61f77dc563c8a38d612cf4fba812e6066f00449e27b9bc620e866a52e08ea4d2", 'input evidence facts were loaded': expectedFacts > 0 ? facts.length === expectedFacts : facts.length >= 0, 'compiled rules were loaded': RULES.length === 3, 'compiled query directives were loaded': QUERIES.length === 0, 'a derivation fixpoint was reached': result.graph.facts.length >= facts.length, 'query or output facts were produced': rawOutput.length > 0 }); return { ...result, rawOutput, inputFacts: facts }; }
1522
1522
  function snapshotMarkdown(markdown) { return markdown.split(/\n/).map((line) => line ? line + ' \n' : '\n').join(''); }
@@ -1040,19 +1040,19 @@ function renderStructuredOutput({ title, graph, queries = [], rules = [], initia
1040
1040
  const lines = [];
1041
1041
  lines.push('# ' + title);
1042
1042
  lines.push('');
1043
- lines.push('## Insight');
1043
+ lines.push('## Entailment');
1044
1044
  if (mode === 'query') {
1045
1045
  lines.push('The compiled query selected ' + selected.length + ' fact(s) after the rule closure was computed.');
1046
1046
  } else if (mode === 'formula') {
1047
- lines.push('The derivation produced ' + selected.length + ' formula-valued conclusion(s).');
1047
+ lines.push('The derivation produced ' + selected.length + ' formula-valued entailment(s).');
1048
1048
  } else {
1049
1049
  lines.push('The derivation produced ' + derived.length + ' new fact(s) from ' + initialFacts.length + ' stated fact(s).');
1050
1050
  }
1051
- if (keyFact) lines.push('Main conclusion: **' + factSentence(keyFact) + '**');
1051
+ if (keyFact) lines.push('Main entailment: **' + factSentence(keyFact) + '**');
1052
1052
  const bullets = selected.slice(-6).reverse();
1053
1053
  if (bullets.length) {
1054
1054
  lines.push('');
1055
- lines.push('Selected conclusions:');
1055
+ lines.push('Selected entailments:');
1056
1056
  for (const fact of bullets) lines.push('- ' + codeFact(fact));
1057
1057
  }
1058
1058
  lines.push('');
@@ -1114,15 +1114,15 @@ function dedupeExplanationHeadings(text) {
1114
1114
  function normalizePublicReport(markdown, title) {
1115
1115
  let text = String(markdown || '').trimEnd();
1116
1116
  if (!/^\s*#\s+/m.test(text)) text = '# ' + title + '\n\n' + text;
1117
- if (!/^##\s+Insight\s*$/mi.test(text)) {
1118
- text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Insight\n');
1117
+ if (!/^##\s+Entailment\s*$/mi.test(text)) {
1118
+ text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Entailment\n');
1119
1119
  }
1120
1120
  if (!/^##\s+Explanation\s*$/mi.test(text)) {
1121
1121
  text += '\n\n## Explanation\nNo additional explanation was provided by the generated output.';
1122
1122
  }
1123
1123
  text = text.replace(/^##\s+([^\n]+?)\s*$/gm, (line, heading) => {
1124
1124
  const normalized = heading.trim().toLowerCase();
1125
- if (normalized === 'insight' || normalized === 'explanation') return '## ' + (normalized === 'insight' ? 'Insight' : 'Explanation');
1125
+ if (normalized === 'insight' || normalized === 'conclusion' || normalized === 'entailment' || normalized === 'explanation') return '## ' + (normalized === 'explanation' ? 'Explanation' : 'Entailment');
1126
1126
  return '**' + heading.trim() + '**';
1127
1127
  });
1128
1128
  text = dedupeExplanationHeadings(text);
@@ -1131,13 +1131,13 @@ function normalizePublicReport(markdown, title) {
1131
1131
  function markdownize(raw, title) {
1132
1132
  let text = String(raw || '');
1133
1133
  text = text
1134
- .replace(/===\s*Answer\s*===/g, '## Insight')
1134
+ .replace(/===\s*Answer\s*===/g, '## Entailment')
1135
1135
  .replace(/===\s*Reason\s+Why\s*===/gi, '## Explanation')
1136
1136
  .replace(/===\s*Explanation\s*===/gi, '## Explanation')
1137
1137
  .replace(/===\s*([^=]+?)\s*===/g, (_, h) => '**' + h.trim() + '**');
1138
1138
  text = text.replace(/^C(\d+)\s+OK\s*-\s*/gm, 'C$1: ');
1139
1139
  text = dedupeExplanationHeadings(text);
1140
- if (!text.trim()) text = '## Insight\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1140
+ if (!text.trim()) text = '## Entailment\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1141
1141
  return normalizePublicReport(text, title);
1142
1142
  }
1143
1143
  function authoredSupportAppendix(graph, queries, rules, initialFacts, trace) {
@@ -1793,7 +1793,7 @@ const QUERIES = [
1793
1793
  ]
1794
1794
  }
1795
1795
  ];
1796
- const DOC_MARKDOWN = "# In a partial order, a greatest lower bound is unique.\n\nGenerated by `see.js` from a Notation3 source file.\n\n## Compilation summary\n\n- Example name: `greatest_lower_bound_uniqueness`\n- Input facts emitted: 6\n- Forward rules compiled: 7\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 8\n\n## Built-ins used\n\n- `log:notEqualTo`\n\n## Runtime model\n\nThe generated `examples/greatest_lower_bound_uniqueness.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/greatest_lower_bound_uniqueness.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/greatest-lower-bound-uniqueness.trig` or `examples/input/greatest_lower_bound_uniqueness.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/greatest_lower_bound_uniqueness.js` produces a SEE-style Markdown report with an **Insight** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
1796
+ const DOC_MARKDOWN = "# In a partial order, a greatest lower bound is unique.\n\nGenerated by `see.js` from a Notation3 source file.\n\n## Compilation summary\n\n- Example name: `greatest_lower_bound_uniqueness`\n- Input facts emitted: 6\n- Forward rules compiled: 7\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 8\n\n## Built-ins used\n\n- `log:notEqualTo`\n\n## Runtime model\n\nThe generated `examples/greatest_lower_bound_uniqueness.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/greatest_lower_bound_uniqueness.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/greatest-lower-bound-uniqueness.trig` or `examples/input/greatest_lower_bound_uniqueness.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/greatest_lower_bound_uniqueness.js` produces a SEE-style Markdown report with an **Entailment** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
1797
1797
  function seeMetadata(data) { return (data && data.__see) || {}; }
1798
1798
  function trustedDerivation(data) { const meta = seeMetadata(data); const facts = data && Array.isArray(data.facts) ? data.facts : []; const expectedFacts = EXPECTED_INPUT_FACTS || Number(meta.InputFacts || 0); if (meta.SourceSHA256 && meta.SourceSHA256 !== "3a199585b9906a895deba6508458c88551558aec89fdc1b490ed9493bbb63433") throw new Error('input evidence does not match the N3 source compiled into this example'); const result = saturate(facts, RULES); const rawOutput = renderRawOutput(result.graph, QUERIES, RULES, facts); fail('Compiled N3 derivation failed', { 'input evidence metadata is present and matches compiled source': meta.SourceSHA256 === "3a199585b9906a895deba6508458c88551558aec89fdc1b490ed9493bbb63433", 'input evidence facts were loaded': expectedFacts > 0 ? facts.length === expectedFacts : facts.length >= 0, 'compiled rules were loaded': RULES.length === 7, 'compiled query directives were loaded': QUERIES.length === 1, 'a derivation fixpoint was reached': result.graph.facts.length >= facts.length, 'query or output facts were produced': rawOutput.length > 0 }); return { ...result, rawOutput, inputFacts: facts }; }
1799
1799
  function snapshotMarkdown(markdown) { return markdown.split(/\n/).map((line) => line ? line + ' \n' : '\n').join(''); }
@@ -1040,19 +1040,19 @@ function renderStructuredOutput({ title, graph, queries = [], rules = [], initia
1040
1040
  const lines = [];
1041
1041
  lines.push('# ' + title);
1042
1042
  lines.push('');
1043
- lines.push('## Insight');
1043
+ lines.push('## Entailment');
1044
1044
  if (mode === 'query') {
1045
1045
  lines.push('The compiled query selected ' + selected.length + ' fact(s) after the rule closure was computed.');
1046
1046
  } else if (mode === 'formula') {
1047
- lines.push('The derivation produced ' + selected.length + ' formula-valued conclusion(s).');
1047
+ lines.push('The derivation produced ' + selected.length + ' formula-valued entailment(s).');
1048
1048
  } else {
1049
1049
  lines.push('The derivation produced ' + derived.length + ' new fact(s) from ' + initialFacts.length + ' stated fact(s).');
1050
1050
  }
1051
- if (keyFact) lines.push('Main conclusion: **' + factSentence(keyFact) + '**');
1051
+ if (keyFact) lines.push('Main entailment: **' + factSentence(keyFact) + '**');
1052
1052
  const bullets = selected.slice(-6).reverse();
1053
1053
  if (bullets.length) {
1054
1054
  lines.push('');
1055
- lines.push('Selected conclusions:');
1055
+ lines.push('Selected entailments:');
1056
1056
  for (const fact of bullets) lines.push('- ' + codeFact(fact));
1057
1057
  }
1058
1058
  lines.push('');
@@ -1114,15 +1114,15 @@ function dedupeExplanationHeadings(text) {
1114
1114
  function normalizePublicReport(markdown, title) {
1115
1115
  let text = String(markdown || '').trimEnd();
1116
1116
  if (!/^\s*#\s+/m.test(text)) text = '# ' + title + '\n\n' + text;
1117
- if (!/^##\s+Insight\s*$/mi.test(text)) {
1118
- text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Insight\n');
1117
+ if (!/^##\s+Entailment\s*$/mi.test(text)) {
1118
+ text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Entailment\n');
1119
1119
  }
1120
1120
  if (!/^##\s+Explanation\s*$/mi.test(text)) {
1121
1121
  text += '\n\n## Explanation\nNo additional explanation was provided by the generated output.';
1122
1122
  }
1123
1123
  text = text.replace(/^##\s+([^\n]+?)\s*$/gm, (line, heading) => {
1124
1124
  const normalized = heading.trim().toLowerCase();
1125
- if (normalized === 'insight' || normalized === 'explanation') return '## ' + (normalized === 'insight' ? 'Insight' : 'Explanation');
1125
+ if (normalized === 'insight' || normalized === 'conclusion' || normalized === 'entailment' || normalized === 'explanation') return '## ' + (normalized === 'explanation' ? 'Explanation' : 'Entailment');
1126
1126
  return '**' + heading.trim() + '**';
1127
1127
  });
1128
1128
  text = dedupeExplanationHeadings(text);
@@ -1131,13 +1131,13 @@ function normalizePublicReport(markdown, title) {
1131
1131
  function markdownize(raw, title) {
1132
1132
  let text = String(raw || '');
1133
1133
  text = text
1134
- .replace(/===\s*Answer\s*===/g, '## Insight')
1134
+ .replace(/===\s*Answer\s*===/g, '## Entailment')
1135
1135
  .replace(/===\s*Reason\s+Why\s*===/gi, '## Explanation')
1136
1136
  .replace(/===\s*Explanation\s*===/gi, '## Explanation')
1137
1137
  .replace(/===\s*([^=]+?)\s*===/g, (_, h) => '**' + h.trim() + '**');
1138
1138
  text = text.replace(/^C(\d+)\s+OK\s*-\s*/gm, 'C$1: ');
1139
1139
  text = dedupeExplanationHeadings(text);
1140
- if (!text.trim()) text = '## Insight\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1140
+ if (!text.trim()) text = '## Entailment\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1141
1141
  return normalizePublicReport(text, title);
1142
1142
  }
1143
1143
  function authoredSupportAppendix(graph, queries, rules, initialFacts, trace) {
@@ -1772,7 +1772,7 @@ const QUERIES = [
1772
1772
  ]
1773
1773
  }
1774
1774
  ];
1775
- const DOC_MARKDOWN = "# In a group, the inverse of an element is unique.\n\nGenerated by `see.js` from a Notation3 source file.\n\n## Compilation summary\n\n- Example name: `group_inverse_uniqueness`\n- Input facts emitted: 6\n- Forward rules compiled: 6\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 6\n\n## Built-ins used\n\n- `log:notEqualTo`\n\n## Runtime model\n\nThe generated `examples/group_inverse_uniqueness.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/group_inverse_uniqueness.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/group-inverse-uniqueness.trig` or `examples/input/group_inverse_uniqueness.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/group_inverse_uniqueness.js` produces a SEE-style Markdown report with an **Insight** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
1775
+ const DOC_MARKDOWN = "# In a group, the inverse of an element is unique.\n\nGenerated by `see.js` from a Notation3 source file.\n\n## Compilation summary\n\n- Example name: `group_inverse_uniqueness`\n- Input facts emitted: 6\n- Forward rules compiled: 6\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 6\n\n## Built-ins used\n\n- `log:notEqualTo`\n\n## Runtime model\n\nThe generated `examples/group_inverse_uniqueness.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/group_inverse_uniqueness.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/group-inverse-uniqueness.trig` or `examples/input/group_inverse_uniqueness.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/group_inverse_uniqueness.js` produces a SEE-style Markdown report with an **Entailment** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
1776
1776
  function seeMetadata(data) { return (data && data.__see) || {}; }
1777
1777
  function trustedDerivation(data) { const meta = seeMetadata(data); const facts = data && Array.isArray(data.facts) ? data.facts : []; const expectedFacts = EXPECTED_INPUT_FACTS || Number(meta.InputFacts || 0); if (meta.SourceSHA256 && meta.SourceSHA256 !== "956bff60a7e087600d31b0fce180031de1e03f7a995b3f2949e531653b7b5dc3") throw new Error('input evidence does not match the N3 source compiled into this example'); const result = saturate(facts, RULES); const rawOutput = renderRawOutput(result.graph, QUERIES, RULES, facts); fail('Compiled N3 derivation failed', { 'input evidence metadata is present and matches compiled source': meta.SourceSHA256 === "956bff60a7e087600d31b0fce180031de1e03f7a995b3f2949e531653b7b5dc3", 'input evidence facts were loaded': expectedFacts > 0 ? facts.length === expectedFacts : facts.length >= 0, 'compiled rules were loaded': RULES.length === 6, 'compiled query directives were loaded': QUERIES.length === 1, 'a derivation fixpoint was reached': result.graph.facts.length >= facts.length, 'query or output facts were produced': rawOutput.length > 0 }); return { ...result, rawOutput, inputFacts: facts }; }
1778
1778
  function snapshotMarkdown(markdown) { return markdown.split(/\n/).map((line) => line ? line + ' \n' : '\n').join(''); }
@@ -1040,19 +1040,19 @@ function renderStructuredOutput({ title, graph, queries = [], rules = [], initia
1040
1040
  const lines = [];
1041
1041
  lines.push('# ' + title);
1042
1042
  lines.push('');
1043
- lines.push('## Insight');
1043
+ lines.push('## Entailment');
1044
1044
  if (mode === 'query') {
1045
1045
  lines.push('The compiled query selected ' + selected.length + ' fact(s) after the rule closure was computed.');
1046
1046
  } else if (mode === 'formula') {
1047
- lines.push('The derivation produced ' + selected.length + ' formula-valued conclusion(s).');
1047
+ lines.push('The derivation produced ' + selected.length + ' formula-valued entailment(s).');
1048
1048
  } else {
1049
1049
  lines.push('The derivation produced ' + derived.length + ' new fact(s) from ' + initialFacts.length + ' stated fact(s).');
1050
1050
  }
1051
- if (keyFact) lines.push('Main conclusion: **' + factSentence(keyFact) + '**');
1051
+ if (keyFact) lines.push('Main entailment: **' + factSentence(keyFact) + '**');
1052
1052
  const bullets = selected.slice(-6).reverse();
1053
1053
  if (bullets.length) {
1054
1054
  lines.push('');
1055
- lines.push('Selected conclusions:');
1055
+ lines.push('Selected entailments:');
1056
1056
  for (const fact of bullets) lines.push('- ' + codeFact(fact));
1057
1057
  }
1058
1058
  lines.push('');
@@ -1114,15 +1114,15 @@ function dedupeExplanationHeadings(text) {
1114
1114
  function normalizePublicReport(markdown, title) {
1115
1115
  let text = String(markdown || '').trimEnd();
1116
1116
  if (!/^\s*#\s+/m.test(text)) text = '# ' + title + '\n\n' + text;
1117
- if (!/^##\s+Insight\s*$/mi.test(text)) {
1118
- text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Insight\n');
1117
+ if (!/^##\s+Entailment\s*$/mi.test(text)) {
1118
+ text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Entailment\n');
1119
1119
  }
1120
1120
  if (!/^##\s+Explanation\s*$/mi.test(text)) {
1121
1121
  text += '\n\n## Explanation\nNo additional explanation was provided by the generated output.';
1122
1122
  }
1123
1123
  text = text.replace(/^##\s+([^\n]+?)\s*$/gm, (line, heading) => {
1124
1124
  const normalized = heading.trim().toLowerCase();
1125
- if (normalized === 'insight' || normalized === 'explanation') return '## ' + (normalized === 'insight' ? 'Insight' : 'Explanation');
1125
+ if (normalized === 'insight' || normalized === 'conclusion' || normalized === 'entailment' || normalized === 'explanation') return '## ' + (normalized === 'explanation' ? 'Explanation' : 'Entailment');
1126
1126
  return '**' + heading.trim() + '**';
1127
1127
  });
1128
1128
  text = dedupeExplanationHeadings(text);
@@ -1131,13 +1131,13 @@ function normalizePublicReport(markdown, title) {
1131
1131
  function markdownize(raw, title) {
1132
1132
  let text = String(raw || '');
1133
1133
  text = text
1134
- .replace(/===\s*Answer\s*===/g, '## Insight')
1134
+ .replace(/===\s*Answer\s*===/g, '## Entailment')
1135
1135
  .replace(/===\s*Reason\s+Why\s*===/gi, '## Explanation')
1136
1136
  .replace(/===\s*Explanation\s*===/gi, '## Explanation')
1137
1137
  .replace(/===\s*([^=]+?)\s*===/g, (_, h) => '**' + h.trim() + '**');
1138
1138
  text = text.replace(/^C(\d+)\s+OK\s*-\s*/gm, 'C$1: ');
1139
1139
  text = dedupeExplanationHeadings(text);
1140
- if (!text.trim()) text = '## Insight\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1140
+ if (!text.trim()) text = '## Entailment\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1141
1141
  return normalizePublicReport(text, title);
1142
1142
  }
1143
1143
  function authoredSupportAppendix(graph, queries, rules, initialFacts, trace) {
@@ -4292,7 +4292,7 @@ const QUERIES = [
4292
4292
  ]
4293
4293
  }
4294
4294
  ];
4295
- const DOC_MARKDOWN = "# Hadamard gate approximation\n\nGenerated by `see.js` from a Notation3 source file.\n\n## Compilation summary\n\n- Example name: `hadamard_approx`\n- Input facts emitted: 8\n- Forward rules compiled: 10\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 39\n\n## Built-ins used\n\n- `math:difference`\n- `math:equalTo`\n- `math:exponentiation`\n- `math:lessThan`\n- `math:notGreaterThan`\n- `math:notLessThan`\n- `math:product`\n- `math:quotient`\n- `math:sum`\n\n## Runtime model\n\nThe generated `examples/hadamard_approx.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/hadamard_approx.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/hadamard-approx.trig` or `examples/input/hadamard_approx.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/hadamard_approx.js` produces a SEE-style Markdown report with an **Insight** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
4295
+ const DOC_MARKDOWN = "# Hadamard gate approximation\n\nGenerated by `see.js` from a Notation3 source file.\n\n## Compilation summary\n\n- Example name: `hadamard_approx`\n- Input facts emitted: 8\n- Forward rules compiled: 10\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 39\n\n## Built-ins used\n\n- `math:difference`\n- `math:equalTo`\n- `math:exponentiation`\n- `math:lessThan`\n- `math:notGreaterThan`\n- `math:notLessThan`\n- `math:product`\n- `math:quotient`\n- `math:sum`\n\n## Runtime model\n\nThe generated `examples/hadamard_approx.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/hadamard_approx.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/hadamard-approx.trig` or `examples/input/hadamard_approx.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/hadamard_approx.js` produces a SEE-style Markdown report with an **Entailment** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
4296
4296
  function seeMetadata(data) { return (data && data.__see) || {}; }
4297
4297
  function trustedDerivation(data) { const meta = seeMetadata(data); const facts = data && Array.isArray(data.facts) ? data.facts : []; const expectedFacts = EXPECTED_INPUT_FACTS || Number(meta.InputFacts || 0); if (meta.SourceSHA256 && meta.SourceSHA256 !== "e8ecabf81463a98ebcb7a1970dfe31792d96011b5e060ad2ed6f5f02ee46a6d2") throw new Error('input evidence does not match the N3 source compiled into this example'); const result = saturate(facts, RULES); const rawOutput = renderRawOutput(result.graph, QUERIES, RULES, facts); fail('Compiled N3 derivation failed', { 'input evidence metadata is present and matches compiled source': meta.SourceSHA256 === "e8ecabf81463a98ebcb7a1970dfe31792d96011b5e060ad2ed6f5f02ee46a6d2", 'input evidence facts were loaded': expectedFacts > 0 ? facts.length === expectedFacts : facts.length >= 0, 'compiled rules were loaded': RULES.length === 10, 'compiled query directives were loaded': QUERIES.length === 3, 'a derivation fixpoint was reached': result.graph.facts.length >= facts.length, 'query or output facts were produced': rawOutput.length > 0 }); return { ...result, rawOutput, inputFacts: facts }; }
4298
4298
  function snapshotMarkdown(markdown) { return markdown.split(/\n/).map((line) => line ? line + ' \n' : '\n').join(''); }
@@ -1040,19 +1040,19 @@ function renderStructuredOutput({ title, graph, queries = [], rules = [], initia
1040
1040
  const lines = [];
1041
1041
  lines.push('# ' + title);
1042
1042
  lines.push('');
1043
- lines.push('## Insight');
1043
+ lines.push('## Entailment');
1044
1044
  if (mode === 'query') {
1045
1045
  lines.push('The compiled query selected ' + selected.length + ' fact(s) after the rule closure was computed.');
1046
1046
  } else if (mode === 'formula') {
1047
- lines.push('The derivation produced ' + selected.length + ' formula-valued conclusion(s).');
1047
+ lines.push('The derivation produced ' + selected.length + ' formula-valued entailment(s).');
1048
1048
  } else {
1049
1049
  lines.push('The derivation produced ' + derived.length + ' new fact(s) from ' + initialFacts.length + ' stated fact(s).');
1050
1050
  }
1051
- if (keyFact) lines.push('Main conclusion: **' + factSentence(keyFact) + '**');
1051
+ if (keyFact) lines.push('Main entailment: **' + factSentence(keyFact) + '**');
1052
1052
  const bullets = selected.slice(-6).reverse();
1053
1053
  if (bullets.length) {
1054
1054
  lines.push('');
1055
- lines.push('Selected conclusions:');
1055
+ lines.push('Selected entailments:');
1056
1056
  for (const fact of bullets) lines.push('- ' + codeFact(fact));
1057
1057
  }
1058
1058
  lines.push('');
@@ -1114,15 +1114,15 @@ function dedupeExplanationHeadings(text) {
1114
1114
  function normalizePublicReport(markdown, title) {
1115
1115
  let text = String(markdown || '').trimEnd();
1116
1116
  if (!/^\s*#\s+/m.test(text)) text = '# ' + title + '\n\n' + text;
1117
- if (!/^##\s+Insight\s*$/mi.test(text)) {
1118
- text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Insight\n');
1117
+ if (!/^##\s+Entailment\s*$/mi.test(text)) {
1118
+ text = text.replace(/^(#\s+[^\n]+\n*)/, '$1\n## Entailment\n');
1119
1119
  }
1120
1120
  if (!/^##\s+Explanation\s*$/mi.test(text)) {
1121
1121
  text += '\n\n## Explanation\nNo additional explanation was provided by the generated output.';
1122
1122
  }
1123
1123
  text = text.replace(/^##\s+([^\n]+?)\s*$/gm, (line, heading) => {
1124
1124
  const normalized = heading.trim().toLowerCase();
1125
- if (normalized === 'insight' || normalized === 'explanation') return '## ' + (normalized === 'insight' ? 'Insight' : 'Explanation');
1125
+ if (normalized === 'insight' || normalized === 'conclusion' || normalized === 'entailment' || normalized === 'explanation') return '## ' + (normalized === 'explanation' ? 'Explanation' : 'Entailment');
1126
1126
  return '**' + heading.trim() + '**';
1127
1127
  });
1128
1128
  text = dedupeExplanationHeadings(text);
@@ -1131,13 +1131,13 @@ function normalizePublicReport(markdown, title) {
1131
1131
  function markdownize(raw, title) {
1132
1132
  let text = String(raw || '');
1133
1133
  text = text
1134
- .replace(/===\s*Answer\s*===/g, '## Insight')
1134
+ .replace(/===\s*Answer\s*===/g, '## Entailment')
1135
1135
  .replace(/===\s*Reason\s+Why\s*===/gi, '## Explanation')
1136
1136
  .replace(/===\s*Explanation\s*===/gi, '## Explanation')
1137
1137
  .replace(/===\s*([^=]+?)\s*===/g, (_, h) => '**' + h.trim() + '**');
1138
1138
  text = text.replace(/^C(\d+)\s+OK\s*-\s*/gm, 'C$1: ');
1139
1139
  text = dedupeExplanationHeadings(text);
1140
- if (!text.trim()) text = '## Insight\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1140
+ if (!text.trim()) text = '## Entailment\nNo log:outputString facts were derived.\n\n## Explanation\nThe compiled derivation did not produce authored report text.';
1141
1141
  return normalizePublicReport(text, title);
1142
1142
  }
1143
1143
  function authoredSupportAppendix(graph, queries, rules, initialFacts, trace) {
@@ -1500,7 +1500,7 @@ const RULES = [
1500
1500
  }
1501
1501
  ];
1502
1502
  const QUERIES = [];
1503
- const DOC_MARKDOWN = "# Towers of Hanoi\n\nGenerated by `see.js` from a Notation3 source file.\n\n## Compilation summary\n\n- Example name: `hanoi`\n- Input facts emitted: 0\n- Forward rules compiled: 1\n- Backward predicate rules compiled: 2\n- Fuses compiled: 0\n- Predicate count: 5\n\n## Built-ins used\n\n- `list:append`\n- `math:difference`\n- `math:greaterThan`\n\n## Runtime model\n\nThe generated `examples/hanoi.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/hanoi.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/hanoi.trig` or `examples/input/hanoi.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/hanoi.js` produces a SEE-style Markdown report with an **Insight** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
1503
+ const DOC_MARKDOWN = "# Towers of Hanoi\n\nGenerated by `see.js` from a Notation3 source file.\n\n## Compilation summary\n\n- Example name: `hanoi`\n- Input facts emitted: 0\n- Forward rules compiled: 1\n- Backward predicate rules compiled: 2\n- Fuses compiled: 0\n- Predicate count: 5\n\n## Built-ins used\n\n- `list:append`\n- `math:difference`\n- `math:greaterThan`\n\n## Runtime model\n\nThe generated `examples/hanoi.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/hanoi.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/hanoi.trig` or `examples/input/hanoi.trig`. The runner reads that TriG evidence directly and performs a local fixpoint derivation; it does not parse the program source or call an external reasoner.\n\n## Output model\n\nRunning `node examples/hanoi.js` produces a SEE-style Markdown report with an **Entailment** section, an **Explanation** section, and a **Formal TriG Output** section containing the selected derived/query facts.\n";
1504
1504
  function seeMetadata(data) { return (data && data.__see) || {}; }
1505
1505
  function trustedDerivation(data) { const meta = seeMetadata(data); const facts = data && Array.isArray(data.facts) ? data.facts : []; const expectedFacts = EXPECTED_INPUT_FACTS || Number(meta.InputFacts || 0); if (meta.SourceSHA256 && meta.SourceSHA256 !== "f2ef15363d9c2430bd3b68d500d3d256d241b8fcf4fd368b287a91e15289df1d") throw new Error('input evidence does not match the N3 source compiled into this example'); const result = saturate(facts, RULES); const rawOutput = renderRawOutput(result.graph, QUERIES, RULES, facts); fail('Compiled N3 derivation failed', { 'input evidence metadata is present and matches compiled source': meta.SourceSHA256 === "f2ef15363d9c2430bd3b68d500d3d256d241b8fcf4fd368b287a91e15289df1d", 'input evidence facts were loaded': expectedFacts > 0 ? facts.length === expectedFacts : facts.length >= 0, 'compiled rules were loaded': RULES.length === 3, 'compiled query directives were loaded': QUERIES.length === 0, 'a derivation fixpoint was reached': result.graph.facts.length >= facts.length, 'query or output facts were produced': rawOutput.length > 0 }); return { ...result, rawOutput, inputFacts: facts }; }
1506
1506
  function snapshotMarkdown(markdown) { return markdown.split(/\n/).map((line) => line ? line + ' \n' : '\n').join(''); }