seam-lang 2.0.0
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/LICENSE.md +9 -0
- package/README.md +71 -0
- package/bin/seam.js +7 -0
- package/conformance-report.md +25 -0
- package/docs/compact-reasoning-workbench.md +35 -0
- package/docs/guide.md +621 -0
- package/docs/language-reference.md +773 -0
- package/examples/abstract-interpretation.pl +50 -0
- package/examples/access-control-policy.pl +52 -0
- package/examples/ackermann.pl +47 -0
- package/examples/age.pl +26 -0
- package/examples/aliases-and-namespaces.pl +20 -0
- package/examples/alignment-demo.pl +44 -0
- package/examples/allen-interval-calculus.pl +64 -0
- package/examples/ancestor.pl +22 -0
- package/examples/animal.pl +21 -0
- package/examples/annotation.pl +34 -0
- package/examples/auroracare.pl +309 -0
- package/examples/backward.pl +11 -0
- package/examples/basic-monadic.pl +10032 -0
- package/examples/bayes-diagnosis.pl +108 -0
- package/examples/bayes-therapy.pl +189 -0
- package/examples/beam-deflection.pl +48 -0
- package/examples/binomial-vandermonde.pl +49 -0
- package/examples/blocks-world-planning.pl +77 -0
- package/examples/bmi.pl +232 -0
- package/examples/braking-safety-worlds.pl +69 -0
- package/examples/buck-converter-design.pl +83 -0
- package/examples/cache-performance.pl +56 -0
- package/examples/canary-release.pl +51 -0
- package/examples/cat-koko.pl +24 -0
- package/examples/catalan-convolution.pl +37 -0
- package/examples/cdcl-sat-solver.pl +65 -0
- package/examples/chart-parser.pl +65 -0
- package/examples/clinical-trial-screening.pl +97 -0
- package/examples/collatz-1000.pl +45 -0
- package/examples/combinatorics-findall-sort.pl +38 -0
- package/examples/competitive-enzyme-kinetics.pl +78 -0
- package/examples/complex.pl +133 -0
- package/examples/composition-of-injective-functions-is-injective.pl +50 -0
- package/examples/context-association.pl +53 -0
- package/examples/context-schema-audit.pl +46 -0
- package/examples/continued-fraction-sqrt2.pl +36 -0
- package/examples/control-system.pl +76 -0
- package/examples/critical-path-schedule.pl +82 -0
- package/examples/cyclic-path.pl +18 -0
- package/examples/d3-group.pl +99 -0
- package/examples/dairy-energy-balance.pl +66 -0
- package/examples/data-negotiation.pl +38 -0
- package/examples/deep-taxonomy-10.pl +106 -0
- package/examples/deep-taxonomy-100.pl +376 -0
- package/examples/deep-taxonomy-1000.pl +3076 -0
- package/examples/deep-taxonomy-10000.pl +30076 -0
- package/examples/deep-taxonomy-100000.pl +300076 -0
- package/examples/delfour.pl +281 -0
- package/examples/deontic-logic.pl +52 -0
- package/examples/derived-backward-rule.pl +30 -0
- package/examples/derived-rule.pl +27 -0
- package/examples/diamond-property.pl +38 -0
- package/examples/dijkstra-findall-sort.pl +43 -0
- package/examples/dijkstra-risk-path.pl +87 -0
- package/examples/dijkstra.pl +50 -0
- package/examples/dining-philosophers.pl +147 -0
- package/examples/dog.pl +25 -0
- package/examples/dpv-odrl-purpose-mapping.pl +48 -0
- package/examples/drone-corridor-planner.pl +48 -0
- package/examples/easter-computus.pl +88 -0
- package/examples/electrical-rc-filter.pl +37 -0
- package/examples/epidemic-policy.pl +66 -0
- package/examples/equality-saturation.pl +84 -0
- package/examples/equivalence-classes-overlap-implies-same-class.pl +27 -0
- package/examples/eulerian-path.pl +87 -0
- package/examples/ev-range-worlds.pl +87 -0
- package/examples/existential-rule.pl +14 -0
- package/examples/exoplanet-validation-worlds.pl +94 -0
- package/examples/expression-eval.pl +45 -0
- package/examples/family-cousins.pl +67 -0
- package/examples/fastpow.pl +61 -0
- package/examples/fft8-numeric.pl +85 -0
- package/examples/fibonacci.pl +60 -0
- package/examples/field-nitrogen-balance.pl +73 -0
- package/examples/flandor.pl +296 -0
- package/examples/floating-point.pl +28 -0
- package/examples/four-color-map.pl +133 -0
- package/examples/fundamental-theorem-arithmetic.pl +119 -0
- package/examples/gd-step-certified.pl +162 -0
- package/examples/gdpr-compliance.pl +69 -0
- package/examples/good-cobbler.pl +16 -0
- package/examples/gps.pl +146 -0
- package/examples/graph-reachability.pl +33 -0
- package/examples/graph.pl +35 -0
- package/examples/gray-code-counter.pl +47 -0
- package/examples/greatest-lower-bound-uniqueness.pl +30 -0
- package/examples/group-inverse-uniqueness.pl +36 -0
- package/examples/hamiltonian-path.pl +51 -0
- package/examples/hamming-code.pl +109 -0
- package/examples/hanoi.pl +19 -0
- package/examples/heat-loss.pl +56 -0
- package/examples/herbrand-witnesses.pl +31 -0
- package/examples/heron-theorem.pl +42 -0
- package/examples/ideal-gas-law.pl +39 -0
- package/examples/illegitimate-reasoning.pl +88 -0
- package/examples/integer-partitions.pl +35 -0
- package/examples/intuitionistic-logic-kripke.pl +69 -0
- package/examples/job-shop-scheduling.pl +48 -0
- package/examples/knapsack-optimization.pl +46 -0
- package/examples/knowledge-engineering-alignment-flow.pl +46 -0
- package/examples/knuth-bendix-completion.pl +55 -0
- package/examples/language.pl +25 -0
- package/examples/law-of-cosines.pl +37 -0
- package/examples/least-squares-regression.pl +85 -0
- package/examples/linear-logic-resources.pl +51 -0
- package/examples/list-collection.pl +35 -0
- package/examples/lldm.pl +80 -0
- package/examples/manufacturing-quality-control.pl +73 -0
- package/examples/map-four-color-search.pl +65 -0
- package/examples/markov-logic-network.pl +87 -0
- package/examples/matrix-chain-order.pl +79 -0
- package/examples/matrix-noncommutativity.pl +43 -0
- package/examples/microgrid-dispatch.pl +89 -0
- package/examples/missionaries-cannibals.pl +53 -0
- package/examples/modal-logic-kripke.pl +45 -0
- package/examples/modular-exponentiation.pl +35 -0
- package/examples/monkey-bananas.pl +45 -0
- package/examples/n-queens-8.pl +35 -0
- package/examples/network-sla.pl +48 -0
- package/examples/newton-raphson.pl +48 -0
- package/examples/nixon-diamond.pl +37 -0
- package/examples/observability-log-correlation.pl +40 -0
- package/examples/odrl-dpv-fpv-trust-flow.pl +51 -0
- package/examples/odrl-dpv-healthcare-risk-ranked.pl +270 -0
- package/examples/odrl-dpv-risk-ranked.pl +320 -0
- package/examples/orbital-transfer-design.pl +116 -0
- package/examples/output/abstract-interpretation.pl +16 -0
- package/examples/output/access-control-policy.pl +2 -0
- package/examples/output/ackermann.pl +12 -0
- package/examples/output/age.pl +2 -0
- package/examples/output/aliases-and-namespaces.pl +5 -0
- package/examples/output/alignment-demo.pl +32 -0
- package/examples/output/allen-interval-calculus.pl +154 -0
- package/examples/output/ancestor.pl +6 -0
- package/examples/output/animal.pl +4 -0
- package/examples/output/annotation.pl +4 -0
- package/examples/output/auroracare.pl +117 -0
- package/examples/output/backward.pl +1 -0
- package/examples/output/basic-monadic.pl +1518 -0
- package/examples/output/bayes-diagnosis.pl +13 -0
- package/examples/output/bayes-therapy.pl +23 -0
- package/examples/output/beam-deflection.pl +5 -0
- package/examples/output/binomial-vandermonde.pl +4 -0
- package/examples/output/blocks-world-planning.pl +4 -0
- package/examples/output/bmi.pl +32 -0
- package/examples/output/braking-safety-worlds.pl +18 -0
- package/examples/output/buck-converter-design.pl +6 -0
- package/examples/output/cache-performance.pl +4 -0
- package/examples/output/canary-release.pl +5 -0
- package/examples/output/cat-koko.pl +3 -0
- package/examples/output/catalan-convolution.pl +4 -0
- package/examples/output/cdcl-sat-solver.pl +7 -0
- package/examples/output/chart-parser.pl +6 -0
- package/examples/output/clinical-trial-screening.pl +9 -0
- package/examples/output/collatz-1000.pl +1000 -0
- package/examples/output/combinatorics-findall-sort.pl +2 -0
- package/examples/output/competitive-enzyme-kinetics.pl +6 -0
- package/examples/output/complex.pl +6 -0
- package/examples/output/composition-of-injective-functions-is-injective.pl +2 -0
- package/examples/output/context-association.pl +3 -0
- package/examples/output/context-schema-audit.pl +12 -0
- package/examples/output/continued-fraction-sqrt2.pl +4 -0
- package/examples/output/control-system.pl +6 -0
- package/examples/output/critical-path-schedule.pl +19 -0
- package/examples/output/cyclic-path.pl +16 -0
- package/examples/output/d3-group.pl +2 -0
- package/examples/output/dairy-energy-balance.pl +13 -0
- package/examples/output/data-negotiation.pl +1 -0
- package/examples/output/deep-taxonomy-10.pl +16 -0
- package/examples/output/deep-taxonomy-100.pl +16 -0
- package/examples/output/deep-taxonomy-1000.pl +16 -0
- package/examples/output/deep-taxonomy-10000.pl +16 -0
- package/examples/output/deep-taxonomy-100000.pl +16 -0
- package/examples/output/delfour.pl +31 -0
- package/examples/output/deontic-logic.pl +4 -0
- package/examples/output/derived-backward-rule.pl +3 -0
- package/examples/output/derived-rule.pl +2 -0
- package/examples/output/diamond-property.pl +4 -0
- package/examples/output/dijkstra-findall-sort.pl +2 -0
- package/examples/output/dijkstra-risk-path.pl +29 -0
- package/examples/output/dijkstra.pl +16 -0
- package/examples/output/dining-philosophers.pl +350 -0
- package/examples/output/dog.pl +1 -0
- package/examples/output/dpv-odrl-purpose-mapping.pl +18 -0
- package/examples/output/drone-corridor-planner.pl +17 -0
- package/examples/output/easter-computus.pl +30 -0
- package/examples/output/electrical-rc-filter.pl +3 -0
- package/examples/output/epidemic-policy.pl +14 -0
- package/examples/output/equality-saturation.pl +5 -0
- package/examples/output/equivalence-classes-overlap-implies-same-class.pl +18 -0
- package/examples/output/eulerian-path.pl +3 -0
- package/examples/output/ev-range-worlds.pl +19 -0
- package/examples/output/existential-rule.pl +2 -0
- package/examples/output/exoplanet-validation-worlds.pl +22 -0
- package/examples/output/expression-eval.pl +1 -0
- package/examples/output/family-cousins.pl +28 -0
- package/examples/output/fastpow.pl +6 -0
- package/examples/output/fft8-numeric.pl +4 -0
- package/examples/output/fibonacci.pl +6 -0
- package/examples/output/field-nitrogen-balance.pl +21 -0
- package/examples/output/flandor.pl +43 -0
- package/examples/output/floating-point.pl +9 -0
- package/examples/output/four-color-map.pl +3 -0
- package/examples/output/fundamental-theorem-arithmetic.pl +9 -0
- package/examples/output/gd-step-certified.pl +79 -0
- package/examples/output/gdpr-compliance.pl +6 -0
- package/examples/output/good-cobbler.pl +1 -0
- package/examples/output/gps.pl +21 -0
- package/examples/output/graph-reachability.pl +3 -0
- package/examples/output/graph.pl +21 -0
- package/examples/output/gray-code-counter.pl +1 -0
- package/examples/output/greatest-lower-bound-uniqueness.pl +2 -0
- package/examples/output/group-inverse-uniqueness.pl +2 -0
- package/examples/output/hamiltonian-path.pl +121 -0
- package/examples/output/hamming-code.pl +6 -0
- package/examples/output/hanoi.pl +1 -0
- package/examples/output/heat-loss.pl +5 -0
- package/examples/output/herbrand-witnesses.pl +7 -0
- package/examples/output/heron-theorem.pl +4 -0
- package/examples/output/ideal-gas-law.pl +3 -0
- package/examples/output/illegitimate-reasoning.pl +15 -0
- package/examples/output/integer-partitions.pl +4 -0
- package/examples/output/intuitionistic-logic-kripke.pl +5 -0
- package/examples/output/job-shop-scheduling.pl +3 -0
- package/examples/output/knapsack-optimization.pl +4 -0
- package/examples/output/knowledge-engineering-alignment-flow.pl +17 -0
- package/examples/output/knuth-bendix-completion.pl +7 -0
- package/examples/output/language.pl +6 -0
- package/examples/output/law-of-cosines.pl +3 -0
- package/examples/output/least-squares-regression.pl +5 -0
- package/examples/output/linear-logic-resources.pl +2 -0
- package/examples/output/list-collection.pl +3 -0
- package/examples/output/lldm.pl +6 -0
- package/examples/output/manufacturing-quality-control.pl +6 -0
- package/examples/output/map-four-color-search.pl +1 -0
- package/examples/output/markov-logic-network.pl +32 -0
- package/examples/output/matrix-chain-order.pl +4 -0
- package/examples/output/matrix-noncommutativity.pl +3 -0
- package/examples/output/microgrid-dispatch.pl +6 -0
- package/examples/output/missionaries-cannibals.pl +3 -0
- package/examples/output/modal-logic-kripke.pl +4 -0
- package/examples/output/modular-exponentiation.pl +4 -0
- package/examples/output/monkey-bananas.pl +5 -0
- package/examples/output/n-queens-8.pl +1 -0
- package/examples/output/network-sla.pl +4 -0
- package/examples/output/newton-raphson.pl +3 -0
- package/examples/output/nixon-diamond.pl +5 -0
- package/examples/output/observability-log-correlation.pl +28 -0
- package/examples/output/odrl-dpv-fpv-trust-flow.pl +9 -0
- package/examples/output/odrl-dpv-healthcare-risk-ranked.pl +42 -0
- package/examples/output/odrl-dpv-risk-ranked.pl +120 -0
- package/examples/output/orbital-transfer-design.pl +7 -0
- package/examples/output/partial-evaluator.pl +4 -0
- package/examples/output/path-discovery.pl +3 -0
- package/examples/output/peano-arithmetic.pl +3 -0
- package/examples/output/peano-calculus.pl +3 -0
- package/examples/output/peasant.pl +10 -0
- package/examples/output/pell-equation.pl +4 -0
- package/examples/output/pendulum-period.pl +4 -0
- package/examples/output/pointer-analysis.pl +8 -0
- package/examples/output/polynomial.pl +14 -0
- package/examples/output/prime-range.pl +3 -0
- package/examples/output/proof-contrapositive.pl +3 -0
- package/examples/output/quadratic-formula.pl +6 -0
- package/examples/output/radioactive-decay.pl +5 -0
- package/examples/output/register-allocation.pl +8 -0
- package/examples/output/reusable-builtins.pl +5 -0
- package/examples/output/riemann-hypothesis.pl +12 -0
- package/examples/output/route-planning.pl +4 -0
- package/examples/output/sat-solver-dpll.pl +11 -0
- package/examples/output/security-incident-correlation.pl +3 -0
- package/examples/output/send-more-money.pl +3 -0
- package/examples/output/service-impact.pl +11 -0
- package/examples/output/shoelace-polygon-area.pl +1 -0
- package/examples/output/sieve.pl +1 -0
- package/examples/output/skolem-functions.pl +16 -0
- package/examples/output/socket-age.pl +1 -0
- package/examples/output/socket-family.pl +3 -0
- package/examples/output/socrates.pl +2 -0
- package/examples/output/stable-marriage.pl +2 -0
- package/examples/output/statistics-summary.pl +4 -0
- package/examples/output/stirling-bell-numbers.pl +4 -0
- package/examples/output/sudoku-4x4.pl +2 -0
- package/examples/output/superdense-coding.pl +6 -0
- package/examples/output/symbolic-derivative.pl +4 -0
- package/examples/output/term-tools.pl +6 -0
- package/examples/output/totient-summatory.pl +4 -0
- package/examples/output/trust-flow-provenance-threshold.pl +6 -0
- package/examples/output/truth-maintenance-system.pl +25 -0
- package/examples/output/turing.pl +12 -0
- package/examples/output/type-inference.pl +8 -0
- package/examples/output/vector-similarity.pl +4 -0
- package/examples/output/vulnerability-impact.pl +20 -0
- package/examples/output/web-names.pl +3 -0
- package/examples/output/weighted-interval-scheduling.pl +5 -0
- package/examples/output/witch.pl +7 -0
- package/examples/output/wolf-goat-cabbage.pl +3 -0
- package/examples/output/workplace-compliance.pl +4 -0
- package/examples/output/zebra.pl +3 -0
- package/examples/partial-evaluator.pl +74 -0
- package/examples/path-discovery.pl +45013 -0
- package/examples/peano-arithmetic.pl +33 -0
- package/examples/peano-calculus.pl +40 -0
- package/examples/peasant.pl +29 -0
- package/examples/pell-equation.pl +34 -0
- package/examples/pendulum-period.pl +50 -0
- package/examples/pointer-analysis.pl +50 -0
- package/examples/polynomial.pl +124 -0
- package/examples/prime-range.pl +45 -0
- package/examples/proof/access-control-policy.pl +158 -0
- package/examples/proof/age.pl +71 -0
- package/examples/proof/aliases-and-namespaces.pl +78 -0
- package/examples/proof/ancestor.pl +140 -0
- package/examples/proof/animal.pl +68 -0
- package/examples/proof/annotation.pl +80 -0
- package/examples/proof/backward.pl +22 -0
- package/examples/proof/bayes-diagnosis.pl +208 -0
- package/examples/proof/beam-deflection.pl +227 -0
- package/examples/proof/cache-performance.pl +310 -0
- package/examples/proof/canary-release.pl +172 -0
- package/examples/proof/cat-koko.pl +86 -0
- package/examples/proof/chart-parser.pl +474 -0
- package/examples/proof/clinical-trial-screening.pl +389 -0
- package/examples/proof/composition-of-injective-functions-is-injective.pl +258 -0
- package/examples/proof/context-association.pl +78 -0
- package/examples/proof/data-negotiation.pl +76 -0
- package/examples/proof/deontic-logic.pl +109 -0
- package/examples/proof/derived-backward-rule.pl +74 -0
- package/examples/proof/derived-rule.pl +43 -0
- package/examples/proof/diamond-property.pl +307 -0
- package/examples/proof/dog.pl +31 -0
- package/examples/proof/dpv-odrl-purpose-mapping.pl +348 -0
- package/examples/proof/electrical-rc-filter.pl +105 -0
- package/examples/proof/epidemic-policy.pl +774 -0
- package/examples/proof/equivalence-classes-overlap-implies-same-class.pl +1098 -0
- package/examples/proof/existential-rule.pl +32 -0
- package/examples/proof/expression-eval.pl +105 -0
- package/examples/proof/floating-point.pl +160 -0
- package/examples/proof/gdpr-compliance.pl +199 -0
- package/examples/proof/good-cobbler.pl +16 -0
- package/examples/proof/graph-reachability.pl +151 -0
- package/examples/proof/greatest-lower-bound-uniqueness.pl +150 -0
- package/examples/proof/group-inverse-uniqueness.pl +84 -0
- package/examples/proof/hanoi.pl +185 -0
- package/examples/proof/heat-loss.pl +228 -0
- package/examples/proof/ideal-gas-law.pl +151 -0
- package/examples/proof/intuitionistic-logic-kripke.pl +133 -0
- package/examples/proof/linear-logic-resources.pl +205 -0
- package/examples/proof/list-collection.pl +52 -0
- package/examples/proof/modal-logic-kripke.pl +125 -0
- package/examples/proof/nixon-diamond.pl +181 -0
- package/examples/proof/proof-contrapositive.pl +78 -0
- package/examples/proof/reusable-builtins.pl +124 -0
- package/examples/proof/security-incident-correlation.pl +270 -0
- package/examples/proof/socket-age.pl +32 -0
- package/examples/proof/socket-family.pl +59 -0
- package/examples/proof/socrates.pl +38 -0
- package/examples/proof/term-tools.pl +95 -0
- package/examples/proof/witch.pl +216 -0
- package/examples/proof-contrapositive.pl +27 -0
- package/examples/quadratic-formula.pl +56 -0
- package/examples/radioactive-decay.pl +58 -0
- package/examples/register-allocation.pl +77 -0
- package/examples/reusable-builtins.pl +36 -0
- package/examples/riemann-hypothesis.pl +110 -0
- package/examples/route-planning.pl +33 -0
- package/examples/sat-solver-dpll.pl +88 -0
- package/examples/security-incident-correlation.pl +69 -0
- package/examples/send-more-money.pl +71 -0
- package/examples/service-impact.pl +41 -0
- package/examples/shoelace-polygon-area.pl +22 -0
- package/examples/sieve.pl +20 -0
- package/examples/skolem-functions.pl +52 -0
- package/examples/socket-age.pl +39 -0
- package/examples/socket-family.pl +28 -0
- package/examples/socrates.pl +19 -0
- package/examples/stable-marriage.pl +92 -0
- package/examples/statistics-summary.pl +56 -0
- package/examples/stirling-bell-numbers.pl +69 -0
- package/examples/sudoku-4x4.pl +54 -0
- package/examples/superdense-coding.pl +84 -0
- package/examples/symbolic-derivative.pl +39 -0
- package/examples/term-tools.pl +32 -0
- package/examples/totient-summatory.pl +33 -0
- package/examples/trust-flow-provenance-threshold.pl +47 -0
- package/examples/truth-maintenance-system.pl +62 -0
- package/examples/turing.pl +69 -0
- package/examples/type-inference.pl +58 -0
- package/examples/vector-similarity.pl +60 -0
- package/examples/vulnerability-impact.pl +69 -0
- package/examples/web-names.pl +39 -0
- package/examples/weighted-interval-scheduling.pl +81 -0
- package/examples/witch.pl +38 -0
- package/examples/wolf-goat-cabbage.pl +56 -0
- package/examples/workplace-compliance.pl +41 -0
- package/examples/zebra.pl +45 -0
- package/index.d.ts +230 -0
- package/index.js +4 -0
- package/package.json +51 -0
- package/playground.html +1259 -0
- package/src/bin.js +7 -0
- package/src/builtins/aggregation.js +81 -0
- package/src/builtins/arithmetic.js +208 -0
- package/src/builtins/context.js +42 -0
- package/src/builtins/control.js +43 -0
- package/src/builtins/core.js +78 -0
- package/src/builtins/lists.js +283 -0
- package/src/builtins/registry.js +48 -0
- package/src/builtins/strings.js +234 -0
- package/src/builtins/terms.js +69 -0
- package/src/cli.js +194 -0
- package/src/explain.js +324 -0
- package/src/hash.js +294 -0
- package/src/index.js +47 -0
- package/src/parser.js +465 -0
- package/src/program.js +447 -0
- package/src/solver.js +453 -0
- package/src/term.js +349 -0
- package/test/conformance/README.md +72 -0
- package/test/conformance/cases/aggregation/044_findall_user_goal.pl +6 -0
- package/test/conformance/cases/aggregation/044_findall_user_goal.query +1 -0
- package/test/conformance/cases/aggregation/057_countall_empty_and_nonempty.pl +4 -0
- package/test/conformance/cases/aggregation/057_countall_empty_and_nonempty.query +1 -0
- package/test/conformance/cases/aggregation/058_sumall_numeric_template.pl +5 -0
- package/test/conformance/cases/aggregation/058_sumall_numeric_template.query +1 -0
- package/test/conformance/cases/aggregation/059_aggregate_min_template.pl +5 -0
- package/test/conformance/cases/aggregation/059_aggregate_min_template.query +1 -0
- package/test/conformance/cases/aggregation/060_aggregate_max_compound_key.pl +5 -0
- package/test/conformance/cases/aggregation/060_aggregate_max_compound_key.query +1 -0
- package/test/conformance/cases/aggregation/075_aggregation_edges.pl +12 -0
- package/test/conformance/cases/aggregation/098_aggregation_nested_templates.pl +11 -0
- package/test/conformance/cases/aggregation/aggregate_max_no_answers_fails.pl +2 -0
- package/test/conformance/cases/aggregation/aggregate_min_structured_key.pl +5 -0
- package/test/conformance/cases/aggregation/countall_zero.pl +2 -0
- package/test/conformance/cases/aggregation/extra_aggregate_max_iri_key.pl +4 -0
- package/test/conformance/cases/aggregation/extra_aggregate_min_tie_first.pl +5 -0
- package/test/conformance/cases/aggregation/extra_countall_with_filter.pl +5 -0
- package/test/conformance/cases/aggregation/extra_findall_repeated_template.pl +4 -0
- package/test/conformance/cases/aggregation/extra_sumall_float_template.pl +4 -0
- package/test/conformance/cases/aggregation/findall_empty_bag.pl +2 -0
- package/test/conformance/cases/aggregation/sumall_empty_zero.pl +2 -0
- package/test/conformance/cases/arithmetic/024_numeric_literal_readback.pl +6 -0
- package/test/conformance/cases/arithmetic/029_arithmetic_and_comparison.pl +11 -0
- package/test/conformance/cases/arithmetic/029_arithmetic_and_comparison.query +1 -0
- package/test/conformance/cases/arithmetic/039_numeric_functions.pl +9 -0
- package/test/conformance/cases/arithmetic/039_numeric_functions.query +1 -0
- package/test/conformance/cases/arithmetic/040_between_enumeration.pl +3 -0
- package/test/conformance/cases/arithmetic/040_between_enumeration.query +1 -0
- package/test/conformance/cases/arithmetic/041_smallest_divisor.pl +3 -0
- package/test/conformance/cases/arithmetic/041_smallest_divisor.query +1 -0
- package/test/conformance/cases/arithmetic/054_numeric_and_lexical_comparison.pl +5 -0
- package/test/conformance/cases/arithmetic/054_numeric_and_lexical_comparison.query +1 -0
- package/test/conformance/cases/arithmetic/061_date_difference.pl +4 -0
- package/test/conformance/cases/arithmetic/062_reusable_numeric_builtins.pl +10 -0
- package/test/conformance/cases/arithmetic/066_numeric_edges.pl +14 -0
- package/test/conformance/cases/arithmetic/079_big_integer_arithmetic.pl +8 -0
- package/test/conformance/cases/arithmetic/080_rounding_modes.pl +10 -0
- package/test/conformance/cases/arithmetic/081_zero_safe_numeric_functions.pl +9 -0
- package/test/conformance/cases/arithmetic/082_comparison_semantics.pl +10 -0
- package/test/conformance/cases/arithmetic/083_between_modes_and_empty_ranges.pl +8 -0
- package/test/conformance/cases/arithmetic/between_bound_value.pl +2 -0
- package/test/conformance/cases/arithmetic/between_singleton.pl +2 -0
- package/test/conformance/cases/arithmetic/duration_comparison.pl +2 -0
- package/test/conformance/cases/arithmetic/extra_acos_one.pl +2 -0
- package/test/conformance/cases/arithmetic/extra_asin_zero.pl +2 -0
- package/test/conformance/cases/arithmetic/extra_atan2_axis.pl +2 -0
- package/test/conformance/cases/arithmetic/extra_difference_leap_day.pl +2 -0
- package/test/conformance/cases/arithmetic/extra_difference_same_day.pl +2 -0
- package/test/conformance/cases/arithmetic/extra_div_float_exact.pl +2 -0
- package/test/conformance/cases/arithmetic/extra_div_integer_trunc.pl +2 -0
- package/test/conformance/cases/arithmetic/extra_division_by_zero_fails.pl +2 -0
- package/test/conformance/cases/arithmetic/extra_exp_zero.pl +2 -0
- package/test/conformance/cases/arithmetic/extra_ge_equal_duration.pl +2 -0
- package/test/conformance/cases/arithmetic/extra_le_equal_string.pl +2 -0
- package/test/conformance/cases/arithmetic/extra_log_one.pl +2 -0
- package/test/conformance/cases/arithmetic/extra_mod_negative_right.pl +2 -0
- package/test/conformance/cases/arithmetic/extra_pow_large_integer.pl +2 -0
- package/test/conformance/cases/arithmetic/float_add_and_div.pl +3 -0
- package/test/conformance/cases/arithmetic/min_max_mixed.pl +3 -0
- package/test/conformance/cases/arithmetic/mod_negative_left.pl +2 -0
- package/test/conformance/cases/arithmetic/neg_abs_integer.pl +4 -0
- package/test/conformance/cases/arithmetic/pow_negative_exponent_fails.pl +2 -0
- package/test/conformance/cases/arithmetic/pow_zero_exponent.pl +2 -0
- package/test/conformance/cases/arithmetic/rounding_negative_float.pl +5 -0
- package/test/conformance/cases/arithmetic/smallest_divisor_prime.pl +2 -0
- package/test/conformance/cases/arithmetic/sqrt_negative_fails.pl +2 -0
- package/test/conformance/cases/atoms/008_graphic_atoms.pl +6 -0
- package/test/conformance/cases/atoms/008_graphic_atoms.query +1 -0
- package/test/conformance/cases/atoms/016_arity_zero_atom.pl +4 -0
- package/test/conformance/cases/atoms/018_quoted_atom_readback.pl +6 -0
- package/test/conformance/cases/atoms/018_quoted_atom_readback.query +1 -0
- package/test/conformance/cases/atoms/103_angle_iri_atoms.pl +7 -0
- package/test/conformance/cases/atoms/angle_iri_percent_encoded.pl +2 -0
- package/test/conformance/cases/atoms/extra_graphic_backslash_atom.pl +2 -0
- package/test/conformance/cases/atoms/extra_iri_mailto_plus.pl +2 -0
- package/test/conformance/cases/atoms/extra_iri_uuid_scheme.pl +2 -0
- package/test/conformance/cases/atoms/extra_quoted_atom_with_quote_readback.pl +2 -0
- package/test/conformance/cases/atoms/graphic_angle_atom_stays_graphic.pl +4 -0
- package/test/conformance/cases/atoms/graphic_atom_predicate.pl +3 -0
- package/test/conformance/cases/atoms/graphic_less_than_atom.pl +4 -0
- package/test/conformance/cases/atoms/iri_as_predicate_name_quoted.pl +3 -0
- package/test/conformance/cases/atoms/iri_atoms_in_lists.pl +4 -0
- package/test/conformance/cases/atoms/iri_mailto_readback.pl +4 -0
- package/test/conformance/cases/atoms/iri_query_fragment_readback.pl +4 -0
- package/test/conformance/cases/atoms/iri_quoted_absolute_readback.pl +5 -0
- package/test/conformance/cases/atoms/iri_quoted_and_angle_unify.pl +3 -0
- package/test/conformance/cases/atoms/iri_urn_readback.pl +4 -0
- package/test/conformance/cases/atoms/quoted_relative_iri_not_angle.pl +2 -0
- package/test/conformance/cases/atoms/quoted_urn_iri_readback.pl +4 -0
- package/test/conformance/cases/atoms/zero_arity_atom_roundtrip.pl +5 -0
- package/test/conformance/cases/builtins/037_matching_and_comparison.pl +7 -0
- package/test/conformance/cases/builtins/037_matching_and_comparison.query +1 -0
- package/test/conformance/cases/builtins/076_composed_reusable_builtins.pl +8 -0
- package/test/conformance/cases/builtins/100_reusable_builtin_workflow.pl +10 -0
- package/test/conformance/cases/builtins/atom_string_iri_atom.pl +3 -0
- package/test/conformance/cases/builtins/eq_unifies_iri_atoms.pl +3 -0
- package/test/conformance/cases/builtins/extra_difference_end_before_start_fails.pl +2 -0
- package/test/conformance/cases/builtins/extra_difference_invalid_date_fails.pl +2 -0
- package/test/conformance/cases/builtins/extra_eq_binds_both_sides.pl +2 -0
- package/test/conformance/cases/builtins/extra_neq_different_iri_atoms.pl +2 -0
- package/test/conformance/cases/builtins/extra_neq_same_iri_fails.pl +2 -0
- package/test/conformance/cases/context/032_holds_parts.pl +4 -0
- package/test/conformance/cases/context/051_nested_holds_parts.pl +4 -0
- package/test/conformance/cases/context/052_holds_member.pl +3 -0
- package/test/conformance/cases/context/094_context_holds_enumeration.pl +7 -0
- package/test/conformance/cases/context/extra_holds_atom_parts.pl +2 -0
- package/test/conformance/cases/context/extra_holds_ignores_string_parts.pl +2 -0
- package/test/conformance/cases/context/extra_holds_list_parts.pl +2 -0
- package/test/conformance/cases/context/extra_holds_term_nested_order.pl +2 -0
- package/test/conformance/cases/context/holds_compound_formula.pl +2 -0
- package/test/conformance/cases/context/holds_fails_when_missing.pl +2 -0
- package/test/conformance/cases/context/holds_parts_from_formula.pl +2 -0
- package/test/conformance/cases/control/014_failure_filters_answers.pl +7 -0
- package/test/conformance/cases/control/014_failure_filters_answers.query +1 -0
- package/test/conformance/cases/control/043_once_user_predicate.pl +5 -0
- package/test/conformance/cases/control/043_once_user_predicate.query +1 -0
- package/test/conformance/cases/control/074_forall_edges.pl +10 -0
- package/test/conformance/cases/control/097_control_negation_once_forall.pl +13 -0
- package/test/conformance/cases/control/double_negation_ground_goal.pl +3 -0
- package/test/conformance/cases/control/extra_forall_bound_check.pl +2 -0
- package/test/conformance/cases/control/extra_forall_counterexample_fails.pl +2 -0
- package/test/conformance/cases/control/extra_not_unbound_existing_goal_fails.pl +3 -0
- package/test/conformance/cases/control/extra_not_unbound_unknown_goal_succeeds.pl +2 -0
- package/test/conformance/cases/control/extra_once_empty_fails.pl +2 -0
- package/test/conformance/cases/control/extra_once_preserves_binding.pl +2 -0
- package/test/conformance/cases/control/forall_detects_counterexample.pl +5 -0
- package/test/conformance/cases/control/forall_empty_generator_true.pl +2 -0
- package/test/conformance/cases/control/negation_with_bound_generator.pl +5 -0
- package/test/conformance/cases/control/once_keeps_first_answer.pl +4 -0
- package/test/conformance/cases/declarations/104_mode_determinism_declarations.pl +11 -0
- package/test/conformance/cases/declarations/det_semidet_do_not_emit_without_materialize.pl +5 -0
- package/test/conformance/cases/declarations/memoize_is_ordinary_fact.pl +4 -0
- package/test/conformance/cases/declarations/mode_determinism_are_facts.pl +8 -0
- package/test/conformance/cases/declarations/mode_ignored_when_arity_mismatch.pl +5 -0
- package/test/conformance/cases/declarations/table_is_also_fact.pl +4 -0
- package/test/conformance/cases/lists/005_list_deconstruction.pl +6 -0
- package/test/conformance/cases/lists/005_list_deconstruction.query +1 -0
- package/test/conformance/cases/lists/015_improper_list_unification.pl +6 -0
- package/test/conformance/cases/lists/015_improper_list_unification.query +1 -0
- package/test/conformance/cases/lists/020_nested_list_terms.pl +5 -0
- package/test/conformance/cases/lists/020_nested_list_terms.query +1 -0
- package/test/conformance/cases/lists/031_lists_aggregation_ordering.pl +10 -0
- package/test/conformance/cases/lists/031_lists_aggregation_ordering.query +1 -0
- package/test/conformance/cases/lists/035_list_relations.pl +5 -0
- package/test/conformance/cases/lists/035_list_relations.query +1 -0
- package/test/conformance/cases/lists/036_append_splits.pl +3 -0
- package/test/conformance/cases/lists/036_append_splits.query +1 -0
- package/test/conformance/cases/lists/045_sort_deduplicates_atoms.pl +3 -0
- package/test/conformance/cases/lists/045_sort_deduplicates_atoms.query +1 -0
- package/test/conformance/cases/lists/046_append_bound_prefix_suffix.pl +4 -0
- package/test/conformance/cases/lists/046_append_bound_prefix_suffix.query +1 -0
- package/test/conformance/cases/lists/047_nth0_index_generation.pl +3 -0
- package/test/conformance/cases/lists/047_nth0_index_generation.query +1 -0
- package/test/conformance/cases/lists/048_set_nth0_edges.pl +4 -0
- package/test/conformance/cases/lists/048_set_nth0_edges.query +1 -0
- package/test/conformance/cases/lists/049_select_duplicate_occurrences.pl +3 -0
- package/test/conformance/cases/lists/049_select_duplicate_occurrences.query +1 -0
- package/test/conformance/cases/lists/063_reusable_list_builtins.pl +11 -0
- package/test/conformance/cases/lists/067_list_edges.pl +10 -0
- package/test/conformance/cases/lists/068_list_generation_order.pl +7 -0
- package/test/conformance/cases/lists/069_list_summaries_and_sets.pl +9 -0
- package/test/conformance/cases/lists/084_append_and_select_composition.pl +7 -0
- package/test/conformance/cases/lists/085_nth_and_update_edges.pl +8 -0
- package/test/conformance/cases/lists/086_slicing_pipeline.pl +10 -0
- package/test/conformance/cases/lists/087_sort_reverse_length.pl +8 -0
- package/test/conformance/cases/lists/088_list_summaries_failures.pl +8 -0
- package/test/conformance/cases/lists/empty_list_term.pl +4 -0
- package/test/conformance/cases/lists/extra_append_all_splits_three.pl +2 -0
- package/test/conformance/cases/lists/extra_append_to_improper_tail.pl +2 -0
- package/test/conformance/cases/lists/extra_drop_all.pl +2 -0
- package/test/conformance/cases/lists/extra_head_and_rest_improper.pl +2 -0
- package/test/conformance/cases/lists/extra_last_singleton.pl +2 -0
- package/test/conformance/cases/lists/extra_length_improper_fails.pl +2 -0
- package/test/conformance/cases/lists/extra_list_to_set_stable_order.pl +2 -0
- package/test/conformance/cases/lists/extra_member_repeated_nested.pl +2 -0
- package/test/conformance/cases/lists/extra_not_member_compound_fails.pl +2 -0
- package/test/conformance/cases/lists/extra_not_member_compound_success.pl +2 -0
- package/test/conformance/cases/lists/extra_nth0_duplicate_indexes.pl +2 -0
- package/test/conformance/cases/lists/extra_reverse_nested_terms.pl +2 -0
- package/test/conformance/cases/lists/extra_select_structured_duplicate.pl +2 -0
- package/test/conformance/cases/lists/extra_slice_end.pl +2 -0
- package/test/conformance/cases/lists/extra_sort_iri_atoms.pl +2 -0
- package/test/conformance/cases/lists/extra_take_all.pl +2 -0
- package/test/conformance/cases/lists/head_rest_last.pl +4 -0
- package/test/conformance/cases/lists/improper_list_readback.pl +4 -0
- package/test/conformance/cases/lists/length_empty_and_nested.pl +3 -0
- package/test/conformance/cases/lists/list_to_set_structural_duplicates.pl +2 -0
- package/test/conformance/cases/lists/list_with_iri_atoms.pl +4 -0
- package/test/conformance/cases/lists/min_list_empty_fails.pl +2 -0
- package/test/conformance/cases/lists/nth0_known_value.pl +2 -0
- package/test/conformance/cases/lists/nth0_out_of_range_fails.pl +2 -0
- package/test/conformance/cases/lists/reverse_empty.pl +2 -0
- package/test/conformance/cases/lists/select_all_occurrences.pl +2 -0
- package/test/conformance/cases/lists/set_nth0_middle.pl +2 -0
- package/test/conformance/cases/lists/slice_middle.pl +2 -0
- package/test/conformance/cases/lists/slice_out_of_range_fails.pl +2 -0
- package/test/conformance/cases/lists/sort_structured_terms.pl +2 -0
- package/test/conformance/cases/lists/sum_list_empty_zero.pl +2 -0
- package/test/conformance/cases/lists/sum_min_max_list.pl +4 -0
- package/test/conformance/cases/lists/take_zero_and_drop_all.pl +3 -0
- package/test/conformance/cases/materialize/027_default_derived_output.pl +5 -0
- package/test/conformance/cases/materialize/028_materialize_focus.pl +5 -0
- package/test/conformance/cases/materialize/053_materialize_excludes_source_fact.pl +6 -0
- package/test/conformance/cases/materialize/099_materialize_multiple_arities.pl +8 -0
- package/test/conformance/cases/materialize/arity_specific_outputs.pl +4 -0
- package/test/conformance/cases/materialize/extra_materialize_derived_only_with_same_source.pl +4 -0
- package/test/conformance/cases/materialize/extra_materialize_selects_arity.pl +4 -0
- package/test/conformance/cases/materialize/source_facts_suppressed.pl +5 -0
- package/test/conformance/cases/negation/033_negation_once_generators.pl +7 -0
- package/test/conformance/cases/negation/033_negation_once_generators.query +1 -0
- package/test/conformance/cases/negation/042_negation_filter.pl +7 -0
- package/test/conformance/cases/negation/042_negation_filter.query +1 -0
- package/test/conformance/cases/negation/050_not_member_filter.pl +6 -0
- package/test/conformance/cases/negation/050_not_member_filter.query +1 -0
- package/test/conformance/cases/negation/extra_not_with_bound_fails.pl +3 -0
- package/test/conformance/cases/negation/extra_not_with_bound_success.pl +3 -0
- package/test/conformance/cases/negation/not_known_goal_fails.pl +4 -0
- package/test/conformance/cases/negation/not_unknown_goal_succeeds.pl +3 -0
- package/test/conformance/cases/negation/stratified_negation_answers.pl +6 -0
- package/test/conformance/cases/rules/001_fact_output.pl +4 -0
- package/test/conformance/cases/rules/002_rule_recursion.pl +7 -0
- package/test/conformance/cases/rules/002_rule_recursion.query +1 -0
- package/test/conformance/cases/rules/011_predicate_arity.pl +6 -0
- package/test/conformance/cases/rules/011_predicate_arity.query +1 -0
- package/test/conformance/cases/rules/013_multiple_clauses_order.pl +6 -0
- package/test/conformance/cases/rules/013_multiple_clauses_order.query +1 -0
- package/test/conformance/cases/rules/017_three_step_recursion.pl +8 -0
- package/test/conformance/cases/rules/017_three_step_recursion.query +1 -0
- package/test/conformance/cases/rules/022_rule_head_structure.pl +5 -0
- package/test/conformance/cases/rules/077_recursive_path_with_lists.pl +10 -0
- package/test/conformance/cases/rules/078_mutual_recursion_with_arithmetic.pl +7 -0
- package/test/conformance/cases/rules/extra_left_to_right_multiple_bindings.pl +5 -0
- package/test/conformance/cases/rules/extra_structured_head_rule.pl +3 -0
- package/test/conformance/cases/rules/left_to_right_body_binding.pl +4 -0
- package/test/conformance/cases/rules/transitive_rule_three_edges.pl +7 -0
- package/test/conformance/cases/strings/023_quoted_escapes_readback.pl +5 -0
- package/test/conformance/cases/strings/030_strings_and_atoms.pl +4 -0
- package/test/conformance/cases/strings/030_strings_and_atoms.query +1 -0
- package/test/conformance/cases/strings/055_string_matching_filters.pl +6 -0
- package/test/conformance/cases/strings/055_string_matching_filters.query +1 -0
- package/test/conformance/cases/strings/056_string_and_atom_concat.pl +3 -0
- package/test/conformance/cases/strings/056_string_and_atom_concat.query +1 -0
- package/test/conformance/cases/strings/064_reusable_string_builtins.pl +12 -0
- package/test/conformance/cases/strings/070_matches_named_captures.pl +13 -0
- package/test/conformance/cases/strings/071_string_edges.pl +10 -0
- package/test/conformance/cases/strings/072_string_conversions.pl +10 -0
- package/test/conformance/cases/strings/089_string_split_join_pipeline.pl +7 -0
- package/test/conformance/cases/strings/090_string_substring_replace_edges.pl +9 -0
- package/test/conformance/cases/strings/091_string_case_and_trim.pl +7 -0
- package/test/conformance/cases/strings/092_scalar_string_conversions.pl +9 -0
- package/test/conformance/cases/strings/093_regex_named_captures_context.pl +8 -0
- package/test/conformance/cases/strings/atom_string_from_string.pl +2 -0
- package/test/conformance/cases/strings/casefold_atoms.pl +3 -0
- package/test/conformance/cases/strings/contains_empty_needle.pl +2 -0
- package/test/conformance/cases/strings/extra_atom_string_number_input.pl +2 -0
- package/test/conformance/cases/strings/extra_join_empty_list.pl +2 -0
- package/test/conformance/cases/strings/extra_join_iri_and_atom.pl +2 -0
- package/test/conformance/cases/strings/extra_lowercase_iri_atom.pl +2 -0
- package/test/conformance/cases/strings/extra_matches_invalid_pattern_fails.pl +2 -0
- package/test/conformance/cases/strings/extra_named_regex_optional_missing.pl +2 -0
- package/test/conformance/cases/strings/extra_number_string_atom_input.pl +2 -0
- package/test/conformance/cases/strings/extra_replace_multiple.pl +2 -0
- package/test/conformance/cases/strings/extra_split_empty_separator.pl +2 -0
- package/test/conformance/cases/strings/extra_substring_last_char.pl +2 -0
- package/test/conformance/cases/strings/extra_term_string_iri_list.pl +2 -0
- package/test/conformance/cases/strings/extra_uppercase_mixed_string.pl +2 -0
- package/test/conformance/cases/strings/join_mixed_scalars.pl +2 -0
- package/test/conformance/cases/strings/matches_simple_alternation.pl +2 -0
- package/test/conformance/cases/strings/named_regex_two_groups.pl +2 -0
- package/test/conformance/cases/strings/not_matches_simple_pattern.pl +2 -0
- package/test/conformance/cases/strings/number_string_from_string.pl +2 -0
- package/test/conformance/cases/strings/number_string_rejects_non_numeric.pl +2 -0
- package/test/conformance/cases/strings/replace_empty_search_no_change.pl +2 -0
- package/test/conformance/cases/strings/split_without_separator_match.pl +2 -0
- package/test/conformance/cases/strings/substring_out_of_range_fails.pl +2 -0
- package/test/conformance/cases/strings/substring_zero_count.pl +2 -0
- package/test/conformance/cases/strings/term_string_nested_term.pl +2 -0
- package/test/conformance/cases/strings/trim_tabs_and_spaces.pl +3 -0
- package/test/conformance/cases/syntax/004_conjunction_and_parentheses.pl +5 -0
- package/test/conformance/cases/syntax/004_conjunction_and_parentheses.query +1 -0
- package/test/conformance/cases/syntax/006_comma_formula_data.pl +4 -0
- package/test/conformance/cases/syntax/006_comma_formula_data.query +1 -0
- package/test/conformance/cases/syntax/009_comments_and_whitespace.pl +5 -0
- package/test/conformance/cases/syntax/009_comments_and_whitespace.query +1 -0
- package/test/conformance/cases/syntax/019_parenthesized_three_conjuncts.pl +7 -0
- package/test/conformance/cases/syntax/019_parenthesized_three_conjuncts.query +1 -0
- package/test/conformance/cases/syntax/025_body_parentheses_with_formula_data.pl +5 -0
- package/test/conformance/cases/syntax/comments_inside_program.pl +4 -0
- package/test/conformance/cases/syntax/extra_comments_after_terms.pl +3 -0
- package/test/conformance/cases/syntax/extra_nested_parenthesized_body.pl +2 -0
- package/test/conformance/cases/syntax/parenthesized_query_style_body.pl +5 -0
- package/test/conformance/cases/syntax/quoted_atom_with_newline_escape.pl +3 -0
- package/test/conformance/cases/syntax/string_with_tab_escape.pl +2 -0
- package/test/conformance/cases/table/038_table_declaration.pl +8 -0
- package/test/conformance/cases/table/038_table_declaration.query +1 -0
- package/test/conformance/cases/table/102_table_declaration.pl +11 -0
- package/test/conformance/cases/table/extra_table_bound_cycle.pl +7 -0
- package/test/conformance/cases/table/extra_table_open_call_fallback.pl +5 -0
- package/test/conformance/cases/table/table_does_not_change_answers.pl +7 -0
- package/test/conformance/cases/table/tabled_left_recursion_path.pl +7 -0
- package/test/conformance/cases/terms/003_terms_and_readback.pl +16 -0
- package/test/conformance/cases/terms/003_terms_and_readback.query +1 -0
- package/test/conformance/cases/terms/065_reusable_term_control_builtins.pl +11 -0
- package/test/conformance/cases/terms/073_term_introspection_edges.pl +11 -0
- package/test/conformance/cases/terms/095_term_introspection_roundtrip.pl +8 -0
- package/test/conformance/cases/terms/096_functor_scalar_edges.pl +8 -0
- package/test/conformance/cases/terms/arg_first_and_second.pl +3 -0
- package/test/conformance/cases/terms/arg_zero_fails.pl +2 -0
- package/test/conformance/cases/terms/compound_name_arguments_atom_zero_args.pl +3 -0
- package/test/conformance/cases/terms/compound_name_arguments_bad_args_fail.pl +2 -0
- package/test/conformance/cases/terms/compound_name_arguments_builds_atom_from_empty_args.pl +3 -0
- package/test/conformance/cases/terms/compound_name_arguments_builds_compound.pl +2 -0
- package/test/conformance/cases/terms/compound_name_arguments_iri_name.pl +2 -0
- package/test/conformance/cases/terms/extra_arg_atom_fails.pl +2 -0
- package/test/conformance/cases/terms/extra_arg_first_last.pl +2 -0
- package/test/conformance/cases/terms/extra_arg_zero_fails.pl +2 -0
- package/test/conformance/cases/terms/extra_compound_name_arguments_bad_args_fails.pl +2 -0
- package/test/conformance/cases/terms/extra_compound_name_arguments_construct_atom_zero.pl +2 -0
- package/test/conformance/cases/terms/extra_compound_name_arguments_construct_iri.pl +2 -0
- package/test/conformance/cases/terms/extra_compound_name_arguments_decompose_list.pl +2 -0
- package/test/conformance/cases/terms/extra_functor_list_cons.pl +2 -0
- package/test/conformance/cases/terms/extra_functor_number_scalar.pl +2 -0
- package/test/conformance/cases/terms/extra_functor_string_scalar.pl +2 -0
- package/test/conformance/cases/terms/functor_atom_arity_zero.pl +3 -0
- package/test/conformance/cases/terms/functor_number_and_string.pl +3 -0
- package/test/conformance/cases/terms/herbrand_witness_different_inputs_distinct.pl +2 -0
- package/test/conformance/cases/terms/herbrand_witness_one_input.pl +5 -0
- package/test/conformance/cases/terms/herbrand_witness_same_inputs_same_term.pl +2 -0
- package/test/conformance/cases/terms/herbrand_witness_two_inputs.pl +5 -0
- package/test/conformance/cases/terms/term_string_readback_iri_list.pl +2 -0
- package/test/conformance/cases/unification/012_nested_compound_unification.pl +5 -0
- package/test/conformance/cases/unification/012_nested_compound_unification.query +1 -0
- package/test/conformance/cases/unification/021_repeated_variable_head.pl +7 -0
- package/test/conformance/cases/unification/034_equality_and_inequality.pl +6 -0
- package/test/conformance/cases/unification/034_equality_and_inequality.query +1 -0
- package/test/conformance/cases/unification/compound_arity_mismatch_fails.pl +2 -0
- package/test/conformance/cases/unification/extra_eq_iri_and_quoted_atom.pl +2 -0
- package/test/conformance/cases/unification/extra_eq_list_tail_binding.pl +2 -0
- package/test/conformance/cases/unification/extra_eq_nested_repeated_fails.pl +2 -0
- package/test/conformance/cases/unification/extra_eq_nested_repeated_success.pl +2 -0
- package/test/conformance/cases/unification/extra_eq_scalar_number_atom.pl +2 -0
- package/test/conformance/cases/unification/extra_eq_scalar_string_number.pl +2 -0
- package/test/conformance/cases/unification/extra_neq_compound_arity_mismatch.pl +2 -0
- package/test/conformance/cases/unification/extra_neq_scalar_same_lexical_fails.pl +2 -0
- package/test/conformance/cases/unification/extra_variable_clause_locality.pl +4 -0
- package/test/conformance/cases/unification/list_tail_binding.pl +2 -0
- package/test/conformance/cases/unification/nested_repeated_variable.pl +2 -0
- package/test/conformance/cases/unification/scalar_cross_type_same_lexical_value.pl +3 -0
- package/test/conformance/cases/variables/007_anonymous_variables.pl +5 -0
- package/test/conformance/cases/variables/007_anonymous_variables.query +1 -0
- package/test/conformance/cases/variables/010_variable_scope_and_reuse.pl +8 -0
- package/test/conformance/cases/variables/010_variable_scope_and_reuse.query +1 -0
- package/test/conformance/cases/variables/026_question_underscore_named_variable_reuse.pl +5 -0
- package/test/conformance/cases/variables/101_question_mark_variables.pl +7 -0
- package/test/conformance/cases/variables/anonymous_in_two_goals.pl +4 -0
- package/test/conformance/cases/variables/clause_local_variable_names.pl +5 -0
- package/test/conformance/cases/variables/extra_anonymous_not_reused.pl +2 -0
- package/test/conformance/cases/variables/extra_named_variable_reused.pl +2 -0
- package/test/conformance/cases/variables/extra_question_underscore_named_distinct.pl +2 -0
- package/test/conformance/cases/variables/extra_question_uppercase_named.pl +2 -0
- package/test/conformance/cases/variables/question_anonymous_not_reused.pl +6 -0
- package/test/conformance/cases/variables/question_underscore_named_reuse.pl +5 -0
- package/test/conformance/cases/variables/question_uppercase_variable.pl +4 -0
- package/test/conformance/cases/variables/question_variable_digits_and_underscore.pl +2 -0
- package/test/conformance/cases/variables/question_variable_uppercase_name.pl +2 -0
- package/test/conformance/cases/variables/variable_scope_per_clause.pl +6 -0
- package/test/conformance/errors/atoms/extra_angle_iri_backslash_rejected.pl +1 -0
- package/test/conformance/errors/atoms/extra_angle_iri_pipe_rejected.pl +1 -0
- package/test/conformance/errors/atoms/extra_angle_iri_quote_rejected.pl +1 -0
- package/test/conformance/errors/atoms/hash_comment_not_atom_at_line_start.pl +1 -0
- package/test/conformance/errors/atoms/relative_angle_name_rejected.pl +1 -0
- package/test/conformance/errors/atoms/space_in_angle_iri_rejected.pl +1 -0
- package/test/conformance/errors/atoms/unclosed_angle_iri_rejected.pl +1 -0
- package/test/conformance/errors/atoms/zero_arity_compound_rejected.pl +1 -0
- package/test/conformance/errors/lists/extra_missing_tail_after_bar.pl +1 -0
- package/test/conformance/errors/lists/extra_unclosed_list_tail.pl +1 -0
- package/test/conformance/errors/lists/missing_list_tail.pl +1 -0
- package/test/conformance/errors/rules/extra_empty_head_with_body.pl +1 -0
- package/test/conformance/errors/rules/extra_rule_without_body.pl +1 -0
- package/test/conformance/errors/rules/rule_head_cannot_be_empty_parentheses.pl +1 -0
- package/test/conformance/errors/syntax/angle_iri_with_space_rejected.pl +1 -0
- package/test/conformance/errors/syntax/bad_question_digit_variable.pl +1 -0
- package/test/conformance/errors/syntax/bad_question_variable.pl +1 -0
- package/test/conformance/errors/syntax/colon_name_rejected.pl +1 -0
- package/test/conformance/errors/syntax/empty_body_after_rule_marker.pl +1 -0
- package/test/conformance/errors/syntax/empty_compound_nested.pl +1 -0
- package/test/conformance/errors/syntax/extra_bad_backtick_character.pl +1 -0
- package/test/conformance/errors/syntax/extra_bad_iri_empty_body.pl +1 -0
- package/test/conformance/errors/syntax/extra_bad_list_double_comma.pl +1 -0
- package/test/conformance/errors/syntax/extra_bad_list_double_tail.pl +1 -0
- package/test/conformance/errors/syntax/extra_bad_number_two_decimal_points.pl +1 -0
- package/test/conformance/errors/syntax/extra_double_period_rejected.pl +1 -0
- package/test/conformance/errors/syntax/extra_extra_closing_paren.pl +1 -0
- package/test/conformance/errors/syntax/extra_missing_closing_rule_body.pl +1 -0
- package/test/conformance/errors/syntax/extra_missing_head_rejected.pl +1 -0
- package/test/conformance/errors/syntax/missing_final_dot_rejected.pl +1 -0
- package/test/conformance/errors/syntax/missing_period.pl +1 -0
- package/test/conformance/errors/syntax/relative_angle_iri_rejected.pl +1 -0
- package/test/conformance/errors/syntax/trailing_comma_in_body.pl +1 -0
- package/test/conformance/errors/syntax/unclosed_compound.pl +1 -0
- package/test/conformance/errors/syntax/unclosed_list.pl +1 -0
- package/test/conformance/errors/syntax/unclosed_list_rejected.pl +1 -0
- package/test/conformance/errors/syntax/unclosed_quoted_atom.pl +1 -0
- package/test/conformance/errors/syntax/unclosed_quoted_atom_rejected.pl +1 -0
- package/test/conformance/errors/syntax/unclosed_string.pl +1 -0
- package/test/conformance/errors/syntax/unquoted_colon_predicate.pl +1 -0
- package/test/conformance/errors/syntax/unquoted_dotted_predicate.pl +1 -0
- package/test/conformance/errors/syntax/uppercase_predicate_rejected.pl +1 -0
- package/test/conformance/errors/terms/extra_empty_nested_compound.pl +1 -0
- package/test/conformance/errors/terms/extra_empty_top_level_compound.pl +1 -0
- package/test/conformance/errors/terms/zero_arity_compound_nested_rejected.pl +1 -0
- package/test/conformance/errors/variables/bare_underscore_in_list_rejected.pl +1 -0
- package/test/conformance/errors/variables/bare_underscore_name_in_compound_rejected.pl +1 -0
- package/test/conformance/errors/variables/bare_underscore_rejected.pl +1 -0
- package/test/conformance/errors/variables/extra_bare_underscore_in_rule_head.pl +1 -0
- package/test/conformance/errors/variables/extra_question_dash_variable.pl +1 -0
- package/test/conformance/errors/variables/extra_uppercase_in_list.pl +1 -0
- package/test/conformance/errors/variables/question_digit_rejected.pl +1 -0
- package/test/conformance/errors/variables/question_dot_rejected.pl +1 -0
- package/test/conformance/errors/variables/underscore_named_rejected.pl +1 -0
- package/test/conformance/errors/variables/uppercase_in_body_rejected.pl +1 -0
- package/test/conformance/errors/variables/uppercase_variable_rejected.pl +1 -0
- package/test/conformance/expected/aggregation/044_findall_user_goal.pl +1 -0
- package/test/conformance/expected/aggregation/057_countall_empty_and_nonempty.pl +1 -0
- package/test/conformance/expected/aggregation/058_sumall_numeric_template.pl +1 -0
- package/test/conformance/expected/aggregation/059_aggregate_min_template.pl +1 -0
- package/test/conformance/expected/aggregation/060_aggregate_max_compound_key.pl +1 -0
- package/test/conformance/expected/aggregation/075_aggregation_edges.pl +7 -0
- package/test/conformance/expected/aggregation/098_aggregation_nested_templates.pl +5 -0
- package/test/conformance/expected/aggregation/aggregate_max_no_answers_fails.pl +1 -0
- package/test/conformance/expected/aggregation/aggregate_min_structured_key.pl +1 -0
- package/test/conformance/expected/aggregation/countall_zero.pl +1 -0
- package/test/conformance/expected/aggregation/extra_aggregate_max_iri_key.pl +1 -0
- package/test/conformance/expected/aggregation/extra_aggregate_min_tie_first.pl +1 -0
- package/test/conformance/expected/aggregation/extra_countall_with_filter.pl +1 -0
- package/test/conformance/expected/aggregation/extra_findall_repeated_template.pl +1 -0
- package/test/conformance/expected/aggregation/extra_sumall_float_template.pl +1 -0
- package/test/conformance/expected/aggregation/findall_empty_bag.pl +1 -0
- package/test/conformance/expected/aggregation/sumall_empty_zero.pl +1 -0
- package/test/conformance/expected/arithmetic/024_numeric_literal_readback.pl +3 -0
- package/test/conformance/expected/arithmetic/029_arithmetic_and_comparison.pl +9 -0
- package/test/conformance/expected/arithmetic/039_numeric_functions.pl +7 -0
- package/test/conformance/expected/arithmetic/040_between_enumeration.pl +3 -0
- package/test/conformance/expected/arithmetic/041_smallest_divisor.pl +1 -0
- package/test/conformance/expected/arithmetic/054_numeric_and_lexical_comparison.pl +3 -0
- package/test/conformance/expected/arithmetic/061_date_difference.pl +2 -0
- package/test/conformance/expected/arithmetic/062_reusable_numeric_builtins.pl +8 -0
- package/test/conformance/expected/arithmetic/066_numeric_edges.pl +12 -0
- package/test/conformance/expected/arithmetic/079_big_integer_arithmetic.pl +6 -0
- package/test/conformance/expected/arithmetic/080_rounding_modes.pl +8 -0
- package/test/conformance/expected/arithmetic/081_zero_safe_numeric_functions.pl +7 -0
- package/test/conformance/expected/arithmetic/082_comparison_semantics.pl +8 -0
- package/test/conformance/expected/arithmetic/083_between_modes_and_empty_ranges.pl +8 -0
- package/test/conformance/expected/arithmetic/between_bound_value.pl +1 -0
- package/test/conformance/expected/arithmetic/between_singleton.pl +1 -0
- package/test/conformance/expected/arithmetic/duration_comparison.pl +1 -0
- package/test/conformance/expected/arithmetic/extra_acos_one.pl +1 -0
- package/test/conformance/expected/arithmetic/extra_asin_zero.pl +1 -0
- package/test/conformance/expected/arithmetic/extra_atan2_axis.pl +1 -0
- package/test/conformance/expected/arithmetic/extra_difference_leap_day.pl +1 -0
- package/test/conformance/expected/arithmetic/extra_difference_same_day.pl +1 -0
- package/test/conformance/expected/arithmetic/extra_div_float_exact.pl +1 -0
- package/test/conformance/expected/arithmetic/extra_div_integer_trunc.pl +1 -0
- package/test/conformance/expected/arithmetic/extra_division_by_zero_fails.pl +0 -0
- package/test/conformance/expected/arithmetic/extra_exp_zero.pl +1 -0
- package/test/conformance/expected/arithmetic/extra_ge_equal_duration.pl +1 -0
- package/test/conformance/expected/arithmetic/extra_le_equal_string.pl +1 -0
- package/test/conformance/expected/arithmetic/extra_log_one.pl +1 -0
- package/test/conformance/expected/arithmetic/extra_mod_negative_right.pl +1 -0
- package/test/conformance/expected/arithmetic/extra_pow_large_integer.pl +1 -0
- package/test/conformance/expected/arithmetic/float_add_and_div.pl +2 -0
- package/test/conformance/expected/arithmetic/min_max_mixed.pl +2 -0
- package/test/conformance/expected/arithmetic/mod_negative_left.pl +1 -0
- package/test/conformance/expected/arithmetic/neg_abs_integer.pl +2 -0
- package/test/conformance/expected/arithmetic/pow_negative_exponent_fails.pl +1 -0
- package/test/conformance/expected/arithmetic/pow_zero_exponent.pl +1 -0
- package/test/conformance/expected/arithmetic/rounding_negative_float.pl +4 -0
- package/test/conformance/expected/arithmetic/smallest_divisor_prime.pl +1 -0
- package/test/conformance/expected/arithmetic/sqrt_negative_fails.pl +1 -0
- package/test/conformance/expected/atoms/008_graphic_atoms.pl +3 -0
- package/test/conformance/expected/atoms/016_arity_zero_atom.pl +1 -0
- package/test/conformance/expected/atoms/018_quoted_atom_readback.pl +3 -0
- package/test/conformance/expected/atoms/103_angle_iri_atoms.pl +3 -0
- package/test/conformance/expected/atoms/angle_iri_percent_encoded.pl +0 -0
- package/test/conformance/expected/atoms/extra_graphic_backslash_atom.pl +0 -0
- package/test/conformance/expected/atoms/extra_iri_mailto_plus.pl +0 -0
- package/test/conformance/expected/atoms/extra_iri_uuid_scheme.pl +0 -0
- package/test/conformance/expected/atoms/extra_quoted_atom_with_quote_readback.pl +0 -0
- package/test/conformance/expected/atoms/graphic_angle_atom_stays_graphic.pl +1 -0
- package/test/conformance/expected/atoms/graphic_atom_predicate.pl +1 -0
- package/test/conformance/expected/atoms/graphic_less_than_atom.pl +1 -0
- package/test/conformance/expected/atoms/iri_as_predicate_name_quoted.pl +1 -0
- package/test/conformance/expected/atoms/iri_atoms_in_lists.pl +1 -0
- package/test/conformance/expected/atoms/iri_mailto_readback.pl +1 -0
- package/test/conformance/expected/atoms/iri_query_fragment_readback.pl +1 -0
- package/test/conformance/expected/atoms/iri_quoted_absolute_readback.pl +2 -0
- package/test/conformance/expected/atoms/iri_quoted_and_angle_unify.pl +0 -0
- package/test/conformance/expected/atoms/iri_urn_readback.pl +1 -0
- package/test/conformance/expected/atoms/quoted_relative_iri_not_angle.pl +0 -0
- package/test/conformance/expected/atoms/quoted_urn_iri_readback.pl +1 -0
- package/test/conformance/expected/atoms/zero_arity_atom_roundtrip.pl +3 -0
- package/test/conformance/expected/builtins/037_matching_and_comparison.pl +5 -0
- package/test/conformance/expected/builtins/076_composed_reusable_builtins.pl +5 -0
- package/test/conformance/expected/builtins/100_reusable_builtin_workflow.pl +6 -0
- package/test/conformance/expected/builtins/atom_string_iri_atom.pl +1 -0
- package/test/conformance/expected/builtins/eq_unifies_iri_atoms.pl +0 -0
- package/test/conformance/expected/builtins/extra_difference_end_before_start_fails.pl +0 -0
- package/test/conformance/expected/builtins/extra_difference_invalid_date_fails.pl +0 -0
- package/test/conformance/expected/builtins/extra_eq_binds_both_sides.pl +1 -0
- package/test/conformance/expected/builtins/extra_neq_different_iri_atoms.pl +1 -0
- package/test/conformance/expected/builtins/extra_neq_same_iri_fails.pl +1 -0
- package/test/conformance/expected/context/032_holds_parts.pl +3 -0
- package/test/conformance/expected/context/051_nested_holds_parts.pl +3 -0
- package/test/conformance/expected/context/052_holds_member.pl +2 -0
- package/test/conformance/expected/context/094_context_holds_enumeration.pl +8 -0
- package/test/conformance/expected/context/extra_holds_atom_parts.pl +2 -0
- package/test/conformance/expected/context/extra_holds_ignores_string_parts.pl +0 -0
- package/test/conformance/expected/context/extra_holds_list_parts.pl +2 -0
- package/test/conformance/expected/context/extra_holds_term_nested_order.pl +3 -0
- package/test/conformance/expected/context/holds_compound_formula.pl +1 -0
- package/test/conformance/expected/context/holds_fails_when_missing.pl +1 -0
- package/test/conformance/expected/context/holds_parts_from_formula.pl +2 -0
- package/test/conformance/expected/control/014_failure_filters_answers.pl +1 -0
- package/test/conformance/expected/control/043_once_user_predicate.pl +1 -0
- package/test/conformance/expected/control/074_forall_edges.pl +5 -0
- package/test/conformance/expected/control/097_control_negation_once_forall.pl +5 -0
- package/test/conformance/expected/control/double_negation_ground_goal.pl +1 -0
- package/test/conformance/expected/control/extra_forall_bound_check.pl +1 -0
- package/test/conformance/expected/control/extra_forall_counterexample_fails.pl +0 -0
- package/test/conformance/expected/control/extra_not_unbound_existing_goal_fails.pl +0 -0
- package/test/conformance/expected/control/extra_not_unbound_unknown_goal_succeeds.pl +1 -0
- package/test/conformance/expected/control/extra_once_empty_fails.pl +0 -0
- package/test/conformance/expected/control/extra_once_preserves_binding.pl +1 -0
- package/test/conformance/expected/control/forall_detects_counterexample.pl +1 -0
- package/test/conformance/expected/control/forall_empty_generator_true.pl +1 -0
- package/test/conformance/expected/control/negation_with_bound_generator.pl +1 -0
- package/test/conformance/expected/control/once_keeps_first_answer.pl +1 -0
- package/test/conformance/expected/declarations/104_mode_determinism_declarations.pl +4 -0
- package/test/conformance/expected/declarations/det_semidet_do_not_emit_without_materialize.pl +1 -0
- package/test/conformance/expected/declarations/memoize_is_ordinary_fact.pl +1 -0
- package/test/conformance/expected/declarations/mode_determinism_are_facts.pl +3 -0
- package/test/conformance/expected/declarations/mode_ignored_when_arity_mismatch.pl +1 -0
- package/test/conformance/expected/declarations/table_is_also_fact.pl +1 -0
- package/test/conformance/expected/lists/005_list_deconstruction.pl +2 -0
- package/test/conformance/expected/lists/015_improper_list_unification.pl +3 -0
- package/test/conformance/expected/lists/020_nested_list_terms.pl +2 -0
- package/test/conformance/expected/lists/031_lists_aggregation_ordering.pl +9 -0
- package/test/conformance/expected/lists/035_list_relations.pl +4 -0
- package/test/conformance/expected/lists/036_append_splits.pl +3 -0
- package/test/conformance/expected/lists/045_sort_deduplicates_atoms.pl +1 -0
- package/test/conformance/expected/lists/046_append_bound_prefix_suffix.pl +2 -0
- package/test/conformance/expected/lists/047_nth0_index_generation.pl +1 -0
- package/test/conformance/expected/lists/048_set_nth0_edges.pl +2 -0
- package/test/conformance/expected/lists/049_select_duplicate_occurrences.pl +2 -0
- package/test/conformance/expected/lists/063_reusable_list_builtins.pl +9 -0
- package/test/conformance/expected/lists/067_list_edges.pl +8 -0
- package/test/conformance/expected/lists/068_list_generation_order.pl +10 -0
- package/test/conformance/expected/lists/069_list_summaries_and_sets.pl +7 -0
- package/test/conformance/expected/lists/084_append_and_select_composition.pl +10 -0
- package/test/conformance/expected/lists/085_nth_and_update_edges.pl +8 -0
- package/test/conformance/expected/lists/086_slicing_pipeline.pl +7 -0
- package/test/conformance/expected/lists/087_sort_reverse_length.pl +6 -0
- package/test/conformance/expected/lists/088_list_summaries_failures.pl +6 -0
- package/test/conformance/expected/lists/empty_list_term.pl +1 -0
- package/test/conformance/expected/lists/extra_append_all_splits_three.pl +4 -0
- package/test/conformance/expected/lists/extra_append_to_improper_tail.pl +1 -0
- package/test/conformance/expected/lists/extra_drop_all.pl +1 -0
- package/test/conformance/expected/lists/extra_head_and_rest_improper.pl +1 -0
- package/test/conformance/expected/lists/extra_last_singleton.pl +1 -0
- package/test/conformance/expected/lists/extra_length_improper_fails.pl +0 -0
- package/test/conformance/expected/lists/extra_list_to_set_stable_order.pl +1 -0
- package/test/conformance/expected/lists/extra_member_repeated_nested.pl +2 -0
- package/test/conformance/expected/lists/extra_not_member_compound_fails.pl +0 -0
- package/test/conformance/expected/lists/extra_not_member_compound_success.pl +1 -0
- package/test/conformance/expected/lists/extra_nth0_duplicate_indexes.pl +2 -0
- package/test/conformance/expected/lists/extra_reverse_nested_terms.pl +1 -0
- package/test/conformance/expected/lists/extra_select_structured_duplicate.pl +2 -0
- package/test/conformance/expected/lists/extra_slice_end.pl +1 -0
- package/test/conformance/expected/lists/extra_sort_iri_atoms.pl +1 -0
- package/test/conformance/expected/lists/extra_take_all.pl +1 -0
- package/test/conformance/expected/lists/head_rest_last.pl +3 -0
- package/test/conformance/expected/lists/improper_list_readback.pl +1 -0
- package/test/conformance/expected/lists/length_empty_and_nested.pl +2 -0
- package/test/conformance/expected/lists/list_to_set_structural_duplicates.pl +1 -0
- package/test/conformance/expected/lists/list_with_iri_atoms.pl +1 -0
- package/test/conformance/expected/lists/min_list_empty_fails.pl +1 -0
- package/test/conformance/expected/lists/nth0_known_value.pl +1 -0
- package/test/conformance/expected/lists/nth0_out_of_range_fails.pl +1 -0
- package/test/conformance/expected/lists/reverse_empty.pl +1 -0
- package/test/conformance/expected/lists/select_all_occurrences.pl +3 -0
- package/test/conformance/expected/lists/set_nth0_middle.pl +1 -0
- package/test/conformance/expected/lists/slice_middle.pl +0 -0
- package/test/conformance/expected/lists/slice_out_of_range_fails.pl +1 -0
- package/test/conformance/expected/lists/sort_structured_terms.pl +1 -0
- package/test/conformance/expected/lists/sum_list_empty_zero.pl +1 -0
- package/test/conformance/expected/lists/sum_min_max_list.pl +3 -0
- package/test/conformance/expected/lists/take_zero_and_drop_all.pl +2 -0
- package/test/conformance/expected/materialize/027_default_derived_output.pl +3 -0
- package/test/conformance/expected/materialize/028_materialize_focus.pl +1 -0
- package/test/conformance/expected/materialize/053_materialize_excludes_source_fact.pl +1 -0
- package/test/conformance/expected/materialize/099_materialize_multiple_arities.pl +4 -0
- package/test/conformance/expected/materialize/arity_specific_outputs.pl +0 -0
- package/test/conformance/expected/materialize/extra_materialize_derived_only_with_same_source.pl +1 -0
- package/test/conformance/expected/materialize/extra_materialize_selects_arity.pl +0 -0
- package/test/conformance/expected/materialize/source_facts_suppressed.pl +1 -0
- package/test/conformance/expected/negation/033_negation_once_generators.pl +2 -0
- package/test/conformance/expected/negation/042_negation_filter.pl +2 -0
- package/test/conformance/expected/negation/050_not_member_filter.pl +1 -0
- package/test/conformance/expected/negation/extra_not_with_bound_fails.pl +0 -0
- package/test/conformance/expected/negation/extra_not_with_bound_success.pl +1 -0
- package/test/conformance/expected/negation/not_known_goal_fails.pl +0 -0
- package/test/conformance/expected/negation/not_unknown_goal_succeeds.pl +1 -0
- package/test/conformance/expected/negation/stratified_negation_answers.pl +1 -0
- package/test/conformance/expected/rules/001_fact_output.pl +1 -0
- package/test/conformance/expected/rules/002_rule_recursion.pl +2 -0
- package/test/conformance/expected/rules/011_predicate_arity.pl +2 -0
- package/test/conformance/expected/rules/013_multiple_clauses_order.pl +2 -0
- package/test/conformance/expected/rules/017_three_step_recursion.pl +3 -0
- package/test/conformance/expected/rules/022_rule_head_structure.pl +2 -0
- package/test/conformance/expected/rules/077_recursive_path_with_lists.pl +3 -0
- package/test/conformance/expected/rules/078_mutual_recursion_with_arithmetic.pl +7 -0
- package/test/conformance/expected/rules/extra_left_to_right_multiple_bindings.pl +2 -0
- package/test/conformance/expected/rules/extra_structured_head_rule.pl +1 -0
- package/test/conformance/expected/rules/left_to_right_body_binding.pl +1 -0
- package/test/conformance/expected/rules/transitive_rule_three_edges.pl +6 -0
- package/test/conformance/expected/strings/023_quoted_escapes_readback.pl +2 -0
- package/test/conformance/expected/strings/030_strings_and_atoms.pl +2 -0
- package/test/conformance/expected/strings/055_string_matching_filters.pl +2 -0
- package/test/conformance/expected/strings/056_string_and_atom_concat.pl +1 -0
- package/test/conformance/expected/strings/064_reusable_string_builtins.pl +10 -0
- package/test/conformance/expected/strings/070_matches_named_captures.pl +1 -0
- package/test/conformance/expected/strings/071_string_edges.pl +8 -0
- package/test/conformance/expected/strings/072_string_conversions.pl +8 -0
- package/test/conformance/expected/strings/089_string_split_join_pipeline.pl +4 -0
- package/test/conformance/expected/strings/090_string_substring_replace_edges.pl +7 -0
- package/test/conformance/expected/strings/091_string_case_and_trim.pl +5 -0
- package/test/conformance/expected/strings/092_scalar_string_conversions.pl +7 -0
- package/test/conformance/expected/strings/093_regex_named_captures_context.pl +5 -0
- package/test/conformance/expected/strings/atom_string_from_string.pl +1 -0
- package/test/conformance/expected/strings/casefold_atoms.pl +2 -0
- package/test/conformance/expected/strings/contains_empty_needle.pl +1 -0
- package/test/conformance/expected/strings/extra_atom_string_number_input.pl +1 -0
- package/test/conformance/expected/strings/extra_join_empty_list.pl +1 -0
- package/test/conformance/expected/strings/extra_join_iri_and_atom.pl +1 -0
- package/test/conformance/expected/strings/extra_lowercase_iri_atom.pl +1 -0
- package/test/conformance/expected/strings/extra_matches_invalid_pattern_fails.pl +0 -0
- package/test/conformance/expected/strings/extra_named_regex_optional_missing.pl +1 -0
- package/test/conformance/expected/strings/extra_number_string_atom_input.pl +1 -0
- package/test/conformance/expected/strings/extra_replace_multiple.pl +1 -0
- package/test/conformance/expected/strings/extra_split_empty_separator.pl +1 -0
- package/test/conformance/expected/strings/extra_substring_last_char.pl +1 -0
- package/test/conformance/expected/strings/extra_term_string_iri_list.pl +1 -0
- package/test/conformance/expected/strings/extra_uppercase_mixed_string.pl +1 -0
- package/test/conformance/expected/strings/join_mixed_scalars.pl +1 -0
- package/test/conformance/expected/strings/matches_simple_alternation.pl +1 -0
- package/test/conformance/expected/strings/named_regex_two_groups.pl +1 -0
- package/test/conformance/expected/strings/not_matches_simple_pattern.pl +1 -0
- package/test/conformance/expected/strings/number_string_from_string.pl +1 -0
- package/test/conformance/expected/strings/number_string_rejects_non_numeric.pl +1 -0
- package/test/conformance/expected/strings/replace_empty_search_no_change.pl +1 -0
- package/test/conformance/expected/strings/split_without_separator_match.pl +1 -0
- package/test/conformance/expected/strings/substring_out_of_range_fails.pl +1 -0
- package/test/conformance/expected/strings/substring_zero_count.pl +1 -0
- package/test/conformance/expected/strings/term_string_nested_term.pl +1 -0
- package/test/conformance/expected/strings/trim_tabs_and_spaces.pl +1 -0
- package/test/conformance/expected/syntax/004_conjunction_and_parentheses.pl +1 -0
- package/test/conformance/expected/syntax/006_comma_formula_data.pl +1 -0
- package/test/conformance/expected/syntax/009_comments_and_whitespace.pl +2 -0
- package/test/conformance/expected/syntax/019_parenthesized_three_conjuncts.pl +1 -0
- package/test/conformance/expected/syntax/025_body_parentheses_with_formula_data.pl +1 -0
- package/test/conformance/expected/syntax/comments_inside_program.pl +0 -0
- package/test/conformance/expected/syntax/extra_comments_after_terms.pl +0 -0
- package/test/conformance/expected/syntax/extra_nested_parenthesized_body.pl +1 -0
- package/test/conformance/expected/syntax/parenthesized_query_style_body.pl +1 -0
- package/test/conformance/expected/syntax/quoted_atom_with_newline_escape.pl +0 -0
- package/test/conformance/expected/syntax/string_with_tab_escape.pl +0 -0
- package/test/conformance/expected/table/038_table_declaration.pl +2 -0
- package/test/conformance/expected/table/102_table_declaration.pl +6 -0
- package/test/conformance/expected/table/extra_table_bound_cycle.pl +2 -0
- package/test/conformance/expected/table/extra_table_open_call_fallback.pl +2 -0
- package/test/conformance/expected/table/table_does_not_change_answers.pl +3 -0
- package/test/conformance/expected/table/tabled_left_recursion_path.pl +1 -0
- package/test/conformance/expected/terms/003_terms_and_readback.pl +13 -0
- package/test/conformance/expected/terms/065_reusable_term_control_builtins.pl +6 -0
- package/test/conformance/expected/terms/073_term_introspection_edges.pl +9 -0
- package/test/conformance/expected/terms/095_term_introspection_roundtrip.pl +6 -0
- package/test/conformance/expected/terms/096_functor_scalar_edges.pl +6 -0
- package/test/conformance/expected/terms/arg_first_and_second.pl +2 -0
- package/test/conformance/expected/terms/arg_zero_fails.pl +1 -0
- package/test/conformance/expected/terms/compound_name_arguments_atom_zero_args.pl +1 -0
- package/test/conformance/expected/terms/compound_name_arguments_bad_args_fail.pl +1 -0
- package/test/conformance/expected/terms/compound_name_arguments_builds_atom_from_empty_args.pl +1 -0
- package/test/conformance/expected/terms/compound_name_arguments_builds_compound.pl +1 -0
- package/test/conformance/expected/terms/compound_name_arguments_iri_name.pl +1 -0
- package/test/conformance/expected/terms/extra_arg_atom_fails.pl +0 -0
- package/test/conformance/expected/terms/extra_arg_first_last.pl +1 -0
- package/test/conformance/expected/terms/extra_arg_zero_fails.pl +0 -0
- package/test/conformance/expected/terms/extra_compound_name_arguments_bad_args_fails.pl +0 -0
- package/test/conformance/expected/terms/extra_compound_name_arguments_construct_atom_zero.pl +1 -0
- package/test/conformance/expected/terms/extra_compound_name_arguments_construct_iri.pl +1 -0
- package/test/conformance/expected/terms/extra_compound_name_arguments_decompose_list.pl +1 -0
- package/test/conformance/expected/terms/extra_functor_list_cons.pl +1 -0
- package/test/conformance/expected/terms/extra_functor_number_scalar.pl +1 -0
- package/test/conformance/expected/terms/extra_functor_string_scalar.pl +1 -0
- package/test/conformance/expected/terms/functor_atom_arity_zero.pl +1 -0
- package/test/conformance/expected/terms/functor_number_and_string.pl +2 -0
- package/test/conformance/expected/terms/herbrand_witness_different_inputs_distinct.pl +1 -0
- package/test/conformance/expected/terms/herbrand_witness_one_input.pl +2 -0
- package/test/conformance/expected/terms/herbrand_witness_same_inputs_same_term.pl +1 -0
- package/test/conformance/expected/terms/herbrand_witness_two_inputs.pl +2 -0
- package/test/conformance/expected/terms/term_string_readback_iri_list.pl +1 -0
- package/test/conformance/expected/unification/012_nested_compound_unification.pl +2 -0
- package/test/conformance/expected/unification/021_repeated_variable_head.pl +2 -0
- package/test/conformance/expected/unification/034_equality_and_inequality.pl +4 -0
- package/test/conformance/expected/unification/compound_arity_mismatch_fails.pl +1 -0
- package/test/conformance/expected/unification/extra_eq_iri_and_quoted_atom.pl +0 -0
- package/test/conformance/expected/unification/extra_eq_list_tail_binding.pl +1 -0
- package/test/conformance/expected/unification/extra_eq_nested_repeated_fails.pl +0 -0
- package/test/conformance/expected/unification/extra_eq_nested_repeated_success.pl +1 -0
- package/test/conformance/expected/unification/extra_eq_scalar_number_atom.pl +1 -0
- package/test/conformance/expected/unification/extra_eq_scalar_string_number.pl +1 -0
- package/test/conformance/expected/unification/extra_neq_compound_arity_mismatch.pl +1 -0
- package/test/conformance/expected/unification/extra_neq_scalar_same_lexical_fails.pl +0 -0
- package/test/conformance/expected/unification/extra_variable_clause_locality.pl +2 -0
- package/test/conformance/expected/unification/list_tail_binding.pl +1 -0
- package/test/conformance/expected/unification/nested_repeated_variable.pl +1 -0
- package/test/conformance/expected/unification/scalar_cross_type_same_lexical_value.pl +2 -0
- package/test/conformance/expected/variables/007_anonymous_variables.pl +1 -0
- package/test/conformance/expected/variables/010_variable_scope_and_reuse.pl +2 -0
- package/test/conformance/expected/variables/026_question_underscore_named_variable_reuse.pl +1 -0
- package/test/conformance/expected/variables/101_question_mark_variables.pl +3 -0
- package/test/conformance/expected/variables/anonymous_in_two_goals.pl +1 -0
- package/test/conformance/expected/variables/clause_local_variable_names.pl +2 -0
- package/test/conformance/expected/variables/extra_anonymous_not_reused.pl +1 -0
- package/test/conformance/expected/variables/extra_named_variable_reused.pl +1 -0
- package/test/conformance/expected/variables/extra_question_underscore_named_distinct.pl +1 -0
- package/test/conformance/expected/variables/extra_question_uppercase_named.pl +1 -0
- package/test/conformance/expected/variables/question_anonymous_not_reused.pl +4 -0
- package/test/conformance/expected/variables/question_underscore_named_reuse.pl +1 -0
- package/test/conformance/expected/variables/question_uppercase_variable.pl +1 -0
- package/test/conformance/expected/variables/question_variable_digits_and_underscore.pl +1 -0
- package/test/conformance/expected/variables/question_variable_uppercase_name.pl +1 -0
- package/test/conformance/expected/variables/variable_scope_per_clause.pl +2 -0
- package/test/conformance/expected-errors/atoms/extra_angle_iri_backslash_rejected.txt +1 -0
- package/test/conformance/expected-errors/atoms/extra_angle_iri_pipe_rejected.txt +1 -0
- package/test/conformance/expected-errors/atoms/extra_angle_iri_quote_rejected.txt +1 -0
- package/test/conformance/expected-errors/atoms/hash_comment_not_atom_at_line_start.txt +1 -0
- package/test/conformance/expected-errors/atoms/relative_angle_name_rejected.txt +1 -0
- package/test/conformance/expected-errors/atoms/space_in_angle_iri_rejected.txt +1 -0
- package/test/conformance/expected-errors/atoms/unclosed_angle_iri_rejected.txt +1 -0
- package/test/conformance/expected-errors/atoms/zero_arity_compound_rejected.txt +1 -0
- package/test/conformance/expected-errors/lists/extra_missing_tail_after_bar.txt +1 -0
- package/test/conformance/expected-errors/lists/extra_unclosed_list_tail.txt +1 -0
- package/test/conformance/expected-errors/lists/missing_list_tail.txt +1 -0
- package/test/conformance/expected-errors/rules/extra_empty_head_with_body.txt +1 -0
- package/test/conformance/expected-errors/rules/extra_rule_without_body.txt +1 -0
- package/test/conformance/expected-errors/rules/rule_head_cannot_be_empty_parentheses.txt +1 -0
- package/test/conformance/expected-errors/syntax/angle_iri_with_space_rejected.txt +1 -0
- package/test/conformance/expected-errors/syntax/bad_question_digit_variable.txt +1 -0
- package/test/conformance/expected-errors/syntax/bad_question_variable.txt +1 -0
- package/test/conformance/expected-errors/syntax/colon_name_rejected.txt +1 -0
- package/test/conformance/expected-errors/syntax/empty_body_after_rule_marker.txt +1 -0
- package/test/conformance/expected-errors/syntax/empty_compound_nested.txt +1 -0
- package/test/conformance/expected-errors/syntax/extra_bad_backtick_character.txt +1 -0
- package/test/conformance/expected-errors/syntax/extra_bad_iri_empty_body.txt +1 -0
- package/test/conformance/expected-errors/syntax/extra_bad_list_double_comma.txt +1 -0
- package/test/conformance/expected-errors/syntax/extra_bad_list_double_tail.txt +1 -0
- package/test/conformance/expected-errors/syntax/extra_bad_number_two_decimal_points.txt +1 -0
- package/test/conformance/expected-errors/syntax/extra_double_period_rejected.txt +1 -0
- package/test/conformance/expected-errors/syntax/extra_extra_closing_paren.txt +1 -0
- package/test/conformance/expected-errors/syntax/extra_missing_closing_rule_body.txt +1 -0
- package/test/conformance/expected-errors/syntax/extra_missing_head_rejected.txt +1 -0
- package/test/conformance/expected-errors/syntax/missing_final_dot_rejected.txt +1 -0
- package/test/conformance/expected-errors/syntax/missing_period.txt +1 -0
- package/test/conformance/expected-errors/syntax/relative_angle_iri_rejected.txt +1 -0
- package/test/conformance/expected-errors/syntax/trailing_comma_in_body.txt +1 -0
- package/test/conformance/expected-errors/syntax/unclosed_compound.txt +1 -0
- package/test/conformance/expected-errors/syntax/unclosed_list.txt +1 -0
- package/test/conformance/expected-errors/syntax/unclosed_list_rejected.txt +1 -0
- package/test/conformance/expected-errors/syntax/unclosed_quoted_atom.txt +1 -0
- package/test/conformance/expected-errors/syntax/unclosed_quoted_atom_rejected.txt +1 -0
- package/test/conformance/expected-errors/syntax/unclosed_string.txt +1 -0
- package/test/conformance/expected-errors/syntax/unquoted_colon_predicate.txt +1 -0
- package/test/conformance/expected-errors/syntax/unquoted_dotted_predicate.txt +1 -0
- package/test/conformance/expected-errors/syntax/uppercase_predicate_rejected.txt +1 -0
- package/test/conformance/expected-errors/terms/extra_empty_nested_compound.txt +1 -0
- package/test/conformance/expected-errors/terms/extra_empty_top_level_compound.txt +1 -0
- package/test/conformance/expected-errors/terms/zero_arity_compound_nested_rejected.txt +1 -0
- package/test/conformance/expected-errors/variables/bare_underscore_in_list_rejected.txt +1 -0
- package/test/conformance/expected-errors/variables/bare_underscore_name_in_compound_rejected.txt +1 -0
- package/test/conformance/expected-errors/variables/bare_underscore_rejected.txt +1 -0
- package/test/conformance/expected-errors/variables/extra_bare_underscore_in_rule_head.txt +1 -0
- package/test/conformance/expected-errors/variables/extra_question_dash_variable.txt +1 -0
- package/test/conformance/expected-errors/variables/extra_uppercase_in_list.txt +1 -0
- package/test/conformance/expected-errors/variables/question_digit_rejected.txt +1 -0
- package/test/conformance/expected-errors/variables/question_dot_rejected.txt +1 -0
- package/test/conformance/expected-errors/variables/underscore_named_rejected.txt +1 -0
- package/test/conformance/expected-errors/variables/uppercase_in_body_rejected.txt +1 -0
- package/test/conformance/expected-errors/variables/uppercase_variable_rejected.txt +1 -0
- package/test/conformance/expected-proofs/proofs/bindings_nested_term.pl +16 -0
- package/test/conformance/expected-proofs/proofs/builtin_numeric.pl +16 -0
- package/test/conformance/expected-proofs/proofs/conjunction_order.pl +19 -0
- package/test/conformance/expected-proofs/proofs/extra_aggregate_min.pl +16 -0
- package/test/conformance/expected-proofs/proofs/extra_compound_name_arguments.pl +16 -0
- package/test/conformance/expected-proofs/proofs/extra_eq_builtin.pl +16 -0
- package/test/conformance/expected-proofs/proofs/extra_findall_builtin.pl +16 -0
- package/test/conformance/expected-proofs/proofs/extra_forall_builtin.pl +15 -0
- package/test/conformance/expected-proofs/proofs/extra_holds_parts.pl +32 -0
- package/test/conformance/expected-proofs/proofs/extra_iri_join.pl +16 -0
- package/test/conformance/expected-proofs/proofs/extra_negation_success.pl +15 -0
- package/test/conformance/expected-proofs/proofs/extra_nested_list_binding.pl +16 -0
- package/test/conformance/expected-proofs/proofs/extra_once_member.pl +22 -0
- package/test/conformance/expected-proofs/proofs/extra_recursive_path.pl +59 -0
- package/test/conformance/expected-proofs/proofs/extra_table_path_bound.pl +57 -0
- package/test/conformance/expected-proofs/proofs/herbrand_witness.pl +16 -0
- package/test/conformance/expected-proofs/proofs/iri_atom.pl +16 -0
- package/test/conformance/expected-proofs/proofs/list_builtin.pl +20 -0
- package/test/conformance/expected-proofs/proofs/once_child.pl +22 -0
- package/test/conformance/expected-proofs/proofs/rule_fact.pl +16 -0
- package/test/conformance/expected-proofs/proofs/table_recursive.pl +59 -0
- package/test/conformance/expected-warnings/negation/extra_stratified_multiple_negations_quiet.pl +1 -0
- package/test/conformance/expected-warnings/negation/extra_stratified_multiple_negations_quiet.txt +0 -0
- package/test/conformance/expected-warnings/negation/extra_stratified_negation_with_table_quiet.pl +1 -0
- package/test/conformance/expected-warnings/negation/extra_stratified_negation_with_table_quiet.txt +0 -0
- package/test/conformance/expected-warnings/negation/extra_unstratified_indirect_self_with_fact.pl +0 -0
- package/test/conformance/expected-warnings/negation/extra_unstratified_indirect_self_with_fact.txt +2 -0
- package/test/conformance/expected-warnings/negation/extra_unstratified_positive_negative_loop.pl +0 -0
- package/test/conformance/expected-warnings/negation/extra_unstratified_positive_negative_loop.txt +2 -0
- package/test/conformance/expected-warnings/negation/extra_unstratified_three_cycle_all_negative.pl +0 -0
- package/test/conformance/expected-warnings/negation/extra_unstratified_three_cycle_all_negative.txt +4 -0
- package/test/conformance/expected-warnings/negation/extra_warning_preserves_empty_stdout.pl +0 -0
- package/test/conformance/expected-warnings/negation/extra_warning_preserves_empty_stdout.txt +3 -0
- package/test/conformance/expected-warnings/negation/negative_unknown_group_quiet.pl +1 -0
- package/test/conformance/expected-warnings/negation/negative_unknown_group_quiet.txt +0 -0
- package/test/conformance/expected-warnings/negation/no_negation_quiet.pl +1 -0
- package/test/conformance/expected-warnings/negation/no_negation_quiet.txt +0 -0
- package/test/conformance/expected-warnings/negation/stratified_negative_unknown_after_positive_quiet.pl +1 -0
- package/test/conformance/expected-warnings/negation/stratified_negative_unknown_after_positive_quiet.txt +0 -0
- package/test/conformance/expected-warnings/negation/stratified_quiet.pl +1 -0
- package/test/conformance/expected-warnings/negation/stratified_quiet.txt +0 -0
- package/test/conformance/expected-warnings/negation/stratified_two_level_quiet.pl +1 -0
- package/test/conformance/expected-warnings/negation/stratified_two_level_quiet.txt +0 -0
- package/test/conformance/expected-warnings/negation/unstratified_mutual.pl +0 -0
- package/test/conformance/expected-warnings/negation/unstratified_mutual.txt +3 -0
- package/test/conformance/expected-warnings/negation/unstratified_positive_prefix.pl +0 -0
- package/test/conformance/expected-warnings/negation/unstratified_positive_prefix.txt +2 -0
- package/test/conformance/expected-warnings/negation/unstratified_self.pl +0 -0
- package/test/conformance/expected-warnings/negation/unstratified_self.txt +2 -0
- package/test/conformance/expected-warnings/negation/unstratified_three_step.pl +1 -0
- package/test/conformance/expected-warnings/negation/unstratified_three_step.txt +2 -0
- package/test/conformance/expected-warnings/negation/unstratified_two_arity_cycle.pl +0 -0
- package/test/conformance/expected-warnings/negation/unstratified_two_arity_cycle.txt +3 -0
- package/test/conformance/expected-warnings/negation/unstratified_two_independent_cycles.pl +0 -0
- package/test/conformance/expected-warnings/negation/unstratified_two_independent_cycles.txt +5 -0
- package/test/conformance/expected-warnings/negation/unstratified_with_iri_predicates.pl +0 -0
- package/test/conformance/expected-warnings/negation/unstratified_with_iri_predicates.txt +3 -0
- package/test/conformance/expected-warnings/negation/warning_preserves_multiple_stdout_answers.pl +0 -0
- package/test/conformance/expected-warnings/negation/warning_preserves_multiple_stdout_answers.txt +3 -0
- package/test/conformance/proofs/proofs/bindings_nested_term.pl +4 -0
- package/test/conformance/proofs/proofs/builtin_numeric.pl +3 -0
- package/test/conformance/proofs/proofs/conjunction_order.pl +5 -0
- package/test/conformance/proofs/proofs/extra_aggregate_min.pl +4 -0
- package/test/conformance/proofs/proofs/extra_compound_name_arguments.pl +2 -0
- package/test/conformance/proofs/proofs/extra_eq_builtin.pl +2 -0
- package/test/conformance/proofs/proofs/extra_findall_builtin.pl +4 -0
- package/test/conformance/proofs/proofs/extra_forall_builtin.pl +2 -0
- package/test/conformance/proofs/proofs/extra_holds_parts.pl +2 -0
- package/test/conformance/proofs/proofs/extra_iri_join.pl +2 -0
- package/test/conformance/proofs/proofs/extra_negation_success.pl +3 -0
- package/test/conformance/proofs/proofs/extra_nested_list_binding.pl +2 -0
- package/test/conformance/proofs/proofs/extra_once_member.pl +2 -0
- package/test/conformance/proofs/proofs/extra_recursive_path.pl +5 -0
- package/test/conformance/proofs/proofs/extra_table_path_bound.pl +7 -0
- package/test/conformance/proofs/proofs/herbrand_witness.pl +3 -0
- package/test/conformance/proofs/proofs/iri_atom.pl +4 -0
- package/test/conformance/proofs/proofs/list_builtin.pl +3 -0
- package/test/conformance/proofs/proofs/once_child.pl +5 -0
- package/test/conformance/proofs/proofs/rule_fact.pl +4 -0
- package/test/conformance/proofs/proofs/table_recursive.pl +7 -0
- package/test/conformance/warnings/negation/extra_stratified_multiple_negations_quiet.pl +4 -0
- package/test/conformance/warnings/negation/extra_stratified_negation_with_table_quiet.pl +6 -0
- package/test/conformance/warnings/negation/extra_unstratified_indirect_self_with_fact.pl +5 -0
- package/test/conformance/warnings/negation/extra_unstratified_positive_negative_loop.pl +5 -0
- package/test/conformance/warnings/negation/extra_unstratified_three_cycle_all_negative.pl +5 -0
- package/test/conformance/warnings/negation/extra_warning_preserves_empty_stdout.pl +3 -0
- package/test/conformance/warnings/negation/negative_unknown_group_quiet.pl +2 -0
- package/test/conformance/warnings/negation/no_negation_quiet.pl +3 -0
- package/test/conformance/warnings/negation/stratified_negative_unknown_after_positive_quiet.pl +3 -0
- package/test/conformance/warnings/negation/stratified_quiet.pl +4 -0
- package/test/conformance/warnings/negation/stratified_two_level_quiet.pl +5 -0
- package/test/conformance/warnings/negation/unstratified_mutual.pl +5 -0
- package/test/conformance/warnings/negation/unstratified_positive_prefix.pl +5 -0
- package/test/conformance/warnings/negation/unstratified_self.pl +4 -0
- package/test/conformance/warnings/negation/unstratified_three_step.pl +6 -0
- package/test/conformance/warnings/negation/unstratified_two_arity_cycle.pl +4 -0
- package/test/conformance/warnings/negation/unstratified_two_independent_cycles.pl +6 -0
- package/test/conformance/warnings/negation/unstratified_with_iri_predicates.pl +4 -0
- package/test/conformance/warnings/negation/warning_preserves_multiple_stdout_answers.pl +5 -0
- package/test/run-all.mjs +20 -0
- package/test/run-conformance-report.mjs +120 -0
- package/test/run-conformance.mjs +189 -0
- package/test/run-examples.mjs +155 -0
- package/test/run-regression.mjs +1251 -0
- package/test/test-style.mjs +94 -0
|
@@ -0,0 +1,1251 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Supplemental regression runner.
|
|
3
|
+
// This file collects focused checks that do not belong to the public
|
|
4
|
+
// conformance corpus or the example-output corpus: CLI regressions, public API
|
|
5
|
+
// checks, and small white-box tests for maintenance-sensitive internals.
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
import os from 'node:os';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { spawnSync } from 'node:child_process';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import * as publicApi from '../src/index.js';
|
|
12
|
+
import {
|
|
13
|
+
run,
|
|
14
|
+
Program,
|
|
15
|
+
makeProgram,
|
|
16
|
+
Solver,
|
|
17
|
+
Env,
|
|
18
|
+
BuiltinRegistry,
|
|
19
|
+
createDefaultRegistry,
|
|
20
|
+
atom,
|
|
21
|
+
compound,
|
|
22
|
+
listFromItems,
|
|
23
|
+
numberTerm,
|
|
24
|
+
stringTerm,
|
|
25
|
+
variable,
|
|
26
|
+
copyResolved,
|
|
27
|
+
flattenConjunction,
|
|
28
|
+
properListItems,
|
|
29
|
+
termIsGround,
|
|
30
|
+
termToString,
|
|
31
|
+
unify,
|
|
32
|
+
variantTerms,
|
|
33
|
+
parseProgramText,
|
|
34
|
+
} from '../src/index.js';
|
|
35
|
+
import { parseGoalText } from '../src/parser.js';
|
|
36
|
+
import { selectClauseCandidates } from '../src/program.js';
|
|
37
|
+
import { TestReporter, isMainModule } from './test-style.mjs';
|
|
38
|
+
import { buildConformanceReport, formatConformanceReport } from './run-conformance-report.mjs';
|
|
39
|
+
import { hashHex } from '../src/hash.js';
|
|
40
|
+
|
|
41
|
+
const testRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)));
|
|
42
|
+
const packageRoot = path.resolve(testRoot, '..');
|
|
43
|
+
const runtimeRoot = path.join(packageRoot, 'src');
|
|
44
|
+
const bin = path.join(runtimeRoot, 'bin.js');
|
|
45
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
|
|
46
|
+
let tmp = null;
|
|
47
|
+
let tmpCounter = 0;
|
|
48
|
+
|
|
49
|
+
export function runRegression(reporter = new TestReporter()) {
|
|
50
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'seam-regression.'));
|
|
51
|
+
tmpCounter = 0;
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
runSection(reporter, 'Regression', regressionCases());
|
|
55
|
+
runSection(reporter, 'Documentation sync', documentationSyncCases());
|
|
56
|
+
runSection(reporter, 'API', apiCases());
|
|
57
|
+
runSection(reporter, 'White-box', whiteBoxCases());
|
|
58
|
+
} finally {
|
|
59
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
60
|
+
tmp = null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function regressionCases() {
|
|
65
|
+
return [
|
|
66
|
+
{
|
|
67
|
+
name: '--proof rule fact explanation output',
|
|
68
|
+
run: () => runWhy({
|
|
69
|
+
program: 'type(socrates, man).\ntype(X, mortal) :- type(X, man).\n',
|
|
70
|
+
goalText: 'type(socrates, mortal)',
|
|
71
|
+
expected: `type(socrates, mortal).
|
|
72
|
+
why(
|
|
73
|
+
type(socrates, mortal),
|
|
74
|
+
proof(
|
|
75
|
+
goal(type(socrates, mortal)),
|
|
76
|
+
by(rule("__FILE__", clause(2))),
|
|
77
|
+
bindings([binding("X", socrates)]),
|
|
78
|
+
uses([
|
|
79
|
+
proof(
|
|
80
|
+
goal(type(socrates, man)),
|
|
81
|
+
by(fact("__FILE__", clause(1)))
|
|
82
|
+
)
|
|
83
|
+
])
|
|
84
|
+
)
|
|
85
|
+
).
|
|
86
|
+
|
|
87
|
+
`,
|
|
88
|
+
}),
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: '--proof numeric builtin explanation output',
|
|
92
|
+
run: () => runWhy({
|
|
93
|
+
program: 'p(X) :- between(536, 536, X).\n',
|
|
94
|
+
goalText: 'p(536)',
|
|
95
|
+
expected: `p(536).
|
|
96
|
+
why(
|
|
97
|
+
p(536),
|
|
98
|
+
proof(
|
|
99
|
+
goal(p(536)),
|
|
100
|
+
by(rule("__FILE__", clause(1))),
|
|
101
|
+
bindings([binding("X", 536)]),
|
|
102
|
+
uses([
|
|
103
|
+
proof(
|
|
104
|
+
goal(between(536, 536, 536)),
|
|
105
|
+
by(builtin(between, 3))
|
|
106
|
+
)
|
|
107
|
+
])
|
|
108
|
+
)
|
|
109
|
+
).
|
|
110
|
+
|
|
111
|
+
`,
|
|
112
|
+
}),
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: '--proof list builtin explanation output',
|
|
116
|
+
run: () => runWhy({
|
|
117
|
+
program: 'p(X) :- member(X, [a]).\n',
|
|
118
|
+
goalText: 'p(a)',
|
|
119
|
+
expected: `p(a).
|
|
120
|
+
why(
|
|
121
|
+
p(a),
|
|
122
|
+
proof(
|
|
123
|
+
goal(p(a)),
|
|
124
|
+
by(rule("__FILE__", clause(1))),
|
|
125
|
+
bindings([binding("X", a)]),
|
|
126
|
+
uses([
|
|
127
|
+
proof(
|
|
128
|
+
goal(member(a, [a])),
|
|
129
|
+
by(builtin(member, 2))
|
|
130
|
+
)
|
|
131
|
+
])
|
|
132
|
+
)
|
|
133
|
+
).
|
|
134
|
+
|
|
135
|
+
`,
|
|
136
|
+
}),
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
name: 'explanation backtracks across earlier subgoal alternatives',
|
|
140
|
+
run: () => {
|
|
141
|
+
const result = runWhyLoose({
|
|
142
|
+
program: 'p(ok) :- q(X), r(X).\nq(a).\nq(b).\nr(b).\n',
|
|
143
|
+
goalText: 'p(ok)',
|
|
144
|
+
});
|
|
145
|
+
assertIncludes(result.stdout, 'goal(q(b)),\n by(fact("', 'stdout');
|
|
146
|
+
assertIncludes(result.stdout, 'goal(r(b)),\n by(fact("', 'stdout');
|
|
147
|
+
assertNotIncludes(result.stdout, 'no_proof', 'stdout');
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
name: 'explanation releases active call before caller rest goals',
|
|
152
|
+
run: () => {
|
|
153
|
+
const result = runWhyLoose({
|
|
154
|
+
program: 'p(ok) :- q(1), q(1).\nq(0).\nq(1) :- q(0).\n',
|
|
155
|
+
goalText: 'p(ok)',
|
|
156
|
+
});
|
|
157
|
+
assertIncludes(result.stdout, 'goal(p(ok)),\n by(rule("', 'stdout');
|
|
158
|
+
assertIncludes(result.stdout, 'goal(q(1)),\n by(rule("', 'stdout');
|
|
159
|
+
assertNotIncludes(result.stdout, 'no_proof', 'stdout');
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
name: 'SEAM_LOCAL_TIME fixes local_time builtin',
|
|
164
|
+
run: () => {
|
|
165
|
+
const result = runCli(['-'], {
|
|
166
|
+
input: 'materialize(local_time_answer, 1).\nlocal_time_answer(D) :- local_time(D).\n',
|
|
167
|
+
env: { SEAM_LOCAL_TIME: '2024-01-02' },
|
|
168
|
+
});
|
|
169
|
+
assertEqual(result.status, 0, 'exit status');
|
|
170
|
+
assertEqual(result.stdout, 'local_time_answer("2024-01-02").\n', 'stdout');
|
|
171
|
+
assertEqual(result.stderr, '', 'stderr');
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: 'help with no arguments',
|
|
176
|
+
run: () => {
|
|
177
|
+
const result = runCli([]);
|
|
178
|
+
assertEqual(result.status, 0, 'exit status');
|
|
179
|
+
assertIncludes(result.stdout, 'Usage:\n seam [options] [file-or-url.pl|- ...]', 'stdout');
|
|
180
|
+
assertIncludes(result.stdout, '-p, --proof', 'stdout');
|
|
181
|
+
assertIncludes(result.stdout, '-s, --stats', 'stdout');
|
|
182
|
+
assertIncludes(result.stdout, '-v, --version', 'stdout');
|
|
183
|
+
assertIncludes(result.stdout, '-w, --warnings', 'stdout');
|
|
184
|
+
assertIncludes(result.stdout, '-v, --version Show the package version and exit.\n -w, --warnings Print non-fatal portability warnings to stderr.', 'stdout');
|
|
185
|
+
assertIncludes(result.stdout, 'Read a Seam program', 'stdout');
|
|
186
|
+
assertEqual(result.stderr, '', 'stderr');
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
name: 'version comes from package.json',
|
|
191
|
+
run: () => {
|
|
192
|
+
const result = runCli(['--version']);
|
|
193
|
+
assertEqual(result.status, 0, 'exit status');
|
|
194
|
+
assertEqual(result.stdout, `seam ${pkg.version}\n`, 'stdout');
|
|
195
|
+
assertEqual(result.stderr, '', 'stderr');
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
name: '-v shows package version',
|
|
200
|
+
run: () => {
|
|
201
|
+
const result = runCli(['-v']);
|
|
202
|
+
assertEqual(result.status, 0, 'exit status');
|
|
203
|
+
assertEqual(result.stdout, `seam ${pkg.version}\n`, 'stdout');
|
|
204
|
+
assertEqual(result.stderr, '', 'stderr');
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
name: 'npm exec can run package CLI bin from checkout',
|
|
209
|
+
run: () => {
|
|
210
|
+
const result = spawnSync('npm', ['exec', '--', 'seam', '--version'], {
|
|
211
|
+
cwd: packageRoot,
|
|
212
|
+
encoding: 'utf8',
|
|
213
|
+
env: { ...process.env, npm_config_update_notifier: 'false' },
|
|
214
|
+
});
|
|
215
|
+
assertEqual(result.status, 0, 'exit status');
|
|
216
|
+
assertEqual(result.stdout, `seam ${pkg.version}\n`, 'stdout');
|
|
217
|
+
assertEqual(result.stderr, '', 'stderr');
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
name: 'stdin input is accepted',
|
|
222
|
+
run: () => {
|
|
223
|
+
const result = runCli(['-'], { input: 'p(a, b).\nq(X, Y) :- p(X, Y).\n' });
|
|
224
|
+
assertEqual(result.status, 0, 'exit status');
|
|
225
|
+
assertEqual(result.stdout, 'q(a, b).\n', 'stdout');
|
|
226
|
+
assertEqual(result.stderr, '', 'stderr');
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
|
|
230
|
+
{
|
|
231
|
+
name: '--proof enables materialization explanations',
|
|
232
|
+
run: () => {
|
|
233
|
+
const result = runCli(['--proof', '-'], { input: 'p(a, b).\nq(X, Y) :- p(X, Y).\n' });
|
|
234
|
+
assertEqual(result.status, 0, 'exit status');
|
|
235
|
+
assertIncludes(result.stdout, 'q(a, b).\nwhy(', 'stdout');
|
|
236
|
+
assertEqual(result.stderr, '', 'stderr');
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
name: '-p enables materialization explanations',
|
|
241
|
+
run: () => {
|
|
242
|
+
const result = runCli(['-p', '-'], { input: 'p(a, b).\nq(X, Y) :- p(X, Y).\n' });
|
|
243
|
+
assertEqual(result.status, 0, 'exit status');
|
|
244
|
+
assertIncludes(result.stdout, 'q(a, b).\nwhy(', 'stdout');
|
|
245
|
+
assertEqual(result.stderr, '', 'stderr');
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
{
|
|
251
|
+
name: '--stats prints solver statistics to stderr',
|
|
252
|
+
run: () => {
|
|
253
|
+
const result = runCli(['--stats', '-'], { input: 'p(a, b).\nq(X, Y) :- p(X, Y).\n' });
|
|
254
|
+
assertEqual(result.status, 0, 'exit status');
|
|
255
|
+
assertEqual(result.stdout, 'q(a, b).\n', 'stdout');
|
|
256
|
+
assertIncludes(result.stderr, 'seam stats:\n', 'stderr');
|
|
257
|
+
assertIncludes(result.stderr, ' solve_goals_calls:', 'stderr');
|
|
258
|
+
},
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
name: '-s prints solver statistics to stderr',
|
|
262
|
+
run: () => {
|
|
263
|
+
const result = runCli(['-s', '-'], { input: 'p(a, b).\nq(X, Y) :- p(X, Y).\n' });
|
|
264
|
+
assertEqual(result.status, 0, 'exit status');
|
|
265
|
+
assertEqual(result.stdout, 'q(a, b).\n', 'stdout');
|
|
266
|
+
assertIncludes(result.stderr, 'seam stats:\n', 'stderr');
|
|
267
|
+
assertIncludes(result.stderr, ' solve_goals_calls:', 'stderr');
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
name: '--warnings prints unstratified negation diagnostics without failing',
|
|
272
|
+
run: () => {
|
|
273
|
+
const input = [
|
|
274
|
+
'materialize(answer, 1).',
|
|
275
|
+
'p(a) :- not(q(a)).',
|
|
276
|
+
'q(a) :- not(p(a)).',
|
|
277
|
+
'answer(ok).',
|
|
278
|
+
'',
|
|
279
|
+
].join('\n');
|
|
280
|
+
const result = runCli(['--warnings', '-'], { input });
|
|
281
|
+
assertEqual(result.status, 0, 'exit status');
|
|
282
|
+
assertEqual(result.stdout, '', 'stdout');
|
|
283
|
+
assertIncludes(result.stderr, 'seam warning: unstratified negation\n', 'stderr');
|
|
284
|
+
assertIncludes(result.stderr, 'p/1 depends negatively on q/1', 'stderr');
|
|
285
|
+
assertIncludes(result.stderr, 'q/1 depends negatively on p/1', 'stderr');
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
name: '-w prints unstratified negation diagnostics without failing',
|
|
290
|
+
run: () => {
|
|
291
|
+
const input = [
|
|
292
|
+
'materialize(answer, 1).',
|
|
293
|
+
'p(a) :- not(q(a)).',
|
|
294
|
+
'q(a) :- not(p(a)).',
|
|
295
|
+
'answer(ok).',
|
|
296
|
+
'',
|
|
297
|
+
].join('\n');
|
|
298
|
+
const result = runCli(['-w', '-'], { input });
|
|
299
|
+
assertEqual(result.status, 0, 'exit status');
|
|
300
|
+
assertEqual(result.stdout, '', 'stdout');
|
|
301
|
+
assertIncludes(result.stderr, 'seam warning: unstratified negation\n', 'stderr');
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
name: '--warnings stays quiet for stratified negation',
|
|
306
|
+
run: () => {
|
|
307
|
+
const input = 'materialize(answer, 1).\np(a).\nanswer(ok) :- not(q(a)).\n';
|
|
308
|
+
const result = runCli(['--warnings', '-'], { input });
|
|
309
|
+
assertEqual(result.status, 0, 'exit status');
|
|
310
|
+
assertEqual(result.stdout, 'answer(ok).\n', 'stdout');
|
|
311
|
+
assertEqual(result.stderr, '', 'stderr');
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
name: 'double dash permits option-shaped file names',
|
|
316
|
+
run: () => {
|
|
317
|
+
const file = path.join(tmp, '-h');
|
|
318
|
+
fs.writeFileSync(file, 'p(a, b).\nq(X, Y) :- p(X, Y).\n');
|
|
319
|
+
const result = runCli(['--', file]);
|
|
320
|
+
assertEqual(result.status, 0, 'exit status');
|
|
321
|
+
assertEqual(result.stdout, 'q(a, b).\n', 'stdout');
|
|
322
|
+
assertEqual(result.stderr, '', 'stderr');
|
|
323
|
+
},
|
|
324
|
+
},
|
|
325
|
+
];
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
function documentationSyncCases() {
|
|
330
|
+
return [
|
|
331
|
+
{
|
|
332
|
+
name: 'language reference builtins match runtime registry',
|
|
333
|
+
run: () => assertArrayEqual(languageReferenceBuiltinNames(), registeredBuiltinNames(), 'builtins'),
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
name: 'guide builtin catalog matches runtime registry',
|
|
337
|
+
run: () => {
|
|
338
|
+
assertArrayEqual(guideBuiltinNames(), registeredBuiltinNames(), 'builtins');
|
|
339
|
+
const summary = guideBuiltinSummary();
|
|
340
|
+
const actual = registeredBuiltinSummary();
|
|
341
|
+
assertEqual(summary.entries, actual.entries, 'builtin entry count');
|
|
342
|
+
assertEqual(summary.names, actual.names, 'builtin predicate name count');
|
|
343
|
+
},
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
name: 'guide example catalog source and output links match examples directory',
|
|
347
|
+
run: () => assertArrayEqual(guideExampleCatalogIssues(), [], 'guide example catalog'),
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
name: 'playground example catalog and relative loaders match examples directory',
|
|
351
|
+
run: () => assertArrayEqual(playgroundExampleIssues(), [], 'playground examples'),
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
name: 'playground static page is browser-ready and packaged',
|
|
355
|
+
run: () => assertArrayEqual(playgroundStaticIssues(), [], 'playground static page'),
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
name: 'documentation local links and anchors resolve',
|
|
359
|
+
run: () => assertArrayEqual(findBrokenDocLinks(), [], 'broken documentation links'),
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
name: 'documentation uses seam source style',
|
|
363
|
+
run: () => assertArrayEqual(documentationSourceStyleIssues(), [], 'documentation source style'),
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
name: 'documented npm scripts exist in package.json',
|
|
367
|
+
run: () => assertArrayEqual(missingDocumentedPackageScripts(), [], 'missing documented npm scripts'),
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
name: 'conformance report summarizes public corpus',
|
|
371
|
+
run: () => {
|
|
372
|
+
const report = buildConformanceReport();
|
|
373
|
+
assertArrayEqual(report.issues, [], 'conformance report issues');
|
|
374
|
+
assertEqual(report.total.total >= 400, true, 'conformance case count');
|
|
375
|
+
assertEqual(report.total.positive + report.total.errors + report.total.warnings + report.total.proofs, report.total.total, 'conformance total');
|
|
376
|
+
assertEqual(report.rows.some((row) => row.category === 'legacy-numbered'), false, 'legacy-numbered category');
|
|
377
|
+
const text = formatConformanceReport(report);
|
|
378
|
+
assertIncludes(text, '| variables |', 'report');
|
|
379
|
+
assertIncludes(text, '| Proofs |', 'report');
|
|
380
|
+
assertIncludes(text, '| **Total** |', 'report');
|
|
381
|
+
},
|
|
382
|
+
},
|
|
383
|
+
|
|
384
|
+
{
|
|
385
|
+
name: 'committed conformance report is current',
|
|
386
|
+
run: () => {
|
|
387
|
+
const reportFile = path.join(packageRoot, 'conformance-report.md');
|
|
388
|
+
assertEqual(fs.existsSync(reportFile), true, 'conformance-report.md exists');
|
|
389
|
+
assertEqual(fs.readFileSync(reportFile, 'utf8'), formatConformanceReport(buildConformanceReport()), 'conformance-report.md');
|
|
390
|
+
},
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
name: 'source-checkout setup docs match package bin',
|
|
394
|
+
run: () => {
|
|
395
|
+
assertEqual(pkg.bin?.seam, './bin/seam.js', 'package seam bin');
|
|
396
|
+
const binPath = path.join(packageRoot, pkg.bin.seam);
|
|
397
|
+
const binText = fs.readFileSync(binPath, 'utf8');
|
|
398
|
+
assertEqual(binText.startsWith('#!/usr/bin/env node\n'), true, 'bin shebang');
|
|
399
|
+
assertArrayEqual(misleadingDependencyInstallDocs(), [], 'misleading dependency install docs');
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
];
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
function apiCases() {
|
|
406
|
+
return [
|
|
407
|
+
{
|
|
408
|
+
name: 'public type declarations match runtime exports',
|
|
409
|
+
run: () => assertArrayEqual(declaredValueExportNames(), runtimeExportNames(), 'public value exports'),
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
name: 'run materialization through public API without proof by default',
|
|
413
|
+
run: () => {
|
|
414
|
+
const result = run('p(a, b).\nq(X, Y) :- p(X, Y).\n');
|
|
415
|
+
assertEqual(result.stdout, 'q(a, b).\n', 'stdout');
|
|
416
|
+
},
|
|
417
|
+
},
|
|
418
|
+
|
|
419
|
+
{
|
|
420
|
+
name: 'compound factory canonicalizes zero arity to atoms',
|
|
421
|
+
run: () => {
|
|
422
|
+
const nil = compound('nil', []);
|
|
423
|
+
assertEqual(nil.type, 'atom', 'type');
|
|
424
|
+
assertEqual(nil.name, 'nil', 'name');
|
|
425
|
+
assertEqual(nil.arity, 0, 'arity');
|
|
426
|
+
assertEqual(termToString(nil, new Env(), true), 'nil', 'readback');
|
|
427
|
+
assertEqual(unify(nil, atom('nil'), new Env()), true, 'unifies with atom');
|
|
428
|
+
},
|
|
429
|
+
},
|
|
430
|
+
|
|
431
|
+
{
|
|
432
|
+
name: 'portable hash helpers match standard vectors',
|
|
433
|
+
run: () => {
|
|
434
|
+
assertEqual(hashHex('md5', 'abc'), '900150983cd24fb0d6963f7d28e17f72', 'md5');
|
|
435
|
+
assertEqual(hashHex('sha', 'abc'), 'a9993e364706816aba3e25717850c26c9cd0d89d', 'sha1');
|
|
436
|
+
assertEqual(hashHex('sha256', 'abc'), 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad', 'sha256');
|
|
437
|
+
assertEqual(hashHex('sha512', 'abc'), 'ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f', 'sha512');
|
|
438
|
+
},
|
|
439
|
+
},
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
{
|
|
443
|
+
name: 'run materialization can enable proof explanations',
|
|
444
|
+
run: () => {
|
|
445
|
+
const result = run('p(a, b).\nq(X, Y) :- p(X, Y).\n', { proof: true });
|
|
446
|
+
assertIncludes(result.stdout, 'q(a, b).\nwhy(', 'stdout');
|
|
447
|
+
},
|
|
448
|
+
},
|
|
449
|
+
|
|
450
|
+
{
|
|
451
|
+
name: 'run accepts Program instances',
|
|
452
|
+
run: () => {
|
|
453
|
+
const program = Program.parse('p(a, b).\nq(X, Y) :- p(X, Y).\n');
|
|
454
|
+
const result = run(program);
|
|
455
|
+
assertEqual(result.stdout, 'q(a, b).\n', 'stdout');
|
|
456
|
+
},
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
name: 'run keeps recursive materializations independent in one solver',
|
|
460
|
+
run: () => {
|
|
461
|
+
const text = fs.readFileSync(path.join(packageRoot, 'examples', 'alignment-demo.pl'), 'utf8');
|
|
462
|
+
const program = Program.parseSources([{ text, filename: 'alignment-demo.pl' }]);
|
|
463
|
+
const result = run(program);
|
|
464
|
+
assertIncludes(result.stdout, 'broaderTransitive(anpr_passenger_car, ref_car).\n', 'stdout');
|
|
465
|
+
assertIncludes(result.stdout, 'narrowerOrEqualOf(anpr_passenger_car, ref_car).\n', 'stdout');
|
|
466
|
+
},
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
name: 'makeProgram creates indexed programs',
|
|
470
|
+
run: () => {
|
|
471
|
+
const program = makeProgram('edge(a, b).\npath(X, Y) :- edge(X, Y).\n');
|
|
472
|
+
const group = program.findGroup('path', 2);
|
|
473
|
+
assertEqual(Boolean(group), true, 'path/2 group exists');
|
|
474
|
+
assertEqual(group.groupName ?? group.name, 'path', 'group name');
|
|
475
|
+
assertEqual(group.arity, 2, 'group arity');
|
|
476
|
+
},
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
name: 'program keeps negation diagnostics lazy by default',
|
|
480
|
+
run: () => {
|
|
481
|
+
const program = Program.parse('p(a).\nq(X) :- not(p(X)).\n');
|
|
482
|
+
assertEqual(program._negationAnalysis, null, 'analysis starts lazy');
|
|
483
|
+
assertEqual(program.negationDependencies.length, 1, 'dependency count');
|
|
484
|
+
assertEqual(program._negationAnalysis !== null, true, 'analysis computed on demand');
|
|
485
|
+
},
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
name: 'analyzeNegation option computes diagnostics eagerly',
|
|
489
|
+
run: () => {
|
|
490
|
+
const program = Program.parse('p(a).\nq(X) :- not(p(X)).\n', { analyzeNegation: true });
|
|
491
|
+
assertEqual(program._negationAnalysis !== null, true, 'analysis computed eagerly');
|
|
492
|
+
assertEqual(program.stratifiedNegation, true, 'stratified negation');
|
|
493
|
+
},
|
|
494
|
+
},
|
|
495
|
+
{
|
|
496
|
+
name: 'program reports stratified negation metadata',
|
|
497
|
+
run: () => {
|
|
498
|
+
const program = Program.parse(`
|
|
499
|
+
materialize(open, 1).
|
|
500
|
+
candidate(a).
|
|
501
|
+
blocked(b).
|
|
502
|
+
closed(X) :- blocked(X).
|
|
503
|
+
open(X) :- candidate(X), not(closed(X)).
|
|
504
|
+
`);
|
|
505
|
+
assertEqual(program.isStratifiedNegation(), true, 'stratified negation');
|
|
506
|
+
assertEqual(program.negationStratificationErrors.length, 0, 'stratification errors');
|
|
507
|
+
assertEqual(program.findGroup('closed', 1).negationStratum, 0, 'closed stratum');
|
|
508
|
+
assertEqual(program.findGroup('open', 1).negationStratum, 1, 'open stratum');
|
|
509
|
+
},
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
name: 'program detects unstratified negation cycles',
|
|
513
|
+
run: () => {
|
|
514
|
+
const program = Program.parse('p(X) :- q(X).\nq(X) :- not(p(X)).\n');
|
|
515
|
+
assertEqual(program.isStratifiedNegation(), false, 'unstratified negation');
|
|
516
|
+
assertEqual(program.negationStratificationErrors.length, 1, 'stratification error count');
|
|
517
|
+
assertEqual(program.negationStratificationErrors[0].from, 'q/1', 'error source');
|
|
518
|
+
assertEqual(program.negationStratificationErrors[0].to, 'p/1', 'error target');
|
|
519
|
+
let threw = false;
|
|
520
|
+
try { program.assertStratifiedNegation(); } catch (err) {
|
|
521
|
+
threw = true;
|
|
522
|
+
assertIncludes(err.message, 'unstratified negation', 'error message');
|
|
523
|
+
}
|
|
524
|
+
assertEqual(threw, true, 'assertion throws');
|
|
525
|
+
},
|
|
526
|
+
},
|
|
527
|
+
{
|
|
528
|
+
name: 'strictNegation option rejects unstratified programs',
|
|
529
|
+
run: () => {
|
|
530
|
+
let threw = false;
|
|
531
|
+
try { Program.parse('p(X) :- not(p(X)).\n', { strictNegation: true }); } catch (err) {
|
|
532
|
+
threw = true;
|
|
533
|
+
assertIncludes(err.message, 'p/1 depends negatively on p/1', 'error message');
|
|
534
|
+
}
|
|
535
|
+
assertEqual(threw, true, 'strict negation throws');
|
|
536
|
+
},
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
name: 'program and solver public classes',
|
|
540
|
+
run: () => {
|
|
541
|
+
const program = Program.parse('p(a).\np(b).\n');
|
|
542
|
+
const solver = new Solver(program);
|
|
543
|
+
const goal = parseGoalText('p(X)');
|
|
544
|
+
const answers = [...solver.solve([goal], new Env(), 0)].map((env) => termToString(goal, env, true));
|
|
545
|
+
assertEqual(answers.join('\n'), 'p(a)\np(b)', 'answers');
|
|
546
|
+
},
|
|
547
|
+
},
|
|
548
|
+
{
|
|
549
|
+
name: 'solver honors solution limits',
|
|
550
|
+
run: () => {
|
|
551
|
+
const program = Program.parse('p(a).\np(b).\np(c).\n');
|
|
552
|
+
const solver = new Solver(program, { solutionLimit: 2 });
|
|
553
|
+
const goal = parseGoalText('p(X)');
|
|
554
|
+
const answers = [...solver.solve([goal], new Env(), 0)].map((env) => termToString(goal, env, true));
|
|
555
|
+
assertEqual(answers.join('\n'), 'p(a)\np(b)', 'answers');
|
|
556
|
+
},
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
name: 'custom builtin registry can be embedded',
|
|
560
|
+
run: () => {
|
|
561
|
+
const registry = new BuiltinRegistry();
|
|
562
|
+
registry.add('hello', 1, function* ({ goal, env }) {
|
|
563
|
+
const next = env.clone();
|
|
564
|
+
if (unify(goal.args[0], atom('world'), next)) yield next;
|
|
565
|
+
});
|
|
566
|
+
const program = Program.parse('answer(X) :- hello(X).\n');
|
|
567
|
+
const solver = new Solver(program, { registry });
|
|
568
|
+
const goal = parseGoalText('answer(X)');
|
|
569
|
+
const answers = [...solver.solve([goal], new Env(), 0)].map((env) => termToString(goal, env, true));
|
|
570
|
+
assertEqual(answers.join('\n'), 'answer(world)', 'answers');
|
|
571
|
+
},
|
|
572
|
+
},
|
|
573
|
+
{
|
|
574
|
+
name: 'default builtin registry exposes expected metadata',
|
|
575
|
+
run: () => {
|
|
576
|
+
const registry = createDefaultRegistry();
|
|
577
|
+
const between = registry.get('between', 3);
|
|
578
|
+
const append = registry.get('append', 3);
|
|
579
|
+
assertEqual(Boolean(between), true, 'between/3 exists');
|
|
580
|
+
assertEqual(Boolean(append), true, 'append/3 exists');
|
|
581
|
+
assertEqual(between.name, 'between', 'between name');
|
|
582
|
+
assertEqual(append.arity, 3, 'append arity');
|
|
583
|
+
},
|
|
584
|
+
},
|
|
585
|
+
];
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
function whiteBoxCases() {
|
|
589
|
+
return [
|
|
590
|
+
{
|
|
591
|
+
name: 'unification binds variables in Env',
|
|
592
|
+
run: () => {
|
|
593
|
+
const env = new Env();
|
|
594
|
+
assertEqual(unify(variable('X'), atom('socrates'), env), true, 'unify result');
|
|
595
|
+
assertEqual(termToString(variable('X'), env, true), 'socrates', 'binding');
|
|
596
|
+
},
|
|
597
|
+
},
|
|
598
|
+
{
|
|
599
|
+
name: 'copyResolved and termIsGround follow bindings',
|
|
600
|
+
run: () => {
|
|
601
|
+
const env = new Env();
|
|
602
|
+
const term = compound('p', [variable('X'), atom('b')]);
|
|
603
|
+
assertEqual(termIsGround(term, env), false, 'not ground before binding');
|
|
604
|
+
assertEqual(unify(variable('X'), atom('a'), env), true, 'bind X');
|
|
605
|
+
const resolved = copyResolved(term, env);
|
|
606
|
+
assertEqual(termToString(resolved, new Env(), true), 'p(a, b)', 'resolved term');
|
|
607
|
+
assertEqual(termIsGround(resolved), true, 'ground after copy');
|
|
608
|
+
},
|
|
609
|
+
},
|
|
610
|
+
|
|
611
|
+
{
|
|
612
|
+
name: 'parser rejects non-Prolog unquoted atom spelling',
|
|
613
|
+
run: () => {
|
|
614
|
+
let threw = false;
|
|
615
|
+
try { parseProgramText('value(a-b, ok).\n'); } catch (_) { threw = true; }
|
|
616
|
+
assertEqual(threw, true, 'a-b must be quoted');
|
|
617
|
+
},
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
name: 'parser rejects zero-arity compound syntax',
|
|
621
|
+
run: () => {
|
|
622
|
+
let threw = false;
|
|
623
|
+
try { parseProgramText('value(nil(), ok).\n'); } catch (_) { threw = true; }
|
|
624
|
+
assertEqual(threw, true, 'zero-arity compound rejection');
|
|
625
|
+
},
|
|
626
|
+
},
|
|
627
|
+
{
|
|
628
|
+
name: 'parser preserves list syntax readback',
|
|
629
|
+
run: () => {
|
|
630
|
+
const goal = parseGoalText('member(X, [a, b])');
|
|
631
|
+
assertEqual(termToString(goal, new Env(), true), 'member(X, [a, b])', 'goal');
|
|
632
|
+
},
|
|
633
|
+
},
|
|
634
|
+
{
|
|
635
|
+
name: 'parser accepts ISO-style uppercase variables',
|
|
636
|
+
run: () => {
|
|
637
|
+
const goal = parseGoalText('member(X, [a, b])');
|
|
638
|
+
assertEqual(termToString(goal, new Env(), true), 'member(X, [a, b])', 'goal');
|
|
639
|
+
},
|
|
640
|
+
},
|
|
641
|
+
{
|
|
642
|
+
name: 'parser treats bare underscore as anonymous',
|
|
643
|
+
run: () => {
|
|
644
|
+
const clauses = parseProgramText('p(_, _).\n');
|
|
645
|
+
const left = clauses[0].head.args[0].name;
|
|
646
|
+
const right = clauses[0].head.args[1].name;
|
|
647
|
+
assertEqual(left.startsWith('__anon'), true, 'left anonymous');
|
|
648
|
+
assertEqual(right.startsWith('__anon'), true, 'right anonymous');
|
|
649
|
+
assertEqual(left === right, false, 'fresh anonymous variables');
|
|
650
|
+
},
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
name: 'parser rejects old question-mark variable spelling',
|
|
654
|
+
run: () => {
|
|
655
|
+
let threw = false;
|
|
656
|
+
try { parseProgramText('p(?x).\n'); } catch (_) { threw = true; }
|
|
657
|
+
assertEqual(threw, true, 'question-mark variable syntax rejected');
|
|
658
|
+
},
|
|
659
|
+
},
|
|
660
|
+
{
|
|
661
|
+
name: 'parser accepts bare underscore anonymous variable spelling',
|
|
662
|
+
run: () => {
|
|
663
|
+
let threw = false;
|
|
664
|
+
try { parseProgramText('p(_).\n'); } catch (_) { threw = true; }
|
|
665
|
+
assertEqual(threw, false, 'bare underscore syntax accepted');
|
|
666
|
+
},
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
name: 'parser rejects unquoted dotted atoms to stay ISO-compatible',
|
|
670
|
+
run: () => {
|
|
671
|
+
let threw = false;
|
|
672
|
+
try { parseProgramText('p(web(be.ugent, josd)).\n'); } catch (_) { threw = true; }
|
|
673
|
+
assertEqual(threw, true, 'unquoted dotted atoms must be quoted');
|
|
674
|
+
},
|
|
675
|
+
},
|
|
676
|
+
{
|
|
677
|
+
name: 'parser preserves quoted dotted atoms for web-style terms',
|
|
678
|
+
run: () => {
|
|
679
|
+
const clauses = parseProgramText("p(web('be.ugent', josd), 'org.schema').\n");
|
|
680
|
+
assertEqual(termToString(clauses[0].head, new Env(), true), "p(web('be.ugent', josd), 'org.schema')", 'head');
|
|
681
|
+
},
|
|
682
|
+
},
|
|
683
|
+
{
|
|
684
|
+
name: 'parser accepts quoted angle-bracket atoms',
|
|
685
|
+
run: () => {
|
|
686
|
+
const clauses = parseProgramText("p('<https://example.org/alice>', '<urn:example:bob>').\n");
|
|
687
|
+
assertEqual(termToString(clauses[0].head, new Env(), true), "p('<https://example.org/alice>', '<urn:example:bob>')", 'head');
|
|
688
|
+
},
|
|
689
|
+
},
|
|
690
|
+
{
|
|
691
|
+
name: 'readback leaves absolute IRI atoms as quoted atoms',
|
|
692
|
+
run: () => {
|
|
693
|
+
const clauses = parseProgramText("p('https://example.org/alice').\n");
|
|
694
|
+
assertEqual(termToString(clauses[0].head, new Env(), true), "p('https://example.org/alice')", 'head');
|
|
695
|
+
},
|
|
696
|
+
},
|
|
697
|
+
{
|
|
698
|
+
name: 'angle IRI syntax does not steal graphic atom syntax',
|
|
699
|
+
run: () => {
|
|
700
|
+
const clauses = parseProgramText('p(<=>).\n');
|
|
701
|
+
assertEqual(termToString(clauses[0].head, new Env(), true), 'p(<=>)', 'head');
|
|
702
|
+
},
|
|
703
|
+
},
|
|
704
|
+
{
|
|
705
|
+
name: 'list construction round-trips through properListItems',
|
|
706
|
+
run: () => {
|
|
707
|
+
const list = listFromItems([atom('a'), numberTerm(2), stringTerm('c')]);
|
|
708
|
+
const items = properListItems(list, new Env());
|
|
709
|
+
assertEqual(items.length, 3, 'length');
|
|
710
|
+
assertEqual(termToString(list, new Env(), true), '[a, 2, "c"]', 'list text');
|
|
711
|
+
},
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
name: 'variantTerms recognizes alpha-equivalent goals',
|
|
715
|
+
run: () => {
|
|
716
|
+
const left = parseGoalText('edge(X, Y)');
|
|
717
|
+
const right = parseGoalText('edge(A, B)');
|
|
718
|
+
const nonVariant = parseGoalText('edge(A, A)');
|
|
719
|
+
assertEqual(variantTerms(left, new Env(), right, new Env()), true, 'variant');
|
|
720
|
+
assertEqual(variantTerms(left, new Env(), nonVariant, new Env()), false, 'non-variant');
|
|
721
|
+
},
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
name: 'flattenConjunction preserves left-to-right order',
|
|
725
|
+
run: () => {
|
|
726
|
+
const goal = parseGoalText('(a, b, c)');
|
|
727
|
+
const parts = flattenConjunction(goal).map((part) => termToString(part, new Env(), true));
|
|
728
|
+
assertEqual(parts.join(' | '), 'a | b | c', 'order');
|
|
729
|
+
},
|
|
730
|
+
},
|
|
731
|
+
{
|
|
732
|
+
name: 'parseProgramText returns clause objects',
|
|
733
|
+
run: () => {
|
|
734
|
+
const clauses = parseProgramText('p(a).\nq(X) :- p(X).\n');
|
|
735
|
+
assertEqual(clauses.length, 2, 'clause count');
|
|
736
|
+
assertEqual(termToString(clauses[1].head, new Env(), true), 'q(X)', 'rule head');
|
|
737
|
+
assertEqual(clauses[1].body.length, 1, 'body length');
|
|
738
|
+
},
|
|
739
|
+
},
|
|
740
|
+
{
|
|
741
|
+
name: 'clause candidate selection uses scalar indexes with fallback',
|
|
742
|
+
run: () => {
|
|
743
|
+
const program = Program.parse('edge(a, b).\nedge(c, d).\nedge(X, z).\n');
|
|
744
|
+
const group = program.findGroup('edge', 2);
|
|
745
|
+
const goal = parseGoalText('edge(a, Y)');
|
|
746
|
+
const candidates = selectClauseCandidates(group, goal, new Env());
|
|
747
|
+
assertEqual(candidates.primary.length, 1, 'primary bucket length');
|
|
748
|
+
assertEqual(candidates.fallback.length, 1, 'fallback length');
|
|
749
|
+
assertEqual(termToString(candidates.primary[0].head, new Env(), true), 'edge(a, b)', 'primary head');
|
|
750
|
+
},
|
|
751
|
+
},
|
|
752
|
+
{
|
|
753
|
+
name: 'table declaration marks predicate group tabled',
|
|
754
|
+
run: () => {
|
|
755
|
+
const program = Program.parse('table(path, 2).\nedge(a, b).\npath(X, Y) :- edge(X, Y).\n');
|
|
756
|
+
const group = program.findGroup('path', 2);
|
|
757
|
+
assertEqual(Boolean(group), true, 'path/2 group exists');
|
|
758
|
+
assertEqual(group.tabled, true, 'path/2 tabled through table/2');
|
|
759
|
+
},
|
|
760
|
+
},
|
|
761
|
+
{
|
|
762
|
+
name: 'memoize fact does not table predicates',
|
|
763
|
+
run: () => {
|
|
764
|
+
const program = Program.parse('memoize(path, 2).\nedge(a, b).\npath(X, Y) :- edge(X, Y).\n');
|
|
765
|
+
const group = program.findGroup('path', 2);
|
|
766
|
+
assertEqual(Boolean(group), true, 'path/2 group exists');
|
|
767
|
+
assertEqual(group.tabled, false, 'memoize/2 is not a table declaration');
|
|
768
|
+
},
|
|
769
|
+
},
|
|
770
|
+
{
|
|
771
|
+
name: 'mode and determinism declarations annotate predicate groups',
|
|
772
|
+
run: () => {
|
|
773
|
+
const program = Program.parse('mode(path, 2, [in, out]).\ndet(path, 2).\nedge(a, b).\npath(X, Y) :- edge(X, Y).\n');
|
|
774
|
+
const group = program.findGroup('path', 2);
|
|
775
|
+
assertEqual(Boolean(group), true, 'path/2 group exists');
|
|
776
|
+
assertEqual(group.mode.join(','), 'in,out', 'path/2 mode');
|
|
777
|
+
assertEqual(group.determinism, 'det', 'path/2 determinism');
|
|
778
|
+
},
|
|
779
|
+
},
|
|
780
|
+
{
|
|
781
|
+
name: 'semidet declaration annotates predicate groups',
|
|
782
|
+
run: () => {
|
|
783
|
+
const program = Program.parse('semidet(edge, 2).\nedge(a, b).\n');
|
|
784
|
+
const group = program.findGroup('edge', 2);
|
|
785
|
+
assertEqual(Boolean(group), true, 'edge/2 group exists');
|
|
786
|
+
assertEqual(group.determinism, 'semidet', 'edge/2 determinism');
|
|
787
|
+
},
|
|
788
|
+
},
|
|
789
|
+
{
|
|
790
|
+
name: 'challenging examples keep dynamic-programming predicates tabled',
|
|
791
|
+
run: () => {
|
|
792
|
+
const checks = [
|
|
793
|
+
['binomial-vandermonde.pl', 'choose_step', 5, true],
|
|
794
|
+
['catalan-convolution.pl', 'catalan', 2, false],
|
|
795
|
+
['chart-parser.pl', 'span', 4, true],
|
|
796
|
+
['continued-fraction-sqrt2.pl', 'conv', 3, true],
|
|
797
|
+
['critical-path-schedule.pl', 'earliest_start', 2, false],
|
|
798
|
+
['critical-path-schedule.pl', 'finish_time', 2, false],
|
|
799
|
+
['integer-partitions.pl', 'partitions', 3, true],
|
|
800
|
+
['matrix-chain-order.pl', 'cost', 3, false],
|
|
801
|
+
['modular-exponentiation.pl', 'pow_mod', 4, true],
|
|
802
|
+
['pell-equation.pl', 'pell', 3, true],
|
|
803
|
+
['stirling-bell-numbers.pl', 'stirling2', 3, false],
|
|
804
|
+
['totient-summatory.pl', 'gcd', 3, true],
|
|
805
|
+
['totient-summatory.pl', 'totient', 2, false],
|
|
806
|
+
['weighted-interval-scheduling.pl', 'best_from', 2, true],
|
|
807
|
+
];
|
|
808
|
+
for (const [filename, name, arity, recursive] of checks) {
|
|
809
|
+
const text = fs.readFileSync(path.join(packageRoot, 'examples', filename), 'utf8');
|
|
810
|
+
const program = Program.parseSources([{ text, filename }]);
|
|
811
|
+
const group = program.findGroup(name, arity);
|
|
812
|
+
assertEqual(Boolean(group), true, `${filename} ${name}/${arity} group exists`);
|
|
813
|
+
assertEqual(group.tabled, true, `${filename} ${name}/${arity} tabled`);
|
|
814
|
+
assertEqual(group.recursive, recursive, `${filename} ${name}/${arity} recursive`);
|
|
815
|
+
}
|
|
816
|
+
},
|
|
817
|
+
},
|
|
818
|
+
{
|
|
819
|
+
name: 'n-queens example keeps diagonal checks tabled',
|
|
820
|
+
run: () => {
|
|
821
|
+
const text = fs.readFileSync(path.join(packageRoot, 'examples', 'n-queens-8.pl'), 'utf8');
|
|
822
|
+
const program = Program.parseSources([{ text, filename: 'n-queens-8.pl' }]);
|
|
823
|
+
const group = program.findGroup('no_diagonal_attack', 3);
|
|
824
|
+
assertEqual(Boolean(group), true, 'no_diagonal_attack/3 group exists');
|
|
825
|
+
assertEqual(group.tabled, true, 'no_diagonal_attack/3 tabled');
|
|
826
|
+
assertEqual(group.recursive, true, 'no_diagonal_attack/3 recursive');
|
|
827
|
+
},
|
|
828
|
+
},
|
|
829
|
+
{
|
|
830
|
+
name: 'collatz example keeps recursive trajectory predicate tabled',
|
|
831
|
+
run: () => {
|
|
832
|
+
const text = fs.readFileSync(path.join(packageRoot, 'examples', 'collatz-1000.pl'), 'utf8');
|
|
833
|
+
const program = Program.parseSources([{ text, filename: 'collatz-1000.pl' }]);
|
|
834
|
+
const group = program.findGroup('collatz', 2);
|
|
835
|
+
assertEqual(Boolean(group), true, 'collatz/2 group exists');
|
|
836
|
+
assertEqual(group.tabled, true, 'collatz/2 tabled');
|
|
837
|
+
assertEqual(group.recursive, true, 'collatz/2 recursive');
|
|
838
|
+
},
|
|
839
|
+
},
|
|
840
|
+
{
|
|
841
|
+
name: 'collatz example remains stack-safe for browser-sized stacks',
|
|
842
|
+
run: () => {
|
|
843
|
+
// Use a deliberately tiny stack to catch browser-worker recursion regressions.
|
|
844
|
+
const result = spawnSync(process.execPath, ['--stack-size=100', bin, 'examples/collatz-1000.pl'], {
|
|
845
|
+
cwd: packageRoot,
|
|
846
|
+
encoding: 'utf8',
|
|
847
|
+
});
|
|
848
|
+
assertEqual(result.status, 0, `exit status${result.stderr ? `\nstderr: ${result.stderr}` : ''}`);
|
|
849
|
+
assertEqual(result.stderr, '', 'stderr');
|
|
850
|
+
assertIncludes(result.stdout, 'collatzTrajectory(1000, [1000, 500, 250, 125', 'stdout');
|
|
851
|
+
assertIncludes(result.stdout, 'collatzTrajectory(1, [1]).\n', 'stdout');
|
|
852
|
+
},
|
|
853
|
+
},
|
|
854
|
+
];
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
function runSection(reporter, name, cases) {
|
|
858
|
+
reporter.section(name);
|
|
859
|
+
for (const testCase of cases) reporter.test(testCase.name, testCase.run);
|
|
860
|
+
reporter.sectionTotal(sectionLabel(name));
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
function sectionLabel(name) {
|
|
864
|
+
if (name === 'Documentation sync') return 'documentation sync';
|
|
865
|
+
if (name === 'API') return 'API';
|
|
866
|
+
if (name === 'White-box') return 'white-box';
|
|
867
|
+
return name.toLowerCase();
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
function runWhy({ program, goalText, expected }) {
|
|
871
|
+
const programFile = path.join(tmp, `${++tmpCounter}.pl`);
|
|
872
|
+
fs.writeFileSync(programFile, program);
|
|
873
|
+
const goal = parseGoalText(goalText);
|
|
874
|
+
fs.appendFileSync(programFile, `\nmaterialize(${goal.name}, ${goal.arity}).\n`);
|
|
875
|
+
const result = runCli(['--proof', programFile]);
|
|
876
|
+
assertEqual(result.status, 0, 'exit status');
|
|
877
|
+
assertEqual(result.stderr, '', 'stderr');
|
|
878
|
+
const expectedText = expected.replaceAll('__FILE__', path.basename(programFile));
|
|
879
|
+
assertEqual(result.stdout, expectedText, 'stdout');
|
|
880
|
+
|
|
881
|
+
Program.parse(result.stdout);
|
|
882
|
+
assertIncludes(result.stdout, ' proof(\n', 'stdout');
|
|
883
|
+
assertIncludes(result.stdout, ' by(rule("', 'stdout');
|
|
884
|
+
assertIncludes(result.stdout, ', clause(', 'stdout');
|
|
885
|
+
assertNotIncludes(result.stdout, 'source(head(', 'stdout');
|
|
886
|
+
assertIncludes(result.stdout, '\n).\n\n', 'stdout');
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
function runWhyLoose({ program, goalText }) {
|
|
890
|
+
const programFile = path.join(tmp, `${++tmpCounter}.pl`);
|
|
891
|
+
fs.writeFileSync(programFile, program);
|
|
892
|
+
const goal = parseGoalText(goalText);
|
|
893
|
+
fs.appendFileSync(programFile, `\nmaterialize(${goal.name}, ${goal.arity}).\n`);
|
|
894
|
+
const result = runCli(['--proof', programFile]);
|
|
895
|
+
assertEqual(result.status, 0, 'exit status');
|
|
896
|
+
assertEqual(result.stderr, '', 'stderr');
|
|
897
|
+
Program.parse(result.stdout);
|
|
898
|
+
assertIncludes(result.stdout, '\n).\n\n', 'stdout');
|
|
899
|
+
return result;
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
function listExampleNames() {
|
|
903
|
+
return fs.readdirSync(path.join(packageRoot, 'examples'))
|
|
904
|
+
.filter((name) => name.endsWith('.pl'))
|
|
905
|
+
.map((name) => name.slice(0, -3))
|
|
906
|
+
.sort();
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
function guideExampleCatalogIssues() {
|
|
910
|
+
const issues = [];
|
|
911
|
+
const expected = listExampleNames();
|
|
912
|
+
const guide = fs.readFileSync(path.join(packageRoot, 'docs', 'guide.md'), 'utf8');
|
|
913
|
+
const section = between(guide, '## Example catalog', '## Golden outputs, tests, and conformance');
|
|
914
|
+
const rows = [...section.matchAll(/^\| \[`([A-Za-z0-9_-]+)\.pl`\]\(\.\.\/examples\/\1\.pl\) \|[^|]+\| \[`output\/\1\.pl`\]\(\.\.\/examples\/output\/\1\.pl\) \|$/gm)]
|
|
915
|
+
.map((match) => match[1]);
|
|
916
|
+
const sourceNames = [...section.matchAll(/\.\.\/examples\/([A-Za-z0-9_-]+)\.pl/g)].map((match) => match[1]).sort();
|
|
917
|
+
const outputNames = [...section.matchAll(/\.\.\/examples\/output\/([A-Za-z0-9_-]+)\.pl/g)].map((match) => match[1]).sort();
|
|
918
|
+
if (rows.length !== expected.length) issues.push(`expected ${expected.length} complete example rows, found ${rows.length}`);
|
|
919
|
+
issues.push(...arrayDiffMessages(rows.sort(), expected, 'complete example rows'));
|
|
920
|
+
issues.push(...arrayDiffMessages(sourceNames, expected, 'source links'));
|
|
921
|
+
issues.push(...arrayDiffMessages(outputNames, expected, 'output links'));
|
|
922
|
+
for (const name of expected) {
|
|
923
|
+
const outputPath = path.join(packageRoot, 'examples', 'output', `${name}.pl`);
|
|
924
|
+
if (!fs.existsSync(outputPath)) issues.push(`missing examples/output/${name}.pl`);
|
|
925
|
+
}
|
|
926
|
+
return issues.sort();
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
function playgroundExampleIssues() {
|
|
930
|
+
const issues = [];
|
|
931
|
+
const expected = listExampleNames();
|
|
932
|
+
const html = fs.readFileSync(path.join(packageRoot, 'playground.html'), 'utf8');
|
|
933
|
+
const match = html.match(/const EXAMPLES = (\[[\s\S]*?\]);/);
|
|
934
|
+
if (match == null) return ['playground EXAMPLES array not found'];
|
|
935
|
+
const examples = JSON.parse(match[1]).sort();
|
|
936
|
+
issues.push(...arrayDiffMessages(examples, expected, 'playground EXAMPLES'));
|
|
937
|
+
if (!html.includes('new URL(`./examples/${name}.pl`, location.href)')) {
|
|
938
|
+
issues.push('playground must load selected examples from relative ./examples/*.pl URLs');
|
|
939
|
+
}
|
|
940
|
+
if (!html.includes("fetch(exampleUrl, { cache: 'no-store' })")) {
|
|
941
|
+
issues.push('playground must fetch selected example source from its relative URL');
|
|
942
|
+
}
|
|
943
|
+
return issues.sort();
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
function playgroundStaticIssues() {
|
|
947
|
+
const issues = [];
|
|
948
|
+
const playgroundPath = path.join(packageRoot, 'playground.html');
|
|
949
|
+
const html = fs.readFileSync(playgroundPath, 'utf8');
|
|
950
|
+
const readme = fs.readFileSync(path.join(packageRoot, 'README.md'), 'utf8');
|
|
951
|
+
if (!pkg.files?.includes('playground.html')) issues.push('package files must include playground.html');
|
|
952
|
+
if (!readme.includes('[Playground](https://eyereasoner.github.io/seam/playground)')) issues.push('README must link to the GitHub Pages playground URL');
|
|
953
|
+
if (!html.includes('<meta name="viewport" content="width=device-width, initial-scale=1">')) issues.push('missing mobile viewport meta');
|
|
954
|
+
if (!html.includes('main {') || !html.includes('display: block;')) {
|
|
955
|
+
issues.push('playground must use a simple vertical layout');
|
|
956
|
+
}
|
|
957
|
+
if (!html.includes('@media (max-width: 560px)') || !html.includes('button,') || !html.includes('width: 100%')) {
|
|
958
|
+
issues.push('playground must make controls usable at phone widths');
|
|
959
|
+
}
|
|
960
|
+
if (!html.includes('<summary id="advanced-heading">⚙ Advanced configuration</summary>')) {
|
|
961
|
+
issues.push('playground must keep URL/proof controls inside advanced configuration');
|
|
962
|
+
}
|
|
963
|
+
if (!html.includes('id="load-background"') || !html.includes('backgroundSource') || !html.includes('combinedSource()')) {
|
|
964
|
+
issues.push('playground must support loading URL content as background knowledge');
|
|
965
|
+
}
|
|
966
|
+
if (!html.includes('HIGHLIGHT_LIMIT') || !html.includes('text.length > HIGHLIGHT_LIMIT')) {
|
|
967
|
+
issues.push('playground must avoid full syntax coloring for very large examples');
|
|
968
|
+
}
|
|
969
|
+
if (!html.includes('<script type="module">')) issues.push('playground script must be an ES module');
|
|
970
|
+
if (!html.includes("new URL('./src/index.js', location.href)")) issues.push('playground must import the public browser API');
|
|
971
|
+
if (!html.includes('class="editor"') || !html.includes('id="highlight"') || !html.includes('id="source"')) {
|
|
972
|
+
issues.push('playground must include layered syntax-colored editor');
|
|
973
|
+
}
|
|
974
|
+
if (!html.includes('--editor-bg: #ffffff') || !html.includes('background: var(--editor-bg)')) {
|
|
975
|
+
issues.push('playground editor must use a light editor background');
|
|
976
|
+
}
|
|
977
|
+
if (!html.includes('id="error-line-marker"') || !html.includes('extractParseErrorLine') || !html.includes('markSyntaxErrorLine') || !html.includes('--editor-error-line')) {
|
|
978
|
+
issues.push('playground must highlight syntax-error lines in the editor');
|
|
979
|
+
}
|
|
980
|
+
if (!html.includes('id="line-numbers"') || !html.includes('updateLineNumbers') || !html.includes('lineNumbersInner.style.transform') || !html.includes('--line-number-bg')) {
|
|
981
|
+
issues.push('playground editor must include synced line numbers');
|
|
982
|
+
}
|
|
983
|
+
if (!html.includes('MAX_SHARE_URL_LENGTH') || !html.includes('buildReferenceShareLink') || !html.includes("params.set('example'") || !html.includes("params.set('url'")) {
|
|
984
|
+
issues.push('playground share links must avoid embedding large example or URL-loaded sources');
|
|
985
|
+
}
|
|
986
|
+
if (!html.includes('id="create-gist"') || !html.includes('createGistShare') || !html.includes('GIST_STATE_FILENAME') || !html.includes("fetch('https://api.github.com/gists'")) {
|
|
987
|
+
issues.push('playground must support Gist-backed sharing for large programs');
|
|
988
|
+
}
|
|
989
|
+
if (!html.includes('await createGistShare({') || html.includes('Use “Create Gist share” instead')) {
|
|
990
|
+
issues.push('playground Copy share link must automatically fall back to Gist sharing for large programs');
|
|
991
|
+
}
|
|
992
|
+
if (!html.includes("params.has('state-url')") || !html.includes('#state-url=')) {
|
|
993
|
+
issues.push('playground must restore state from raw Gist state URLs');
|
|
994
|
+
}
|
|
995
|
+
if (!html.includes('id="example-search"') || !html.includes('id="examples"')) issues.push('playground must include searchable examples');
|
|
996
|
+
const scriptMatch = html.match(new RegExp('<script type="module">\\n([\\s\\S]*?)\\n <\\/script>'));
|
|
997
|
+
if (scriptMatch == null) {
|
|
998
|
+
issues.push('module script not found');
|
|
999
|
+
} else {
|
|
1000
|
+
const scriptFile = path.join(tmp, 'playground-script.mjs');
|
|
1001
|
+
fs.writeFileSync(scriptFile, scriptMatch[1]);
|
|
1002
|
+
const result = spawnSync(process.execPath, ['--check', scriptFile], { encoding: 'utf8' });
|
|
1003
|
+
if (result.status !== 0) issues.push(`playground module syntax check failed: ${result.stderr.trim()}`);
|
|
1004
|
+
}
|
|
1005
|
+
return issues.sort();
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
function registeredBuiltinNames() {
|
|
1009
|
+
return [...createDefaultRegistry().defs.keys()].sort();
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
function registeredBuiltinSummary() {
|
|
1013
|
+
const names = registeredBuiltinNames();
|
|
1014
|
+
return {
|
|
1015
|
+
entries: names.length,
|
|
1016
|
+
names: new Set(names.map((name) => name.split('/')[0])).size,
|
|
1017
|
+
};
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
function guideBuiltinNames() {
|
|
1021
|
+
const guide = fs.readFileSync(path.join(packageRoot, 'docs', 'guide.md'), 'utf8');
|
|
1022
|
+
return documentedBuiltinNames(between(guide, '### Builtins', '## Aggregation helpers'));
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
function guideBuiltinSummary() {
|
|
1026
|
+
const guide = fs.readFileSync(path.join(packageRoot, 'docs', 'guide.md'), 'utf8');
|
|
1027
|
+
const section = between(guide, '### Builtins', '## Aggregation helpers');
|
|
1028
|
+
const match = section.match(/currently registers (\d+) name\/arity entries across (\d+) predicate names/);
|
|
1029
|
+
if (match == null) throw new Error('guide builtin summary not found');
|
|
1030
|
+
return { entries: Number(match[1]), names: Number(match[2]) };
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
function languageReferenceBuiltinNames() {
|
|
1034
|
+
const reference = fs.readFileSync(path.join(packageRoot, 'docs', 'language-reference.md'), 'utf8');
|
|
1035
|
+
return documentedBuiltinNames(between(reference, '## 9. Standard built-in predicates', '## 10. Implementation-specific built-ins'));
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
function documentedBuiltinNames(section) {
|
|
1039
|
+
const names = [];
|
|
1040
|
+
for (const line of section.split('\n')) {
|
|
1041
|
+
if (!line.trim().startsWith('|') || !line.includes('`')) continue;
|
|
1042
|
+
for (const match of line.matchAll(/`([A-Za-z_][A-Za-z0-9_]*)\(([^`)]*)\)`/g)) {
|
|
1043
|
+
const arity = match[2].trim() === '' ? 0 : match[2].split(',').length;
|
|
1044
|
+
names.push(`${match[1]}/${arity}`);
|
|
1045
|
+
}
|
|
1046
|
+
for (const match of line.matchAll(/`([A-Za-z_][A-Za-z0-9_]*)\/(\d+)`/g)) {
|
|
1047
|
+
names.push(`${match[1]}/${match[2]}`);
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
return [...new Set(names)].sort();
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
function runtimeExportNames() {
|
|
1054
|
+
return Object.keys(publicApi).sort();
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
function declaredValueExportNames() {
|
|
1058
|
+
const dts = fs.readFileSync(path.join(packageRoot, 'index.d.ts'), 'utf8');
|
|
1059
|
+
return [...dts.matchAll(/^export\s+(?:declare\s+)?(?:class|function|const)\s+([A-Za-z_][A-Za-z0-9_]*)/gm)]
|
|
1060
|
+
.map((match) => match[1])
|
|
1061
|
+
.filter((name, index, names) => names.indexOf(name) === index)
|
|
1062
|
+
.sort();
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
function missingDocumentedPackageScripts() {
|
|
1066
|
+
const docs = documentationFiles();
|
|
1067
|
+
const missing = [];
|
|
1068
|
+
const nativeCommands = new Set(['exec', 'install', 'link']);
|
|
1069
|
+
for (const file of docs) {
|
|
1070
|
+
const text = fs.readFileSync(file, 'utf8');
|
|
1071
|
+
for (const line of text.split('\n')) {
|
|
1072
|
+
const trimmed = line.trim();
|
|
1073
|
+
const commandTexts = [];
|
|
1074
|
+
if (trimmed.startsWith('npm ')) commandTexts.push(trimmed);
|
|
1075
|
+
for (const match of line.matchAll(/`([^`]*\bnpm\s+[^`]*)`/g)) commandTexts.push(match[1].trim());
|
|
1076
|
+
for (const commandText of commandTexts) {
|
|
1077
|
+
const match = commandText.match(/^npm\s+(?:run\s+)?([A-Za-z0-9:_-]+)/);
|
|
1078
|
+
if (match == null) continue;
|
|
1079
|
+
const command = match[1];
|
|
1080
|
+
if (nativeCommands.has(command)) continue;
|
|
1081
|
+
const script = command === 'test' ? 'test' : command;
|
|
1082
|
+
if (!pkg.scripts?.[script]) missing.push(`${path.relative(packageRoot, file)}: npm ${command === 'test' ? 'test' : `run ${script}`}`);
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
return [...new Set(missing)].sort();
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
function misleadingDependencyInstallDocs() {
|
|
1090
|
+
const misleading = [];
|
|
1091
|
+
for (const file of documentationFiles()) {
|
|
1092
|
+
const text = fs.readFileSync(file, 'utf8');
|
|
1093
|
+
if (text.includes('Install dependencies')) misleading.push(`${path.relative(packageRoot, file)}: Install dependencies`);
|
|
1094
|
+
if (text.includes('npm install\n```') || text.includes('npm install\r\n```')) {
|
|
1095
|
+
misleading.push(`${path.relative(packageRoot, file)}: bare npm install setup block`);
|
|
1096
|
+
}
|
|
1097
|
+
}
|
|
1098
|
+
return [...new Set(misleading)].sort();
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
function documentationSourceStyleIssues() {
|
|
1102
|
+
const issues = [];
|
|
1103
|
+
const docsRoot = path.join(packageRoot, 'docs');
|
|
1104
|
+
const docs = [
|
|
1105
|
+
path.join(docsRoot, 'guide.md'),
|
|
1106
|
+
path.join(docsRoot, 'language-reference.md'),
|
|
1107
|
+
];
|
|
1108
|
+
for (const file of docs) {
|
|
1109
|
+
const text = fs.readFileSync(file, 'utf8');
|
|
1110
|
+
if (text.includes('```prolog')) {
|
|
1111
|
+
issues.push(`${path.relative(packageRoot, file)}: use seam code fences instead of prolog fences`);
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
const reference = fs.readFileSync(path.join(docsRoot, 'language-reference.md'), 'utf8');
|
|
1116
|
+
const builtins = between(reference, '## 9. Standard built-in predicates', '## 10. Implementation-specific built-ins');
|
|
1117
|
+
const staleQuestionVariables = /`[^`]*\?[A-Za-z_][A-Za-z0-9_]*[^`]*`|`[^`]*\?(?=[,.)\] |])[^`]*`/;
|
|
1118
|
+
for (const [index, line] of builtins.split('\n').entries()) {
|
|
1119
|
+
if (!line.trim().startsWith('|')) continue;
|
|
1120
|
+
if (line.includes('SEAM_LOCAL_TIME=')) continue;
|
|
1121
|
+
if (staleQuestionVariables.test(line)) {
|
|
1122
|
+
issues.push(`docs/language-reference.md section 9 line ${index + 1}: stale question-mark variable in built-in description: ${line.trim()}`);
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
return issues.sort();
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
function findBrokenDocLinks() {
|
|
1129
|
+
const broken = [];
|
|
1130
|
+
const anchorsByFile = new Map();
|
|
1131
|
+
for (const file of documentationFiles()) {
|
|
1132
|
+
const text = fs.readFileSync(file, 'utf8');
|
|
1133
|
+
for (const target of markdownLinkTargets(text)) {
|
|
1134
|
+
if (/^(?:https?:|mailto:)/i.test(target)) continue;
|
|
1135
|
+
const [targetPathRaw, fragmentRaw] = target.split('#');
|
|
1136
|
+
const targetPath = targetPathRaw === '' ? file : path.resolve(path.dirname(file), decodeURI(targetPathRaw));
|
|
1137
|
+
const display = `${path.relative(packageRoot, file)} -> ${target}`;
|
|
1138
|
+
if (!fs.existsSync(targetPath)) {
|
|
1139
|
+
broken.push(`${display} (missing target)`);
|
|
1140
|
+
continue;
|
|
1141
|
+
}
|
|
1142
|
+
if (fragmentRaw != null && fragmentRaw !== '') {
|
|
1143
|
+
const anchors = anchorsByFile.get(targetPath) ?? markdownAnchors(targetPath);
|
|
1144
|
+
anchorsByFile.set(targetPath, anchors);
|
|
1145
|
+
if (!anchors.has(fragmentRaw)) broken.push(`${display} (missing heading #${fragmentRaw})`);
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
return broken.sort();
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
function documentationFiles() {
|
|
1153
|
+
return [
|
|
1154
|
+
path.join(packageRoot, 'README.md'),
|
|
1155
|
+
path.join(packageRoot, 'docs', 'guide.md'),
|
|
1156
|
+
path.join(packageRoot, 'docs', 'language-reference.md'),
|
|
1157
|
+
];
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
function markdownLinkTargets(text) {
|
|
1161
|
+
return [...text.matchAll(/!?\[[^\]\n]*\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g)].map((match) => match[1]);
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
function markdownAnchors(file) {
|
|
1165
|
+
if (!file.endsWith('.md')) return new Set();
|
|
1166
|
+
const text = fs.readFileSync(file, 'utf8');
|
|
1167
|
+
const anchors = new Set();
|
|
1168
|
+
const counts = new Map();
|
|
1169
|
+
for (const match of text.matchAll(/^#{1,6}\s+(.+)$/gm)) {
|
|
1170
|
+
const base = githubSlug(match[1]);
|
|
1171
|
+
const count = counts.get(base) ?? 0;
|
|
1172
|
+
counts.set(base, count + 1);
|
|
1173
|
+
anchors.add(count === 0 ? base : `${base}-${count}`);
|
|
1174
|
+
}
|
|
1175
|
+
return anchors;
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
function githubSlug(heading) {
|
|
1179
|
+
return heading
|
|
1180
|
+
.replace(/`([^`]*)`/g, '$1')
|
|
1181
|
+
.replace(/<[^>]+>/g, '')
|
|
1182
|
+
.trim()
|
|
1183
|
+
.toLowerCase()
|
|
1184
|
+
.replace(/[^\p{Letter}\p{Number}\s-]/gu, '')
|
|
1185
|
+
.trim()
|
|
1186
|
+
.replace(/\s+/g, '-');
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
function between(text, startMarker, endMarker) {
|
|
1190
|
+
const start = text.indexOf(startMarker);
|
|
1191
|
+
if (start === -1) throw new Error(`${startMarker} not found`);
|
|
1192
|
+
const contentStart = start + startMarker.length;
|
|
1193
|
+
const end = text.indexOf(endMarker, contentStart);
|
|
1194
|
+
if (end === -1) throw new Error(`${endMarker} not found`);
|
|
1195
|
+
return text.slice(contentStart, end);
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
function runCli(args, options = {}) {
|
|
1199
|
+
return spawnSync(process.execPath, [bin, ...args], {
|
|
1200
|
+
cwd: packageRoot,
|
|
1201
|
+
encoding: 'utf8',
|
|
1202
|
+
env: options.env ? { ...process.env, ...options.env } : process.env,
|
|
1203
|
+
input: options.input ?? undefined,
|
|
1204
|
+
});
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
function assertEqual(actual, expected, label) {
|
|
1208
|
+
if (actual !== expected) throw new Error(`${label} mismatch\nexpected: ${format(expected)}\nactual: ${format(actual)}`);
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
function assertIncludes(actual, expected, label) {
|
|
1212
|
+
if (!actual.includes(expected)) throw new Error(`${label} did not include ${format(expected)}\nactual: ${format(actual)}`);
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
function assertNotIncludes(actual, expected, label) {
|
|
1216
|
+
if (String(actual).includes(expected)) throw new Error(`${label} unexpectedly included ${format(expected)}\nactual: ${format(actual)}`);
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
function arrayDiffMessages(actual, expected, label) {
|
|
1220
|
+
const messages = [];
|
|
1221
|
+
const actualSet = new Set(actual);
|
|
1222
|
+
const expectedSet = new Set(expected);
|
|
1223
|
+
for (const item of expected) if (!actualSet.has(item)) messages.push(`${label} missing ${item}`);
|
|
1224
|
+
for (const item of actual) if (!expectedSet.has(item)) messages.push(`${label} has unexpected ${item}`);
|
|
1225
|
+
if (new Set(actual).size !== actual.length) messages.push(`${label} has duplicate entries`);
|
|
1226
|
+
return messages;
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
function assertArrayEqual(actual, expected, label) {
|
|
1230
|
+
const actualText = actual.join('\n');
|
|
1231
|
+
const expectedText = expected.join('\n');
|
|
1232
|
+
if (actualText !== expectedText) {
|
|
1233
|
+
const onlyActual = actual.filter((item) => !expected.includes(item));
|
|
1234
|
+
const onlyExpected = expected.filter((item) => !actual.includes(item));
|
|
1235
|
+
throw new Error(`${label} mismatch\nonly actual: ${format(onlyActual)}\nonly expected: ${format(onlyExpected)}`);
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
function format(value) {
|
|
1240
|
+
return typeof value === 'string' ? JSON.stringify(value) : String(value);
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
if (isMainModule(import.meta.url)) {
|
|
1244
|
+
const reporter = new TestReporter();
|
|
1245
|
+
try {
|
|
1246
|
+
runRegression(reporter);
|
|
1247
|
+
reporter.totalLine();
|
|
1248
|
+
} catch (_) {
|
|
1249
|
+
process.exit(1);
|
|
1250
|
+
}
|
|
1251
|
+
}
|