eyeprolog 1.5.52 → 1.5.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -70,7 +70,7 @@ printf 'human(socrates).\nmortal(X) :- human(X).\n' |
70
70
  - [Introduction to EyeProlog](https://eyereasoner.github.io/eyeprolog/examples/deck/introduction-to-eyeprolog) — short presentation deck for first-time audiences
71
71
  - [Symbiotic Knowledge Graphs](https://eyereasoner.github.io/eyeprolog/examples/deck/symbiotic-knowledge-graphs) — RDF ↔ Prolog heatwave-response demo for human/AI/KG co-evolution
72
72
  - [rdf-prolog-roundtrip](https://github.com/eyereasoner/rdf-prolog-roundtrip) — standalone RDF 1.2 ↔ ISO Prolog bridge used by the RDF examples
73
- - [ISO conformance audit](test/conformance/ISO-COMPLIANCE.md) — supported Part 1 profile
73
+ - [ISO conformance review](test/conformance/ISO-COMPLIANCE.md) — supported Part 1 profile
74
74
  - [Latest Neumerkel conformity](test/conformance/NEUMERKEL-LATEST.md) — tracked result from the current live upstream inventory
75
75
  - [Conformance report](conformance-report.md) — generated executable conformance status, local corpus summary, and known deviations
76
76
  - [Acknowledgements](ACKNOWLEDGEMENTS.md) — funding, standards consulted, and credits for vendored conformance corpora
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.5.52",
6
+ "version": "1.5.54",
7
7
  "description": "EyeProlog turns facts and rules into answers and proofs.",
8
8
  "type": "module",
9
9
  "main": "./index.js",
@@ -1,6 +1,6 @@
1
- # ISO Part 1 built-in mode/error audit
1
+ # ISO Part 1 built-in mode/error review
2
2
 
3
- This matrix turns the broad built-in audit in `ISO-COMPLIANCE.md` into smaller,
3
+ This matrix turns the broad built-in review in `ISO-COMPLIANCE.md` into smaller,
4
4
  release-gated units. The normative baseline is ISO/IEC 13211-1:1995 plus
5
5
  Technical Corrigenda 1:2007, 2:2012, and 3:2017.
6
6
 
@@ -15,7 +15,7 @@ does not infer a universal priority merely from the textual order of an error
15
15
  table.
16
16
 
17
17
  The table is intentionally explicit about what has and has not been closed.
18
- The current audit now covers the complete 8.2-8.17 built-in family at the
18
+ The current review now covers the complete 8.2-8.17 built-in family at the
19
19
  level of prescribed modes, success/failure behavior, individual error
20
20
  conditions, and explicit not-applicable processor branches. Closely related
21
21
  conditions may share a row only when that row names every condition and the
@@ -30,9 +30,9 @@ existing file-based cases remain additional regression evidence.
30
30
  | Clause / predicate | Prescribed row | Status | Executable evidence |
31
31
  | --- | --- | --- | --- |
32
32
  | 8.2.1 `(=)/2` | `?term, ?term`; succeeds/fails according to Prolog unification; no prescribed errors | covered | existing unification corpus and `term_modes_and_ordering` |
33
- | 8.2.2 `unify_with_occurs_check/2` | `?term, ?term`; succeeds/fails and never reports a prescribed error | covered | strict row-audit success assertion plus unification corpus |
33
+ | 8.2.2 `unify_with_occurs_check/2` | `?term, ?term`; succeeds/fails and never reports a prescribed error | covered | strict row-review success assertion plus unification corpus |
34
34
  | 8.2.3 `(\=)/2` | `@term, @term`; succeeds/fails for the defined NSTO cases; no prescribed errors | covered | unification/control corpus |
35
- | Cor.2 8.2.4 `subsumes_term/2` | `@term, @term`; succeeds/fails without binding its arguments; no prescribed errors | covered | strict row-audit success assertion and Corrigendum 2 term-predicate cases |
35
+ | Cor.2 8.2.4 `subsumes_term/2` | `@term, @term`; succeeds/fails without binding its arguments; no prescribed errors | covered | strict row-review success assertion and Corrigendum 2 term-predicate cases |
36
36
 
37
37
  ## 8.3 — type testing
38
38
 
@@ -147,7 +147,7 @@ The Corrigendum 2 additions have the same shape.
147
147
  | 8.8.1 error (c) | private procedure -> access/private-procedure permission error | covered | strict static/private tests |
148
148
  | 8.8.1 error (d) | fixed non-callable Body -> callable type error | covered | strict dynamic `clause(p(_),4)` coverage |
149
149
  | 8.8.1 clause-to-term conversion | source variable goals become `call/1` while preserving sharing with the head | covered | strict `foo(X):-X` -> `clause(foo(C),call(C))`; nested `;/2` and `->/2` regressions |
150
- | 8.8.2 `current_predicate/1` | enumerate/query user-defined predicate indicators, including empty declared procedures | covered | strict row audit and empty-procedure lifetime tests |
150
+ | 8.8.2 `current_predicate/1` | enumerate/query user-defined predicate indicators, including empty declared procedures | covered | strict row review and empty-procedure lifetime tests |
151
151
  | 8.8.2 error (a) | fixed non-predicate-indicator -> predicate-indicator type error | covered | strict `current_predicate(4)` |
152
152
 
153
153
  ## 8.9 — database modification
@@ -301,7 +301,7 @@ The Corrigendum 2 additions have the same shape.
301
301
 
302
302
  | Clause / predicate | Prescribed row | Status | Executable evidence |
303
303
  | --- | --- | --- | --- |
304
- | 8.16.1 `atom_length/2` | atom -> length / check supplied length | covered | `logtalk_atom_length`, strict row audit |
304
+ | 8.16.1 `atom_length/2` | atom -> length / check supplied length | covered | `logtalk_atom_length`, strict row review |
305
305
  | 8.16.1 error: atom variable | required atom unavailable -> instantiation error | covered | strict `atom_length(X,4)` |
306
306
  | 8.16.1 error: atom type | first argument non-atom -> atom type error | covered | strict `atom_length(1.2,4)` |
307
307
  | 8.16.1 error: length type | non-integer length -> integer type error | covered | strict `atom_length(atom,'4')` |
@@ -356,9 +356,9 @@ built-in matrix does not have a gap at 8.17.
356
356
 
357
357
  | Clause / predicate | Prescribed row | Status | Executable evidence |
358
358
  | --- | --- | --- | --- |
359
- | 8.17.1 `set_prolog_flag/2` | set a supported, changeable flag value | covered | strict flag audit |
359
+ | 8.17.1 `set_prolog_flag/2` | set a supported, changeable flag value | covered | strict flag review |
360
360
  | 8.17.1 errors | variable/name type/domain, value type/domain, and non-changeable-flag permission distinctions | covered | `covers the Part 1 flag defaults, value domains, and changeability` plus file-based flag errors |
361
- | 8.17.2 `current_prolog_flag/2` | enumerate/query current standard flags | covered | strict complete flag audit |
361
+ | 8.17.2 `current_prolog_flag/2` | enumerate/query current standard flags | covered | strict complete flag review |
362
362
  | 8.17.2 flag-name type error | fixed non-atom name -> atom type error | covered | strict `current_prolog_flag(1,_)` |
363
363
  | 8.17.2 unknown-flag domain error | fixed unsupported flag name -> Prolog-flag domain error | covered | strict `current_prolog_flag(no_such_iso_flag,_)` |
364
364
  | 8.17.3 `halt/0` | terminate with implementation-defined successful host status | covered | `halt` conformance case / host runner tests |
@@ -368,10 +368,10 @@ built-in matrix does not have a gap at 8.17.
368
368
 
369
369
  ## Closure note
370
370
 
371
- The built-in **8.2-8.17 row audit is complete** at the level tracked by this
371
+ The built-in **8.2-8.17 row review is complete** at the level tracked by this
372
372
  file: prescribed modes, success/failure behavior, individual error conditions,
373
373
  and conditional/not-applicable processor branches all have explicit outcomes.
374
- “Row audit” means condition-by-condition accounting; it does not promise one
374
+ “Row review” means condition-by-condition accounting; it does not promise one
375
375
  Markdown table row per condition when a grouped row enumerates them all.
376
376
  ISO 7.12 simultaneous-error selection remains an implementation-dependent
377
377
  processor choice unless more specific normative text constrains it.
@@ -1,6 +1,6 @@
1
1
  # ISO/IEC 13211-1 compliance ledger
2
2
 
3
- This ledger is the release-facing audit and high-level coverage map for
3
+ This ledger is the release-facing review and high-level coverage map for
4
4
  EyeProlog's ISO/IEC 13211-1 core. The normative baseline is ISO/IEC 13211-1:1995
5
5
  together with Technical Corrigenda 1:2007, 2:2012, and 3:2017. Detailed
6
6
  row-level evidence lives only where it adds information: the built-in, processor,
@@ -11,13 +11,13 @@ published-Corrigenda, WG17-syntax, and STC draft ledgers in this directory. The
11
11
  The ledger deliberately does **not** claim independent certification. A row
12
12
  marked `covered` means EyeProlog has implementation and executable tests for
13
13
  that family, an explicit disposition for every requirement accounted for by
14
- the linked audit rows, and no known open defect in the listed behavior. An
15
- audit row may group closely related modes or error conditions, but it must name
14
+ the linked review rows, and no known open defect in the listed behavior. An
15
+ review row may group closely related modes or error conditions, but it must name
16
16
  each grouped condition and its evidence; `covered` does not imply one Markdown
17
17
  row per occurrence of the word `shall`. A row marked
18
- `audit` means the family is implemented and tested, but the project has not yet
18
+ `review` means the family is implemented and tested, but the project has not yet
19
19
  mapped every normative `shall`, option combination, prescribed error, and
20
- relevant implementation-dependent overlap choice to an explicit audit outcome.
20
+ relevant implementation-dependent overlap choice to an explicit review outcome.
21
21
 
22
22
  ## Processor compliance requirements
23
23
 
@@ -26,7 +26,7 @@ relevant implementation-dependent overlap choice to an explicit audit outcome.
26
26
  | 5.1(a) prepare conforming Prolog text | covered | Clause 6 token/term production and rejection families are mapped by the strict production gate and the complete 366-case vendored WG17 syntax matrix; 7.4 preparation/directive behavior is separately closed. |
27
27
  | 5.1(b) execute conforming Prolog goals | covered | Clause 7 term/control/execution semantics, the higher-level 7.10 stream model, 7.11 flags, the 7.12 error envelope, all 8.2-8.17 built-in rows, and Clause 9 arithmetic have explicit executable dispositions. |
28
28
  | 5.1(c) reject nonconforming text/read-terms | covered | WG17 negative syntax cases, focused malformed-production/escape/comment/operator cases, read-term syntax errors, and strict rejection of implementation-specific syntax provide explicit rejection evidence across the Clause 6 families. |
29
- | 5.1(d) document permitted variations | covered | The clause-by-clause [ISO 5.4 decision index](ISO-IMPLEMENTATION-DEFINED.md) records every explicit implementation-defined decision found in the Part 1 + Corrigenda baseline and separately inventories implementation-specific extension families. The index retains an `audit gap` category for future discoveries; no current release-facing row depends on one. |
29
+ | 5.1(d) document permitted variations | covered | The clause-by-clause [ISO 5.4 decision index](ISO-IMPLEMENTATION-DEFINED.md) records every explicit implementation-defined decision found in the Part 1 + Corrigenda baseline and separately inventories implementation-specific extension families. The index retains an `gap` category for future discoveries; no current release-facing row depends on one. |
30
30
  | 5.1(e) offer a strictly conforming mode | covered | `--iso-strict` and API option `isoStrict: true` restrict the processor to the Part 1 + Corrigenda 1-3 core language surface, remove EyeProlog-only registry/flag/operator features, reject explicit tabling and other normal-profile extensions, and reject the normal-profile host `stringTerm(Text)` term type at strict program/goal entry. |
31
31
  | 5.4 accompanying documentation | covered | *The Art of EyeProlog* remains the implementation reference; [ISO-IMPLEMENTATION-DEFINED.md](ISO-IMPLEMENTATION-DEFINED.md) is the closed clause-by-clause 5.4 decision index and points each decision to implementation evidence. |
32
32
  | 5.5 extension boundaries | covered | [ISO-PROCESSOR-REQUIREMENTS.md](ISO-PROCESSOR-REQUIREMENTS.md) gives an explicit disposition for every 5.5 extension hook. The Clause 6 cross-profile gate verifies that normal-mode syntax extensions do not reinterpret standard text accepted by the strict reader. |
@@ -40,21 +40,21 @@ relevant implementation-dependent overlap choice to an explicit audit outcome.
40
40
  | 7.4 — Prolog text and directives | covered | [ISO-PROLOG-TEXT-EXECUTION-MATRIX.md](ISO-PROLOG-TEXT-EXECUTION-MATRIX.md) closes the preparation/directive rows: declaration semantics, source clauses, cross-text operators/character conversion/flags, initialization order/lifetime, `include/1`, and one-time `ensure_loaded/1`, with implementation-defined cross-text choices indexed under 5.4. |
41
41
  | 7.5-7.6 — database and term/clause conversion | covered | [ISO-PROLOG-TEXT-EXECUTION-MATRIX.md](ISO-PROLOG-TEXT-EXECUTION-MATRIX.md) closes static/dynamic and private/public procedure semantics, clause order, logical-update visibility, empty/unknown lifetime, and term/body/clause conversion. Source and runtime assertion conversion recurse through `,/2`, `;/2`, and `->/2`, preserve variable identity, and protect standardized static/control procedures. |
42
42
  | 7.7 — execution and backtracking | covered | [ISO-PROLOG-TEXT-EXECUTION-MATRIX.md](ISO-PROLOG-TEXT-EXECUTION-MATRIX.md) closes ordinary clause selection/backtracking, source/database order, empty-versus-unknown procedures, logical-update visibility, and strict dispatch. The normal-profile `table` declaration, `tnot/1`, and recursive numeric shortcuts remain outside the strict profile. |
43
- | 7.8 — control constructs and exceptions | covered | [ISO-PROLOG-TEXT-EXECUTION-MATRIX.md](ISO-PROLOG-TEXT-EXECUTION-MATRIX.md) closes `true/0`, `fail/0`, `call/1`, cut, conjunction, disjunction, if-then(-else), and `catch/3`/`throw/1`, including Corrigendum 2 catchability of errors arising from the protected goal and Corrigendum 3 term-to-body conversion at `call/1` entry; the regression suite pins the resulting cut scope when an initially unbound variable goal later becomes `!`. The 8.15 built-in additions remain independently row-audited. |
44
- | 7.9 — expression evaluation | covered | [ISO-EVALUABLE-FUNCTOR-MATRIX.md](ISO-EVALUABLE-FUNCTOR-MATRIX.md) closes recursive evaluation, direct-variable precedence, corrected non-evaluable `F/N` errors (including STC #69), operand template/type rules, mixed arithmetic-comparison conversion, exceptional values, and finite-host resource normalization. The audit also fixes float-only `float_integer_part/1` and `float_fractional_part/1` so even huge valid integers reach `type_error(float,...)` before any I->F overflow. |
45
- | 7.10 — input/output concepts | covered | Higher-level stream semantics are pinned for non-atom ground stream terms, alias lifetime, current/target stream selection and fallback, write truncation, append positioning, contradictory stream options, exact binary round-tripping, flushing, standard-stream close behavior, and repositioned overwrite. Term-output spelling is also checked lexically where ISO distinguishes token forms: Corrigendum 2 bar operators are written with bare `|`, ordinary atom/functor `|` remains quoted, and the semicolon name token is emitted bare by canonical output. The complete 8.11-8.14 built-in mode/error family remains row-audited in [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md), while all implementation-defined stream choices are indexed in [ISO-IMPLEMENTATION-DEFINED.md](ISO-IMPLEMENTATION-DEFINED.md). |
43
+ | 7.8 — control constructs and exceptions | covered | [ISO-PROLOG-TEXT-EXECUTION-MATRIX.md](ISO-PROLOG-TEXT-EXECUTION-MATRIX.md) closes `true/0`, `fail/0`, `call/1`, cut, conjunction, disjunction, if-then(-else), and `catch/3`/`throw/1`, including Corrigendum 2 catchability of errors arising from the protected goal and Corrigendum 3 term-to-body conversion at `call/1` entry; the regression suite pins the resulting cut scope when an initially unbound variable goal later becomes `!`. The 8.15 built-in additions remain independently row-reviewed. |
44
+ | 7.9 — expression evaluation | covered | [ISO-EVALUABLE-FUNCTOR-MATRIX.md](ISO-EVALUABLE-FUNCTOR-MATRIX.md) closes recursive evaluation, direct-variable precedence, corrected non-evaluable `F/N` errors (including STC #69), operand template/type rules, mixed arithmetic-comparison conversion, exceptional values, and finite-host resource normalization. The review also fixes float-only `float_integer_part/1` and `float_fractional_part/1` so even huge valid integers reach `type_error(float,...)` before any I->F overflow. |
45
+ | 7.10 — input/output concepts | covered | Higher-level stream semantics are pinned for non-atom ground stream terms, alias lifetime, current/target stream selection and fallback, write truncation, append positioning, contradictory stream options, exact binary round-tripping, flushing, standard-stream close behavior, and repositioned overwrite. Term-output spelling is also checked lexically where ISO distinguishes token forms: Corrigendum 2 bar operators are written with bare `|`, ordinary atom/functor `|` remains quoted, and the semicolon name token is emitted bare by canonical output. The complete 8.11-8.14 built-in mode/error family remains row-reviewed in [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md), while all implementation-defined stream choices are indexed in [ISO-IMPLEMENTATION-DEFINED.md](ISO-IMPLEMENTATION-DEFINED.md). |
46
46
  | 7.11 — flags | covered | The complete Part 1 flag set, selected defaults, standard value domains, changeability, `current_prolog_flag/2`, and `set_prolog_flag/2` error behavior have dedicated strict tests. EyeProlog selects `bounded=false` and `integer_rounding_function=toward_zero`; valid alternative values of those fixed flags reach `permission_error(modify,flag,...)`, while `max_integer` and `min_integer` have no current value. STC #70 is recorded explicitly: EyeProlog has no separate finite procedure-arity ceiling, so the optional `max_procedure_arity` flag is absent while `max_arity` remains `unbounded`. Strict mode excludes the EyeProlog `occurs_check` extension. |
47
47
  | 7.12 — errors | covered | The strict error-envelope gate exercises instantiation, type, domain, existence, permission, representation, evaluation, resource, syntax, and system errors through `error(Error, Context)`. Built-in rows provide the individual prescribed conditions, implementation-defined representation/context choices are documented, and simultaneous-error regressions pin deterministic EyeProlog choices without treating textual table order as normative. |
48
- | 8.2-8.17 — built-in predicates | covered | [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md) accounts for the complete Part 1 + Corrigenda built-in family across prescribed modes, success/failure behavior, individual error conditions, and conditional/not-applicable branches. Closely related conditions may share a row when every condition and its executable evidence are named. The audit exposed and fixed source/runtime 7.6.2 body conversion/variable sharing, strict host-string leakage, input-code error timing, `close/2` force handling, and closed-stream `stream_property/2` behavior. Simultaneous-error choices are documented as implementation dependent under 7.12 unless separately constrained. |
48
+ | 8.2-8.17 — built-in predicates | covered | [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md) accounts for the complete Part 1 + Corrigenda built-in family across prescribed modes, success/failure behavior, individual error conditions, and conditional/not-applicable branches. Closely related conditions may share a row when every condition and its executable evidence are named. The review exposed and fixed source/runtime 7.6.2 body conversion/variable sharing, strict host-string leakage, input-code error timing, `close/2` force handling, and closed-stream `stream_property/2` behavior. Simultaneous-error choices are documented as implementation dependent under 7.12 unless separately constrained. |
49
49
  | Clause 9 — evaluable functors | covered | [ISO-EVALUABLE-FUNCTOR-MATRIX.md](ISO-EVALUABLE-FUNCTOR-MATRIX.md) records the published Part 1 + Corrigenda arithmetic templates and exceptional branches across 9.1, 9.3, and 9.4. It pins the unbounded integer model, `rndI`/`rndF`/`resultF` choices, float-only conversion rules, I->F overflow, explicit `exp/1` and power underflow, Corrigendum 2 additions and mixed-type `max/2`/`min/2` implementation-dependent choice, Corrigendum 3 negative-power correction, signed bitwise/shift choices, and resource-error translation. Post-N289 STC #75 remains a separately tracked draft proposal rather than a silent change to the published baseline. |
50
50
  | Corrigendum 1 | covered | [ISO-CORRIGENDA-MATRIX.md](ISO-CORRIGENDA-MATRIX.md) dispositions every amendment cluster, including the square-root boundary, double-quoted operator atoms, typed expression errors, clause/operator enumeration, and atomic-conversion corrections; editorial items and the later-superseded set-order example are identified explicitly. |
51
51
  | Corrigendum 2 | covered | [ISO-CORRIGENDA-MATRIX.md](ISO-CORRIGENDA-MATRIX.md) tracks the bar/operator changes, new predicates and evaluable functors, catch and uninstantiation corrections, atomic-conversion errors, and every other amendment cluster to executable evidence or an explicit editorial disposition. |
52
52
  | Corrigendum 3 | covered | [ISO-CORRIGENDA-MATRIX.md](ISO-CORRIGENDA-MATRIX.md) tracks option-extension/error rules, final layout, term-to-body conversion, metadata traversal, writing rules, stream/built-in corrections, and negative integer powers; editorial changes are dispositioned separately. |
53
53
 
54
- ## Conformance corrections and audit closure
54
+ ## Conformance corrections and review closure
55
55
 
56
- The audit against the licensed Part 1 text and Corrigenda closed two
57
- concrete mismatches that are now part of the closed Part 1 audit:
56
+ The review against the licensed Part 1 text and Corrigenda closed two
57
+ concrete mismatches that are now part of the closed Part 1 review:
58
58
 
59
59
  - `bounded=false` no longer exposes implementation-specific `unbounded` values
60
60
  for `max_integer` or `min_integer`; the corresponding
@@ -63,7 +63,7 @@ concrete mismatches that are now part of the closed Part 1 audit:
63
63
  when the `char_conversion` flag is `on`, leaves quoted characters unchanged,
64
64
  and feeds the same mapping into execution-time term input.
65
65
 
66
- A follow-on audit made the processor-character-set/collation choices explicit.
66
+ A follow-on review made the processor-character-set/collation choices explicit.
67
67
  A follow-up processor-character-set review corrected an over-strict interpretation: because PCS membership
68
68
  and extended-character classification are implementation defined by Part 1,
69
69
  `--iso-strict` must not replace EyeProlog's ordinary processor choice. Both
@@ -75,7 +75,7 @@ without changing these implementation-defined character choices. The complete
75
75
  WG17 syntax matrix remains a release gate.
76
76
 
77
77
 
78
- The subsequent arity audit originally selected a finite `max_arity=65535`, but
78
+ The subsequent arity review originally selected a finite `max_arity=65535`, but
79
79
  the post-Corrigendum STC arity review exposed that as the wrong
80
80
  abstraction: Part 1 `max_arity` is the maximum arity of **compound terms**, not
81
81
  a procedure-arity limit. EyeProlog now again selects `max_arity=unbounded` and
@@ -88,10 +88,10 @@ database update errors, and Corrigendum 3 variable metadata traversal/write
88
88
  naming.
89
89
 
90
90
  The public WG17 `number_chars/2` comparison used in preparation of Corrigendum
91
- 2 has additionally been checked during the audit. It remains supporting review
91
+ 2 has additionally been checked during the review. It remains supporting review
92
92
  evidence rather than a duplicated vendored corpus or release criterion.
93
93
 
94
- The flag and term-I/O audit closes the Part 1 flag family and tightens the 8.14
94
+ The flag and term-I/O review closes the Part 1 flag family and tightens the 8.14
95
95
  term-I/O/operator error rules. The strict flag registry now distinguishes a
96
96
  standard value that is valid but not selectable from a value outside the
97
97
  standard domain: attempts to change fixed `bounded` or
@@ -105,7 +105,7 @@ the Part 1 plus Corrigendum 3 option surface; the normal-profile
105
105
  implementation-specific EyeProlog extensions.
106
106
 
107
107
 
108
- The preparation, stream, conversion, sorting, and arithmetic audit expands the coverage into Prolog-text,
108
+ The preparation, stream, conversion, sorting, and arithmetic review expands the coverage into Prolog-text,
109
109
  stream, atomic-conversion, sorting, and arithmetic edge cases. Strict
110
110
  preparation now enforces the Part 1 declaration constraints for `dynamic/1`,
111
111
  `multifile/1`, and `discontiguous/1`, including cross-text multifile use and
@@ -115,7 +115,7 @@ requirements, and tightens creation, truncation/append, repositioning, flush,
115
115
  EOF, close, and current-stream behavior. Corrigendum 2 `keysort/2` variable and
116
116
  non-pair errors are corrected. Strict arithmetic no longer exposes the
117
117
  EyeProlog-only evaluable atom `e`, while the Corrigendum arithmetic additions
118
- remain available. These corrections are retained as regression evidence inside the closed shall-by-shall/error-condition audit.
118
+ remain available. These corrections are retained as regression evidence inside the closed shall-by-shall/error-condition review.
119
119
 
120
120
  The next Corrigendum 2 pass closed the prescribed `call/2..8` max-arity
121
121
  branch for processors with a finite `max_arity`, and corrected reverse
@@ -150,7 +150,7 @@ operation, so an integer outside the selected finite binary64 range reports
150
150
  result. The explicit underflow clauses for `exp/1`, Part 1 `**/2`, and
151
151
  Corrigendum 2 `^/2` are enforced even though EyeProlog retains the
152
152
  implementation-defined `round(x)` choice for generic `resultF` arithmetic. The
153
- power audit also preserves the specified negative-base and zero/negative
153
+ power review also preserves the specified negative-base and zero/negative
154
154
  exception conditions before any later I->F overflow, including Corrigendum 3's
155
155
  correction to the `**/2` operand wording and Corrigendum 2's distinct rule that
156
156
  `^/2` may accept an integer-valued float exponent.
@@ -170,8 +170,8 @@ The row-level matrices make the exit criteria concrete rather than leaving confo
170
170
  [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md) now records
171
171
  each prescribed mode/error row for the 8.2-8.5 and 8.15-8.17 slices, and
172
172
  [ISO-PROCESSOR-REQUIREMENTS.md](ISO-PROCESSOR-REQUIREMENTS.md) decomposes the
173
- Clause 5 obligations into covered, audit, and not-applicable decisions. While
174
- doing that mapping, the 7.6.2 term-to-clause conversion audit exposed a runtime
173
+ Clause 5 obligations into covered, review, and not-applicable decisions. While
174
+ doing that mapping, the 7.6.2 term-to-clause conversion review exposed a runtime
175
175
  assertion defect: variables and invalid terms nested under `;/2` or `->/2` were
176
176
  not being recursively converted. `asserta/1` and `assertz/1` now convert all
177
177
  three standardized binary control forms `,/2`, `;/2`, and `->/2` recursively,
@@ -189,7 +189,7 @@ a sixth term type in the Part 1 strict execution domain.
189
189
 
190
190
  A row-level 8.6-8.10 pass then turns arithmetic predicates, clause/database
191
191
  operations, and all-solutions predicates into explicit mode/error-condition
192
- entries. During that audit, strict source preparation exposed a 7.6.2 defect:
192
+ entries. During that review, strict source preparation exposed a 7.6.2 defect:
193
193
  a clause such as `foo(X) :- X.` was executed as a variable goal but was not
194
194
  stored in the converted `call(X)` form, so `clause(foo(C),call(C))` and the
195
195
  corresponding `retract/1` pattern lost the required head/body variable identity.
@@ -199,7 +199,7 @@ also records the 7.12 rule for simultaneous errors, so deterministic overlap
199
199
  tests are treated as processor choices unless more specific normative text
200
200
  constrains them.
201
201
 
202
- The subsequent 8.11-8.14 pass completes the built-in row audit. Stream
202
+ The subsequent 8.11-8.14 pass completes the built-in row review. Stream
203
203
  selection/control, character/code input and output, byte I/O, term I/O,
204
204
  operators, and character conversion now each have explicit success/mode and
205
205
  individual-error outcomes in `ISO-BUILTIN-MODE-ERROR-MATRIX.md`. During this
@@ -211,7 +211,7 @@ still a `domain_error(stream, ...)`. The higher-level Clause 6, 7.10, and 7.12 g
211
211
  ## Post-Corrigendum STC cross-check
212
212
 
213
213
  The public WG17 STC draft is tracked as useful defect-discovery material, but it
214
- is not silently treated as a fourth published Corrigendum. The current audit
214
+ is not silently treated as a fourth published Corrigendum. The current review
215
215
  confirms EyeProlog already has the behavior implicated by the substantive STC
216
216
  items on negative-number layout/operator syntax, arithmetic instantiation
217
217
  precedence, EOF actions/end tokens, character/code/byte output error overlap,
@@ -297,9 +297,9 @@ conformance outputs are never auto-accepted.
297
297
 
298
298
  ## Exit criteria for a full conformance claim
299
299
 
300
- The Part 1 audit is closed by explicit dispositions, not by a test-count threshold.
300
+ The Part 1 review is closed by explicit dispositions, not by a test-count threshold.
301
301
  The table below records the closure criteria used by the project. A `covered`
302
- status is an implementation/audit result, not an independent certification. Public
302
+ status is an implementation/review result, not an independent certification. Public
303
303
  post-N289 STC drafts remain review input until standardized.
304
304
 
305
305
  | Criterion | Status | Evidence |
@@ -315,7 +315,7 @@ post-N289 STC drafts remain review input until standardized.
315
315
  | Current post-N289 draft is tracked without silently changing the published baseline | covered | `STC-DRAFT-STATUS.md` tracks reviewed draft items separately from normative requirements |
316
316
  | Latest Neumerkel conformity is a live release gate | covered | `npm test` fetches and executes the seven current TU Wien conformity sources with dynamic inventories; the vendored WG17 matrix remains an offline reviewed-outcome regression layer |
317
317
  | Third-party standard-core regression provenance is retained | covered | adapted Logtalk, Scryer, Trealla, and SWI-Prolog cases retain source identifiers and licenses in `THIRD_PARTY.md` |
318
- | No unexplained deviation remains in the release-facing ledger | covered | the release-facing ledger contains no remaining `audit` rows; documented variation points are implementation-defined/specific or draft-only rather than unexplained deviations. |
318
+ | No unexplained deviation remains in the release-facing ledger | covered | the release-facing ledger contains no remaining `review` rows; documented variation points are implementation-defined/specific or draft-only rather than unexplained deviations. |
319
319
 
320
320
  The specialized row matrices are evidence for this ledger, not separate public
321
321
  status documents. *The Art of EyeProlog* remains the implementation reference.
@@ -1,4 +1,4 @@
1
- # ISO/IEC 13211-1 published Corrigenda audit
1
+ # ISO/IEC 13211-1 published Corrigenda review
2
2
 
3
3
  This matrix records every amendment cluster in Technical Corrigenda 1:2007,
4
4
  2:2012, and 3:2017 against EyeProlog's published Part 1 baseline. It separates
@@ -7,24 +7,24 @@ from text superseded by a later Corrigendum. A `covered` behavior row names
7
7
  executable evidence; an `editorial` row records that no processor behavior was
8
8
  changed; a `superseded` row points to the later published amendment.
9
9
 
10
- The stable audit IDs are checked by the documentation regression suite. They
10
+ The stable review IDs are checked by the documentation regression suite. They
11
11
  make omission detectable without reproducing the licensed standard text here.
12
12
 
13
13
  ## Technical Corrigendum 1:2007
14
14
 
15
- | Audit ID | Clauses / amendment cluster | Disposition | EyeProlog evidence |
15
+ | Review ID | Clauses / amendment cluster | Disposition | EyeProlog evidence |
16
16
  | --- | --- | --- | --- |
17
17
  | C1-01 | 3.106, 3.108, 3.125, 3.148 terminology and typography | editorial | Definitions/source typography; no processor behavior changes. |
18
18
  | C1-02 | 4.1.3.5 non-negative square-root axiom | covered | Strict test `pins behavior-changing Technical Corrigendum 1 corrections` checks `sqrt(0)`. |
19
19
  | C1-03 | 6.3.7 priority of a double-quoted atom that names an operator | covered | Same strict test plus `iso/corrigendum1_double_quote_operator`. |
20
20
  | C1-04 | 7.2.5 compound-term ordering wording | editorial | The corrected condition is represented by the Clause 7.2 standard-order tests. |
21
- | C1-05 | 7.8.5.4, table 35, and 7.8.8.4 control-model/example corrections | editorial | Corrected notation; conjunction and if-then-else behavior is independently covered by the strict 7.8 audit. |
21
+ | C1-05 | 7.8.5.4, table 35, and 7.8.8.4 control-model/example corrections | editorial | Corrected notation; conjunction and if-then-else behavior is independently covered by the strict 7.8 review. |
22
22
  | C1-06 | 7.9.2 integer- and float-operand type errors | covered | Strict Clause 7.9 tests exercise integer-only and float-only templates. |
23
23
  | C1-07 | 7.12.2 representation-error metavariable capitalization | editorial | Error-term representation is covered by the 7.12 envelope; this amendment changes notation only. |
24
24
  | C1-08 | 8.8.1.1 selected `clause/2` result is unified with head/body | covered | Strict test `pins behavior-changing Technical Corrigendum 1 corrections`. |
25
25
  | C1-09 | 8.9.4.1 `abolish/1` note wording | editorial | Singular/plural note correction only. |
26
26
  | C1-10 | 8.10.3.4 set-order example | superseded | Corrigendum 3 explicitly restores the original example; current behavior follows Corrigendum 3. |
27
- | C1-11 | 8.13.3.4 `put_byte/1-2` example values | editorial | Examples corrected; byte-output semantics are covered by the strict 8.13 audit. |
27
+ | C1-11 | 8.13.3.4 `put_byte/1-2` example values | editorial | Examples corrected; byte-output semantics are covered by the strict 8.13 review. |
28
28
  | C1-12 | 8.14.1.4 input-stream names and post-syntax-error example state | editorial | Examples corrected; read-stream behavior is covered by strict term-I/O tests. |
29
29
  | C1-13 | 8.14.4.1 selected `current_op/3` result is unified with its arguments | covered | Strict test `pins behavior-changing Technical Corrigendum 1 corrections`. |
30
30
  | C1-14 | 8.16.4 `atom_chars/2` accepts a matching supplied list prefix | covered | Strict test `pins behavior-changing Technical Corrigendum 1 corrections`. |
@@ -35,7 +35,7 @@ make omission detectable without reproducing the licensed standard text here.
35
35
 
36
36
  ## Technical Corrigendum 2:2012
37
37
 
38
- | Audit ID | Clauses / amendment cluster | Disposition | EyeProlog evidence |
38
+ | Review ID | Clauses / amendment cluster | Disposition | EyeProlog evidence |
39
39
  | --- | --- | --- | --- |
40
40
  | C2-01 | 6.3.4, 6.4, 6.5 bar token/operator rules and protected `[]`/`{}` operators | covered | WG17 lexical output cases, `corrigenda_bar_operator`, and strict `op/3` tests. |
41
41
  | C2-02 | 6.3.4.4 predefined unary plus and `div` operators | covered | Strict predefined-operator and arithmetic tests. |
@@ -53,7 +53,7 @@ make omission detectable without reproducing the licensed standard text here.
53
53
  | C2-14 | 8.9.3 static `retract/1` uses modify permission | covered | Strict database predicate error tests. |
54
54
  | C2-15 | 8.9.5 `retractall/1` | covered | Strict lifetime/error tests and `corrigenda_retractall`. |
55
55
  | C2-16 | 8.11.5 non-variable `open/4` stream result | covered | Strict uninstantiation-error test. |
56
- | C2-17 | 8.14.3 protected operator priority/specifier combinations | covered | Strict `op/3` row audit and bar-operator cases. |
56
+ | C2-17 | 8.14.3 protected operator priority/specifier combinations | covered | Strict `op/3` row review and bar-operator cases. |
57
57
  | C2-18 | 8.15.4 `call/2..8` and implementation-dependent higher arities | covered | Strict closure expansion, error, and selected ceiling tests. |
58
58
  | C2-19 | 8.15.5 `false/0` | covered | Strict registry, execution, and static-procedure protection tests. |
59
59
  | C2-20 | 8.16.4-8.16.8 atomic/number conversion partial-list errors | covered | Individual strict mode/error assertions for all four predicates. |
@@ -63,7 +63,7 @@ make omission detectable without reproducing the licensed standard text here.
63
63
 
64
64
  ## Technical Corrigendum 3:2017
65
65
 
66
- | Audit ID | Clauses / amendment cluster | Disposition | EyeProlog evidence |
66
+ | Review ID | Clauses / amendment cluster | Disposition | EyeProlog evidence |
67
67
  | --- | --- | --- | --- |
68
68
  | C3-01 | 5.5.12 implementation-specific options and their error classification | covered | Strict option surfaces reject normal-only options and exercise variable/domain distinctions. |
69
69
  | C3-02 | 6.2.1 optional final layout text | covered | Strict test `pins behavior-changing Technical Corrigendum 3 corrections`. |
@@ -1,6 +1,6 @@
1
- # ISO Part 1 expression/evaluable-functor audit matrix
1
+ # ISO Part 1 expression/evaluable-functor coverage matrix
2
2
 
3
- This file is the row-level audit for Part 1 Clause 7.9 and Clause 9, including
3
+ This file is the row-level review for Part 1 Clause 7.9 and Clause 9, including
4
4
  the arithmetic additions and corrections in Technical Corrigenda 1-3. It is
5
5
  paired with the strict regression named `closes the ISO 7.9 and Clause 9
6
6
  evaluable-functor rows`.
@@ -7,7 +7,7 @@ pages at complang.tuwien.ac.at are useful review input, but draft proposals are
7
7
  not silently treated as normative changes to that licensed baseline.
8
8
 
9
9
  [*The Art of EyeProlog*](../../the-art-of-eyeprolog.md) remains the single
10
- implementation reference. This file is an audit index: it identifies each
10
+ implementation reference. This file is an review index: it identifies each
11
11
  explicitly implementation-defined decision in Part 1, states the EyeProlog
12
12
  choice, and points to the implementation boundary that realizes it. Repeated
13
13
  references to the same decision are folded into one row. Requirements that the
@@ -19,7 +19,7 @@ Status values are:
19
19
  - **defined** — the current behavior is implemented and stated here;
20
20
  - **not applicable** — the standard decision is conditional and the condition
21
21
  is false for EyeProlog's selected profile;
22
- - **audit gap** — retained for any future implementation-defined choice whose
22
+ - **gap** — retained for any future implementation-defined choice whose
23
23
  code/documentation boundary is still unresolved. Open *normative* shall-by-
24
24
  shall work is tracked separately in `ISO-COMPLIANCE.md`.
25
25
 
@@ -131,10 +131,9 @@ Normal mode provides documented module and DCG compatibility profiles whose
131
131
  features overlap standardized Part 2 and Part 3 facilities. They are extensions
132
132
  relative to the Part 1 strict-core boundary and are tested separately; this
133
133
  ledger does not assert complete Part 2 or Part 3 conformance. The concrete
134
- compatibility boundary, including the normal-profile `phrase/2-3` terminal-sequence
135
- error choice, is recorded in `ISO-PART2-PART3-SCOPE.md`. The requirements
136
- clarified by the 2013 Part 2 amendment are tracked separately in the executable
137
- `ISO-PART2-AMENDMENT-2013.md` ledger.
134
+ per-directive and per-predicate boundary is recorded in `ISO-PART2.md` and
135
+ `ISO-PART3.md`, including the 2013 module-amendment evidence and the
136
+ normal-profile `phrase/2-3` terminal-sequence error choice.
138
137
 
139
138
  ## Important implementation-dependent behavior (not the 5.4 mandatory table)
140
139
 
@@ -0,0 +1,117 @@
1
+ # ISO/IEC 13211-2:2000 (Modules) — implementation status
2
+
3
+ This document records, predicate by predicate and directive by directive, what
4
+ EyeProlog implements of Prolog Part 2 (Modules). It is a status ledger, not a
5
+ conformance claim.
6
+
7
+ **EyeProlog does not claim Part 2 conformance.** What normal mode provides is a
8
+ procedure-oriented module *compatibility layer* built around the widespread
9
+ Quintus-style syntax. The ISO interface/body directive surface is not
10
+ implemented. `--iso-strict` targets Part 1 + Corrigenda 1-3 only and excludes
11
+ module directives and the `:` operator entirely.
12
+
13
+ ## Interface and body directives (ISO form)
14
+
15
+ Part 2 separates a module *interface* from one or more module *bodies*. None of
16
+ this surface is implemented; EyeProlog accepts only the compatibility syntax in
17
+ the next section.
18
+
19
+ | Directive | Part 2 role | Status |
20
+ | --- | --- | --- |
21
+ | `module/1` | begin the interface for a named module | **not implemented** |
22
+ | `export/1` | export locally defined procedures | **not implemented** |
23
+ | `reexport/2` | selectively import from another module and export again | **not implemented** |
24
+ | `reexport/1` | re-export the exports of named modules | **not implemented** |
25
+ | `metapredicate/1` | declare and export context-sensitive procedures (ISO spelling, no underscore) | **not implemented** |
26
+ | `op/3` in an interface | initial operators for this module's bodies only | **not implemented** — operator state is global |
27
+ | `char_conversion/2` in an interface | initial character conversions for this module's bodies only | **not implemented** — conversion state is global |
28
+ | `set_prolog_flag/2` in an interface | initial flag values for this module's bodies only | **not implemented** — flag state is global |
29
+ | `end_module/1` | end the interface | **not implemented** |
30
+ | `body/1` | begin a body of an already interfaced module | **not implemented** |
31
+ | `import/2` | selectively import exported procedures | **not implemented** |
32
+ | `import/1` | import all exports of named modules | **not implemented** |
33
+ | `end_body/1` | end the module body | **not implemented** |
34
+
35
+ ## Compatibility directives (what EyeProlog actually accepts)
36
+
37
+ | Directive | Status | Notes |
38
+ | --- | --- | --- |
39
+ | `module/2` | **implemented** | `:- module(Name, Exports).` Records the named module and its export map. Non-terminal indicators `A//N` are accepted in the export list. |
40
+ | `use_module/1` | **implemented** | Imports the full export map of the source module. |
41
+ | `use_module/2` | **implemented** | Selective import, validated against the source module's exports. |
42
+ | `meta_predicate/1` | **implemented** | Both `:- meta_predicate p(:).` and the parenthesized spelling. Numeric closure modes are a further EyeProlog extension. |
43
+ | `ensure_loaded/1` | **implemented** | Imports a module's public predicates while keeping source loading idempotent. |
44
+
45
+ Only one module body is supported per Prolog text: a second `module/2` in the
46
+ same text is rejected rather than switching modules mid-text. Part 2 allows a
47
+ module to have several non-contiguous bodies.
48
+
49
+ ## Built-in predicates
50
+
51
+ | Predicate | Part 2 requirement | Status |
52
+ | --- | --- | --- |
53
+ | `current_module/1` | enumerate existing modules and test a supplied name; `user` must exist | **not implemented** — raises `existence_error(procedure, current_module/1)` |
54
+ | `predicate_property/2` | module-aware predicate-property model | **not implemented** — raises `existence_error(procedure, predicate_property/2)` |
55
+ | `clause/2` | module-aware redefinition | **partial** — qualification is resolved, but against the compatibility model rather than Part 2 lookup/defining-module rules |
56
+ | `current_predicate/1` | module-aware redefinition | **partial** — as above |
57
+ | `asserta/1` | module-aware redefinition | **partial** — as above |
58
+ | `assertz/1` | module-aware redefinition | **partial** — as above |
59
+ | `retract/1` | module-aware redefinition | **partial** — as above |
60
+ | `abolish/1` | module-aware redefinition | **partial** — as above |
61
+
62
+ The six *partial* rows share one cause: EyeProlog resolves `Module:Goal` and
63
+ tracks a single module per goal, whereas Part 2 distinguishes defining module,
64
+ lookup module, qualifying module, and calling context. Ordinary calls make
65
+ these coincide, so the difference shows up in meta-calls and nested
66
+ qualification rather than in everyday use.
67
+
68
+ ## Operators and flags
69
+
70
+ | Item | Part 2 requirement | Status |
71
+ | --- | --- | --- |
72
+ | `:` operator | added to the initial operator table as `op(600, xfy, :)` | **implemented** in normal mode (`current_op(600, xfy, ':')`); deliberately absent from the Part 1 strict initial table |
73
+ | `colon_sets_calling_context` | a Boolean flag governing whether explicit qualification establishes calling context | **not implemented** — `current_prolog_flag/2` raises `domain_error(prolog_flag, colon_sets_calling_context)` |
74
+
75
+ ## 2013 amendment (WG17 N251) coverage
76
+
77
+ The requirements clarified by the 2013 amendment draft have executable evidence
78
+ in `test/run-iso-part2-amendment.mjs`, which is part of `npm test` and the
79
+ conformance aggregate. This is the one part of the Part 2 surface that is
80
+ release-gated.
81
+
82
+ | Amendment clause | Required behaviour | EyeProlog behaviour / evidence |
83
+ | --- | --- | --- |
84
+ | 6.2.4.1 | A `module(Name, Exports)` directive identifies a named module and its public predicate indicators. | `Program.defineModule()` records the named module and export map. The focused suite checks that public predicates import and private predicates stay module-local. |
85
+ | 6.2.5 | A module body is a Prolog text beginning with its `module/2` directive and extending to the end of that text. | Files named by `use_module/1-2` are accepted as module sources only when their first read term is `module/2`. A second `module/2` in the same text is rejected; a distinct text may begin a distinct module body. |
86
+ | 6.2.5.5 | `use_module(F, L)` selectively imports the predicates in `L` from the exports of the module defined by `F`. | `Program.importModule()` validates requested indicators against the source module's export map and installs only those imports. |
87
+ | 6.2.5.6 | `use_module(F)` imports all exported predicates; the amendment also aligns the public-predicate effect of `ensure_loaded(F)` for a module source. | `use_module/1` imports the full export map. `ensure_loaded/1` imports a module's public predicates while retaining idempotent source loading, including when the module was already loaded for another caller. |
88
+ | 6.2.5.7 | `meta_predicate/1` marks context-sensitive arguments; `:` arguments carry the current source/calling module. | Normal parsing accepts `:- meta_predicate p(:).`. Colon-mode arguments are represented as an observable `Module:Goal` term, including when the argument is a variable. |
89
+ | 6.4.4.3 | Imported metapredicates preserve the caller's module context for their meta-arguments. | The focused suite verifies both visible `Module:Goal` decomposition and execution of a caller-private predicate through a variable meta-argument. Explicit `Module:Goal` calls set their stated module context. |
90
+
91
+ ## Known gaps
92
+
93
+ Beyond the *not implemented* rows above, four structural gaps stand between the
94
+ current compatibility layer and a Part 2 claim.
95
+
96
+ 1. **Module-local reader/writer state.** Part 2 makes a calling context include
97
+ the operator table, character-conversion mapping, and relevant flag values,
98
+ not just a set of visible procedures. EyeProlog keeps operators, conversions,
99
+ and flags in one global program state, so interface-local environment
100
+ settings cannot be expressed. This is the largest single item.
101
+ 2. **Four separate module notions.** Defining, lookup, qualifying, and calling
102
+ context are collapsed into one module field per goal.
103
+ 3. **Re-export and visibility conflicts.** There is no re-export model, and no
104
+ preparation-time rejection of a second import that would make a *different*
105
+ procedure visible under the same unqualified indicator.
106
+ 4. **Introspection.** `current_module/1` and `predicate_property/2` are absent,
107
+ so the module structure is not observable from within a program.
108
+
109
+ Interoperability with Scryer, Trealla, or Logtalk is not treated as evidence of
110
+ Part 2 coverage.
111
+
112
+ ## See also
113
+
114
+ - `ISO-PART3.md` — Part 3 (definite clause grammar rules) status
115
+ - `ISO-COMPLIANCE.md` — the Part 1 review that carries the release-facing claim
116
+ - `ISO-IMPLEMENTATION-DEFINED.md` — implementation-defined choices, including
117
+ the module-qualification error choice
@@ -0,0 +1,99 @@
1
+ # ISO/IEC 13211-3 (Definite clause grammar rules) — implementation status
2
+
3
+ This document records what EyeProlog implements of Prolog Part 3, non-terminal
4
+ by non-terminal and predicate by predicate. It is a status ledger, not a
5
+ conformance claim.
6
+
7
+ Normal mode implements the whole grammar surface below. `--iso-strict` leaves
8
+ `-->/2` as ordinary Part 1 operator syntax and excludes grammar expansion and
9
+ `phrase/2-3` from the strict registry, so `phrase/2` there raises
10
+ `existence_error(procedure, phrase/2)`.
11
+
12
+ ## Grammar control constructs (clause 7.14)
13
+
14
+ | Clause | Construct | Status |
15
+ | --- | --- | --- |
16
+ | 7.14.1 | `[]//0` — empty terminal-sequence | **implemented** |
17
+ | 7.14.2 | `('.')//2` — terminal sequence | **implemented** |
18
+ | 7.14.3 | `(',')//2` — concatenation | **implemented** |
19
+ | 7.14.4 | `(;)//2` — alternative | **implemented** |
20
+ | 7.14.5 | `(;)//2` with `(->)//2` — if-then-else | **implemented** |
21
+ | 7.14.6 | `('\|')//2` — second form of alternative | **implemented** |
22
+ | 7.14.7 | `{}//1` — grammar-body-goal | **implemented** |
23
+ | 7.14.8 | `call//1` | **implemented** |
24
+ | 7.14.9 | `phrase//1` | **implemented** |
25
+ | 7.14.10 | `!//0` — grammar-body-cut | **implemented** |
26
+ | 7.14.11 | `(\+)//1` — grammar-body-not | **implemented** |
27
+ | 7.14.12 | `(->)//2` — if-then | **implemented** |
28
+
29
+ ## Built-in predicates (clause 8.18)
30
+
31
+ | Clause | Predicate | Status |
32
+ | --- | --- | --- |
33
+ | 8.18.1 | `phrase/3` | **implemented** |
34
+ | 8.18.1.3 | `phrase/2` (bootstrapped as `phrase(GRBody, S0, [])`) | **implemented** |
35
+
36
+ ### Prescribed errors (8.18.1.4)
37
+
38
+ | Error | Requirement | EyeProlog |
39
+ | --- | --- | --- |
40
+ | a) `GRBody` is a variable | `instantiation_error` | **matches** |
41
+ | b) `GRBody` is neither a variable nor callable | `type_error(callable, GRBody)` | **matches** |
42
+ | c) `S0` is not a terminal-sequence | `type_error(terminal_sequence, S0)` — implementation-defined for `phrase/3`, **required for `phrase/2`** | **diverges**: EyeProlog raises `type_error(list, S0)` |
43
+ | d) `S` is not a terminal-sequence | `type_error(terminal_sequence, S)` — implementation-defined | **diverges**: EyeProlog raises `type_error(list, S)` |
44
+
45
+ **Open divergence.** EyeProlog performs both optional checks — which the draft
46
+ permits, and which for `phrase/2` clause c it requires — but reports
47
+ `type_error(list, Culprit)` where the 2023-08-14 draft specifies
48
+ `type_error(terminal_sequence, Culprit)`. The draft is explicit that if a
49
+ processor offers these errors, "their form and consequence must be the
50
+ following", so the *form* is not left open even though performing the check is.
51
+
52
+ This appears to track an earlier edition, in which these clauses were numbered
53
+ 8.18.1.3 g and h and specified `list`. The behaviour is deliberate and covered
54
+ by a dedicated regression matrix, so changing the error term is a decision to
55
+ take explicitly rather than a bug to patch silently. Until it is taken, this
56
+ row is the one known Part 3 deviation.
57
+
58
+ What the regression matrix does pin, independently of the error term: the same
59
+ diagnostic across both arities, both sequence positions, atomic and compound
60
+ non-lists, and improper lists at several depths; the culprit is the whole
61
+ invalid argument, including an improper list, not just its tail; variables,
62
+ proper lists, and partial lists are accepted; and for otherwise valid grammar
63
+ bodies, validation precedes execution even when the grammar would fail or
64
+ produce a side effect. The upstream phrase quads permit both checking and
65
+ non-checking outcomes and so do not establish this consistency on their own.
66
+
67
+ ## Language concepts
68
+
69
+ | Clause | Concept | Status |
70
+ | --- | --- | --- |
71
+ | 7.4.4 | grammar rules in Prolog text | **implemented** |
72
+ | 7.5.1 | grammar-rule expansion during preparation | **implemented** |
73
+ | 7.13.1 | terminals and non-terminals | **implemented** |
74
+ | 7.13.2 | format of grammar rules | **implemented** |
75
+ | 7.13.3 | semicontext (pushback) | **implemented** — `head, [Pushback] --> Body` |
76
+ | 7.13.4 | non-terminal indicator `A//N` | **implemented** — accepted in module export lists |
77
+ | 7.15 | executing clauses expanded from grammar rules | **implemented** |
78
+ | 5.5.2 | predefined operators | **implemented** — `-->` is predeclared in both profiles; it is grammar syntax only in normal mode |
79
+
80
+ `predicate_property/2` does not appear in the 2023-08-14 draft, so no Part 3
81
+ predicate-property extension is claimed here. See `ISO-PART2.md` for the Part 2
82
+ status of that predicate.
83
+
84
+ ## Executable evidence
85
+
86
+ Grammar expansion, sequence validation, grammar-body callability, variable-body
87
+ instantiation errors, and `phrase/3` steadfastness are under focused tests in
88
+ `test/run-regression.mjs` and the conformance corpus. The live Neumerkel gate
89
+ covers the upstream phrase quads.
90
+
91
+ Changes intended to advance a formal Part 3 claim should update this ledger and
92
+ the corresponding error cases rather than silently changing the compatibility
93
+ profile.
94
+
95
+ ## See also
96
+
97
+ - `ISO-PART2.md` — Part 2 (modules) status
98
+ - `ISO-COMPLIANCE.md` — the Part 1 review that carries the release-facing claim
99
+ - `NEUMERKEL-LIVE.md` — the live upstream gate
@@ -1,9 +1,9 @@
1
- # ISO Part 1 processor-requirements audit
1
+ # ISO Part 1 processor-requirements review
2
2
 
3
3
  This is the clause-level checklist for the processor requirements that sit
4
4
  above the individual built-ins. It complements `ISO-COMPLIANCE.md`: the latter
5
5
  is release-facing prose, while this file keeps each Clause 5 requirement or
6
- extension boundary visible as its own auditable row.
6
+ extension boundary visible as its own reviewable row.
7
7
 
8
8
  The normative baseline is ISO/IEC 13211-1:1995 plus Technical Corrigenda 1-3.
9
9
  `covered` means the requirement has an implementation/documentation decision
@@ -26,7 +26,7 @@ certification claim.
26
26
  | Requirement | Status | Current evidence |
27
27
  | --- | --- | --- |
28
28
  | 5.2 conforming and strictly conforming Prolog text boundary | covered | strict parsing/preparation accepts the Part 1 + Corrigenda language under the documented PCS choices and rejects implementation-specific language facilities; normal-profile preservation is checked against every strict-accepted WG17 case |
29
- | 5.3 conforming and strictly conforming Prolog goal boundary | covered | strict registry/control/evaluable filtering plus closed 7.1-7.12, 8.2-8.17, and Clause 9 audits define the goal boundary |
29
+ | 5.3 conforming and strictly conforming Prolog goal boundary | covered | strict registry/control/evaluable filtering plus closed 7.1-7.12, 8.2-8.17, and Clause 9 reviews define the goal boundary |
30
30
  | 5.4 accompanying documentation for implementation-defined and implementation-specific features | covered | `ISO-IMPLEMENTATION-DEFINED.md`, *The Art of EyeProlog*, strict-boundary documentation, and release-facing conformance ledgers |
31
31
 
32
32
  ## 5.5 — extension boundaries
@@ -40,15 +40,15 @@ certification claim.
40
40
  | 5.5.4 additional term types | covered | the normal JavaScript API's `stringTerm(Text)` is documented as an implementation-specific sixth term type, including disjointness, ordering, clause conversion, lack of source token syntax, expression behavior, and writing; strict program/goal entry rejects that type with `representation_error(term)` |
41
41
  | 5.5.5 additional directives | covered | normal module/library directives are documented implementation-specific features and are rejected by strict mode |
42
42
  | 5.5.6 additional side effects | covered | normal-profile `statistics/0-2`, cleanup/library state, proof/statistics host instrumentation, and other extension effects are documented outside the Part 1 core; strict registry tests exclude the Prolog-visible statistics/cleanup extensions. Host instrumentation is an embedding observation rather than an extra strict Prolog goal effect |
43
- | 5.5.7 additional control constructs | covered | `tnot/1`, `wfs_truth/2`, and implementation-specific execution optimizations are absent/disabled in strict mode; standard control constructs remain separately audited |
44
- | 5.5.8 additional flags | covered | normal `occurs_check` extension is absent from strict mode; the Part 1 flag family is fully audited |
43
+ | 5.5.7 additional control constructs | covered | `tnot/1`, `wfs_truth/2`, and implementation-specific execution optimizations are absent/disabled in strict mode; standard control constructs remain separately reviewed |
44
+ | 5.5.8 additional flags | covered | normal `occurs_check` extension is absent from strict mode; the Part 1 flag family is fully reviewed |
45
45
  | 5.5.9 additional built-in predicates and error forms | covered | strict registry excludes normal-profile library/native additions; `ISO-BUILTIN-MODE-ERROR-MATRIX.md` closes the complete 8.2-8.17 family row-by-row; simultaneous-error choices are documented per 7.12 rather than treated as a global table-order mandate |
46
- | 5.5.10 additional evaluable functors/types | covered | strict mode rejects the normal-profile evaluable `e` extension while retaining the full Part 1 + Corrigenda arithmetic set. `ISO-EVALUABLE-FUNCTOR-MATRIX.md` now closes the Clause 9 semantic/error audit and pins the 9.1.4.2 `resultF`, mixed-type `max/2`/`min/2`, and signed bitwise/shift choices. Post-N289 STC #75 remains separate from the published baseline |
46
+ | 5.5.10 additional evaluable functors/types | covered | strict mode rejects the normal-profile evaluable `e` extension while retaining the full Part 1 + Corrigenda arithmetic set. `ISO-EVALUABLE-FUNCTOR-MATRIX.md` now closes the Clause 9 semantic/error review and pins the 9.1.4.2 `resultF`, mixed-type `max/2`/`min/2`, and signed bitwise/shift choices. Post-N289 STC #75 remains separate from the published baseline |
47
47
  | 5.5.11 reserved atoms | not applicable | EyeProlog declares no reserved-atom extension; extension names remain ordinary atoms unless used in a documented syntactic/predicate/directive role |
48
48
 
49
49
  ## Clause 6 syntax-preservation closure
50
50
 
51
- The production audit is kept here rather than in another status file. The strict
51
+ The production review is kept here rather than in another status file. The strict
52
52
  regression gate covers the following families directly, while the complete WG17
53
53
  matrix supplies detailed externally sourced syntax expectations.
54
54
 
@@ -1,6 +1,6 @@
1
1
  # ISO Part 1 Prolog-text, database, and execution matrix
2
2
 
3
- This matrix closes the remaining row-level audit for ISO/IEC 13211-1:1995
3
+ This matrix closes the remaining row-level review for ISO/IEC 13211-1:1995
4
4
  Clauses 7.4-7.8 against the published Part 1 baseline plus Technical
5
5
  Corrigenda 1-3. It complements the built-in mode/error matrix: these rows are
6
6
  processor semantics above individual predicate definitions.
@@ -22,7 +22,7 @@ chosen behavior is also indexed by `ISO-IMPLEMENTATION-DEFINED.md`.
22
22
  | 7.4.2.6 `initialization/1` | covered | Goals are retained in preparation order and run after preparation. Reusing the same prepared `Program` does not run them again accidentally. |
23
23
  | 7.4.2.7 `include/1` | covered | The included text is prepared at the directive position and shares operator/character/flag preparation state with its parent. |
24
24
  | 7.4.2.8 `ensure_loaded/1` | covered | A source is prepared at most once in the current load graph, including repeated references and self/top-level references. |
25
- | 7.4.2.9 `set_prolog_flag/2` | covered | Preparation-time flag changes affect subsequent text and are replayed into execution state; strict flag names/values/changeability remain governed by the closed 7.11 audit. |
25
+ | 7.4.2.9 `set_prolog_flag/2` | covered | Preparation-time flag changes affect subsequent text and are replayed into execution state; strict flag names/values/changeability remain governed by the closed 7.11 review. |
26
26
  | 7.4.3 source clauses | covered | Source heads/bodies are validated like program clauses, standardized static/control procedures are protected, declarations can create empty procedures, and body conversion follows 7.6.2 while preserving head/body variable identity. The built-in restriction applies in every execution mode, so consulting a clause for a built-in predicate or control construct reports the same `permission_error(modify, static_procedure)` as `assert`ing one; EyeProlog's own library and extension predicates are not standard built-ins and stay redefinable. Corpus: `error/iso/consult_redefines_builtin`. |
27
27
 
28
28
  The strict release test `closes ISO 7.4 Prolog-text preparation and directive
@@ -70,7 +70,7 @@ converted body.
70
70
  | clause order and re-execution | covered | Clauses are tried in prepared/database order; re-executable predicates expose subsequent solutions on backtracking. |
71
71
  | empty versus unknown procedure | covered | A defined procedure with zero clauses fails normally. A missing procedure follows the `unknown` flag (`error` by default in the strict profile). |
72
72
  | side effects and database changes | covered | Standard side effects occur at their execution point; successful dynamic changes become visible to later activations while preserving the logical-update view of active calls. |
73
- | built-in/control delegation | covered | Standardized built-ins dispatch through the strict registry and control constructs through the strict execution path; implementation-specific predicates/shortcuts are excluded by the 5.5 boundary audit. |
73
+ | built-in/control delegation | covered | Standardized built-ins dispatch through the strict registry and control constructs through the strict execution path; implementation-specific predicates/shortcuts are excluded by the 5.5 boundary review. |
74
74
 
75
75
  ## 7.8 - control constructs and exceptions
76
76
 
@@ -88,9 +88,9 @@ converted body.
88
88
  | 7.8.10 `throw/1` | covered | Throws propagate until a matching catch and use a renamed/fresh term for exception matching. |
89
89
 
90
90
  The strict test `closes ISO 7.8 general control-construct and exception rows`
91
- keeps the general semantics visible in addition to the 8.15 built-in audit.
91
+ keeps the general semantics visible in addition to the 8.15 built-in review.
92
92
 
93
- ## Audit result
93
+ ## Review result
94
94
 
95
95
  Clauses **7.4-7.8 are covered at row level** for the declared strict Part 1
96
96
  profile. Remaining Clause 7 exit work is therefore no longer general
@@ -1,6 +1,6 @@
1
- # ISO Part 1 term-semantics audit matrix
1
+ # ISO Part 1 term-semantics coverage matrix
2
2
 
3
- This file closes the Clause 7.1-7.3 audit at a finer granularity than the
3
+ This file closes the Clause 7.1-7.3 review at a finer granularity than the
4
4
  release-facing `ISO-COMPLIANCE.md`. The normative baseline is ISO/IEC
5
5
  13211-1:1995 plus Technical Corrigenda 1-3.
6
6
 
@@ -29,7 +29,7 @@ Counts are output from upstream, not hard-coded test constants.
29
29
  - [cleanup](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/cleanup)
30
30
 
31
31
  Exact fetched bytes, SHA-256 hashes, fetch timestamps, and HTTP validators remain under
32
- Git-ignored `.cache/neumerkel/` for local audit/reproduction and are intentionally not committed.
32
+ Git-ignored `.cache/neumerkel/` for local inspection/reproduction and are intentionally not committed.
33
33
  A normal test run warns when this tracked report is stale. Refresh directly from live
34
34
  upstream with `npm run conformance:update:neumerkel`, or sync the exact successful
35
35
  snapshot already fetched by `npm test` with `npm run conformance:sync:neumerkel`.
@@ -44,11 +44,11 @@ uses this race-free sync path and stages the generated reports into the release
44
44
  commit. The tracked report intentionally omits fetch timestamps and HTTP validators,
45
45
  so repeated runs against unchanged upstream suites do not dirty the checkout.
46
46
 
47
- ## Local audit cache
47
+ ## Local inspection cache
48
48
 
49
49
  Exact downloaded bytes, SHA-256 hashes, fetch timestamps, HTTP validators, and
50
50
  machine-readable results are kept under `.cache/neumerkel/`. `.cache/` remains
51
- Git-ignored: it is an audit/reproduction cache, not published project evidence.
51
+ Git-ignored: it is an inspection/reproduction cache, not published project evidence.
52
52
 
53
53
  Use:
54
54
 
@@ -7,8 +7,8 @@ supported ISO Prolog profile, built-ins, extensions, and reasoner behavior.
7
7
 
8
8
  The suite is intentionally file-based. Exact standard output, errors, warnings,
9
9
  and proof output test the behavior of the JavaScript implementation.
10
- [ISO-COMPLIANCE.md](ISO-COMPLIANCE.md) is the high-level Part 1 audit and coverage map. [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md)
11
- tracks the row-by-row built-in audit,
10
+ [ISO-COMPLIANCE.md](ISO-COMPLIANCE.md) is the high-level Part 1 review and coverage map. [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md)
11
+ tracks the row-by-row built-in review,
12
12
  [ISO-TERM-SEMANTICS-MATRIX.md](ISO-TERM-SEMANTICS-MATRIX.md) closes 7.1-7.3,
13
13
  [ISO-PROLOG-TEXT-EXECUTION-MATRIX.md](ISO-PROLOG-TEXT-EXECUTION-MATRIX.md)
14
14
  closes 7.4-7.8, [ISO-EVALUABLE-FUNCTOR-MATRIX.md](ISO-EVALUABLE-FUNCTOR-MATRIX.md)
@@ -16,10 +16,11 @@ closes 7.9/Clause 9, and [ISO-PROCESSOR-REQUIREMENTS.md](ISO-PROCESSOR-REQUIREME
16
16
  decomposes the Clause 5 processor obligations.
17
17
  [ISO-CORRIGENDA-MATRIX.md](ISO-CORRIGENDA-MATRIX.md) gives every published
18
18
  Corrigenda amendment cluster an executable, editorial, or superseded
19
- disposition. [ISO-PART2-AMENDMENT-2013.md](ISO-PART2-AMENDMENT-2013.md) maps the
20
- 2013 module-amendment requirements to executable evidence, while
21
- [ISO-PART2-PART3-SCOPE.md](ISO-PART2-PART3-SCOPE.md) records the broader
22
- normal-profile module/DCG compatibility boundary and known non-claims. Built-in rows may group closely related conditions only when the
19
+ disposition. [ISO-PART2.md](ISO-PART2.md) and [ISO-PART3.md](ISO-PART3.md) record,
20
+ directive by directive and predicate by predicate, what the normal profile
21
+ implements of Part 2 (modules) and Part 3 (definite clause grammar rules),
22
+ including the 2013 module-amendment evidence and the known gaps and deviations.
23
+ Neither part carries a conformance claim. Built-in rows may group closely related conditions only when the
23
24
  row names every grouped condition and its executable evidence.
24
25
  The exit checklist is embedded in [ISO-COMPLIANCE.md](ISO-COMPLIANCE.md). [WG17-SYNTAX-STATUS.md](WG17-SYNTAX-STATUS.md) records the
25
26
  complete one-to-one trace for the vendored active upstream WG17 syntax cases.
@@ -31,7 +32,7 @@ review evidence, not normative ISO claims.
31
32
  profile and implementation extensions. The default registry covers the exact
32
33
  predicate indicators listed in Appendix B of the book across the Part 1 strict-core
33
34
  target and the normal-mode module/DCG compatibility families. [ISO-COMPLIANCE.md](ISO-COMPLIANCE.md) is the explicit
34
- release-facing ledger for the Part 1 strict-core audit. This suite is not an independent certification. The release-facing Part 1
35
+ release-facing ledger for the Part 1 strict-core review. This suite is not an independent certification. The release-facing Part 1
35
36
  ledger now has explicit dispositions for Clause 5 processor obligations, Clause 6
36
37
  syntax/rejection, Clause 7 semantics, the complete 8.2-8.17 built-in family, and
37
38
  Clause 9 evaluable functors. Public comparison material remains supporting review
@@ -99,7 +100,7 @@ npm run test:wg17 # vendored reviewed WG17 syntax regression
99
100
  ```
100
101
 
101
102
  `test:neumerkel` always fetches the current TU Wien sources. It does not skip a
102
- fetch because a cache exists. The runner discovers the number of active tests from those sources and fails on any newly introduced case EyeProlog does not pass. If the stable, tracked [NEUMERKEL-LATEST.md](NEUMERKEL-LATEST.md) is stale, normal tests warn rather than turning a passing engine run into a failure. `npm run conformance:update:neumerkel` performs a fresh live run and refreshes the report; after `npm test`, `npm run conformance:sync:neumerkel` refreshes it from the exact successful cached snapshot; and `npm run conformance:check:neumerkel` verifies that snapshot without a second network fetch. Exact bytes, SHA-256 hashes, timestamps, and HTTP validators stay under Git-ignored `.cache/neumerkel/` for audit/reproduction only. See [NEUMERKEL-LIVE.md](NEUMERKEL-LIVE.md).
103
+ fetch because a cache exists. The runner discovers the number of active tests from those sources and fails on any newly introduced case EyeProlog does not pass. If the stable, tracked [NEUMERKEL-LATEST.md](NEUMERKEL-LATEST.md) is stale, normal tests warn rather than turning a passing engine run into a failure. `npm run conformance:update:neumerkel` performs a fresh live run and refreshes the report; after `npm test`, `npm run conformance:sync:neumerkel` refreshes it from the exact successful cached snapshot; and `npm run conformance:check:neumerkel` verifies that snapshot without a second network fetch. Exact bytes, SHA-256 hashes, timestamps, and HTTP validators stay under Git-ignored `.cache/neumerkel/` for inspection/reproduction only. See [NEUMERKEL-LIVE.md](NEUMERKEL-LIVE.md).
103
104
 
104
105
  The vendored WG17 syntax snapshot is intentionally secondary. Update all upstream conformance evidence with `npm run conformance:update`, or use the focused commands:
105
106
 
@@ -32,11 +32,11 @@ regressions.
32
32
  | [#49](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/stc#49) | `read_term/3` and EOF | Covered by strict reader/conformance tests and the interactive-read regressions. |
33
33
  | [#50](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/stc#50) | mixed integer/float arithmetic comparison | The STC-facing normal-profile case requires exact cross-type ordering and `max/2`/`min/2` use the same comparison. `--iso-strict` deliberately retains the published Part 1 integer-to-float comparison rule; the draft case is not silently substituted for that normative baseline. |
34
34
  | [#55](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/stc#55) | integer rounding function | Existing flag conformance verifies `integer_rounding_function = toward_zero`. |
35
- | [#56](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/stc#56) | protect `(:-)/1` and `(:-)/2` from database modification | **The audit found a gap.** Strict database operations now treat both functors as static/private for `assert*`, `retract*`, `abolish/1`, declarations, and `clause/2`, while ordinary calls still follow the separate procedure-existence behavior described by the STC item. |
35
+ | [#56](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/stc#56) | protect `(:-)/1` and `(:-)/2` from database modification | **The review found a gap.** Strict database operations now treat both functors as static/private for `assert*`, `retract*`, `abolish/1`, declarations, and `clause/2`, while ordinary calls still follow the separate procedure-existence behavior described by the STC item. |
36
36
  | [#58](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/stc#58) | `set_prolog_flag/2` instantiation error | Existing strict/error coverage requires an instantiation error when a required flag value is a variable. |
37
37
  | [#67](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/stc#67) | `bagof/3` answer-order example | `stc/bagof_answer_order` verifies the proposed clarifying example produces `[2,1]`. |
38
38
  | [#68](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/stc#68) | division examples | Existing arithmetic coverage evaluates signed integer `/` through the floating operation; no implementation-defined signed-division result is used. |
39
- | [#69](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/stc#69) | arithmetic example culprit | **The audit found a gap.** Strict expression evaluation now applies 7.9.2(c) to an atomic subexpression such as `foo`: it reports `type_error(evaluable,foo/0)` rather than the misleading `type_error(number,foo)` shown by the old 9.1.7 example. |
39
+ | [#69](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/stc#69) | arithmetic example culprit | **The review found a gap.** Strict expression evaluation now applies 7.9.2(c) to an atomic subexpression such as `foo`: it reports `type_error(evaluable,foo/0)` rather than the misleading `type_error(number,foo)` shown by the old 9.1.7 example. |
40
40
  | [#70](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/stc#70) | optional `max_procedure_arity` | Reviewed after the STC arity discussion corrected the earlier #71 pointer. EyeProlog has no declared procedure-arity limit smaller than its `max_arity=unbounded` term model, so the implementation-defined optional flag is intentionally absent. |
41
41
  | [#72](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/stc#72) | tentative non-ground stream-term instances | Reviewed as a tentative post-2026 proposal. EyeProlog does not make this draft wording normative in `--iso-strict`; the published Part 1 stream-term/domain rules remain the baseline until WG17 settles the proposal. |
42
42
  | [#73](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/stc#73) | `read/1-2` and `read_term/2-3` representation limits | The 2026-08-23 post-N289 draft now explicitly proposes `max_float` / `min_float` alongside the existing representation-limit flags. EyeProlog already reports those errors while reading overflowing positive/negative float tokens; strict regression coverage now exercises both `read/1` and `read_term/2`, and the literal STC cases pin parser preparation. |
@@ -474,7 +474,7 @@ export function formatNeumerkelMarkdown({ summary }) {
474
474
  lines.push(
475
475
  '',
476
476
  'Exact fetched bytes, SHA-256 hashes, fetch timestamps, and HTTP validators remain under',
477
- 'Git-ignored `.cache/neumerkel/` for local audit/reproduction and are intentionally not committed.',
477
+ 'Git-ignored `.cache/neumerkel/` for local inspection/reproduction and are intentionally not committed.',
478
478
  'A normal test run warns when this tracked report is stale. Refresh directly from live',
479
479
  'upstream with `npm run conformance:update:neumerkel`, or sync the exact successful',
480
480
  'snapshot already fetched by `npm test` with `npm run conformance:sync:neumerkel`.',
@@ -5901,7 +5901,7 @@ ${profile}`;
5901
5901
  },
5902
5902
  },
5903
5903
  {
5904
- name: 'published ISO Corrigenda have a complete stable audit inventory',
5904
+ name: 'published ISO Corrigenda have a complete stable review inventory',
5905
5905
  run: () => {
5906
5906
  const compliance = fs.readFileSync(path.join(testRoot, 'conformance', 'ISO-COMPLIANCE.md'), 'utf8');
5907
5907
  const matrix = fs.readFileSync(path.join(testRoot, 'conformance', 'ISO-CORRIGENDA-MATRIX.md'), 'utf8');
@@ -5913,7 +5913,7 @@ ${profile}`;
5913
5913
  const rows = matrix.split('\n')
5914
5914
  .filter((line) => /^\| C[123]-\d\d \|/.test(line))
5915
5915
  .map((line) => line.split('|').slice(1, -1).map((cell) => cell.trim()));
5916
- assertEqual(rows.map(([id]) => id).join(','), expected.join(','), 'Corrigenda stable audit IDs');
5916
+ assertEqual(rows.map(([id]) => id).join(','), expected.join(','), 'Corrigenda stable review IDs');
5917
5917
  for (const [id, clauses, disposition, evidence] of rows) {
5918
5918
  assertEqual(Boolean(clauses), true, `${id} clause/amendment cluster`);
5919
5919
  assertEqual(['covered', 'editorial', 'superseded'].includes(disposition), true, `${id} disposition`);
@@ -5981,7 +5981,7 @@ ${profile}`;
5981
5981
  '| Latest Neumerkel conformity is a live release gate | covered |',
5982
5982
  '| No unexplained deviation remains in the release-facing ledger | covered |',
5983
5983
  ]) assertIncludes(exit, item, item);
5984
- assertNotIncludes(exit, '| audit |', 'no release-facing audit rows remain');
5984
+ assertNotIncludes(exit, '| gap |', 'no release-facing gap rows remain');
5985
5985
  },
5986
5986
  },
5987
5987
  {
@@ -5996,13 +5996,13 @@ ${profile}`;
5996
5996
  'ISO-EVALUABLE-FUNCTOR-MATRIX.md',
5997
5997
  ]) assertIncludes(book, name, `book ${name}`);
5998
5998
  assertIncludes(readme, 'implementation reference is [*The Art of EyeProlog*]', 'README book hand-off');
5999
- assertIncludes(readme, 'test/conformance/ISO-COMPLIANCE.md', 'README concise audit link');
5999
+ assertIncludes(readme, 'test/conformance/ISO-COMPLIANCE.md', 'README concise review link');
6000
6000
  for (const heading of ['## Tabling', '## Cleanup-aware control', '## Strict ISO',
6001
6001
  '## Module and definite clause grammar', '## Trealla and Scryer interoperability']) {
6002
6002
  assertNotIncludes(readme, heading, `README delegates ${heading} to the book`);
6003
6003
  }
6004
- assertEqual(readme.includes('2026-08-23 draft items #73-#76'), false, 'README omits audit-history detail');
6005
- assertIncludes(profile, 'Part 1 processor, syntax, semantic, built-in, and arithmetic', 'Why EyeProlog audit state');
6004
+ assertEqual(readme.includes('2026-08-23 draft items #73-#76'), false, 'README omits review-history detail');
6005
+ assertIncludes(profile, 'Part 1 processor, syntax, semantic, built-in, and arithmetic', 'Why EyeProlog review state');
6006
6006
  },
6007
6007
  },
6008
6008
  {
@@ -5883,7 +5883,9 @@ Variables, proper lists, and partial lists pass these checks. Validation
5883
5883
  precedes grammar execution; an otherwise valid failing grammar does not
5884
5884
  suppress the diagnostic. Dedicated regressions enforce this policy separately
5885
5885
  from the portable quads, which accept both checking and non-checking outcomes. See
5886
- [`ISO-PART2-PART3-SCOPE.md`](test/conformance/ISO-PART2-PART3-SCOPE.md).
5886
+ [`ISO-PART3.md`](test/conformance/ISO-PART3.md), which also records that the
5887
+ 2023-08-14 working draft specifies `type_error(terminal_sequence, Culprit)` for
5888
+ this condition.
5887
5889
 
5888
5890
  #### A bidirectional expression grammar
5889
5891
 
@@ -10403,7 +10405,7 @@ node test/run-conformance-report.mjs
10403
10405
  ```
10404
10406
 
10405
10407
  `test/conformance/ISO-COMPLIANCE.md` is the processor-requirement ledger for the
10406
- Part 1 conformance audit. It records explicit dispositions for the tracked processor, syntax, semantic, built-in, and arithmetic requirements. `test/conformance/ISO-COMPLIANCE.md`
10408
+ Part 1 conformance review. It records explicit dispositions for the tracked processor, syntax, semantic, built-in, and arithmetic requirements. `test/conformance/ISO-COMPLIANCE.md`
10407
10409
  maps language families to representative executable cases.
10408
10410
  `test/conformance/ISO-IMPLEMENTATION-DEFINED.md` is the ISO 5.4 decision
10409
10411
  index: it enumerates the Part 1 implementation-defined decisions and the
@@ -10416,7 +10418,7 @@ rows. The exit checklist in `ISO-COMPLIANCE.md` records the closure criteria and
10416
10418
  upstream syntax cases. Reviewed cases can pin exact strict-reader outcomes, while
10417
10419
  newly upgraded cases execute directly against the upstream Codex expectation.
10418
10420
 
10419
- The syntax audit also cross-checks extension safety: each vendored WG17 case
10421
+ The syntax review also cross-checks extension safety: each vendored WG17 case
10420
10422
  accepted by the strict Part 1 reader is executed through the normal profile and
10421
10423
  must preserve the same observable outcome. Additional normal-mode syntax may
10422
10424
  accept texts outside the strict grammar, but it may not reinterpret an accepted
@@ -10463,7 +10465,7 @@ expansion/`phrase/2-3`, quads, EyeProlog libraries, the `occurs_check` flag,
10463
10465
  the normal-profile `table` declaration, `call_cleanup/2`, and `setup_call_cleanup/3` are outside
10464
10466
  that Part 1 strict surface.
10465
10467
 
10466
- The strict-core audit has explicit dispositions for the Clause 5 processor
10468
+ The strict-core review has explicit dispositions for the Clause 5 processor
10467
10469
  obligations, Clause 6 syntax and rejection families, Clause 7 term/execution/I/O
10468
10470
  and error semantics, the 8.2-8.17 built-in families, and Clause 9 evaluable
10469
10471
  functors. The complete vendored WG17 syntax matrix is checked together with normal-mode safety: each strict-success WG17 observation must keep the same result when normal-mode extensions are enabled. Implementation-defined
package/why-eyeprolog.md CHANGED
@@ -235,7 +235,7 @@ tests, and production behavior easier to compare.
235
235
  EyeProlog targets the ISO Part 1 core together with Technical Corrigenda 1, 2,
236
236
  and 3. It provides separately documented compatibility profiles for Part 2
237
237
  modules and Part 3 definite clause grammars in normal mode. The post-N289
238
- WG17/STC working draft is audit input, not a published Corrigendum silently
238
+ WG17/STC working draft is review input, not a published Corrigendum silently
239
239
  added to the strict baseline.
240
240
 
241
241
  The executable conformance matrix records explicit dispositions for the
@@ -288,7 +288,7 @@ documented embedding hook.
288
288
  It should resist duplicate aliases, hidden execution phases, advisory syntax,
289
289
  and integrations that can live outside the reasoning engine. The durable idea
290
290
  is that useful, proof-producing reasoning does not require an opaque language
291
- or an enormous runtime. A carefully audited standard core, portable modules,
291
+ or an enormous runtime. A carefully reviewed standard core, portable modules,
292
292
  and an ordinary JavaScript API can remain both practical and understandable.
293
293
 
294
294
  ## References
@@ -1,36 +0,0 @@
1
- # ISO/IEC 13211-2 module amendment (2013) coverage
2
-
3
- This ledger maps EyeProlog's normal module profile to the requirements clarified
4
- by the attached 2013 ISO/IEC 13211-2 amendment draft (WG17 N251). It is narrowly
5
- scoped to that amendment. It does **not** turn the broader ISO/IEC 13211-2:2000
6
- base document into a release-facing certification claim; unchanged Part 2
7
- facilities outside the amendment still need their own clause-by-clause audit.
8
-
9
- Executable evidence lives in `test/run-iso-part2-amendment.mjs` and is included
10
- in both `npm test` and the conformance aggregate.
11
-
12
- | Amendment clause | Required behavior | EyeProlog behavior / evidence |
13
- | --- | --- | --- |
14
- | 6.2.4.1 | A `module(Name, Exports)` directive identifies a named module and its public predicate indicators. | `Program.defineModule()` records the named module and export map. The focused suite checks that public predicates import and private predicates remain module-local. |
15
- | 6.2.5 | A module body is a Prolog text beginning with its `module/2` directive and extending to the end of that text. | Files designated by `use_module/1-2` are accepted as module sources only when their first read term is `module/2`. A second `module/2` later in the same Prolog text is rejected rather than switching modules mid-text, while a distinct Prolog text may begin a distinct module body. |
16
- | 6.2.5.5 | `use_module(F, L)` selectively imports the predicates in `L` from the exports of the module defined by `F`. | `Program.importModule()` validates requested indicators against the source module's export map and installs only those imports. The focused suite verifies selective import. |
17
- | 6.2.5.6 | `use_module(F)` imports all exported predicates; the amendment also aligns the public-predicate effect of `ensure_loaded(F)` for a module source. | `use_module/1` imports the full export map. `ensure_loaded/1` now imports a module's public predicates while retaining idempotent source loading, including when the same module was already loaded for another caller. |
18
- | 6.2.5.7 | `meta_predicate/1` marks context-sensitive arguments; `:` arguments carry the current source/calling module. | Normal parsing accepts the amendment spelling `:- meta_predicate p(:).`. Colon-mode arguments are represented as an observable `Module:Goal` term, including when the argument is a variable. Numeric closure modes remain a separate compatibility extension. |
19
- | 6.4.4.3 | Imported metapredicates preserve the caller's module context for their meta-arguments. | The focused suite verifies both visible `Module:Goal` decomposition and execution of a caller-private predicate through a variable meta-argument. Explicit `Module:Goal` calls continue to set their stated module context. |
20
-
21
- ## Operator boundary
22
-
23
- ISO/IEC 13211-2 adds `:` as the module-qualification operator relative to the
24
- Part 1 initial operator table. EyeProlog therefore predeclares `:` only in its
25
- normal module profile; `--iso-strict` no longer includes it in the Part 1
26
- initial table. Normal mode also predeclares `meta_predicate` as a directive
27
- operator so the amendment's source spelling is accepted, while the parenthesized
28
- `meta_predicate(...)` compatibility spelling remains valid.
29
-
30
- ## Remaining Part 2 scope
31
-
32
- The amendment coverage above is executable and release-gated. EyeProlog still
33
- describes the overall Part 2 surface as a compatibility profile until the
34
- unchanged portions of ISO/IEC 13211-2:2000 - including its broader module
35
- interface and re-export model - have a complete processor/semantics ledger.
36
- See `ISO-PART2-PART3-SCOPE.md` for that release boundary.
@@ -1,71 +0,0 @@
1
- # ISO Part 2 and Part 3 compatibility scope
2
-
3
- EyeProlog's release-facing `--iso-strict` claim is deliberately limited to
4
- ISO/IEC 13211-1:1995 together with Technical Corrigenda 1:2007, 2:2012, and
5
- 3:2017. This note records the separate status of the normal-profile facilities
6
- that overlap ISO/IEC 13211-2:2000 (modules) and ISO/IEC TS 13211-3:2025 (definite
7
- clause grammar rules). It is a scope ledger, not an independent certification.
8
-
9
- ## Part 2 modules
10
-
11
- Normal mode implements a procedure-oriented module compatibility layer:
12
- `module/2`, `use_module/1-2`, `meta_predicate/1`, explicit `Module:Goal`
13
- qualification, exports/imports, nonterminal indicators, and module-aware meta
14
- calls are covered by the regression and conformance corpora.
15
-
16
- The requirements clarified by the 2013 ISO/IEC 13211-2 module amendment draft
17
- (WG17 N251) now have a dedicated executable ledger in
18
- `ISO-PART2-AMENDMENT-2013.md`: module/2 exports, selective and full imports, the
19
- module-source behavior of ensure_loaded/1, the amendment's meta_predicate
20
- directive spelling, and visible caller-module qualification of `:`
21
- meta-arguments. The focused runner is part of the release gate.
22
-
23
- This amendment coverage is intentionally narrower than a complete Part 2
24
- conformance claim. In particular, the Part 1 strict registry does not enable
25
- module directives or the Part 2 `:` operator, and the project does not infer
26
- full Part 2 coverage from interoperability with Scryer, Trealla, or Logtalk. A
27
- future complete Part 2 claim would require a clause-by-clause audit of the
28
- unchanged ISO/IEC 13211-2:2000 module-interface and re-export facilities as well
29
- as the amendment.
30
-
31
- ## Part 3 definite clause grammars
32
-
33
- Normal mode expands grammar rules to ordinary predicates and supports terminal
34
- sequences, sequencing, alternatives, semicontexts, embedded goals, cut,
35
- `call//1`, `phrase//1`, `phrase/2-3`, module-qualified nonterminals, and the
36
- implementation-dependent negation/if-then choices documented in the reference.
37
- `--iso-strict` leaves `-->/2` as ordinary Part 1 operator syntax and excludes
38
- Part 3 grammar expansion and `phrase/2-3` from the strict registry.
39
-
40
- EyeProlog elects to perform both implementation-defined terminal-sequence
41
- checks in ISO/IEC TS 13211-3:2025, 8.18.1.3 g and h. The checks are optional;
42
- when performed, their specified error type is `list`. EyeProlog consistently
43
- raises `type_error(list, Culprit)` for a non-list input to `phrase/2` or
44
- `phrase/3`, and for a non-list remainder to `phrase/3`. The culprit is the
45
- whole invalid argument, including an improper list, not just its tail.
46
- Variables, proper lists, and partial lists are accepted by these checks.
47
- For otherwise valid grammar bodies, validation precedes execution, even when
48
- the grammar would fail or produce a side effect.
49
-
50
- The upstream phrase quads permit both checking and non-checking outcomes and
51
- therefore do not establish this consistency. A dedicated regression matrix in
52
- `test/run-regression.mjs` requires the exact diagnostic across both arities,
53
- both sequence positions, atomic and compound non-lists, improper lists at
54
- several depths, and several grammar bodies. Positive cases protect variables,
55
- proper lists, and partial lists. These are policy checks, not a relaxation of
56
- the unmodified upstream corpus.
57
-
58
- The Part 3 implementation otherwise keeps sequence validation, grammar-body
59
- callability, variable-body instantiation errors, `phrase/3` steadfastness, and
60
- grammar expansion under focused executable tests. Changes intended to advance a
61
- formal Part 3 claim should update this ledger and the corresponding error cases
62
- rather than silently changing the compatibility profile.
63
-
64
- ## Release boundary
65
-
66
- - Part 1 + Corrigenda 1-3: release-facing strict-core conformance target.
67
- - Part 2: 2013 amendment requirements release-gated; broader Part 2 remains a normal-mode compatibility profile, not a complete certification.
68
- - Part 3: normal-mode compatibility profile, tested but not certified complete.
69
-
70
- This separation keeps Part 1 conformance evidence independent of useful module
71
- and DCG extensions while making known Part 2/Part 3 scope limits visible.