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 +1 -1
- package/package.json +1 -1
- package/test/conformance/ISO-BUILTIN-MODE-ERROR-MATRIX.md +11 -11
- package/test/conformance/ISO-COMPLIANCE.md +28 -28
- package/test/conformance/ISO-CORRIGENDA-MATRIX.md +8 -8
- package/test/conformance/ISO-EVALUABLE-FUNCTOR-MATRIX.md +2 -2
- package/test/conformance/ISO-IMPLEMENTATION-DEFINED.md +5 -6
- package/test/conformance/ISO-PART2.md +117 -0
- package/test/conformance/ISO-PART3.md +99 -0
- package/test/conformance/ISO-PROCESSOR-REQUIREMENTS.md +7 -7
- package/test/conformance/ISO-PROLOG-TEXT-EXECUTION-MATRIX.md +5 -5
- package/test/conformance/ISO-TERM-SEMANTICS-MATRIX.md +2 -2
- package/test/conformance/NEUMERKEL-LATEST.md +1 -1
- package/test/conformance/NEUMERKEL-LIVE.md +2 -2
- package/test/conformance/README.md +9 -8
- package/test/conformance/STC-DRAFT-STATUS.md +2 -2
- package/test/neumerkel.mjs +1 -1
- package/test/run-regression.mjs +6 -6
- package/the-art-of-eyeprolog.md +6 -4
- package/why-eyeprolog.md +2 -2
- package/test/conformance/ISO-PART2-AMENDMENT-2013.md +0 -36
- package/test/conformance/ISO-PART2-PART3-SCOPE.md +0 -71
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
|
|
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
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# ISO Part 1 built-in mode/error
|
|
1
|
+
# ISO Part 1 built-in mode/error review
|
|
2
2
|
|
|
3
|
-
This matrix turns the broad built-in
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
15
|
-
|
|
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
|
-
`
|
|
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
|
|
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 `
|
|
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-
|
|
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
|
|
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-
|
|
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
|
|
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
|
|
54
|
+
## Conformance corrections and review closure
|
|
55
55
|
|
|
56
|
-
The
|
|
57
|
-
concrete mismatches that are now part of the closed Part 1
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
174
|
-
doing that mapping, the 7.6.2 term-to-clause conversion
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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/
|
|
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 `
|
|
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
|
|
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
|
|
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
|
-
|
|
|
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
|
|
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
|
|
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
|
-
|
|
|
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
|
|
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
|
-
|
|
|
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
|
|
1
|
+
# ISO Part 1 expression/evaluable-functor coverage matrix
|
|
2
2
|
|
|
3
|
-
This file is the row-level
|
|
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
|
|
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
|
-
- **
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
44
|
-
| 5.5.8 additional flags | covered | normal `occurs_check` extension is absent from strict mode; the Part 1 flag family is fully
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
91
|
+
keeps the general semantics visible in addition to the 8.15 built-in review.
|
|
92
92
|
|
|
93
|
-
##
|
|
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
|
|
1
|
+
# ISO Part 1 term-semantics coverage matrix
|
|
2
2
|
|
|
3
|
-
This file closes the Clause 7.1-7.3
|
|
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
|
|
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
|
|
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
|
|
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
|
|
11
|
-
tracks the row-by-row built-in
|
|
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
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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. |
|
package/test/neumerkel.mjs
CHANGED
|
@@ -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
|
|
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`.',
|
package/test/run-regression.mjs
CHANGED
|
@@ -5901,7 +5901,7 @@ ${profile}`;
|
|
|
5901
5901
|
},
|
|
5902
5902
|
},
|
|
5903
5903
|
{
|
|
5904
|
-
name: 'published ISO Corrigenda have a complete stable
|
|
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
|
|
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, '|
|
|
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
|
|
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
|
|
6005
|
-
assertIncludes(profile, 'Part 1 processor, syntax, semantic, built-in, and arithmetic', 'Why EyeProlog
|
|
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
|
{
|
package/the-art-of-eyeprolog.md
CHANGED
|
@@ -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-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|