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
@@ -29,4 +29,4 @@ The generated `examples/hadamard_approx.js` is a specialized JavaScript derivati
29
29
 
30
30
  ## Output model
31
31
 
32
- Running `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.
32
+ Running `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.
@@ -23,4 +23,4 @@ The generated `examples/hanoi.js` is a specialized JavaScript derivation program
23
23
 
24
24
  ## Output model
25
25
 
26
- Running `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.
26
+ Running `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.
@@ -54,4 +54,4 @@ The generated `examples/odrl_dpv_risk_ranked.js` is a specialized JavaScript der
54
54
 
55
55
  ## Output model
56
56
 
57
- Running `node examples/odrl_dpv_risk_ranked.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.
57
+ Running `node examples/odrl_dpv_risk_ranked.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.
@@ -30,4 +30,4 @@ The generated `examples/path_discovery.js` is a specialized JavaScript derivatio
30
30
 
31
31
  ## Output model
32
32
 
33
- Running `node examples/path_discovery.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.
33
+ Running `node examples/path_discovery.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.
@@ -30,4 +30,4 @@ The generated `examples/rc_discharge_envelope.js` is a specialized JavaScript de
30
30
 
31
31
  ## Output model
32
32
 
33
- Running `node examples/rc_discharge_envelope.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.
33
+ Running `node examples/rc_discharge_envelope.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.
@@ -32,4 +32,4 @@ The generated `examples/rdf_message_flow.js` is a specialized JavaScript derivat
32
32
 
33
33
  ## Output model
34
34
 
35
- Running `node examples/rdf_message_flow.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.
35
+ Running `node examples/rdf_message_flow.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.
@@ -34,4 +34,4 @@ The generated `examples/rdf_messages.js` is a specialized JavaScript derivation
34
34
 
35
35
  ## Output model
36
36
 
37
- Running `node examples/rdf_messages.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.
37
+ Running `node examples/rdf_messages.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.
@@ -28,4 +28,4 @@ The generated `examples/school_placement_audit.js` is a specialized JavaScript d
28
28
 
29
29
  ## Output model
30
30
 
31
- Running `node examples/school_placement_audit.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.
31
+ Running `node examples/school_placement_audit.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.
@@ -28,4 +28,4 @@ The generated `examples/smoke_arithmetic.js` is a specialized JavaScript derivat
28
28
 
29
29
  ## Output model
30
30
 
31
- Running `node examples/smoke_arithmetic.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.
31
+ Running `node examples/smoke_arithmetic.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.
@@ -21,4 +21,4 @@ The generated `examples/socrates.js` is a specialized JavaScript derivation prog
21
21
 
22
22
  ## Output model
23
23
 
24
- Running `node examples/socrates.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.
24
+ Running `node examples/socrates.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.
@@ -34,4 +34,4 @@ The generated `examples/wind_turbine.js` is a specialized JavaScript derivation
34
34
 
35
35
  ## Output model
36
36
 
37
- Running `node examples/wind_turbine.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.
37
+ Running `node examples/wind_turbine.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.
@@ -25,4 +25,4 @@ The generated `examples/witch.js` is a specialized JavaScript derivation program
25
25
 
26
26
  ## Output model
27
27
 
28
- Running `node examples/witch.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.
28
+ Running `node examples/witch.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.
@@ -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) {
@@ -1311,7 +1311,7 @@ const RULES = [
1311
1311
  }
1312
1312
  ];
1313
1313
  const QUERIES = [];
1314
- const DOC_MARKDOWN = "# Dog license example\n\nGenerated by `see.js` from a Notation3 source file.\n\nIf you have more than 4 dogs you need a license.\n\n## Compilation summary\n\n- Example name: `dog`\n- Input facts emitted: 7\n- Forward rules compiled: 1\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 5\n\n## Built-ins used\n\n- `log:collectAllIn`\n- `math:greaterThan`\n- `math:sum`\n\n## Runtime model\n\nThe generated `examples/dog.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/dog.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/dog.trig` or `examples/input/dog.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/dog.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";
1314
+ const DOC_MARKDOWN = "# Dog license example\n\nGenerated by `see.js` from a Notation3 source file.\n\nIf you have more than 4 dogs you need a license.\n\n## Compilation summary\n\n- Example name: `dog`\n- Input facts emitted: 7\n- Forward rules compiled: 1\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 5\n\n## Built-ins used\n\n- `log:collectAllIn`\n- `math:greaterThan`\n- `math:sum`\n\n## Runtime model\n\nThe generated `examples/dog.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/dog.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/dog.trig` or `examples/input/dog.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/dog.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";
1315
1315
  function seeMetadata(data) { return (data && data.__see) || {}; }
1316
1316
  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 !== "3487cceaf7e09eac16d9048cca2140bd1a474a2da0bf2091ffc0e0e5f87b3167") 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 === "3487cceaf7e09eac16d9048cca2140bd1a474a2da0bf2091ffc0e0e5f87b3167", '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 }; }
1317
1317
  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) {
@@ -1985,7 +1985,7 @@ const QUERIES = [
1985
1985
  ]
1986
1986
  }
1987
1987
  ];
1988
- const DOC_MARKDOWN = "# Eco Route Insight\n\nGenerated by `see.js` from a Notation3 source file.\n\nN3-compiled version of the privacy-preserving eco route insight. The JSON\ninput remains the data-input sidecar; this source compiles the local decision\nand signed-envelope explanation.\n\n## Compilation summary\n\n- Example name: `eco_route_insight`\n- Input facts emitted: 33\n- Forward rules compiled: 2\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 30\n\n## Built-ins used\n\n- `log:outputString`\n- `math:difference`\n- `math:greaterThan`\n- `math:lessThan`\n- `math:notGreaterThan`\n- `string:format`\n\n## Runtime model\n\nThe generated `examples/eco_route_insight.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/eco_route_insight.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/eco-route-insight.trig` or `examples/input/eco_route_insight.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/eco_route_insight.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";
1988
+ const DOC_MARKDOWN = "# Eco Route Insight\n\nGenerated by `see.js` from a Notation3 source file.\n\nN3-compiled version of the privacy-preserving eco route insight. The JSON\ninput remains the data-input sidecar; this source compiles the local decision\nand signed-envelope explanation.\n\n## Compilation summary\n\n- Example name: `eco_route_insight`\n- Input facts emitted: 33\n- Forward rules compiled: 2\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 30\n\n## Built-ins used\n\n- `log:outputString`\n- `math:difference`\n- `math:greaterThan`\n- `math:lessThan`\n- `math:notGreaterThan`\n- `string:format`\n\n## Runtime model\n\nThe generated `examples/eco_route_insight.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/eco_route_insight.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/eco-route-insight.trig` or `examples/input/eco_route_insight.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/eco_route_insight.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";
1989
1989
  function seeMetadata(data) { return (data && data.__see) || {}; }
1990
1990
  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 !== "b5af0caa2e473b5957ba8cec647ee4e2edf4cdc2a5c28110e8536c19381b0bd3") 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 === "b5af0caa2e473b5957ba8cec647ee4e2edf4cdc2a5c28110e8536c19381b0bd3", 'input evidence facts were loaded': expectedFacts > 0 ? facts.length === expectedFacts : facts.length >= 0, 'compiled rules were loaded': RULES.length === 2, '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 }; }
1991
1991
  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) {
@@ -1238,7 +1238,7 @@ const RULES = [
1238
1238
  }
1239
1239
  ];
1240
1240
  const QUERIES = [];
1241
- const DOC_MARKDOWN = "# Equals test\n\nGenerated by `see.js` from a Notation3 source file.\n\nExample from Patrick Hochstenbach\n\n## Compilation summary\n\n- Example name: `equals`\n- Input facts emitted: 1\n- Forward rules compiled: 1\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 2\n\n## Built-ins used\n\n- none\n\n## Runtime model\n\nThe generated `examples/equals.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/equals.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/equals.trig` or `examples/input/equals.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/equals.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";
1241
+ const DOC_MARKDOWN = "# Equals test\n\nGenerated by `see.js` from a Notation3 source file.\n\nExample from Patrick Hochstenbach\n\n## Compilation summary\n\n- Example name: `equals`\n- Input facts emitted: 1\n- Forward rules compiled: 1\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 2\n\n## Built-ins used\n\n- none\n\n## Runtime model\n\nThe generated `examples/equals.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/equals.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/equals.trig` or `examples/input/equals.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/equals.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";
1242
1242
  function seeMetadata(data) { return (data && data.__see) || {}; }
1243
1243
  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 !== "29dfd303c09b0b2f05c637d6a56b6e3b198053a0732aa179ca3e75265dfb8003") 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 === "29dfd303c09b0b2f05c637d6a56b6e3b198053a0732aa179ca3e75265dfb8003", '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 }; }
1244
1244
  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) {
@@ -1667,7 +1667,7 @@ const QUERIES = [
1667
1667
  ]
1668
1668
  }
1669
1669
  ];
1670
- const DOC_MARKDOWN = "# If two equivalence classes share an element, they are the same class.\n\nGenerated by `see.js` from a Notation3 source file.\n\n## Compilation summary\n\n- Example name: `equivalence_classes_overlap_implies_same_class`\n- Input facts emitted: 5\n- Forward rules compiled: 7\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 7\n\n## Built-ins used\n\n- `log:notEqualTo`\n\n## Runtime model\n\nThe generated `examples/equivalence_classes_overlap_implies_same_class.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/equivalence_classes_overlap_implies_same_class.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/equivalence-classes-overlap-implies-same-class.trig` or `examples/input/equivalence_classes_overlap_implies_same_class.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/equivalence_classes_overlap_implies_same_class.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";
1670
+ const DOC_MARKDOWN = "# If two equivalence classes share an element, they are the same class.\n\nGenerated by `see.js` from a Notation3 source file.\n\n## Compilation summary\n\n- Example name: `equivalence_classes_overlap_implies_same_class`\n- Input facts emitted: 5\n- Forward rules compiled: 7\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 7\n\n## Built-ins used\n\n- `log:notEqualTo`\n\n## Runtime model\n\nThe generated `examples/equivalence_classes_overlap_implies_same_class.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/equivalence_classes_overlap_implies_same_class.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/equivalence-classes-overlap-implies-same-class.trig` or `examples/input/equivalence_classes_overlap_implies_same_class.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/equivalence_classes_overlap_implies_same_class.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";
1671
1671
  function seeMetadata(data) { return (data && data.__see) || {}; }
1672
1672
  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 !== "b36ed917f7af601a38f6a1657ce4956a4e38484573c40d0a963e3008cbb46f5f") 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 === "b36ed917f7af601a38f6a1657ce4956a4e38484573c40d0a963e3008cbb46f5f", '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 }; }
1673
1673
  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) {
@@ -1913,7 +1913,7 @@ const QUERIES = [
1913
1913
  ]
1914
1914
  }
1915
1915
  ];
1916
- const DOC_MARKDOWN = "# Euler identity (exact, certificate-friendly):\n\nGenerated by `see.js` from a Notation3 source file.\n\nexp(i*pi) + 1 = 0\nPhilosophy:\nUnlike the T-gate example, this phase needs no approximation. exp(i*pi) lands exactly at\n(-1,0) = cos(pi) + i sin(pi), so the identity can be certified using integer arithmetic\nalone.\nMethod:\n1) Construct -1 as 0 - 1.\n2) Represent exp(i*pi) exactly as (-1, 0).\n3) Add 1 componentwise to obtain (0, 0).\n4) Sanity validation the phase modulus: |-1 + 0i|^2 = 1.\n5) Project only the intended certificates via log:query.\n\n## Compilation summary\n\n- Example name: `euler_identity`\n- Input facts emitted: 10\n- Forward rules compiled: 5\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 21\n\n## Built-ins used\n\n- `math:difference`\n- `math:equalTo`\n- `math:product`\n- `math:sum`\n\n## Runtime model\n\nThe generated `examples/euler_identity.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/euler_identity.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/euler-identity.trig` or `examples/input/euler_identity.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/euler_identity.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";
1916
+ const DOC_MARKDOWN = "# Euler identity (exact, certificate-friendly):\n\nGenerated by `see.js` from a Notation3 source file.\n\nexp(i*pi) + 1 = 0\nPhilosophy:\nUnlike the T-gate example, this phase needs no approximation. exp(i*pi) lands exactly at\n(-1,0) = cos(pi) + i sin(pi), so the identity can be certified using integer arithmetic\nalone.\nMethod:\n1) Construct -1 as 0 - 1.\n2) Represent exp(i*pi) exactly as (-1, 0).\n3) Add 1 componentwise to obtain (0, 0).\n4) Sanity validation the phase modulus: |-1 + 0i|^2 = 1.\n5) Project only the intended certificates via log:query.\n\n## Compilation summary\n\n- Example name: `euler_identity`\n- Input facts emitted: 10\n- Forward rules compiled: 5\n- Backward predicate rules compiled: 0\n- Fuses compiled: 0\n- Predicate count: 21\n\n## Built-ins used\n\n- `math:difference`\n- `math:equalTo`\n- `math:product`\n- `math:sum`\n\n## Runtime model\n\nThe generated `examples/euler_identity.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/euler_identity.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/euler-identity.trig` or `examples/input/euler_identity.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/euler_identity.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";
1917
1917
  function seeMetadata(data) { return (data && data.__see) || {}; }
1918
1918
  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 !== "8a0467bd923b3774627c99aa4cc9fe34baaa0bbaff1847399cd025d24b39c17a") 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 === "8a0467bd923b3774627c99aa4cc9fe34baaa0bbaff1847399cd025d24b39c17a", 'input evidence facts were loaded': expectedFacts > 0 ? facts.length === expectedFacts : facts.length >= 0, 'compiled rules were loaded': RULES.length === 5, '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 }; }
1919
1919
  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) {
@@ -2437,7 +2437,7 @@ const QUERIES = [
2437
2437
  ]
2438
2438
  }
2439
2439
  ];
2440
- const DOC_MARKDOWN = "# EV Roadtrip Planner\n\nGenerated by `see.js` from a Notation3 source file.\n\nN3-compiled version of the hand-written EV roadtrip planner. Candidate plans\nare represented as data; rules apply the same acceptance thresholds and select\nthe fastest acceptable route.\n\n## Compilation summary\n\n- Example name: `ev_roundtrip_planner`\n- Input facts emitted: 64\n- Forward rules compiled: 3\n- Backward predicate rules compiled: 0\n- Fuses compiled: 1\n- Predicate count: 27\n\n## Built-ins used\n\n- `log:notIncludes`\n- `log:outputString`\n- `math:greaterThan`\n- `math:lessThan`\n- `string:format`\n\n## Runtime model\n\nThe generated `examples/ev_roundtrip_planner.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/ev_roundtrip_planner.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/ev-roundtrip-planner.trig` or `examples/input/ev_roundtrip_planner.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/ev_roundtrip_planner.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";
2440
+ const DOC_MARKDOWN = "# EV Roadtrip Planner\n\nGenerated by `see.js` from a Notation3 source file.\n\nN3-compiled version of the hand-written EV roadtrip planner. Candidate plans\nare represented as data; rules apply the same acceptance thresholds and select\nthe fastest acceptable route.\n\n## Compilation summary\n\n- Example name: `ev_roundtrip_planner`\n- Input facts emitted: 64\n- Forward rules compiled: 3\n- Backward predicate rules compiled: 0\n- Fuses compiled: 1\n- Predicate count: 27\n\n## Built-ins used\n\n- `log:notIncludes`\n- `log:outputString`\n- `math:greaterThan`\n- `math:lessThan`\n- `string:format`\n\n## Runtime model\n\nThe generated `examples/ev_roundtrip_planner.js` is a specialized JavaScript derivation program. For ordinary sources, `see.js` emits the source facts as `examples/input/ev_roundtrip_planner.trig`. For rules-only sources, generation can reuse an existing external evidence file such as `examples/input/ev-roundtrip-planner.trig` or `examples/input/ev_roundtrip_planner.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/ev_roundtrip_planner.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";
2441
2441
  function seeMetadata(data) { return (data && data.__see) || {}; }
2442
2442
  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 !== "0adbefa76f008fdb320ee926631bf5e997a8c3b8b7159ec8c3c9111db3437c65") 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 === "0adbefa76f008fdb320ee926631bf5e997a8c3b8b7159ec8c3c9111db3437c65", '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 }; }
2443
2443
  function snapshotMarkdown(markdown) { return markdown.split(/\n/).map((line) => line ? line + ' \n' : '\n').join(''); }