eyeprolog 1.3.60 → 1.3.61
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 +18 -60
- package/package.json +1 -1
- package/test/conformance/ISO-BUILTIN-MODE-ERROR-MATRIX.md +2 -2
- package/test/conformance/ISO-COMPLIANCE.md +42 -38
- package/test/conformance/ISO-EVALUABLE-FUNCTOR-MATRIX.md +1 -1
- package/test/conformance/ISO-PROCESSOR-REQUIREMENTS.md +6 -6
- package/test/conformance/ISO-PROLOG-TEXT-EXECUTION-MATRIX.md +94 -0
- package/test/conformance/README.md +11 -12
- package/test/run-iso-strict.mjs +100 -0
- package/test/run-regression.mjs +27 -8
- package/the-art-of-eyeprolog.md +12 -11
- package/why-eyeprolog.md +1 -1
- package/test/conformance/ISO-EXIT-CRITERIA.md +0 -55
- package/test/conformance/ISO-MATRIX.md +0 -48
package/README.md
CHANGED
|
@@ -203,66 +203,24 @@ eyeprolog --iso-strict
|
|
|
203
203
|
eyeprolog --iso-strict --goal 'p(X)' program.pl
|
|
204
204
|
```
|
|
205
205
|
|
|
206
|
-
The equivalent JavaScript option is `isoStrict: true`. Strict mode
|
|
207
|
-
EyeProlog
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
EyeProlog extension. The strict gate also checks the prescribed ISO error
|
|
225
|
-
precedence for `read_term/3`, `write_term/3`, `op/3`, and `current_op/3`, and
|
|
226
|
-
the complete Part 1 flag defaults/value domains/changeability rules. The
|
|
227
|
-
ongoing issue #65 audit additionally tightens Prolog-text declaration ordering,
|
|
228
|
-
initialization lifetime, stream/open/close behavior, character/byte stream
|
|
229
|
-
errors, `keysort/2` error cases, the now-closed 5.5.6 side-effect and 5.5.10 evaluable-functor strict
|
|
230
|
-
extension boundaries, and the standard's permitted arithmetic variation points: mixed-type Corrigendum 2
|
|
231
|
-
`max/2`/`min/2` and signed Clause 9.4 bitwise/shift behavior. The row-level
|
|
232
|
-
7.1-7.3 term-semantics audit and 7.9/Clause 9 expression/evaluable-functor
|
|
233
|
-
audit are now closed as well. That arithmetic pass also corrected float-only
|
|
234
|
-
`float_integer_part/1` and `float_fractional_part/1`: an integer operand, even
|
|
235
|
-
a huge valid unbounded integer, now reaches `type_error(float,...)` before any
|
|
236
|
-
integer-to-float overflow.
|
|
237
|
-
Those additions improve the Part 1 surface without turning the remaining audit
|
|
238
|
-
rows into a blanket conformance claim. The post-N289 WG17/STC working draft is
|
|
239
|
-
reviewed separately rather than treated as a fourth Corrigendum. The
|
|
240
|
-
2026-08-23 draft items #73-#76 are now pinned explicitly: float input limits for
|
|
241
|
-
`read*` and `number_*` conversions, invalid-character term input, and the draft
|
|
242
|
-
proposal that would make the two power-underflow rows depend on the processor's
|
|
243
|
-
9.1.4.2 `resultF` choice. Strict mode retains the published Part 1 +
|
|
244
|
-
Corrigenda 1-3 behavior where the draft has not been standardized.
|
|
245
|
-
|
|
246
|
-
As an additional 5.5.1 extension-safety gate, every vendored WG17 syntax case
|
|
247
|
-
that succeeds in the strict Part 1 reader is re-run in the normal profile and
|
|
248
|
-
must retain the same observable outcome; normal mode may accept extra extension
|
|
249
|
-
syntax, but it must not reinterpret text already accepted as standard syntax.
|
|
250
|
-
|
|
251
|
-
The auditable processor-requirement checklist lives in
|
|
252
|
-
[`test/conformance/ISO-COMPLIANCE.md`](test/conformance/ISO-COMPLIANCE.md).
|
|
253
|
-
The ISO 5.4 implementation-defined/implementation-specific decision index is
|
|
254
|
-
[`test/conformance/ISO-IMPLEMENTATION-DEFINED.md`](test/conformance/ISO-IMPLEMENTATION-DEFINED.md).
|
|
255
|
-
The closed term and arithmetic row audits are
|
|
256
|
-
[`ISO-TERM-SEMANTICS-MATRIX.md`](test/conformance/ISO-TERM-SEMANTICS-MATRIX.md) and
|
|
257
|
-
[`ISO-EVALUABLE-FUNCTOR-MATRIX.md`](test/conformance/ISO-EVALUABLE-FUNCTOR-MATRIX.md);
|
|
258
|
-
[`ISO-EXIT-CRITERIA.md`](test/conformance/ISO-EXIT-CRITERIA.md) states the remaining
|
|
259
|
-
normative and external-corpus exit conditions.
|
|
260
|
-
The separate [WG17 syntax ledger](test/conformance/WG17-SYNTAX-STATUS.md)
|
|
261
|
-
records executable dispositions for the vendored active upstream WG17 syntax
|
|
262
|
-
cases and runs as part of `npm test`. Reviewed cases can pin exact outcomes;
|
|
263
|
-
newly upgraded cases run directly against the upstream Codex expectation.
|
|
264
|
-
EyeProlog does not yet claim independent certification or closure of every
|
|
265
|
-
normative Part 1 requirement.
|
|
206
|
+
The equivalent JavaScript option is `isoStrict: true`. Strict mode keeps
|
|
207
|
+
EyeProlog's documented implementation-defined Unicode scalar processor
|
|
208
|
+
character set, while excluding normal-profile language extensions such as Part
|
|
209
|
+
2 module compatibility forms, Part 3 DCG expansion, quads, extra libraries,
|
|
210
|
+
automatic tabling, and non-standard flags/control facilities. Normal mode is
|
|
211
|
+
unchanged.
|
|
212
|
+
|
|
213
|
+
This README intentionally stays at the project-overview level. The detailed
|
|
214
|
+
implementation reference is [*The Art of EyeProlog*](the-art-of-eyeprolog.md).
|
|
215
|
+
The current Part 1 audit status and remaining release conditions are recorded in
|
|
216
|
+
[`test/conformance/ISO-COMPLIANCE.md`](test/conformance/ISO-COMPLIANCE.md);
|
|
217
|
+
implementation-defined decisions are indexed in
|
|
218
|
+
[`ISO-IMPLEMENTATION-DEFINED.md`](test/conformance/ISO-IMPLEMENTATION-DEFINED.md). The complete
|
|
219
|
+
vendored WG17 syntax corpus and the strict ISO regression suite run as release
|
|
220
|
+
gates.
|
|
221
|
+
|
|
222
|
+
EyeProlog does not claim independent ISO certification while the explicit exit
|
|
223
|
+
checklist still contains unresolved normative or unexplained-deviation items.
|
|
266
224
|
|
|
267
225
|
## Module and definite clause grammar compatibility profiles
|
|
268
226
|
|
package/package.json
CHANGED
|
@@ -376,5 +376,5 @@ The remaining #65 work is therefore above/below this built-in table. The
|
|
|
376
376
|
7.1-7.3 term-semantics and 7.9/Clause 9 evaluable-functor rows are now closed in
|
|
377
377
|
their dedicated matrices. What remains is Clause 6 text/rejection mapping,
|
|
378
378
|
Clause 7.4-7.8 plus higher-level 7.10/7.12 processor/control semantics, residual
|
|
379
|
-
Clause 5 dependency rows
|
|
380
|
-
|
|
379
|
+
Clause 5 dependency rows and the unexplained-deviation exit criterion
|
|
380
|
+
recorded in `ISO-COMPLIANCE.md`.
|
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
# ISO/IEC 13211-1 compliance ledger
|
|
2
2
|
|
|
3
|
-
This ledger is the release-facing audit
|
|
4
|
-
The normative baseline is ISO/IEC 13211-1:1995
|
|
5
|
-
Corrigenda 1:2007, 2:2012, and 3:2017.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
[
|
|
10
|
-
Clause 5 processor obligations. [ISO-TERM-SEMANTICS-MATRIX.md](ISO-TERM-SEMANTICS-MATRIX.md)
|
|
11
|
-
and [ISO-EVALUABLE-FUNCTOR-MATRIX.md](ISO-EVALUABLE-FUNCTOR-MATRIX.md) close the
|
|
12
|
-
row-level Clause 7.1-7.3 and 7.9/Clause 9 audits, while
|
|
13
|
-
[ISO-EXIT-CRITERIA.md](ISO-EXIT-CRITERIA.md) makes the remaining release exit
|
|
14
|
-
conditions explicit. The generated [`conformance-report.md`](../../conformance-report.md)
|
|
15
|
-
gives current case totals.
|
|
3
|
+
This ledger is the release-facing audit and high-level coverage map for
|
|
4
|
+
EyeProlog's ISO/IEC 13211-1 core. The normative baseline is ISO/IEC 13211-1:1995
|
|
5
|
+
together with Technical Corrigenda 1:2007, 2:2012, and 3:2017. Detailed
|
|
6
|
+
row-level evidence lives only where it adds information: the built-in, processor,
|
|
7
|
+
term-semantics, Prolog-text/execution, evaluable-functor, implementation-defined,
|
|
8
|
+
WG17-syntax, and STC draft ledgers in this directory. The generated
|
|
9
|
+
[`conformance-report.md`](../../conformance-report.md) gives current case totals.
|
|
16
10
|
|
|
17
11
|
The ledger deliberately does **not** claim independent certification. A row
|
|
18
12
|
marked `covered` means EyeProlog has implementation and executable tests for
|
|
@@ -26,7 +20,7 @@ relevant implementation-dependent overlap choice to an explicit audit outcome.
|
|
|
26
20
|
| Requirement | Status | EyeProlog evidence / remaining work |
|
|
27
21
|
| --- | --- | --- |
|
|
28
22
|
| 5.1(a) prepare conforming Prolog text | audit | Clause 6 parser/tokenizer coverage, directive coverage, syntax-error corpus, and the [complete vendored WG17 syntax matrix](WG17-SYNTAX-STATUS.md). Wider shall-by-shall text-processing audit remains open. |
|
|
29
|
-
| 5.1(b) execute conforming Prolog goals | audit | Clause 7-9 conformance corpus plus regression/API/example gates. The 7.1-7.
|
|
23
|
+
| 5.1(b) execute conforming Prolog goals | audit | Clause 7-9 conformance corpus plus regression/API/example gates. The 7.1-7.8 term/preparation/database/control rows, 7.9/Clause 9 arithmetic, and 8.2-8.17 built-in row audits are now closed; the dependency remains open on higher-level 7.10 and residual processor-level 7.12 semantics. |
|
|
30
24
|
| 5.1(c) reject nonconforming text/read-terms | audit | Dedicated syntax-error cases and strict-core extension rejection. Exhaustive lexical rejection coverage remains open. |
|
|
31
25
|
| 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. Rows marked `audit gap` remain conformance work, but the variation is no longer undocumented. |
|
|
32
26
|
| 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, disable automatic tabling/recursion guards, and reject the normal-profile host `stringTerm/1` term type at strict program/goal entry. |
|
|
@@ -39,14 +33,14 @@ relevant implementation-dependent overlap choice to an explicit audit outcome.
|
|
|
39
33
|
| --- | --- | --- |
|
|
40
34
|
| Clause 6 — tokens, terms, lists, operators, quoted text | audit | Complete vendored WG17 syntax matrix, `lexical_and_curly_terms`, `scryer_lexical_terms`, operator suites, syntax-error cases, quoted-layout/escape error cases, writer/read-back regressions, and Unicode-scalar PCS/collation boundary tests. A cross-profile gate now verifies that every WG17 case accepted by the strict Part 1 reader has the same observable outcome under normal-mode syntax extensions. The implementation-defined 6.5/6.6 character-model decisions are closed; the remaining work is the explicit production-by-production shall map. |
|
|
41
35
|
| 7.1-7.3 — term types, term order, unification | covered | [ISO-TERM-SEMANTICS-MATRIX.md](ISO-TERM-SEMANTICS-MATRIX.md) records the five mutually exclusive strict term types, derived variable/compound/list notions, the complete standard-order classes and implementation-dependent variable-order choice, NSTO MGU/failure behavior, and EyeProlog's permitted consistent occurs-check failure for Part 1's undefined STO ordinary-unification cases. The normal JavaScript API string term is documented as a 5.5.4 extension and rejected at strict program/goal entry. |
|
|
42
|
-
| 7.4 — Prolog text and directives |
|
|
43
|
-
| 7.5-7.6 — database and term/clause conversion |
|
|
44
|
-
| 7.7 — execution and backtracking |
|
|
45
|
-
| 7.8 — control constructs and exceptions |
|
|
36
|
+
| 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. |
|
|
37
|
+
| 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. |
|
|
38
|
+
| 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. EyeProlog automatic tabling, cycle guards, and recursive numeric shortcuts remain disabled in the strict profile. |
|
|
39
|
+
| 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. The 8.15 built-in additions remain independently row-audited. |
|
|
46
40
|
| 7.9 — expression evaluation | covered | [ISO-EVALUABLE-FUNCTOR-MATRIX.md](ISO-EVALUABLE-FUNCTOR-MATRIX.md) closes recursive evaluation, direct-variable precedence, corrected non-evaluable `F/N` errors (including STC #69), operand template/type rules, mixed arithmetic-comparison conversion, exceptional values, and finite-host resource normalization. The audit also fixes float-only `float_integer_part/1` and `float_fractional_part/1` so even huge valid integers reach `type_error(float,...)` before any I->F overflow. |
|
|
47
41
|
| 7.10 — input/output concepts | audit | Stream, character/byte I/O, read/write options, operator-sensitive write-back, and Corrigendum 3 writer cases. The complete 8.11-8.14 built-in mode/error family is now row-audited in [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md), including lifecycle/current-stream handling, stream positions, text/binary permissions, EOF actions, `force(true)`, input-code representation timing, term-I/O options, operators, and character conversion. `stream_property/2` now also distinguishes a malformed stream-term (domain error) from a valid stream-term whose stream is no longer open (ordinary failure). The higher-level 7.10 source/sink, buffering, positioning, and implementation-defined stream semantics remain under shall-by-shall audit. |
|
|
48
42
|
| 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. |
|
|
49
|
-
| 7.12 — errors | audit | ISO `error(Error, Context)` envelope, type/domain/permission/representation/evaluation/syntax/resource families and focused error cases. [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md) now gives explicit mode/error-condition outcomes across the complete 8.2-8.17 built-in family, including Corrigendum additions and not-applicable conditional branches. The audit records the 7.12 rule that simultaneous error conditions are implementation dependent: overlap regressions document stable EyeProlog choices rather than inventing a universal table-order requirement. Remaining work is concentrated in
|
|
43
|
+
| 7.12 — errors | audit | ISO `error(Error, Context)` envelope, type/domain/permission/representation/evaluation/syntax/resource families and focused error cases. [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md) now gives explicit mode/error-condition outcomes across the complete 8.2-8.17 built-in family, including Corrigendum additions and not-applicable conditional branches. The audit records the 7.12 rule that simultaneous error conditions are implementation dependent: overlap regressions document stable EyeProlog choices rather than inventing a universal table-order requirement. Remaining work is concentrated in higher-level 7.10 stream semantics and residual processor-level error conditions. |
|
|
50
44
|
| 8.2-8.17 — built-in predicates | covered | [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md) now records the complete Part 1 + Corrigenda built-in family at one row per prescribed mode, success/failure behavior, individual error condition, and conditional/not-applicable branch. The row audit exposed and fixed source/runtime 7.6.2 body conversion/variable sharing, strict host-string leakage, input-code error timing, `close/2` force handling, and closed-stream `stream_property/2` behavior. Simultaneous-error choices are documented as implementation dependent under 7.12 unless separately constrained. |
|
|
51
45
|
| 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. |
|
|
52
46
|
| Corrigendum 1 | covered | Double-quoted atom/operator-priority corrections have dedicated cases. |
|
|
@@ -91,9 +85,8 @@ database update errors, and Corrigendum 3 variable metadata traversal/write
|
|
|
91
85
|
naming.
|
|
92
86
|
|
|
93
87
|
The public WG17 `number_chars/2` comparison used in preparation of Corrigendum
|
|
94
|
-
2 has additionally been checked
|
|
95
|
-
|
|
96
|
-
as an offline release gate; the exit criterion below therefore remains open.
|
|
88
|
+
2 has additionally been checked during the audit. It remains supporting review
|
|
89
|
+
evidence rather than a duplicated vendored corpus or release criterion.
|
|
97
90
|
|
|
98
91
|
A further issue #65 audit closes the Part 1 flag family and tightens the 8.14
|
|
99
92
|
term-I/O/operator error rules. The strict flag registry now distinguishes a
|
|
@@ -213,9 +206,9 @@ individual-error outcomes in `ISO-BUILTIN-MODE-ERROR-MATRIX.md`. During this
|
|
|
213
206
|
pass `stream_property/2` exposed a lifecycle distinction: a syntactically valid
|
|
214
207
|
stream-term for a stream that has been closed denotes no currently open stream
|
|
215
208
|
property pair and therefore fails, whereas a term that is not a stream-term is
|
|
216
|
-
still a `domain_error(stream, ...)`. This leaves the remaining #65 checklist
|
|
217
|
-
|
|
218
|
-
unmapped built-in tables.
|
|
209
|
+
still a `domain_error(stream, ...)`. This leaves the remaining #65 checklist focused on Clause 6 syntax/rejection,
|
|
210
|
+
higher-level 7.10 stream semantics, residual 7.12 processor errors, and final
|
|
211
|
+
unexplained-deviation closure rather than unmapped built-in tables.
|
|
219
212
|
|
|
220
213
|
## Post-Corrigendum STC cross-check
|
|
221
214
|
|
|
@@ -271,10 +264,9 @@ directive may still add an infix `?-` definition; strict mode reads that as an
|
|
|
271
264
|
ordinary term rather than as a quad.
|
|
272
265
|
|
|
273
266
|
Module and DCG compatibility features remain supported and tested in the
|
|
274
|
-
normal EyeProlog profile
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
13211-2:2000 or ISO/IEC TS 13211-3.
|
|
267
|
+
normal EyeProlog profile, but they are not folded into the Part 1 strict-core
|
|
268
|
+
claim. The project does not currently assert that this evidence closes every
|
|
269
|
+
requirement of ISO/IEC 13211-2:2000 or ISO/IEC TS 13211-3.
|
|
278
270
|
|
|
279
271
|
## Release gate
|
|
280
272
|
|
|
@@ -292,13 +284,25 @@ outputs are never auto-accepted.
|
|
|
292
284
|
|
|
293
285
|
## Exit criteria for a full conformance claim
|
|
294
286
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
287
|
+
Issue #65 is closed by explicit dispositions, not by a test-count threshold.
|
|
288
|
+
The remaining qualification can be removed only when every open item below is
|
|
289
|
+
closed without an unexplained deviation from the published Part 1 + Corrigenda
|
|
290
|
+
baseline. Public post-N289 STC drafts remain review input until standardized.
|
|
299
291
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
292
|
+
| Criterion | Status | Evidence / remaining work |
|
|
293
|
+
| --- | --- | --- |
|
|
294
|
+
| Clause 5 processor obligations have explicit dispositions | open | `ISO-PROCESSOR-REQUIREMENTS.md` still depends on the remaining Clause 6 preparation/rejection and syntax-preservation work |
|
|
295
|
+
| Clause 6 lexical/syntactic requirements have explicit dispositions | open | the 366-case vendored WG17 syntax gate and cross-profile preservation are green; the remaining work is the production-by-production shall/rejection map |
|
|
296
|
+
| Clause 7 semantic requirements have explicit dispositions | open | 7.1-7.9 and 7.11 are closed; higher-level 7.10 stream semantics and residual processor-level 7.12 requirements remain |
|
|
297
|
+
| Clause 8 built-in modes/errors have explicit dispositions | covered | `ISO-BUILTIN-MODE-ERROR-MATRIX.md` closes 8.2-8.17 row by row |
|
|
298
|
+
| Clause 9 evaluable-functor requirements have explicit dispositions | covered | `ISO-EVALUABLE-FUNCTOR-MATRIX.md` plus the strict arithmetic regression closes the published Part 1 + Corrigenda arithmetic rows |
|
|
299
|
+
| Implementation-defined choices are documented | covered | `ISO-IMPLEMENTATION-DEFINED.md` is the Clause 5.4 decision index and strict tests pin execution-visible choices |
|
|
300
|
+
| Implementation-specific strict/normal boundary is documented and tested | open | the major 5.5 hooks are closed; exhaustive 5.5.1 syntax preservation remains tied to the Clause 6 audit |
|
|
301
|
+
| Published Corrigenda 1-3 are incorporated | covered | dedicated conformance/strict tests and this ledger track all three published Corrigenda |
|
|
302
|
+
| 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 |
|
|
303
|
+
| Independent external syntax corpus is an offline release gate | covered | the vendored WG17 syntax matrix has 366 executable dispositions checked against its upstream expectations |
|
|
304
|
+
| 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` |
|
|
305
|
+
| No unexplained deviation remains in the release-facing ledger | open | every remaining `audit` row must end as covered, implementation-defined/specific with documented behavior, not applicable, or a documented defect |
|
|
306
|
+
|
|
307
|
+
The specialized row matrices are evidence for this ledger, not separate public
|
|
308
|
+
status documents. *The Art of EyeProlog* remains the implementation reference.
|
|
@@ -88,4 +88,4 @@ With this matrix and the strict arithmetic regression, the release-facing
|
|
|
88
88
|
Clause 7.9 and Clause 9 rows are `covered`. The remaining issue #65 audit is not
|
|
89
89
|
therefore an arithmetic audit: it is concentrated in Clause 6 text/rejection,
|
|
90
90
|
Clause 7.4-7.8 and 7.10/7.12 processor semantics, their Clause 5 dependencies,
|
|
91
|
-
and the remaining
|
|
91
|
+
and the remaining processor-level exit criteria.
|
|
@@ -16,8 +16,8 @@ certification claim.
|
|
|
16
16
|
|
|
17
17
|
| Requirement | Status | Current evidence / remaining work |
|
|
18
18
|
| --- | --- | --- |
|
|
19
|
-
| 5.1(a) prepare conforming Prolog text | audit | parser/preparation tests,
|
|
20
|
-
| 5.1(b) execute conforming Prolog goals | audit | the 7.1-7.
|
|
19
|
+
| 5.1(a) prepare conforming Prolog text | audit | parser/preparation tests, the closed 7.4 directive/source-clause matrix, include/ensure-loaded behavior, preparation-time operators/flags/character conversion, and the complete vendored WG17 syntax matrix; the remaining dependency is the production-by-production Clause 6 map |
|
|
20
|
+
| 5.1(b) execute conforming Prolog goals | audit | the 7.1-7.8 term/preparation/database/control matrices, 7.9/Clause 9 evaluable-functor matrix, and complete 8.2-8.17 built-in row audit are closed; remaining dependency rows are higher-level 7.10 and residual processor-level 7.12 semantics |
|
|
21
21
|
| 5.1(c) reject nonconforming text/read terms | audit | syntax-error corpus, WG17 negative syntax cases, strict extension rejection; exhaustive Clause 6 rejection mapping remains open |
|
|
22
22
|
| 5.1(d) specify permitted variations | covered | `ISO-IMPLEMENTATION-DEFINED.md` records the Part 1 implementation-defined choices and implementation-specific extension families |
|
|
23
23
|
| 5.1(e) offer a strictly conforming mode | covered | CLI `--iso-strict` and API `isoStrict: true`; registry/directive/operator/flag extension filtering plus disabled implementation-specific execution shortcuts |
|
|
@@ -26,8 +26,8 @@ certification claim.
|
|
|
26
26
|
|
|
27
27
|
| Requirement | Status | Current evidence / remaining work |
|
|
28
28
|
| --- | --- | --- |
|
|
29
|
-
| 5.2 conforming and strictly conforming Prolog text boundary | audit | strict parser accepts Part 1 + Corrigenda syntax plus implementation-defined PCS choices and rejects implementation-specific language facilities; full Clause 6/
|
|
30
|
-
| 5.3 conforming and strictly conforming Prolog goal boundary | audit | strict registry/control/evaluable filtering plus closed 7.1-7.
|
|
29
|
+
| 5.2 conforming and strictly conforming Prolog text boundary | audit | strict parser accepts Part 1 + Corrigenda syntax plus implementation-defined PCS choices and rejects implementation-specific language facilities; 7.4 preparation is closed and the full Clause 6 production/rejection map remains open |
|
|
30
|
+
| 5.3 conforming and strictly conforming Prolog goal boundary | audit | strict registry/control/evaluable filtering plus closed 7.1-7.9 and 8.2-8.17 row matrices; remaining higher-level 7.10 stream and processor-error semantics keep the top-level goal boundary open |
|
|
31
31
|
| 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 |
|
|
32
32
|
|
|
33
33
|
## 5.5 — extension boundaries
|
|
@@ -51,6 +51,6 @@ certification claim.
|
|
|
51
51
|
|
|
52
52
|
A top-level row stays `audit` until all of the normative clauses it depends on
|
|
53
53
|
have explicit pass, not-applicable, or documented implementation-defined
|
|
54
|
-
outcomes. `ISO-
|
|
55
|
-
release-exit
|
|
54
|
+
outcomes. `ISO-COMPLIANCE.md` records the same dependency closure in its embedded
|
|
55
|
+
release-exit checklist. This prevents a large green regression suite from
|
|
56
56
|
being mistaken for a completed processor-requirement audit.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# ISO Part 1 Prolog-text, database, and execution matrix
|
|
2
|
+
|
|
3
|
+
This matrix closes the remaining row-level audit for ISO/IEC 13211-1:1995
|
|
4
|
+
Clauses 7.4-7.8 against the published Part 1 baseline plus Technical
|
|
5
|
+
Corrigenda 1-3. It complements the built-in mode/error matrix: these rows are
|
|
6
|
+
processor semantics above individual predicate definitions.
|
|
7
|
+
|
|
8
|
+
`covered` means the strict profile has an explicit implementation decision and
|
|
9
|
+
executable evidence. Where Part 1 leaves a choice implementation-defined, the
|
|
10
|
+
chosen behavior is also indexed by `ISO-IMPLEMENTATION-DEFINED.md`.
|
|
11
|
+
|
|
12
|
+
## 7.4 - Prolog text and preparation
|
|
13
|
+
|
|
14
|
+
| Row | Status | EyeProlog disposition / executable evidence |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| 7.4.1 preparation model | covered | A `Program` is prepared before goal execution. Source units share preparation state where Part 1 permits it; the implementation-defined cross-text choices are recorded in the 5.4 decision index. |
|
|
17
|
+
| 7.4.2.1 `dynamic/1` | covered | Strict preparation validates predicate indicators, declaration ordering, protected procedures, and creates an empty dynamic/public procedure even with no clauses. |
|
|
18
|
+
| 7.4.2.2 `multifile/1` | covered | Declarations can span source texts and preserve the prepared clause group; declaration/order checks are exercised by the strict/conformance suites. |
|
|
19
|
+
| 7.4.2.3 `discontiguous/1` | covered | Strict preparation permits separated clause groups only when declared and preserves their source order. |
|
|
20
|
+
| 7.4.2.4 `op/3` | covered | Operator changes affect subsequent text, including later text after an included source; invalid arguments use the same strict validation as the built-in. Earlier text is not reparsed. |
|
|
21
|
+
| 7.4.2.5 `char_conversion/2` | covered | With the flag enabled, conversion affects subsequent unquoted source characters; quoted text is unchanged and disabling the flag stops conversion. The mapping can carry into later source units according to the documented implementation-defined choice. |
|
|
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
|
+
| 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
|
+
| 7.4.2.8 `ensure_loaded/1` | covered | A source is prepared at most once in the current load graph, including repeated references and self/top-level references. |
|
|
25
|
+
| 7.4.2.9 `set_prolog_flag/2` | covered | Preparation-time flag changes affect subsequent text and are replayed into execution state; strict flag names/values/changeability remain governed by the closed 7.11 audit. |
|
|
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. |
|
|
27
|
+
|
|
28
|
+
The strict release test `closes ISO 7.4 Prolog-text preparation and directive
|
|
29
|
+
rows` exercises the cross-text operator/character/flag state, include and
|
|
30
|
+
ensure-loaded lifetime, initialization order, and one-shot initialization
|
|
31
|
+
behavior together. Existing focused tests retain the individual declaration
|
|
32
|
+
and preparation error cases.
|
|
33
|
+
|
|
34
|
+
## 7.5 - database model
|
|
35
|
+
|
|
36
|
+
| Row | Status | EyeProlog disposition / executable evidence |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| 7.5.1 initial database and clause order | covered | Prepared clauses retain textual preparation order. The implementation-defined initial database/standard-procedure choices are documented separately. |
|
|
39
|
+
| 7.5.2 static and dynamic procedures | covered | Source procedures are static unless declared dynamic; asserting a previously absent predicate creates a dynamic procedure; modification of protected/static procedures is rejected. |
|
|
40
|
+
| 7.5.3 private and public procedures | covered | User static procedures are private to `clause/2`; dynamic procedures are public; standardized built-ins/control forms remain static/private. |
|
|
41
|
+
| 7.5.4 database update visibility | covered | Dynamic calls use the logical-update view: an activation continues over the clause set visible when it began, while later activations see successful assertions/retractions. `retractall/1` retains an empty dynamic procedure and `abolish/1` removes it. |
|
|
42
|
+
|
|
43
|
+
The strict test `closes ISO 7.5-7.7 database, conversion, and execution rows`
|
|
44
|
+
pins source order, logical-update behavior, dynamic/public creation, and the
|
|
45
|
+
required distinction between an empty declared procedure and an unknown one.
|
|
46
|
+
The complete 8.8-8.9 database built-in modes/errors remain covered by
|
|
47
|
+
`ISO-BUILTIN-MODE-ERROR-MATRIX.md`.
|
|
48
|
+
|
|
49
|
+
## 7.6 - conversion between terms and clauses/goals
|
|
50
|
+
|
|
51
|
+
| Row | Status | EyeProlog disposition / executable evidence |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| 7.6.1 term-to-goal/body boundary | covered | Callable terms enter execution as goals; variables are deferred through `call/1`; non-callable numeric/body terms are rejected rather than silently coerced. |
|
|
54
|
+
| 7.6.2 term-to-body conversion | covered | Variables become `call/1`; conjunction, disjunction, and if-then bodies are converted recursively; non-control callable terms retain their predication; variable identity is preserved across the converted clause. |
|
|
55
|
+
| 7.6.3 clause-to-term observation | covered | `clause/2` returns fresh renamed clause observations with the required sharing between head and body. |
|
|
56
|
+
| 7.6.4 update conversion | covered | `asserta/1`, `assertz/1`, `retract/1`, and prepared source clauses use the same strict body-conversion rules and reject malformed bodies before database mutation. |
|
|
57
|
+
|
|
58
|
+
Corrigendum 3's explicit `call/1` term-to-body wording is covered by the source
|
|
59
|
+
and asserted-body conversion regressions.
|
|
60
|
+
|
|
61
|
+
## 7.7 - execution and backtracking
|
|
62
|
+
|
|
63
|
+
| Row family | Status | EyeProlog disposition / executable evidence |
|
|
64
|
+
| --- | --- | --- |
|
|
65
|
+
| goal execution / procedure selection | covered | Strict mode uses ordinary clause selection and depth-first backtracking; EyeProlog automatic tabling, cycle guards, and recursive numeric shortcuts are disabled. |
|
|
66
|
+
| clause order and re-execution | covered | Clauses are tried in prepared/database order; re-executable predicates expose subsequent solutions on backtracking. |
|
|
67
|
+
| 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). |
|
|
68
|
+
| 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. |
|
|
69
|
+
| built-in/control delegation | covered | Standardized built-ins dispatch through the strict registry and control constructs through the strict execution path; implementation-specific predicates/shortcuts are excluded by the 5.5 boundary audit. |
|
|
70
|
+
|
|
71
|
+
## 7.8 - control constructs and exceptions
|
|
72
|
+
|
|
73
|
+
| Row | Status | EyeProlog disposition / executable evidence |
|
|
74
|
+
| --- | --- | --- |
|
|
75
|
+
| 7.8.1 `true/0` | covered | succeeds once |
|
|
76
|
+
| 7.8.2 `fail/0` | covered | fails |
|
|
77
|
+
| 7.8.3 `call/1` | covered | executes the converted goal; variables can become callable after earlier bindings; Corrigendum 3 term-to-body conversion is used |
|
|
78
|
+
| 7.8.4 cut | covered | cut commits within its defined invocation scope; callee-local cuts do not incorrectly prune caller alternatives |
|
|
79
|
+
| 7.8.5 conjunction | covered | left-to-right execution and backtracking; nested malformed converted goals retain the whole control-term culprit |
|
|
80
|
+
| 7.8.6 disjunction | covered | left branch is tried before the right and failure backtracks into the right branch |
|
|
81
|
+
| 7.8.7 if-then | covered | successful condition commits to the selected condition solution before the then branch |
|
|
82
|
+
| 7.8.8 if-then-else | covered | condition success selects the then branch; condition failure selects the else branch with the standard commit boundary |
|
|
83
|
+
| 7.8.9 `catch/3` | covered | The protected goal executes inside the catch boundary. Corrigendum 2 behavior is pinned so callability errors arising from that protected goal can be caught. |
|
|
84
|
+
| 7.8.10 `throw/1` | covered | Throws propagate until a matching catch and use a renamed/fresh term for exception matching. |
|
|
85
|
+
|
|
86
|
+
The strict test `closes ISO 7.8 general control-construct and exception rows`
|
|
87
|
+
keeps the general semantics visible in addition to the 8.15 built-in audit.
|
|
88
|
+
|
|
89
|
+
## Audit result
|
|
90
|
+
|
|
91
|
+
Clauses **7.4-7.8 are covered at row level** for the declared strict Part 1
|
|
92
|
+
profile. Remaining Clause 7 exit work is therefore no longer general
|
|
93
|
+
preparation/database/control semantics; it is concentrated in the higher-level
|
|
94
|
+
7.10 stream model and residual processor-level 7.12 error requirements.
|
|
@@ -7,16 +7,14 @@ 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-
|
|
11
|
-
corrigenda, plus EyeProlog's module and DCG compatibility profiles, to representative
|
|
12
|
-
executable cases. [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md)
|
|
10
|
+
[ISO-COMPLIANCE.md](ISO-COMPLIANCE.md) is the high-level Part 1 audit and coverage map. [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md)
|
|
13
11
|
tracks the row-by-row built-in audit,
|
|
14
12
|
[ISO-TERM-SEMANTICS-MATRIX.md](ISO-TERM-SEMANTICS-MATRIX.md) closes 7.1-7.3,
|
|
15
|
-
[ISO-
|
|
16
|
-
7.
|
|
13
|
+
[ISO-PROLOG-TEXT-EXECUTION-MATRIX.md](ISO-PROLOG-TEXT-EXECUTION-MATRIX.md)
|
|
14
|
+
closes 7.4-7.8, [ISO-EVALUABLE-FUNCTOR-MATRIX.md](ISO-EVALUABLE-FUNCTOR-MATRIX.md)
|
|
15
|
+
closes 7.9/Clause 9, and [ISO-PROCESSOR-REQUIREMENTS.md](ISO-PROCESSOR-REQUIREMENTS.md)
|
|
17
16
|
decomposes the Clause 5 processor obligations.
|
|
18
|
-
[ISO-
|
|
19
|
-
external-corpus release-exit conditions explicit. [WG17-SYNTAX-STATUS.md](WG17-SYNTAX-STATUS.md) records the
|
|
17
|
+
The exit checklist is embedded in [ISO-COMPLIANCE.md](ISO-COMPLIANCE.md). [WG17-SYNTAX-STATUS.md](WG17-SYNTAX-STATUS.md) records the
|
|
20
18
|
complete one-to-one trace for the vendored active upstream WG17 syntax cases.
|
|
21
19
|
[STC-DRAFT-STATUS.md](STC-DRAFT-STATUS.md) separately tracks executable
|
|
22
20
|
implementation questions from the post-N289 working draft (reviewed through the 2026-08-23 items #73-#76); those cases are
|
|
@@ -28,11 +26,12 @@ predicate indicators listed in Appendix B of the book across the Part 1 strict-c
|
|
|
28
26
|
target and the normal-mode module/DCG compatibility families. [ISO-COMPLIANCE.md](ISO-COMPLIANCE.md) is the explicit
|
|
29
27
|
release-facing ledger for the Part 1 strict-core audit. This suite is
|
|
30
28
|
still not an independent certification of every processor requirement or lexical
|
|
31
|
-
edge. The complete 8.2-8.17 built-in family
|
|
32
|
-
|
|
33
|
-
at row level. The remaining Clause 6,
|
|
34
|
-
processor-dependency, and
|
|
35
|
-
dedicated audit files.
|
|
29
|
+
edge. The complete 8.2-8.17 built-in family and Clause 7.1-7.9 term,
|
|
30
|
+
preparation/database/control, and expression/evaluable-functor families are now
|
|
31
|
+
tracked and closed at row level. The remaining Clause 6, higher-level
|
|
32
|
+
7.10/7.12, processor-dependency, and unexplained-deviation criteria stay
|
|
33
|
+
explicitly open in the dedicated audit files. Public comparison material used during the audit remains supporting review
|
|
34
|
+
evidence rather than a duplicated vendored corpus. Cases under `iso/`
|
|
36
35
|
identify standards-derived behavior; other directories cover EyeProlog host
|
|
37
36
|
contracts and extensions. EyeProlog-only execution features such as automatic
|
|
38
37
|
tabling and `tnot/1` well-founded negation are outside the Part 1 strict-core
|
package/test/run-iso-strict.mjs
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
// Release gate for the ISO/IEC 13211-1 strict-core execution profile.
|
|
3
3
|
// This is intentionally separate from the broader `iso/` corpus because that
|
|
4
4
|
// corpus also exercises Part 2 modules and Part 3 grammar rules.
|
|
5
|
+
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
|
|
5
9
|
import {
|
|
6
10
|
Program,
|
|
7
11
|
Solver,
|
|
@@ -254,6 +258,7 @@ export function runIsoStrict(reporter = new TestReporter()) {
|
|
|
254
258
|
includes(ignoredNonVariable.stdout, 'x', 'non-variable right side is permitted and ignored');
|
|
255
259
|
});
|
|
256
260
|
|
|
261
|
+
|
|
257
262
|
reporter.test('reports the complete alias option in open/4 alias collisions', () => {
|
|
258
263
|
const error = capture(() => run('', {
|
|
259
264
|
isoStrict: true,
|
|
@@ -939,6 +944,101 @@ export function runIsoStrict(reporter = new TestReporter()) {
|
|
|
939
944
|
}).stats.completed_goal_lists, 0, 'STC 48 variables([]) does not match an input variable');
|
|
940
945
|
});
|
|
941
946
|
|
|
947
|
+
reporter.test('closes ISO 7.4 Prolog-text preparation and directive rows', () => {
|
|
948
|
+
const directory = mkdtempSync(join(tmpdir(), 'eyeprolog-iso-74-'));
|
|
949
|
+
try {
|
|
950
|
+
writeFileSync(join(directory, 'child.pl'), [
|
|
951
|
+
'child.',
|
|
952
|
+
":- op(500,'xfx',trusts).",
|
|
953
|
+
'child_rule(carol trusts dave).',
|
|
954
|
+
'',
|
|
955
|
+
].join('\n'));
|
|
956
|
+
writeFileSync(join(directory, 'once.pl'), 'once_loaded.\n');
|
|
957
|
+
const source = [
|
|
958
|
+
':- op(500,xfx,likes).',
|
|
959
|
+
':- char_conversion(x,y).',
|
|
960
|
+
':- set_prolog_flag(double_quotes,codes).',
|
|
961
|
+
':- dynamic(seen/1).',
|
|
962
|
+
':- initialization(assertz(seen(1))).',
|
|
963
|
+
':- initialization(assertz(seen(2))).',
|
|
964
|
+
":- include('child.pl').",
|
|
965
|
+
":- ensure_loaded('once.pl').",
|
|
966
|
+
":- ensure_loaded('once.pl').",
|
|
967
|
+
'relation(alice likes bob).',
|
|
968
|
+
'parent_rule(alice trusts bob).',
|
|
969
|
+
'converted(x).',
|
|
970
|
+
'quoted("ab").',
|
|
971
|
+
'',
|
|
972
|
+
].join('\n');
|
|
973
|
+
const program = Program.parseSources([{ text: source, filename: 'main.pl', baseDir: directory }], {
|
|
974
|
+
isoStrict: true,
|
|
975
|
+
sourceMetadata: true,
|
|
976
|
+
});
|
|
977
|
+
|
|
978
|
+
equal(program.findGroup('child', 0)?.clauses.length, 1, 'include/1 textual inclusion');
|
|
979
|
+
equal(program.findGroup('once_loaded', 0)?.clauses.length, 1, 'ensure_loaded/1 loads once');
|
|
980
|
+
equal(program.findGroup('relation', 1)?.clauses[0]?.head?.args[0]?.name, 'likes', 'op/3 affects following text');
|
|
981
|
+
equal(program.findGroup('parent_rule', 1)?.clauses[0]?.head?.args[0]?.name, 'trusts', 'included op/3 affects following parent text');
|
|
982
|
+
equal(program.findGroup('converted', 1)?.clauses[0]?.head?.args[0]?.name, 'y', 'char_conversion/2 affects following unquoted source');
|
|
983
|
+
equal(run(program, { isoStrict: true, goal: 'quoted([97,98])' }).stats.completed_goal_lists > 0, true,
|
|
984
|
+
'set_prolog_flag/2 affects following source and execution');
|
|
985
|
+
|
|
986
|
+
const first = run(program, { isoStrict: true, goal: 'findall(X,seen(X),[1,2])' });
|
|
987
|
+
const second = run(program, { isoStrict: true, goal: 'findall(X,seen(X),[1,2])' });
|
|
988
|
+
equal(first.stats.completed_goal_lists > 0, true, 'initialization/1 order');
|
|
989
|
+
equal(second.stats.completed_goal_lists > 0, true, 'initialization/1 executes once per prepared Program');
|
|
990
|
+
} finally {
|
|
991
|
+
rmSync(directory, { recursive: true, force: true });
|
|
992
|
+
}
|
|
993
|
+
});
|
|
994
|
+
|
|
995
|
+
reporter.test('closes ISO 7.5-7.7 database, conversion, and execution rows', () => {
|
|
996
|
+
const source = [
|
|
997
|
+
':- dynamic(p/1).',
|
|
998
|
+
':- dynamic(empty/0).',
|
|
999
|
+
'p(1).',
|
|
1000
|
+
'p(2).',
|
|
1001
|
+
'body(X) :- X.',
|
|
1002
|
+
'',
|
|
1003
|
+
].join('\n');
|
|
1004
|
+
|
|
1005
|
+
equal(run(source, {
|
|
1006
|
+
isoStrict: true,
|
|
1007
|
+
goal: 'findall(X,(p(X),retract(p(X))),Xs),Xs=[1,2],\\+p(_)',
|
|
1008
|
+
}).stats.completed_goal_lists > 0, true, 'logical-update view and source clause order');
|
|
1009
|
+
equal(run(source, { isoStrict: true, goal: '\\+ empty' }).stats.completed_goal_lists > 0, true,
|
|
1010
|
+
'declared empty procedure fails as a defined procedure');
|
|
1011
|
+
equal(capture(() => run(source, { isoStrict: true, goal: 'missing' })).formal,
|
|
1012
|
+
'existence_error(procedure)', 'unknown procedure remains distinct from empty procedure');
|
|
1013
|
+
equal(run('', {
|
|
1014
|
+
isoStrict: true,
|
|
1015
|
+
goal: 'assertz(fresh(a)),current_predicate(fresh/1),clause(fresh(a),true)',
|
|
1016
|
+
}).stats.completed_goal_lists > 0, true, 'asserting a new procedure makes it dynamic/public');
|
|
1017
|
+
equal(run(source, { isoStrict: true, goal: 'body(true)' }).stats.completed_goal_lists > 0, true,
|
|
1018
|
+
'source variable body is converted to call/1');
|
|
1019
|
+
});
|
|
1020
|
+
|
|
1021
|
+
reporter.test('closes ISO 7.8 general control-construct and exception rows', () => {
|
|
1022
|
+
equal(run('', { isoStrict: true, goal: 'true' }).stats.completed_goal_lists, 1, 'true/0');
|
|
1023
|
+
equal(run('', { isoStrict: true, goal: 'fail' }).stats.completed_goal_lists, 0, 'fail/0');
|
|
1024
|
+
equal(run('', { isoStrict: true, goal: 'X=true,call(X)' }).stats.completed_goal_lists > 0, true,
|
|
1025
|
+
'call/1 executes the converted goal');
|
|
1026
|
+
equal(run('', { isoStrict: true, goal: '(fail;true)' }).stats.completed_goal_lists > 0, true,
|
|
1027
|
+
'disjunction backtracks to the second branch');
|
|
1028
|
+
equal(run('', { isoStrict: true, goal: '(true->true;fail)' }).stats.completed_goal_lists > 0, true,
|
|
1029
|
+
'if-then-else commits after a successful condition');
|
|
1030
|
+
equal(capture(() => run('', { isoStrict: true, goal: 'call((write(a),3))' })).formal,
|
|
1031
|
+
'type_error(callable)', 'nested non-callable control term is rejected');
|
|
1032
|
+
equal(run('', {
|
|
1033
|
+
isoStrict: true,
|
|
1034
|
+
goal: 'catch(X,error(instantiation_error,_),true)',
|
|
1035
|
+
}).stats.completed_goal_lists > 0, true, 'Corrigendum 2 catch/3 can catch callability errors from its protected goal');
|
|
1036
|
+
equal(run('', {
|
|
1037
|
+
isoStrict: true,
|
|
1038
|
+
goal: 'catch(throw(ball(X)),ball(Y),X=Y)',
|
|
1039
|
+
}).stats.completed_goal_lists > 0, true, 'throw/1 and catch/3 unify through a renamed thrown term');
|
|
1040
|
+
});
|
|
1041
|
+
|
|
942
1042
|
reporter.test('rejects EyeProlog module directives', () => {
|
|
943
1043
|
const error = capture(() => Program.parse(':- use_module(library(lists)).\n', { isoStrict: true }));
|
|
944
1044
|
includes(error.message, 'implementation-specific directive use_module/1', 'message');
|
package/test/run-regression.mjs
CHANGED
|
@@ -3705,32 +3705,51 @@ function documentationSyncCases() {
|
|
|
3705
3705
|
assertIncludes(arithmetic, '`float_integer_part/1`, `float_fractional_part/1`', 'float-only conversion row');
|
|
3706
3706
|
},
|
|
3707
3707
|
},
|
|
3708
|
+
{
|
|
3709
|
+
name: 'ISO 7.4-7.8 execution matrix is closed',
|
|
3710
|
+
run: () => {
|
|
3711
|
+
const compliance = fs.readFileSync(path.join(testRoot, 'conformance', 'ISO-COMPLIANCE.md'), 'utf8');
|
|
3712
|
+
const matrix = fs.readFileSync(path.join(testRoot, 'conformance', 'ISO-PROLOG-TEXT-EXECUTION-MATRIX.md'), 'utf8');
|
|
3713
|
+
for (const row of [
|
|
3714
|
+
'| 7.4 — Prolog text and directives | covered |',
|
|
3715
|
+
'| 7.5-7.6 — database and term/clause conversion | covered |',
|
|
3716
|
+
'| 7.7 — execution and backtracking | covered |',
|
|
3717
|
+
'| 7.8 — control constructs and exceptions | covered |',
|
|
3718
|
+
]) assertIncludes(compliance, row, row);
|
|
3719
|
+
for (const section of ['## 7.4 - Prolog text and preparation', '## 7.5 - database model', '## 7.6 - conversion between terms and clauses/goals', '## 7.7 - execution and backtracking', '## 7.8 - control constructs and exceptions']) {
|
|
3720
|
+
assertIncludes(matrix, section, section);
|
|
3721
|
+
}
|
|
3722
|
+
},
|
|
3723
|
+
},
|
|
3708
3724
|
{
|
|
3709
3725
|
name: 'ISO exit criteria keep remaining audit work explicit',
|
|
3710
3726
|
run: () => {
|
|
3711
|
-
const exit = fs.readFileSync(path.join(testRoot, 'conformance', 'ISO-
|
|
3727
|
+
const exit = fs.readFileSync(path.join(testRoot, 'conformance', 'ISO-COMPLIANCE.md'), 'utf8');
|
|
3712
3728
|
for (const item of [
|
|
3713
3729
|
'| Clause 6 lexical/syntactic requirements have explicit dispositions | open |',
|
|
3714
3730
|
'| Clause 7 semantic requirements have explicit dispositions | open |',
|
|
3715
3731
|
'| Clause 8 built-in modes/errors have explicit dispositions | covered |',
|
|
3716
3732
|
'| Clause 9 evaluable-functor requirements have explicit dispositions | covered |',
|
|
3717
3733
|
'| Independent external syntax corpus is an offline release gate | covered |',
|
|
3718
|
-
'| External conversion/variable-name comparisons used during the audit are reproducible offline | open |',
|
|
3719
3734
|
'| No unexplained deviation remains in the release-facing ledger | open |',
|
|
3720
3735
|
]) assertIncludes(exit, item, item);
|
|
3721
3736
|
},
|
|
3722
3737
|
},
|
|
3723
3738
|
{
|
|
3724
|
-
name: 'public ISO documentation
|
|
3739
|
+
name: 'public ISO documentation keeps README concise and the book authoritative',
|
|
3725
3740
|
run: () => {
|
|
3726
3741
|
const readme = fs.readFileSync(path.join(packageRoot, 'README.md'), 'utf8');
|
|
3727
3742
|
const book = fs.readFileSync(path.join(packageRoot, 'the-art-of-eyeprolog.md'), 'utf8');
|
|
3728
3743
|
const profile = fs.readFileSync(path.join(packageRoot, 'why-eyeprolog.md'), 'utf8');
|
|
3729
|
-
for (const name of [
|
|
3730
|
-
|
|
3731
|
-
|
|
3732
|
-
|
|
3733
|
-
assertIncludes(
|
|
3744
|
+
for (const name of [
|
|
3745
|
+
'ISO-TERM-SEMANTICS-MATRIX.md',
|
|
3746
|
+
'ISO-PROLOG-TEXT-EXECUTION-MATRIX.md',
|
|
3747
|
+
'ISO-EVALUABLE-FUNCTOR-MATRIX.md',
|
|
3748
|
+
]) assertIncludes(book, name, `book ${name}`);
|
|
3749
|
+
assertIncludes(readme, 'implementation reference is [*The Art of EyeProlog*]', 'README book hand-off');
|
|
3750
|
+
assertIncludes(readme, 'test/conformance/ISO-COMPLIANCE.md', 'README concise audit link');
|
|
3751
|
+
assertEqual(readme.includes('2026-08-23 draft items #73-#76'), false, 'README omits audit-history detail');
|
|
3752
|
+
assertIncludes(profile, 'completed row-level 7.1-7.9 term, preparation/database/control, and arithmetic audits', 'Why EyeProlog audit state');
|
|
3734
3753
|
},
|
|
3735
3754
|
},
|
|
3736
3755
|
{
|
package/the-art-of-eyeprolog.md
CHANGED
|
@@ -7586,16 +7586,17 @@ node test/run-conformance-report.mjs
|
|
|
7586
7586
|
`test/conformance/ISO-COMPLIANCE.md` is the processor-requirement ledger for the
|
|
7587
7587
|
Part 1 conformance audit. It distinguishes implemented/tested families from
|
|
7588
7588
|
requirements whose normative `shall` clauses, option combinations, or error
|
|
7589
|
-
precedence still need one-by-one closure. `test/conformance/ISO-
|
|
7589
|
+
precedence still need one-by-one closure. `test/conformance/ISO-COMPLIANCE.md`
|
|
7590
7590
|
maps language families to representative executable cases.
|
|
7591
7591
|
`test/conformance/ISO-IMPLEMENTATION-DEFINED.md` is the ISO 5.4 decision
|
|
7592
7592
|
index: it enumerates the Part 1 implementation-defined decisions and the
|
|
7593
7593
|
implementation-specific extension families without turning draft WG17/STC
|
|
7594
|
-
proposals into the licensed baseline. `ISO-TERM-SEMANTICS-MATRIX.md` closes the
|
|
7595
|
-
|
|
7596
|
-
|
|
7597
|
-
|
|
7598
|
-
|
|
7594
|
+
proposals into the licensed baseline. `ISO-TERM-SEMANTICS-MATRIX.md` closes the 7.1-7.3 type/order/unification
|
|
7595
|
+
rows, `ISO-PROLOG-TEXT-EXECUTION-MATRIX.md` closes 7.4-7.8 preparation,
|
|
7596
|
+
database, conversion, execution, and control, and
|
|
7597
|
+
`ISO-EVALUABLE-FUNCTOR-MATRIX.md` closes 7.9/Clause 9 expression and arithmetic
|
|
7598
|
+
rows. The exit checklist in `ISO-COMPLIANCE.md` makes the remaining normative and
|
|
7599
|
+
unexplained-deviation conditions explicit. `test/conformance/WG17-SYNTAX-STATUS.md` separately traces the vendored active
|
|
7599
7600
|
upstream syntax cases. Reviewed cases can pin exact strict-reader outcomes, while
|
|
7600
7601
|
newly upgraded cases execute directly against the upstream Codex expectation.
|
|
7601
7602
|
|
|
@@ -7662,7 +7663,7 @@ that Part 1 strict surface.
|
|
|
7662
7663
|
This release establishes the strict-mode mechanism required for the ongoing
|
|
7663
7664
|
conformance audit; it does **not** yet claim that every processor requirement
|
|
7664
7665
|
has been independently certified. `test/conformance/ISO-COMPLIANCE.md` tracks
|
|
7665
|
-
the remaining normative audit work. The executable examples are mostly
|
|
7666
|
+
the remaining normative audit work. Public comparison material used during the audit remains review evidence rather than a duplicated vendored corpus. The executable examples are mostly
|
|
7666
7667
|
EyeProlog-profile programs using host-supplied goals, character lists, explicit
|
|
7667
7668
|
integrity relations, automatic tabling, and the EyeProlog library. The strict audit also exercises the complete Part 1 flag
|
|
7668
7669
|
set and the prescribed 8.14 error precedence for `read_term/3`, `write_term/3`,
|
|
@@ -7675,13 +7676,13 @@ creation/position/EOF behavior and text-vs-binary permission errors, corrects
|
|
|
7675
7676
|
Corrigendum 2 `keysort/2` error cases, closes the 5.5.6 Prolog-visible
|
|
7676
7677
|
side-effect boundary by excluding statistics/cleanup extensions from strict
|
|
7677
7678
|
mode, closes 5.5.10 by keeping the non-standard evaluable atom `e` outside
|
|
7678
|
-
strict mode, closes the row-level 7.1-7.3 term-semantics and 7.9/Clause 9
|
|
7679
|
+
strict mode, closes the row-level 7.1-7.3 term-semantics, 7.4-7.8 preparation/database/control, and 7.9/Clause 9
|
|
7679
7680
|
arithmetic audits, and pins the permitted arithmetic variation points for
|
|
7680
7681
|
mixed-type Corrigendum 2 `max/2`/`min/2` plus signed Clause 9.4 bitwise and
|
|
7681
7682
|
negative-shift behavior. The Clause 9 audit also corrected float-only
|
|
7682
7683
|
`float_integer_part/1` and `float_fractional_part/1` so integer operands are
|
|
7683
7684
|
rejected by type before a potentially overflowing integer-to-float conversion.
|
|
7684
|
-
These are conformance improvements, while the remaining qualifications are:
|
|
7685
|
+
The 7.4-7.8 closure also pins cross-text directive state, include/ensure-loaded lifetime, initialization order and one-shot execution, logical-update visibility, empty-versus-unknown procedures, term-to-body conversion, and the general Part 1 control/exception constructs. These are conformance improvements, while the remaining qualifications are:
|
|
7685
7686
|
|
|
7686
7687
|
- zero-arity compound syntax such as `ready()` is represented by the atom
|
|
7687
7688
|
`ready`;
|
|
@@ -7702,8 +7703,8 @@ quote atom names that are neither lowercase plain names nor graphic tokens.
|
|
|
7702
7703
|
These boundaries distinguish implemented ISO functionality from certification.
|
|
7703
7704
|
The EyeProlog corpus verifies this documented profile and strict-core boundary.
|
|
7704
7705
|
A public full-conformance claim is deferred until the explicit
|
|
7705
|
-
`test/conformance/ISO-
|
|
7706
|
-
audits or unexplained
|
|
7706
|
+
exit checklist in `test/conformance/ISO-COMPLIANCE.md` has no unresolved normative
|
|
7707
|
+
audits or unexplained deviations.
|
|
7707
7708
|
|
|
7708
7709
|
### Security and resource use
|
|
7709
7710
|
|
package/why-eyeprolog.md
CHANGED
|
@@ -28,7 +28,7 @@ collating-sequence integers in both normal and strict profiles. Strict mode
|
|
|
28
28
|
therefore rejects implementation-specific language extensions without changing
|
|
29
29
|
that processor choice. Its executable conformance matrix and tests
|
|
30
30
|
document the supported behavior, including an executable trace of the vendored
|
|
31
|
-
active WG17 syntax cases, cross-profile preservation of all strict-success WG17 syntax outcomes, closed strict side-effect and evaluable-functor extension boundaries, the completed row-level 7.1-7.
|
|
31
|
+
active WG17 syntax cases, cross-profile preservation of all strict-success WG17 syntax outcomes, closed strict side-effect and evaluable-functor extension boundaries, the completed row-level 7.1-7.9 term, preparation/database/control, and arithmetic audits, offline public conversion/variable-metadata audit fixtures, and explicit choices at standardized variation points such as mixed-type
|
|
32
32
|
`max/2`/`min/2` and signed bitwise/shift operations. The remaining exit criteria
|
|
33
33
|
are recorded explicitly rather than inferred from aggregate test counts. This is
|
|
34
34
|
extensive implementation evidence, not a claim that every Part 1, Part 2, or
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
# ISO Part 1 audit exit criteria
|
|
2
|
-
|
|
3
|
-
Issue #65 is intentionally closed by evidence rather than by a single large
|
|
4
|
-
test count. This checklist defines what must be true before EyeProlog can remove
|
|
5
|
-
the remaining qualification that its strict ISO/IEC 13211-1 profile is still
|
|
6
|
-
under systematic audit.
|
|
7
|
-
|
|
8
|
-
The normative baseline is ISO/IEC 13211-1:1995 plus Technical Corrigenda 1-3.
|
|
9
|
-
Post-N289 STC drafts are review input only until standardized.
|
|
10
|
-
|
|
11
|
-
## Exit checklist
|
|
12
|
-
|
|
13
|
-
| Criterion | Status | Evidence / remaining work |
|
|
14
|
-
| --- | --- | --- |
|
|
15
|
-
| Clause 5 processor obligations have explicit dispositions | open | `ISO-PROCESSOR-REQUIREMENTS.md` still has dependent audit rows for preparation/execution/rejection and syntax preservation |
|
|
16
|
-
| Clause 6 lexical/syntactic requirements have explicit dispositions | open | 366-case vendored WG17 syntax gate and cross-profile preservation are green, but the production-by-production shall/rejection map is not yet complete |
|
|
17
|
-
| Clause 7 semantic requirements have explicit dispositions | open | 7.1-7.3 and 7.9 are now closed; 7.4-7.8, higher-level 7.10, and residual processor-level 7.12 rows remain |
|
|
18
|
-
| Clause 8 built-in modes/errors have explicit dispositions | covered | `ISO-BUILTIN-MODE-ERROR-MATRIX.md` closes 8.2-8.17 row by row |
|
|
19
|
-
| Clause 9 evaluable-functor requirements have explicit dispositions | covered | `ISO-EVALUABLE-FUNCTOR-MATRIX.md` plus the strict arithmetic regression closes the published Part 1 + Corrigenda arithmetic rows |
|
|
20
|
-
| Implementation-defined choices are documented | covered | `ISO-IMPLEMENTATION-DEFINED.md` is the Clause 5.4 decision index and strict tests pin the behavior that affects execution |
|
|
21
|
-
| Implementation-specific strict/normal boundary is documented and tested | open | major 5.5 hooks are closed; exhaustive 5.5.1 syntax-preservation mapping remains tied to the Clause 6 audit |
|
|
22
|
-
| Published Corrigenda 1-3 are incorporated | covered | dedicated conformance/strict tests and the compliance matrix track all three published Corrigenda |
|
|
23
|
-
| Current post-N289 draft is tracked without changing the published baseline silently | covered | `STC-DRAFT-STATUS.md` tracks the reviewed 2026-08-23 items #73-#76, including the deliberate published-baseline treatment of #75 |
|
|
24
|
-
| Independent external syntax corpus is an offline release gate | covered | vendored active WG17 syntax matrix: 366 executable dispositions, checked against upstream expectations and reviewed exact outcomes |
|
|
25
|
-
| Third-party standard-core regression evidence is retained with provenance | covered | adapted Logtalk, Scryer, Trealla, and SWI-Prolog cases are vendored under `iso/`; `THIRD_PARTY.md` records origin and licenses |
|
|
26
|
-
| Known external-corpus deviations are explained and pinned | covered for vendored gates | the Prologue `bounded=false` / `max_integer` divergence is retained as upstream material and explicitly regression-tested; WG17 rows independently validate upstream expectation before any local reviewed snapshot can pass |
|
|
27
|
-
| External conversion/variable-name comparisons used during the audit are reproducible offline | open | focused behavior is already covered internally, but the remaining public comparison material has not all been normalized into a vendored offline fixture |
|
|
28
|
-
| Optional cross-engine runs have no unexplained deviations | open / environment-dependent | external-engine runner evidence is useful corroboration but is not substituted for normative ISO rows; release environments without those engines record the gate as unavailable rather than silently passing it |
|
|
29
|
-
| No unexplained deviation remains in the release-facing ledger | open | may become covered only when every open normative/external item above is either fixed, declared not applicable, or documented as a permitted implementation-defined/dependent choice |
|
|
30
|
-
|
|
31
|
-
## What counts as an explained deviation
|
|
32
|
-
|
|
33
|
-
A difference from an external corpus or another Prolog implementation is not an
|
|
34
|
-
automatic conformance defect. It is explained only when the repository records
|
|
35
|
-
which of these applies and has an executable regression where applicable:
|
|
36
|
-
|
|
37
|
-
- EyeProlog was wrong and was fixed to the published baseline;
|
|
38
|
-
- the external expectation reflects a different permitted implementation-defined
|
|
39
|
-
or implementation-dependent choice;
|
|
40
|
-
- the external fixture itself targets behavior outside the published baseline;
|
|
41
|
-
- a later STC draft proposes a change that is not yet a published Corrigendum;
|
|
42
|
-
- the behavior is an EyeProlog implementation-specific extension excluded from
|
|
43
|
-
`--iso-strict`; or
|
|
44
|
-
- the condition is genuinely not applicable to EyeProlog's declared processor
|
|
45
|
-
model.
|
|
46
|
-
|
|
47
|
-
An unexplained mismatch, host exception, skipped vendored row, or documentation
|
|
48
|
-
claim without executable support keeps the relevant exit criterion open.
|
|
49
|
-
|
|
50
|
-
## Release use
|
|
51
|
-
|
|
52
|
-
`ISO-COMPLIANCE.md` is the release-facing status ledger. This file is the exit
|
|
53
|
-
checklist behind it. Closing a row here must not be inferred solely from a test
|
|
54
|
-
count: the corresponding normative or external evidence must be identifiable
|
|
55
|
-
and the user-facing documentation must describe the same boundary.
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
# ISO Prolog conformance matrix
|
|
2
|
-
|
|
3
|
-
The normative baseline for the `iso/` corpus is ISO/IEC 13211-1:1995 plus
|
|
4
|
-
Technical Corrigenda 1:2007, 2:2012, and 3:2017. This matrix links the standard
|
|
5
|
-
families to executable coverage; `conformance-report.md` supplies the generated
|
|
6
|
-
case totals. [ISO-COMPLIANCE.md](ISO-COMPLIANCE.md) tracks the processor-level
|
|
7
|
-
compliance audit and the remaining work before a full conformance claim.
|
|
8
|
-
`ISO-TERM-SEMANTICS-MATRIX.md` and `ISO-EVALUABLE-FUNCTOR-MATRIX.md` provide
|
|
9
|
-
the closed row-level Clause 7.1-7.3 and 7.9/Clause 9 ledgers;
|
|
10
|
-
`ISO-EXIT-CRITERIA.md` records the remaining project-level exit conditions.
|
|
11
|
-
|
|
12
|
-
| Standard area | Implementation | Representative executable coverage |
|
|
13
|
-
| --- | --- | --- |
|
|
14
|
-
| Clause 6 lexical and term syntax | tokenizer, operator parser, lists, curly terms, quotes, numeric syntax, comments, Unicode-scalar PCS/collation | `scryer_lexical_terms`, `lexical_and_curly_terms`, `double_quoted_lists`, `corrigendum1_double_quote_operator`, `wg17_syntax_high_risk`, `wg17_invalid_octal_escape`, `wg17_unterminated_quoted_token`, `wg17_literal_newline_in_quote`, `wg17_non_iso_escape`, strict PCS/collation tests in `run-iso-strict.mjs`, syntax error cases, and a cross-profile check that all strict-success WG17 cases retain the same normal-profile outcome |
|
|
15
|
-
| Clause 7.1-7.3 term types, term order and unification | five strict term types, derived term notions, finite-tree unification, identity, standard order, occurs-check behavior | `ISO-TERM-SEMANTICS-MATRIX.md`, `unification_control_information`, `swipl_occurs_check`, `term_modes_and_ordering`, `logtalk_compare_standard_order`, and the strict 7.1-7.3 closure regression |
|
|
16
|
-
| Clause 7 control and exceptions | call, cut, conjunction, disjunction, if-then-else, catch and throw | `cut_control`, `control_and_terms`, `exceptions_and_flags`, `corrigenda_catch_callability`, `throw_copies_ball` |
|
|
17
|
-
| 8.2-8.5 term predicates | unification, Corrigendum 2 tests, comparison, sorting, creation and decomposition | `corrigenda_term_predicates`, `corrigenda_sort_keysort`, `logtalk_arg_unification`, `logtalk_univ`, associated error cases, and the one-row-per-mode/error 8.2-8.5 slice in `ISO-BUILTIN-MODE-ERROR-MATRIX.md`, including conditional finite-`max_arity` branches |
|
|
18
|
-
| 8.6-8.7 arithmetic predicates | `is/2` and all six arithmetic comparisons | `arithmetic`, comparison cases, isolated evaluation errors, and the explicit row-level 8.6-8.7 mode/error-condition audit |
|
|
19
|
-
| 8.8-8.10 database and solutions | logical update view, dynamic mutation, all-solutions grouping | `dynamic_database`, `trealla_logical_update_view`, `corrigenda_retractall`, `grouped_solutions_and_clauses`, the complete row-level 8.8-8.10 mode/error-condition audit, source/runtime 7.6.2 conversion through `,/2`, `;/2`, and `->/2` with preserved head/body variable sharing, selected deterministic overlap checks, runtime static/private protection for conjunction, and STC #56 `(:-)/1-2` database protection |
|
|
20
|
-
| 8.11-8.14 streams and term I/O | text/binary streams, properties, units, read/write options and operators | `streams_and_term_io`, `operators`, Corrigendum 3 option cases, stream error cases, the complete row-level 8.11-8.14 mode/error audit, Corrigendum 3 variable metadata/write naming checks, and issue #65 checks for stream lifecycle/property validation (including closed-stream failure), text-vs-binary permissions, EOF/flush/position, open/close semantics, presence-based `force(true)` close handling, late `get_code/peek_code` in-character-code representation errors, and the exact `alias(A)` collision culprit |
|
|
21
|
-
| 8.15 logic and control | negation, once, repeat, `call/2` through `call/8`, `false/0` | `logtalk_once`, `corrigenda_call_closure`, `false_builtin`, plus the complete 8.15 row-audit in `ISO-BUILTIN-MODE-ERROR-MATRIX.md` |
|
|
22
|
-
| 8.16 atomic processing | atoms, characters, codes and number conversion with prescribed errors | `atomic_term_processing`, focused forward/reverse cases, parenthesized-number rejection, Logtalk-derived cases, and the complete 8.16 mode/error slice in `ISO-BUILTIN-MODE-ERROR-MATRIX.md` |
|
|
23
|
-
| 8.17 flags and halt | complete required Part 1 flag set, selected defaults, standard value domains/changeability, and halt status handling | `exceptions_and_flags`, `remaining_builtins_and_directives`, the complete strict flag audit, halt cases, and explicit 8.17 rows in `ISO-BUILTIN-MODE-ERROR-MATRIX.md` |
|
|
24
|
-
| Clause 7.9 / Clause 9 evaluable functors | recursive expression evaluation plus integer, float, rounding, transcendental and bitwise operations | `ISO-EVALUABLE-FUNCTOR-MATRIX.md`, `arithmetic`, `corrigenda_arithmetic`, `corrigenda_atan2_zero`, `corrigenda_integer_negative_power`, the strict row-closure regression (including huge-integer float-only template precedence), published `exp/1`/`**/2`/`^/2` underflow with STC #75 tracked separately, mixed comparison/max/min choices, signed bitwise/negative-shift semantics, and unbounded-integer resource normalization |
|
|
25
|
-
| Module compatibility profile (related to ISO/IEC 13211-2 and later WG17 amendment work) | module declarations, exports, imports, qualification, meta-predicate context | `modules/qualified_call`, `modules/selective_library_import`, `dcg_module_nonterminal_indicator` |
|
|
26
|
-
| Part 3-oriented DCG compatibility profile | `-->`, terminal and partial sequences, grammar control constructs, semicontexts, nonterminal indicators, modules, `phrase/2-3`, steadfastness and errors | `dcg_terminals_and_remainder`, `dcg_control_constructs`, `dcg_partial_sequences`, `dcg_phrase_steadfastness`, `dcg_dynamic_nonterminal_indicator`, `logtalk_dcg_phrase_identity`, `logtalk_dcg_semicontexts`, DCG error and precedence cases |
|
|
27
|
-
|
|
28
|
-
Corrigendum-specific coverage includes double-quoted atom operator priority
|
|
29
|
-
(Cor.1); the added predicates and evaluable functors, bar-operator rules,
|
|
30
|
-
uninstantiation errors, and corrected `catch/3` behavior (Cor.2); and option
|
|
31
|
-
validation, variable-name traversal/output, canonical list output, and negative
|
|
32
|
-
integer powers (Cor.3).
|
|
33
|
-
|
|
34
|
-
Implementation-defined and implementation-specific choices are indexed
|
|
35
|
-
clause-by-clause in [ISO-IMPLEMENTATION-DEFINED.md](ISO-IMPLEMENTATION-DEFINED.md),
|
|
36
|
-
with *The Art of EyeProlog* remaining the implementation reference. In
|
|
37
|
-
particular, the index records the unbounded integer model, `double_quotes=chars`,
|
|
38
|
-
`//` rounding toward zero, the ECMAScript binary64 float policy (including the
|
|
39
|
-
9.1.4.2 choice to round generic tiny results while retaining explicit
|
|
40
|
-
functor-specific underflow errors),
|
|
41
|
-
stream/character decisions, and the normal-profile extension boundary.
|
|
42
|
-
|
|
43
|
-
This is an executable conformance/compatibility matrix, not a certification issued by an
|
|
44
|
-
independent standards body. The Part 2/Part 3-related rows describe tested
|
|
45
|
-
normal-mode compatibility surfaces rather than a claim that every requirement
|
|
46
|
-
of those standards has been closed. Release gating runs the ISO cases and the dedicated
|
|
47
|
-
Part 1 strict-core suite together with the full regression, API, documentation,
|
|
48
|
-
example, and browser suites.
|