eyeling 1.24.7 → 1.24.9

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 (184) hide show
  1. package/HANDBOOK.md +35 -35
  2. package/dist/browser/eyeling.browser.js +14 -1
  3. package/examples/act-alarm-bit-interoperability.n3 +5 -3
  4. package/examples/act-barley-seed-lineage.n3 +5 -3
  5. package/examples/act-docking-abort.n3 +5 -3
  6. package/examples/act-gravity-mediator-witness.n3 +5 -3
  7. package/examples/act-isolation-breach.n3 +5 -3
  8. package/examples/act-photosynthetic-exciton-transfer.n3 +5 -3
  9. package/examples/act-sensor-memory-reset.n3 +5 -3
  10. package/examples/act-tunnel-junction-wake-switch.n3 +5 -3
  11. package/examples/act-yeast-self-reproduction.n3 +5 -3
  12. package/examples/annotation.n3 +5 -0
  13. package/examples/auroracare.n3 +29 -29
  14. package/examples/backward-recursion.n3 +5 -0
  15. package/examples/barley-seed-becoming.n3 +5 -3
  16. package/examples/bmi.n3 +5 -3
  17. package/examples/builtin-coverage.n3 +5 -0
  18. package/examples/calidor.n3 +3 -3
  19. package/examples/collection.n3 +5 -0
  20. package/examples/complex-matrix-stability.n3 +5 -3
  21. package/examples/context-association.n3 +1 -9
  22. package/examples/control-system.n3 +5 -3
  23. package/examples/deep-taxonomy-10.n3 +5 -3
  24. package/examples/deep-taxonomy-100.n3 +5 -3
  25. package/examples/deep-taxonomy-1000.n3 +5 -3
  26. package/examples/deep-taxonomy-10000.n3 +5 -3
  27. package/examples/deep-taxonomy-100000.n3 +3 -1
  28. package/examples/delfour.n3 +3 -3
  29. package/examples/digital-product-passport.n3 +2 -0
  30. package/examples/dijkstra-risk-path.n3 +1 -2
  31. package/examples/easter.n3 +6 -4
  32. package/examples/eco-route-insight.n3 +1 -2
  33. package/examples/flandor.n3 +3 -3
  34. package/examples/french-cities.n3 +5 -3
  35. package/examples/fundamental-theorem-arithmetic.n3 +5 -3
  36. package/examples/genetic-algorithm-knapsack.n3 +1 -1
  37. package/examples/genetic-algorithm.n3 +1 -1
  38. package/examples/genetic-knapsack-selection.n3 +1 -2
  39. package/examples/gps.n3 +5 -3
  40. package/examples/harborsmr.n3 +5 -3
  41. package/examples/input/ontology-question-generation.trig +79 -0
  42. package/examples/input/rdf-message-flow.trig +10 -10
  43. package/examples/input/rdf-messages.trig +6 -6
  44. package/examples/interop-demo.n3 +3 -1
  45. package/examples/matrix-mechanics.n3 +3 -3
  46. package/examples/medior.n3 +3 -3
  47. package/examples/n3-speaks-for-itself.n3 +5 -0
  48. package/examples/odrl-dpv-ehds-risk-ranked.n3 +1 -1
  49. package/examples/odrl-dpv-healthcare-risk-ranked.n3 +1 -1
  50. package/examples/odrl-dpv-risk-ranked.n3 +1 -1
  51. package/examples/odrl-risk-mitigation.n3 +1 -1
  52. package/examples/odrl-risk.n3 +1 -1
  53. package/examples/ontology-question-generation.n3 +409 -0
  54. package/examples/output/{act-alarm-bit-interoperability.txt → act-alarm-bit-interoperability.md} +23 -17
  55. package/examples/output/act-barley-seed-lineage.md +31 -0
  56. package/examples/output/{act-docking-abort.txt → act-docking-abort.md} +25 -19
  57. package/examples/output/{act-gravity-mediator-witness.txt → act-gravity-mediator-witness.md} +27 -21
  58. package/examples/output/{act-isolation-breach.txt → act-isolation-breach.md} +30 -24
  59. package/examples/output/{act-photosynthetic-exciton-transfer.txt → act-photosynthetic-exciton-transfer.md} +23 -17
  60. package/examples/output/{act-sensor-memory-reset.txt → act-sensor-memory-reset.md} +23 -17
  61. package/examples/output/{act-tunnel-junction-wake-switch.txt → act-tunnel-junction-wake-switch.md} +24 -18
  62. package/examples/output/{act-yeast-self-reproduction.txt → act-yeast-self-reproduction.md} +26 -20
  63. package/examples/output/annotation.md +7 -0
  64. package/examples/output/auroracare.md +154 -0
  65. package/examples/output/backward-recursion.md +11 -0
  66. package/examples/output/barley-seed-becoming.md +31 -0
  67. package/examples/output/bmi.md +26 -0
  68. package/examples/output/builtin-coverage.md +7 -0
  69. package/examples/output/calidor.md +35 -0
  70. package/examples/output/collection.md +7 -0
  71. package/examples/output/{complex-matrix-stability.txt → complex-matrix-stability.md} +17 -11
  72. package/examples/output/context-association.md +12 -0
  73. package/examples/output/{control-system.txt → control-system.md} +23 -17
  74. package/examples/output/deep-taxonomy-10.md +21 -0
  75. package/examples/output/deep-taxonomy-100.md +21 -0
  76. package/examples/output/{deep-taxonomy-1000.txt → deep-taxonomy-1000.md} +18 -12
  77. package/examples/output/{deep-taxonomy-10000.txt → deep-taxonomy-10000.md} +18 -12
  78. package/examples/output/{deep-taxonomy-100000.txt → deep-taxonomy-100000.md} +18 -12
  79. package/examples/output/delfour.md +36 -0
  80. package/examples/output/digital-product-passport.md +7 -0
  81. package/examples/output/dijkstra-risk-path.md +16 -0
  82. package/examples/output/{easter.txt → easter.md} +156 -150
  83. package/examples/output/eco-route-insight.md +25 -0
  84. package/examples/output/flandor.md +37 -0
  85. package/examples/output/{french-cities.txt → french-cities.md} +17 -11
  86. package/examples/output/{fundamental-theorem-arithmetic.txt → fundamental-theorem-arithmetic.md} +18 -12
  87. package/examples/output/genetic-algorithm-knapsack.md +7 -0
  88. package/examples/output/genetic-algorithm.md +7 -0
  89. package/examples/output/genetic-knapsack-selection.md +18 -0
  90. package/examples/output/{gps.txt → gps.md} +18 -12
  91. package/examples/output/harborsmr.md +26 -0
  92. package/examples/output/interop-demo.md +7 -0
  93. package/examples/output/matrix-mechanics.md +20 -0
  94. package/examples/output/medior.md +38 -0
  95. package/examples/output/n3-speaks-for-itself.md +58 -0
  96. package/examples/output/{odrl-dpv-ehds-risk-ranked.txt → odrl-dpv-ehds-risk-ranked.md} +20 -15
  97. package/examples/output/{odrl-dpv-healthcare-risk-ranked.txt → odrl-dpv-healthcare-risk-ranked.md} +17 -12
  98. package/examples/output/{odrl-dpv-risk-ranked.txt → odrl-dpv-risk-ranked.md} +21 -16
  99. package/examples/output/{odrl-risk-mitigation.txt → odrl-risk-mitigation.md} +21 -16
  100. package/examples/output/{odrl-risk.txt → odrl-risk.md} +10 -5
  101. package/examples/output/ontology-question-generation.md +31 -0
  102. package/examples/output/parcellocker.md +26 -0
  103. package/examples/output/pn-junction-tunneling.md +29 -0
  104. package/examples/output/queens.md +27 -0
  105. package/examples/output/rc-discharge-envelope.md +16 -0
  106. package/examples/output/rdf-dataset.md +12 -0
  107. package/examples/output/rdf-message-flow.md +12 -0
  108. package/examples/output/rdf-messages.md +12 -0
  109. package/examples/output/{resto.txt → resto.md} +23 -17
  110. package/examples/output/school-placement-audit.md +16 -0
  111. package/examples/output/smoke-arithmetic.md +12 -0
  112. package/examples/output/sqrt2-cauchy.md +19 -0
  113. package/examples/output/sqrt2-dedekind.md +37 -0
  114. package/examples/output/sudoku.md +49 -0
  115. package/examples/output/transcendental-numbers-stretched.md +266 -0
  116. package/examples/output/transistor-switch.md +30 -0
  117. package/examples/output/triple-terms.md +12 -0
  118. package/examples/output/{tunnel-junction-wake-switch-becoming.txt → tunnel-junction-wake-switch-becoming.md} +24 -18
  119. package/examples/output/{wind-turbine.txt → wind-turbine.md} +21 -15
  120. package/examples/parcellocker.n3 +3 -1
  121. package/examples/pn-junction-tunneling.n3 +3 -3
  122. package/examples/queens.n3 +1 -0
  123. package/examples/rc-discharge-envelope.n3 +1 -1
  124. package/examples/rdf-dataset.n3 +5 -0
  125. package/examples/rdf-message-flow.n3 +1 -2
  126. package/examples/rdf-messages.n3 +1 -2
  127. package/examples/resto.n3 +5 -3
  128. package/examples/school-placement-audit.n3 +1 -2
  129. package/examples/smoke-arithmetic.n3 +1 -1
  130. package/examples/sqrt2-cauchy.n3 +2 -0
  131. package/examples/sqrt2-dedekind.n3 +2 -0
  132. package/examples/sudoku.n3 +14 -14
  133. package/examples/transcendental-numbers-stretched.n3 +5 -0
  134. package/examples/transistor-switch.n3 +3 -3
  135. package/examples/triple-terms.n3 +5 -0
  136. package/examples/tunnel-junction-wake-switch-becoming.n3 +5 -3
  137. package/examples/wind-turbine.n3 +5 -3
  138. package/eyeling.js +14 -1
  139. package/lib/explain.js +14 -1
  140. package/package.json +1 -1
  141. package/test/examples.test.js +44 -13
  142. package/test/package.test.js +43 -7
  143. package/examples/output/act-barley-seed-lineage.txt +0 -25
  144. package/examples/output/annotation.n3 +0 -0
  145. package/examples/output/auroracare.txt +0 -149
  146. package/examples/output/backward-recursion.n3 +0 -4
  147. package/examples/output/barley-seed-becoming.txt +0 -25
  148. package/examples/output/bmi.txt +0 -20
  149. package/examples/output/builtin-coverage.n3 +0 -0
  150. package/examples/output/calidor.txt +0 -29
  151. package/examples/output/collection.n3 +0 -0
  152. package/examples/output/context-association.n3 +0 -9
  153. package/examples/output/deep-taxonomy-10.txt +0 -15
  154. package/examples/output/deep-taxonomy-100.txt +0 -15
  155. package/examples/output/delfour.txt +0 -30
  156. package/examples/output/digital-product-passport.txt +0 -1
  157. package/examples/output/dijkstra-risk-path.n3 +0 -3
  158. package/examples/output/eco-route-insight.n3 +0 -3
  159. package/examples/output/flandor.txt +0 -31
  160. package/examples/output/genetic-algorithm-knapsack.txt +0 -1
  161. package/examples/output/genetic-algorithm.txt +0 -1
  162. package/examples/output/genetic-knapsack-selection.n3 +0 -3
  163. package/examples/output/harborsmr.txt +0 -20
  164. package/examples/output/interop-demo.txt +0 -1
  165. package/examples/output/matrix-mechanics.txt +0 -14
  166. package/examples/output/medior.txt +0 -32
  167. package/examples/output/n3-speaks-for-itself.txt +0 -52
  168. package/examples/output/parcellocker.txt +0 -20
  169. package/examples/output/pn-junction-tunneling.txt +0 -23
  170. package/examples/output/queens.txt +0 -21
  171. package/examples/output/rc-discharge-envelope.n3 +0 -9
  172. package/examples/output/rc-discharge-envelope.txt +0 -9
  173. package/examples/output/rdf-dataset.n3 +0 -5
  174. package/examples/output/rdf-message-flow.n3 +0 -7
  175. package/examples/output/rdf-messages.n3 +0 -7
  176. package/examples/output/school-placement-audit.n3 +0 -3
  177. package/examples/output/smoke-arithmetic.n3 +0 -5
  178. package/examples/output/smoke-arithmetic.txt +0 -5
  179. package/examples/output/sqrt2-cauchy.txt +0 -13
  180. package/examples/output/sqrt2-dedekind.txt +0 -31
  181. package/examples/output/sudoku.txt +0 -43
  182. package/examples/output/transcendental-numbers-stretched.txt +0 -260
  183. package/examples/output/transistor-switch.txt +0 -24
  184. package/examples/output/triple-terms.n3 +0 -5
@@ -419,7 +419,7 @@
419
419
  # ARC rendering through log:outputString
420
420
  # --------------------------------------
421
421
 
422
- :out01 log:outputString "=== Answer ===\n" .
422
+ :out01 log:outputString "# calidor\n\n## Source files\n\n- [N3 rules](../calidor.n3)\n\n## Answer\n" .
423
423
 
424
424
  {
425
425
  :case :recommendedPackage ?pkg .
@@ -441,7 +441,7 @@
441
441
  :out06 log:outputString ?line .
442
442
  } .
443
443
 
444
- :out07 log:outputString "\n=== Reason Why ===\n" .
444
+ :out07 log:outputString "\n## Reason Why\n" .
445
445
  :out08 log:outputString "The gateway desensitizes local heat, vulnerability, and prepaid-energy stress into an expiring municipal support insight, and the city consumes that envelope only for heatwave response.\n" .
446
446
  :out09 log:outputString "metric : active_need_count\n" .
447
447
 
@@ -485,7 +485,7 @@
485
485
  :out17 log:outputString ?line .
486
486
  } .
487
487
 
488
- :out18 log:outputString "\n=== Check ===\n" .
488
+ :out18 log:outputString "\n## Check\n" .
489
489
 
490
490
  { :check :signatureVerifies true . } => { :out19 log:outputString "signature verifies : yes\n" . } .
491
491
  { :check :payloadHashMatches true . } => { :out20 log:outputString "payload hash matches : yes\n" . } .
@@ -1,3 +1,8 @@
1
1
  @prefix : <https://eyereasoner.github.io/eyeling/examples/collection#>.
2
2
  (1 _:b2 (2)) :p2 :q2 .
3
3
  _:b2 :p :q .
4
+
5
+
6
+ # Markdown rendering via log:outputString.
7
+ :__md_output :text "# collection\n\n## Source files\n\n- [N3 rules](../collection.n3)\n- [Input TriG](../input/collection.trig)\n\n" .
8
+ { :__md_output :text ?text } log:query { :__md_output log:outputString ?text } .
@@ -17,6 +17,8 @@
17
17
  @prefix math: <http://www.w3.org/2000/10/swap/math#> .
18
18
  @prefix string: <http://www.w3.org/2000/10/swap/string#> .
19
19
 
20
+ :000_md_title log:outputString "# complex-matrix-stability\n\n## Source files\n\n- [N3 rules](../complex-matrix-stability.n3)\n\n" .
21
+
20
22
  # --------------
21
23
  # Editable input
22
24
  # --------------
@@ -254,7 +256,7 @@
254
256
  "Complex Matrix Stability — ARC-style
255
257
 
256
258
  "
257
- "Answer
259
+ "## Answer
258
260
  "
259
261
  "We compare three diagonal 2x2 complex matrices for discrete-time stability: "
260
262
  "A_unstable = " ?MuS ", A_stable = " ?MsS ", and A_damped = " ?MdS ". "
@@ -262,7 +264,7 @@
262
264
  "So A_unstable is unstable, A_stable is marginally stable, and A_damped is damped.
263
265
 
264
266
  "
265
- "Reason Why
267
+ "## Reason Why
266
268
  "
267
269
  "For a discrete-time linear system x_{k+1} = A x_k, the eigenvalues of A govern the behaviour of the modes. "
268
270
  "Because these matrices are diagonal, the eigenvalues are just the diagonal entries. "
@@ -271,7 +273,7 @@
271
273
  "Here the diagonal entries give radii 2, 1, and 0 respectively, which explains the three classifications.
272
274
 
273
275
  "
274
- "Check
276
+ "## Check
275
277
  "
276
278
  "C1 " ?C1 "
277
279
  "
@@ -46,14 +46,6 @@
46
46
  }
47
47
  =>
48
48
  {
49
- :report log:outputString "# Context association\n\n## Entailment\nThe RDF dataset associates Bob's data graph with a Data Integrity proof graph and a second metadata proof graph.\n\n## Explanation\nThe input TriG names three graph contexts. The data graph states Bob's name. The signature graph links to that data graph with a proof and records an ecdsa-rdfc-2019 Data Integrity proof from the university issuer. The metadata graph then signs the signature graph itself, giving a chained context association.".
49
+ :report log:outputString "# Context association\n\n## Source files\n\n- [N3 rules](../context-association.n3)\n- [Input TriG](../input/context-association.trig)\n\n## Entailment\nThe RDF dataset associates Bob's data graph with a Data Integrity proof graph and a second metadata proof graph.\n\n## Explanation\nThe input TriG names three graph contexts. The data graph states Bob's name. The signature graph links to that data graph with a proof and records an ecdsa-rdfc-2019 Data Integrity proof from the university issuer. The metadata graph then signs the signature graph itself, giving a chained context association.".
50
50
  }.
51
51
 
52
- # query
53
- {
54
- :association ?P ?O.
55
- }
56
- log:query
57
- {
58
- :association ?P ?O.
59
- }.
@@ -13,6 +13,8 @@
13
13
  @prefix string: <http://www.w3.org/2000/10/swap/string#>.
14
14
  @prefix : <https://example.org/control-system#>.
15
15
 
16
+ :000_md_title log:outputString "# control-system\n\n## Source files\n\n- [N3 rules](../control-system.n3)\n\n" .
17
+
16
18
  # -----
17
19
  # Facts
18
20
  # -----
@@ -155,11 +157,11 @@
155
157
  :feedbackDifferential ?FBDiff.
156
158
  (
157
159
  "Control System — ARC explanation of two control signals\n\n"
158
- "Answer\n"
160
+ "## Answer\n"
159
161
  ?Answer "\n"
160
162
  "Actuator 1 command: " ?A1 "\n"
161
163
  "Actuator 2 command: " ?A2 "\n\n"
162
- "Reason Why\n"
164
+ "## Reason Why\n"
163
165
  "The first sensor pair is " ?Low " and " ?High ", so the reading is " ?Trend
164
166
  " and the controller normalizes the gap " ?Gap " into " ?Norm ". "
165
167
  "That normalized value creates a feedforward term of " ?FFProp
@@ -169,7 +171,7 @@
169
171
  "The observed state is " ?DiffErr " relative units below the measured output, so the differential correction is negative. "
170
172
  "That yields a proportional feedback part of " ?FBProp ", a nonlinear factor of " ?FBFactor
171
173
  ", and a differential contribution of " ?FBDiff ". Together they produce actuator 2 command " ?A2 ".\n\n"
172
- "Check\n"
174
+ "## Check\n"
173
175
  "C1 OK - the first sensor pair is rising, so the normalization uses the rising-branch rule.\n"
174
176
  "C2 OK - the normalized measurement is positive and smaller than the raw gap, which is consistent with a square-root normalization.\n"
175
177
  "C3 OK - actuator 1 is lower than its proportional feedforward term because disturbance compensation is subtracted.\n"
@@ -31,6 +31,8 @@
31
31
 
32
32
  @prefix log: <http://www.w3.org/2000/10/swap/log#>.
33
33
 
34
+ :000_md_title log:outputString "# deep-taxonomy-10\n\n## Source files\n\n- [N3 rules](../deep-taxonomy-10.n3)\n\n" .
35
+
34
36
  # ARC checks
35
37
  { :ind a :N0. }
36
38
  => { :arc :check1 "C1 OK - the starting classification N0 is present." . } .
@@ -59,13 +61,13 @@
59
61
  {
60
62
  :report log:outputString "Deep Taxonomy - deep classification benchmark
61
63
 
62
- Answer
64
+ ## Answer
63
65
  The test succeeds: starting from one individual classified as N0, the rules eventually classify it as N10 and then as A2.
64
66
 
65
- Reason Why
67
+ ## Reason Why
66
68
  Each rule moves the same individual one level deeper in the taxonomy and also adds two side labels. Because that chain continues all the way from N0 to N10, the final rule deriving A2 fires, and that in turn makes the test true.
67
69
 
68
- Check
70
+ ## Check
69
71
  C1 OK - the starting classification N0 is present.
70
72
  C2 OK - the first expansion produced N1 together with side labels I1 and J1.
71
73
  C3 OK - the chain reaches the midpoint N5 and still carries both side-label branches.
@@ -121,6 +121,8 @@
121
121
 
122
122
  @prefix log: <http://www.w3.org/2000/10/swap/log#>.
123
123
 
124
+ :000_md_title log:outputString "# deep-taxonomy-100\n\n## Source files\n\n- [N3 rules](../deep-taxonomy-100.n3)\n\n" .
125
+
124
126
  # ARC checks
125
127
  { :ind a :N0. }
126
128
  => { :arc :check1 "C1 OK - the starting classification N0 is present." . } .
@@ -149,13 +151,13 @@
149
151
  {
150
152
  :report log:outputString "Deep Taxonomy - deep classification benchmark
151
153
 
152
- Answer
154
+ ## Answer
153
155
  The test succeeds: starting from one individual classified as N0, the rules eventually classify it as N100 and then as A2.
154
156
 
155
- Reason Why
157
+ ## Reason Why
156
158
  Each rule moves the same individual one level deeper in the taxonomy and also adds two side labels. Because that chain continues all the way from N0 to N100, the final rule deriving A2 fires, and that in turn makes the test true.
157
159
 
158
- Check
160
+ ## Check
159
161
  C1 OK - the starting classification N0 is present.
160
162
  C2 OK - the first expansion produced N1 together with side labels I1 and J1.
161
163
  C3 OK - the chain reaches the midpoint N50 and still carries both side-label branches.
@@ -1021,6 +1021,8 @@
1021
1021
 
1022
1022
  @prefix log: <http://www.w3.org/2000/10/swap/log#>.
1023
1023
 
1024
+ :000_md_title log:outputString "# deep-taxonomy-1000\n\n## Source files\n\n- [N3 rules](../deep-taxonomy-1000.n3)\n\n" .
1025
+
1024
1026
  # ARC checks
1025
1027
  { :ind a :N0. }
1026
1028
  => { :arc :check1 "C1 OK - the starting classification N0 is present." . } .
@@ -1049,13 +1051,13 @@
1049
1051
  {
1050
1052
  :report log:outputString "Deep Taxonomy - deep classification benchmark
1051
1053
 
1052
- Answer
1054
+ ## Answer
1053
1055
  The test succeeds: starting from one individual classified as N0, the rules eventually classify it as N1000 and then as A2.
1054
1056
 
1055
- Reason Why
1057
+ ## Reason Why
1056
1058
  Each rule moves the same individual one level deeper in the taxonomy and also adds two side labels. Because that chain continues all the way from N0 to N1000, the final rule deriving A2 fires, and that in turn makes the test true.
1057
1059
 
1058
- Check
1060
+ ## Check
1059
1061
  C1 OK - the starting classification N0 is present.
1060
1062
  C2 OK - the first expansion produced N1 together with side labels I1 and J1.
1061
1063
  C3 OK - the chain reaches the midpoint N500 and still carries both side-label branches.
@@ -10021,6 +10021,8 @@
10021
10021
 
10022
10022
  @prefix log: <http://www.w3.org/2000/10/swap/log#>.
10023
10023
 
10024
+ :000_md_title log:outputString "# deep-taxonomy-10000\n\n## Source files\n\n- [N3 rules](../deep-taxonomy-10000.n3)\n\n" .
10025
+
10024
10026
  # ARC checks
10025
10027
  { :ind a :N0. }
10026
10028
  => { :arc :check1 "C1 OK - the starting classification N0 is present." . } .
@@ -10049,13 +10051,13 @@
10049
10051
  {
10050
10052
  :report log:outputString "Deep Taxonomy - deep classification benchmark
10051
10053
 
10052
- Answer
10054
+ ## Answer
10053
10055
  The test succeeds: starting from one individual classified as N0, the rules eventually classify it as N10000 and then as A2.
10054
10056
 
10055
- Reason Why
10057
+ ## Reason Why
10056
10058
  Each rule moves the same individual one level deeper in the taxonomy and also adds two side labels. Because that chain continues all the way from N0 to N10000, the final rule deriving A2 fires, and that in turn makes the test true.
10057
10059
 
10058
- Check
10060
+ ## Check
10059
10061
  C1 OK - the starting classification N0 is present.
10060
10062
  C2 OK - the first expansion produced N1 together with side labels I1 and J1.
10061
10063
  C3 OK - the chain reaches the midpoint N5000 and still carries both side-label branches.
@@ -100022,6 +100022,8 @@
100022
100022
 
100023
100023
  @prefix log: <http://www.w3.org/2000/10/swap/log#>.
100024
100024
 
100025
+ :000_md_title log:outputString "# deep-taxonomy-100000\n\n## Source files\n\n- [N3 rules](../deep-taxonomy-100000.n3)\n\n" .
100026
+
100025
100027
  # ARC checks
100026
100028
  { :ind a :N0. }
100027
100029
  => { :arc :check1 "C1 OK - the starting classification N0 is present." . } .
@@ -100048,5 +100050,5 @@
100048
100050
  }
100049
100051
  =>
100050
100052
  {
100051
- :report log:outputString "Deep Taxonomy - very deep classification benchmark\n\nAnswer\nThe test succeeds: starting from one individual classified as N0, the rules eventually classify it as N100000 and then as A2.\n\nReason Why\nEach rule moves the same individual one level deeper in the taxonomy and also adds two side labels. Because that chain continues all the way from N0 to N100000, the final rule deriving A2 fires, and that in turn makes the test true.\n\nCheck\nC1 OK - the starting classification N0 is present.\nC2 OK - the first expansion produced N1 together with side labels I1 and J1.\nC3 OK - the chain reaches the midpoint N50000 and still carries both side-label branches.\nC4 OK - the final taxonomy step from N99999 to N100000 was completed.\nC5 OK - once N100000 is reached, the terminal class A2 is derived.\nC6 OK - the success flag is raised only after the terminal class A2 is present.\n" .
100053
+ :report log:outputString "Deep Taxonomy - very deep classification benchmark\n\n## Answer\nThe test succeeds: starting from one individual classified as N0, the rules eventually classify it as N100000 and then as A2.\n\n## Reason Why\nEach rule moves the same individual one level deeper in the taxonomy and also adds two side labels. Because that chain continues all the way from N0 to N100000, the final rule deriving A2 fires, and that in turn makes the test true.\n\n## Check\nC1 OK - the starting classification N0 is present.\nC2 OK - the first expansion produced N1 together with side labels I1 and J1.\nC3 OK - the chain reaches the midpoint N50000 and still carries both side-label branches.\nC4 OK - the final taxonomy step from N99999 to N100000 was completed.\nC5 OK - once N100000 is reached, the terminal class A2 is derived.\nC6 OK - the success flag is raised only after the terminal class A2 is present.\n" .
100052
100054
  } .
@@ -331,7 +331,7 @@
331
331
  # ARC rendering through log:outputString
332
332
  # --------------------------------------
333
333
 
334
- :out01 log:outputString "=== Answer ===\n" .
334
+ :out01 log:outputString "# delfour\n\n## Source files\n\n- [N3 rules](../delfour.n3)\n\n## Answer\n" .
335
335
  :out02 log:outputString "The scanner is allowed to use a neutral shopping insight and recommends Low-Sugar Tea Biscuits instead of Classic Tea Biscuits.\n" .
336
336
  :out03 log:outputString "case : delfour\n" .
337
337
  :out04 log:outputString "decision : Allowed\n" .
@@ -345,7 +345,7 @@
345
345
  :out06 log:outputString ?line .
346
346
  } .
347
347
 
348
- :out07 log:outputString "\n=== Reason Why ===\n" .
348
+ :out07 log:outputString "\n## Reason Why\n" .
349
349
  :out08 log:outputString "The phone desensitizes a diabetes-related household condition into a scoped low-sugar need, wraps it in an expiring Insight + Policy envelope, signs it, and the scanner consumes that envelope for shopping assistance.\n" .
350
350
  :out09 log:outputString "metric : sugar_g_per_serving\n" .
351
351
 
@@ -396,7 +396,7 @@
396
396
  :out18 log:outputString ?line .
397
397
  } .
398
398
 
399
- :out19 log:outputString "\n=== Check ===\n" .
399
+ :out19 log:outputString "\n## Check\n" .
400
400
 
401
401
  { :check :signatureVerifies true . } => { :out20 log:outputString "signature verifies : yes\n" . } .
402
402
  { :check :payloadHashMatches true . } => { :out21 log:outputString "payload hash matches : yes\n" . } .
@@ -17,6 +17,8 @@
17
17
  @prefix log: <http://www.w3.org/2000/10/swap/log#> .
18
18
  @prefix string: <http://www.w3.org/2000/10/swap/string#> .
19
19
 
20
+ :000_md_title log:outputString "# digital-product-passport\n\n## Source files\n\n- [N3 rules](../digital-product-passport.n3)\n\n" .
21
+
20
22
  # --------------------
21
23
  # 1) Actors and places
22
24
  # --------------------
@@ -43,10 +43,9 @@
43
43
  {
44
44
  :Case :selectedPath :pathB; :trustGate :noEnumeratedPathIsLower; :notes :riskCanOutweighRawCost.
45
45
  :pathB :routeText ?Route; :rawCost ?Raw; :riskSum ?Risk; :score ?Score; :edgeCount ?Edges.
46
- ("=== Answer ===\nselected path : %s\nraw cost : %.2f\nrisk sum : %.2f\nrisk-adjusted score : %.2f\nedges in selected path : %d\n\n=== Explanation ===\nEach edge contributes its delivery cost plus the configured risk penalty. The N3 source enumerates the small graph's simple route candidates and compares the selected route against each alternative score. The selected route balances cost and risk through DepotB and LabD, while the apparently cheaper DepotC path is rejected once risk is priced in." ?Route ?Raw ?Risk ?Score ?Edges) string:format ?Block.
46
+ ("# dijkstra-risk-path\n\n## Source files\n\n- [N3 rules](../dijkstra-risk-path.n3)\n- [Input TriG](../input/dijkstra-risk-path.trig)\n\n## Answer\nselected path : %s\nraw cost : %.2f\nrisk sum : %.2f\nrisk-adjusted score : %.2f\nedges in selected path : %d\n\n## Explanation\nEach edge contributes its delivery cost plus the configured risk penalty. The N3 source enumerates the small graph's simple route candidates and compares the selected route against each alternative score. The selected route balances cost and risk through DepotB and LabD, while the apparently cheaper DepotC path is rejected once risk is priced in." ?Route ?Raw ?Risk ?Score ?Edges) string:format ?Block.
47
47
  } => {
48
48
  :dijkstraRiskPath log:outputString ?Block.
49
49
  :dijkstraRiskPath :selects :pathB.
50
50
  }.
51
51
 
52
- { :dijkstraRiskPath :selects ?Path } log:query { :dijkstraRiskPath :selects ?Path }.
@@ -15,6 +15,8 @@
15
15
  @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
16
16
  @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
17
17
 
18
+ :000_md_title log:outputString "# easter\n\n## Source files\n\n- [N3 rules](../easter.n3)\n\n" .
19
+
18
20
  <> rdfs:comment """This ARC-style version keeps the Gregorian computus from the original example and reports, for each sample year, an Answer, a Reason Why, and a set of independent Checks.""" .
19
21
 
20
22
  :y2026 a :Case; :year 2026 .
@@ -194,14 +196,14 @@
194
196
  :check1 ?C1; :check2 ?C2; :check3 ?C3; :check4 ?C4; :check5 ?C5.
195
197
  (
196
198
  "Easter — Gregorian computus\n\n"
197
- "=== " ?Y " ===\n"
198
- "Answer\n"
199
+ "## " ?Y "\n"
200
+ "## Answer\n"
199
201
  "Easter Sunday falls on " ?Month " " ?Day ".\n\n"
200
- "Reason Why\n"
202
+ "## Reason Why\n"
201
203
  "For year " ?Y ", the computus gives j=" ?J ", k=" ?K ", q=" ?Q
202
204
  ", r=" ?R ", v=" ?V ", and final month/day numbers x=" ?X ", z=" ?Z ". "
203
205
  "Because the day is z+1, the resulting Easter date is " ?Month " " ?Day ".\n\n"
204
- "Check\n"
206
+ "## Check\n"
205
207
  ?C1 ?C2 ?C3 ?C4 ?C5
206
208
  ) string:concatenation ?Block. }
207
209
  =>
@@ -34,10 +34,9 @@
34
34
  :Shipment :id ?ShipmentId; :payloadTons ?PayloadTons.
35
35
  :Envelope :rawDataExported ?Raw; :payloadDigest ?Digest; :signatureKey ?Key; :signature ?Signature.
36
36
  :Policy :fuelIndexThreshold ?Threshold; :signatureAlgorithm ?Algorithm.
37
- ("=== Answer ===\ninsight status : issue\nshow eco banner : %s\naudience : %s\nallowed use : %s\nsuggested route : %s\ncurrent fuel index : %.2f\nsuggested fuel index : %.2f\nestimated saving : %.2f\nexpires at : %s\nraw data exported : %s\nsignature algorithm : %s\npayload digest : %s\nsignature key : %s\nsignature : %s\n\n=== Explanation ===\nThe current route uses fuel index = distanceKm × (payloadKg / 1000) × gradientFactor. For %s, Current urban route gives %.2f × %.2f × %.2f = %.2f. The policy threshold is %.2f, so a local eco banner is justified. The selected alternative %s gives %.2f × %.2f × %.2f = %.2f, saving %.2f while staying within the ETA delay limit. The signed envelope exposes audience, use, expiry, route suggestion, and compact fuel indices, but not raw payload, GPS trace, driver behavior, or raw telemetry." ?Show ?Audience ?Use ?AltId ?CurrentIndex ?AltIndex ?Saving ?Expiry ?Raw ?Algorithm ?Digest ?Key ?Signature ?ShipmentId ?CurrentDistance ?PayloadTons ?CurrentGradient ?CurrentIndex ?Threshold ?AltId ?AltDistance ?PayloadTons ?AltGradient ?AltIndex ?Saving) string:format ?Block.
37
+ ("# eco-route-insight\n\n## Source files\n\n- [N3 rules](../eco-route-insight.n3)\n- [Input TriG](../input/eco-route-insight.trig)\n\n## Answer\ninsight status : issue\nshow eco banner : %s\naudience : %s\nallowed use : %s\nsuggested route : %s\ncurrent fuel index : %.2f\nsuggested fuel index : %.2f\nestimated saving : %.2f\nexpires at : %s\nraw data exported : %s\nsignature algorithm : %s\npayload digest : %s\nsignature key : %s\nsignature : %s\n\n## Explanation\nThe current route uses fuel index = distanceKm × (payloadKg / 1000) × gradientFactor. For %s, Current urban route gives %.2f × %.2f × %.2f = %.2f. The policy threshold is %.2f, so a local eco banner is justified. The selected alternative %s gives %.2f × %.2f × %.2f = %.2f, saving %.2f while staying within the ETA delay limit. The signed envelope exposes audience, use, expiry, route suggestion, and compact fuel indices, but not raw payload, GPS trace, driver behavior, or raw telemetry." ?Show ?Audience ?Use ?AltId ?CurrentIndex ?AltIndex ?Saving ?Expiry ?Raw ?Algorithm ?Digest ?Key ?Signature ?ShipmentId ?CurrentDistance ?PayloadTons ?CurrentGradient ?CurrentIndex ?Threshold ?AltId ?AltDistance ?PayloadTons ?AltGradient ?AltIndex ?Saving) string:format ?Block.
38
38
  } => {
39
39
  :ecoRouteInsight log:outputString ?Block.
40
40
  :ecoRouteInsight :issues :Insight.
41
41
  }.
42
42
 
43
- { :ecoRouteInsight :issues ?Insight } log:query { :ecoRouteInsight :issues ?Insight }.
@@ -371,7 +371,7 @@
371
371
  # ARC rendering through log:outputString
372
372
  # --------------------------------------
373
373
 
374
- :out01 log:outputString "=== Answer ===\n" .
374
+ :out01 log:outputString "# flandor\n\n## Source files\n\n- [N3 rules](../flandor.n3)\n\n## Answer\n" .
375
375
  :out02 log:outputString "Name: Flandor\n" .
376
376
  :out03 log:outputString "Region: Flanders\n" .
377
377
  :out04 log:outputString "Metric: regional_retooling_priority\n" .
@@ -392,7 +392,7 @@
392
392
  ("Envelope HMAC-SHA-256: %s\n" ?sig) string:format ?line .
393
393
  } => { :out10 log:outputString ?line . } .
394
394
 
395
- :out11 log:outputString "\n=== Reason Why ===\n" .
395
+ :out11 log:outputString "\n## Reason Why\n" .
396
396
  :out12 log:outputString "Export weakness is active because at least one cluster has exportOrdersIndex < 90 (Antwerp chemicals=84, Ghent manufacturing=87).\n" .
397
397
  :out13 log:outputString "Skills strain is active because technical vacancy rate is 4.6% (threshold > 3.9%).\n" .
398
398
  :out14 log:outputString "Grid stress is active because congestion hours = 19 (threshold > 11).\n" .
@@ -400,7 +400,7 @@
400
400
  :out16 log:outputString "Selected package \"Flandor Retooling Pulse\" covers export=true, skills=true, grid=true, cost=€120M.\n" .
401
401
  :out17 log:outputString "Usage is permitted only for purpose \"regional_stabilization\" and the envelope expires at 2026-04-08T19:00:00+00:00.\n" .
402
402
 
403
- :out18 log:outputString "\n=== Check ===\n" .
403
+ :out18 log:outputString "\n## Check\n" .
404
404
  { :check :payloadHashMatches true . }
405
405
  => { :out19 log:outputString "- PASS: payload hash matches\n" . } .
406
406
  { :check :hmacMatches true . }
@@ -14,6 +14,8 @@
14
14
  @prefix string: <http://www.w3.org/2000/10/swap/string#>.
15
15
  @prefix : <https://example.org/french-cities#>.
16
16
 
17
+ :000_md_title log:outputString "# french-cities\n\n## Source files\n\n- [N3 rules](../french-cities.n3)\n\n" .
18
+
17
19
  # ---------------------------------------------------------------------------
18
20
  # Facts
19
21
  # ---------------------------------------------------------------------------
@@ -128,16 +130,16 @@
128
130
  :check :c1 ?C1; :c2 ?C2; :c3 ?C3; :c4 ?C4.
129
131
  (
130
132
  "French cities — ARC style graph reachability\n\n"
131
- "Answer\n"
133
+ "## Answer\n"
132
134
  ?Outcome "\n\n"
133
- "Reason Why\n"
135
+ "## Reason Why\n"
134
136
  "The original example says that every :oneway link is also a :path, and that :path is transitive. "
135
137
  "So once Angers can reach Nantes directly, longer routes can be built by chaining earlier links. "
136
138
  ?Angers " reaches Nantes directly. "
137
139
  ?LeMans " reaches Nantes through Angers. "
138
140
  ?Chartres " reaches Nantes through Le Mans and Angers. "
139
141
  ?Paris " reaches Nantes through Chartres, Le Mans, and Angers.\n\n"
140
- "Check\n"
142
+ "## Check\n"
141
143
  "C1 " ?C1 "\n"
142
144
  "C2 " ?C2 "\n"
143
145
  "C3 " ?C3 "\n"
@@ -17,6 +17,8 @@
17
17
  @prefix list: <http://www.w3.org/2000/10/swap/list#> .
18
18
  @prefix string: <http://www.w3.org/2000/10/swap/string#> .
19
19
 
20
+ :000_md_title log:outputString "# fundamental-theorem-arithmetic\n\n## Source files\n\n- [N3 rules](../fundamental-theorem-arithmetic.n3)\n\n" .
21
+
20
22
  # --------------
21
23
  # Editable input
22
24
  # --------------
@@ -222,17 +224,17 @@ true .
222
224
  :Check :c6 ?C6.
223
225
  (
224
226
  "Fundamental Theorem of Arithmetic — ARC-style\n\n"
225
- "Answer\n"
227
+ "## Answer\n"
226
228
  "For n = " ?N ", the prime factors are " ?Flat ", the prime-power form is " ?PrimePower
227
229
  ", and the product of these factors is " ?N " with " ?Distinct " distinct primes.\n\n"
228
- "Reason Why\n"
230
+ "## Reason Why\n"
229
231
  "Existence in this run comes from repeated smallest-divisor decomposition: " ?N
230
232
  " factors as " ?Flat ". Each distinct factor is prime. "
231
233
  "For uniqueness up to order, the reverse traversal gives " ?LargestFlat
232
234
  ", and both traversals sort to the same multiset of primes. "
233
235
  "So this concrete case exhibits the Fundamental Theorem of Arithmetic for " ?N
234
236
  ": a prime factorization exists and is unique up to order. The extreme prime factors are " ?Smallest " and " ?Largest ".\n\n"
235
- "Check\n"
237
+ "## Check\n"
236
238
  "C1 " ?C1 "\n"
237
239
  "C2 " ?C2 "\n"
238
240
  "C3 " ?C3 "\n"
@@ -257,4 +257,4 @@
257
257
  ?Best ?Ok ?W ?V ?Gen ) string:format ?Line
258
258
  }
259
259
  log:query
260
- { 1 log:outputString ?Line }.
260
+ { 0 log:outputString "# genetic-algorithm-knapsack\n\n## Source files\n\n- [N3 rules](../genetic-algorithm-knapsack.n3)\n\n". 1 log:outputString ?Line }.
@@ -217,4 +217,4 @@
217
217
  string:format ?Line
218
218
  }
219
219
  log:query
220
- { 1 log:outputString ?Line }.
220
+ { 0 log:outputString "# genetic-algorithm\n\n## Source files\n\n- [N3 rules](../genetic-algorithm.n3)\n\n". 1 log:outputString ?Line }.
@@ -23,10 +23,9 @@
23
23
  :Run :capacity ?Capacity; :localSearchStopsAt :FinalLocal.
24
24
  :FinalLocal :genome ?Genome; :selectedItems ?Items; :weight ?Weight; :value ?Value; :fitness ?Fitness; :generationsEvaluated ?Generations.
25
25
  :ExhaustiveOptimum :genome ?OptGenome; :value ?OptValue.
26
- ("=== Answer ===\nfinal genome : %s\nselected items : %s\nweight : %d / %d\nvalue : %d\nfitness : %d\ngenerations evaluated : %d\nexhaustive optimum value : %d at genome %s\n\n=== Explanation ===\nEach genome bit says whether the corresponding item is selected for the knapsack. Feasible candidates get fitness 1000000 minus value, so higher value means lower fitness; overweight candidates are penalized above every feasible candidate. The N3 source records the deterministic local-search result and validates that the final genome respects capacity and has no strictly better one-bit neighbor. For transparency, an exhaustive enumeration also records the global best feasible value, showing this is a local mutation search rather than a global-optimality claim." ?Genome ?Items ?Weight ?Capacity ?Value ?Fitness ?Generations ?OptValue ?OptGenome) string:format ?Block.
26
+ ("# genetic-knapsack-selection\n\n## Source files\n\n- [N3 rules](../genetic-knapsack-selection.n3)\n- [Input TriG](../input/genetic-knapsack-selection.trig)\n\n## Answer\nfinal genome : %s\nselected items : %s\nweight : %d / %d\nvalue : %d\nfitness : %d\ngenerations evaluated : %d\nexhaustive optimum value : %d at genome %s\n\n## Explanation\nEach genome bit says whether the corresponding item is selected for the knapsack. Feasible candidates get fitness 1000000 minus value, so higher value means lower fitness; overweight candidates are penalized above every feasible candidate. The N3 source records the deterministic local-search result and validates that the final genome respects capacity and has no strictly better one-bit neighbor. For transparency, an exhaustive enumeration also records the global best feasible value, showing this is a local mutation search rather than a global-optimality claim." ?Genome ?Items ?Weight ?Capacity ?Value ?Fitness ?Generations ?OptValue ?OptGenome) string:format ?Block.
27
27
  } => {
28
28
  :geneticKnapsackSelection log:outputString ?Block.
29
29
  :geneticKnapsackSelection :selects :FinalLocal.
30
30
  }.
31
31
 
32
- { :geneticKnapsackSelection :selects ?Candidate } log:query { :geneticKnapsackSelection :selects ?Candidate }.
package/examples/gps.n3 CHANGED
@@ -15,6 +15,8 @@
15
15
  @prefix gps: <https://example.org/gps#>.
16
16
  @prefix : <https://example.org/gps-case#>.
17
17
 
18
+ :000_md_title log:outputString "# gps\n\n## Source files\n\n- [N3 rules](../gps.n3)\n\n" .
19
+
18
20
  # -----
19
21
  # Facts
20
22
  # -----
@@ -105,17 +107,17 @@
105
107
  :routeViaKortrijk :label ?AltLabel; :duration ?AltDur; :cost ?AltCost; :belief ?AltBel; :comfort ?AltComf.
106
108
  (
107
109
  "GPS — Goal driven route planning\n\n"
108
- "Answer\n"
110
+ "## Answer\n"
109
111
  ?Outcome "\n"
110
112
  "Recommended route: " ?BestLabel "\n\n"
111
- "Reason Why\n"
113
+ "## Reason Why\n"
112
114
  "From Gent to Oostende, the planner found two routes in this small map. "
113
115
  "The direct route (" ?BestLabel ") takes " ?BestDur " seconds at cost " ?BestCost
114
116
  ", with belief " ?BestBel " and comfort " ?BestComf ". "
115
117
  "The alternative (" ?AltLabel ") takes " ?AltDur " seconds at cost " ?AltCost
116
118
  ", with belief " ?AltBel " and comfort " ?AltComf ". "
117
119
  "So the direct route is faster, cheaper, more reliable, and slightly more comfortable.\n\n"
118
- "Check\n"
120
+ "## Check\n"
119
121
  "C1 OK - the direct Gent → Brugge → Oostende route was derived.\n"
120
122
  "C2 OK - the alternative Gent → Kortrijk → Brugge → Oostende route was derived.\n"
121
123
  "C3 OK - the recommended route is faster than the alternative.\n"
@@ -22,6 +22,8 @@
22
22
  @prefix string: <http://www.w3.org/2000/10/swap/string#> .
23
23
  @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
24
24
 
25
+ :000_md_title log:outputString "# harborsmr\n\n## Source files\n\n- [N3 rules](../harborsmr.n3)\n\n" .
26
+
25
27
  # -----
26
28
  # Facts
27
29
  # -----
@@ -184,14 +186,14 @@
184
186
  => {
185
187
  :out log:outputString """HarborSMR — bounded flexible-export insight for port electrolysis
186
188
 
187
- Answer
189
+ ## Answer
188
190
  PERMIT
189
191
  The port hydrogen hub may use the SMR insight to run PEM electrolyzer train 2 at 16 MW from 14:00 to 18:00.
190
192
 
191
- Reason Why
193
+ ## Reason Why
192
194
  The operator shares only a narrow, expiring insight that a temporary 18 MW flexible-export window is available. The request is for electrolysis dispatch only, the requested 16 MW fits inside the permitted window, safety margins are above threshold, no outage blocks the window, and the policy forbids redistribution for market resale. Raw reactor telemetry stays local.
193
195
 
194
- Check
196
+ ## Check
195
197
  C1 OK - reserve margin exceeds the dispatch threshold
196
198
  C2 OK - cooling margin exceeds the dispatch threshold
197
199
  C3 OK - no planned outage blocks the window
@@ -0,0 +1,79 @@
1
+ @prefix ex: <http://example.org/ontology-question-generation/domain#> .
2
+ @prefix see: <https://eyereasoner.github.io/eye/reasoning#> .
3
+ @prefix in: <http://example.org/eyeling/input#> .
4
+ @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
5
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
6
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
7
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
8
+
9
+ # A tiny ontology containing common OWL/RDFS patterns from which
10
+ # competency questions can be generated.
11
+
12
+ ex:Person a owl:Class ;
13
+ rdfs:label "person" .
14
+
15
+ ex:Organization a owl:Class ;
16
+ rdfs:label "organization" .
17
+
18
+ ex:Project a owl:Class ;
19
+ rdfs:label "project" .
20
+
21
+ ex:Employee a owl:Class ;
22
+ rdfs:label "employee" ;
23
+ rdfs:subClassOf ex:Person ;
24
+ rdfs:subClassOf [
25
+ a owl:Restriction ;
26
+ owl:onProperty ex:worksFor ;
27
+ owl:someValuesFrom ex:Organization
28
+ ] ;
29
+ rdfs:subClassOf [
30
+ a owl:Restriction ;
31
+ owl:onProperty ex:assignedTo ;
32
+ owl:minCardinality 1
33
+ ] .
34
+
35
+ ex:worksFor a owl:ObjectProperty ;
36
+ rdfs:label "works for" ;
37
+ rdfs:domain ex:Person ;
38
+ rdfs:range ex:Organization ;
39
+ owl:inverseOf ex:employs .
40
+
41
+ ex:employs a owl:ObjectProperty ;
42
+ rdfs:label "employs" ;
43
+ rdfs:domain ex:Organization ;
44
+ rdfs:range ex:Person .
45
+
46
+ ex:assignedTo a owl:ObjectProperty ;
47
+ rdfs:label "assigned to" ;
48
+ rdfs:domain ex:Employee ;
49
+ rdfs:range ex:Project .
50
+
51
+ ex:birthDate a owl:DatatypeProperty, owl:FunctionalProperty ;
52
+ rdfs:label "birth date" ;
53
+ rdfs:domain ex:Person ;
54
+ rdfs:range xsd:date .
55
+
56
+ ex:legalName a owl:DatatypeProperty ;
57
+ rdfs:label "legal name" ;
58
+ rdfs:domain ex:Organization ;
59
+ rdfs:range xsd:string .
60
+
61
+ ex:Organization owl:disjointWith ex:Person .
62
+
63
+ ex:principalEmployer rdfs:subPropertyOf ex:worksFor ;
64
+ rdfs:label "principal employer" .
65
+
66
+ xsd:date a rdfs:Datatype ;
67
+ rdfs:label "date" .
68
+
69
+ xsd:string a rdfs:Datatype ;
70
+ rdfs:label "string" .
71
+
72
+ in:metadata {
73
+ in:run a see:InputDataset .
74
+ in:run see:name "ontology-question-generation" .
75
+ in:run see:title "Ontology Question Generation" .
76
+ in:run see:sourceFile "examples/ontology-question-generation.n3" .
77
+ in:run see:description "Small OWL/RDFS ontology used to generate Markdown competency questions from ontological patterns." .
78
+ in:run see:compiler "Eyeling RDF/TriG input sidecar" .
79
+ }