eyeling 1.32.0 → 1.33.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/README.md +123 -18
- package/bin/eyeling.cjs +56 -4
- package/browser.d.ts +63 -0
- package/dist/browser/eyeling.browser.js +298 -14
- package/examples/eyelang/INTEGRATION.md +13 -0
- package/examples/eyelang/README.md +628 -0
- package/examples/eyelang/SPEC.md +684 -0
- package/examples/eyelang/access-control-policy.pl +52 -0
- package/examples/eyelang/ackermann.pl +46 -0
- package/examples/eyelang/age.pl +28 -0
- package/examples/eyelang/aliases-and-namespaces.pl +22 -0
- package/examples/eyelang/alignment-demo.pl +44 -0
- package/examples/eyelang/allen-interval-calculus.pl +64 -0
- package/examples/eyelang/ancestor.pl +21 -0
- package/examples/eyelang/animal.pl +21 -0
- package/examples/eyelang/annotation-rdf12.ttl +12 -0
- package/examples/eyelang/annotation.pl +34 -0
- package/examples/eyelang/auroracare.pl +309 -0
- package/examples/eyelang/backward.pl +12 -0
- package/examples/eyelang/basic-monadic.pl +10018 -0
- package/examples/eyelang/bayes-diagnosis.pl +108 -0
- package/examples/eyelang/bayes-therapy.pl +182 -0
- package/examples/eyelang/beam-deflection.pl +50 -0
- package/examples/eyelang/blocks-world-planning.pl +75 -0
- package/examples/eyelang/bmi.pl +232 -0
- package/examples/eyelang/braking-safety-worlds.pl +69 -0
- package/examples/eyelang/buck-converter-design.pl +78 -0
- package/examples/eyelang/cache-performance.pl +54 -0
- package/examples/eyelang/canary-release.pl +49 -0
- package/examples/eyelang/cat-koko.pl +24 -0
- package/examples/eyelang/clinical-trial-screening.pl +92 -0
- package/examples/eyelang/collatz-1000.pl +14 -0
- package/examples/eyelang/combinatorics-findall-sort.pl +37 -0
- package/examples/eyelang/competitive-enzyme-kinetics.pl +78 -0
- package/examples/eyelang/complex-matrix-stability.pl +45 -0
- package/examples/eyelang/complex.pl +121 -0
- package/examples/eyelang/composition-of-injective-functions-is-injective.pl +50 -0
- package/examples/eyelang/context-association.pl +53 -0
- package/examples/eyelang/control-system.pl +72 -0
- package/examples/eyelang/cryptarithmetic-send-more-money.pl +49 -0
- package/examples/eyelang/cyclic-path.pl +16 -0
- package/examples/eyelang/d3-group.pl +100 -0
- package/examples/eyelang/dairy-energy-balance.pl +65 -0
- package/examples/eyelang/data-negotiation.pl +39 -0
- package/examples/eyelang/deep-taxonomy-10.pl +115 -0
- package/examples/eyelang/deep-taxonomy-100.pl +385 -0
- package/examples/eyelang/deep-taxonomy-1000.pl +3085 -0
- package/examples/eyelang/deep-taxonomy-10000.pl +30094 -0
- package/examples/eyelang/deep-taxonomy-100000.pl +300184 -0
- package/examples/eyelang/delfour.pl +281 -0
- package/examples/eyelang/dense-hamiltonian-cycle.pl +92 -0
- package/examples/eyelang/deontic-logic.pl +52 -0
- package/examples/eyelang/derived-backward-rule.pl +30 -0
- package/examples/eyelang/derived-rule.pl +27 -0
- package/examples/eyelang/diamond-property.pl +38 -0
- package/examples/eyelang/dijkstra-findall-sort.pl +44 -0
- package/examples/eyelang/dijkstra-risk-path.pl +86 -0
- package/examples/eyelang/dijkstra.pl +46 -0
- package/examples/eyelang/dining-philosophers.pl +140 -0
- package/examples/eyelang/directional-language.ttl +9 -0
- package/examples/eyelang/dog.pl +25 -0
- package/examples/eyelang/drone-corridor-planner.pl +51 -0
- package/examples/eyelang/easter-computus.pl +89 -0
- package/examples/eyelang/electrical-rc-filter.pl +36 -0
- package/examples/eyelang/epidemic-policy.pl +67 -0
- package/examples/eyelang/equivalence-classes-overlap-implies-same-class.pl +27 -0
- package/examples/eyelang/eulerian-path.pl +85 -0
- package/examples/eyelang/ev-range-worlds.pl +82 -0
- package/examples/eyelang/exact-cover-sudoku.pl +113 -0
- package/examples/eyelang/existential-rule.pl +18 -0
- package/examples/eyelang/exoplanet-validation-worlds.pl +88 -0
- package/examples/eyelang/expression-eval.pl +43 -0
- package/examples/eyelang/eyeling-ackermann.n3 +41 -0
- package/examples/eyelang/eyeling-age-threshold.n3 +12 -0
- package/examples/eyelang/eyeling-alignment-demo.n3 +11 -0
- package/examples/eyelang/eyeling-allen-interval-calculus-small.n3 +13 -0
- package/examples/eyelang/eyeling-backward-recursion.n3 +11 -0
- package/examples/eyelang/eyeling-backward.n3 +10 -0
- package/examples/eyelang/eyeling-basic-monadic-small.n3 +11 -0
- package/examples/eyelang/eyeling-bmi.n3 +10 -0
- package/examples/eyelang/eyeling-cat-koko.n3 +15 -0
- package/examples/eyelang/eyeling-collatz-small.n3 +11 -0
- package/examples/eyelang/eyeling-collection.n3 +11 -0
- package/examples/eyelang/eyeling-complex-arithmetic.n3 +10 -0
- package/examples/eyelang/eyeling-context-association.n3 +11 -0
- package/examples/eyelang/eyeling-control-system-small.n3 +11 -0
- package/examples/eyelang/eyeling-crypto-builtins-extra.n3 +10 -0
- package/examples/eyelang/eyeling-crypto-builtins.n3 +8 -0
- package/examples/eyelang/eyeling-deep-taxonomy-10.n3 +18 -0
- package/examples/eyelang/eyeling-derived-backward-rule-flat.n3 +10 -0
- package/examples/eyelang/eyeling-derived-rule-flat.n3 +9 -0
- package/examples/eyelang/eyeling-digital-product-passport-small.n3 +11 -0
- package/examples/eyelang/eyeling-dijkstra-tiny.n3 +14 -0
- package/examples/eyelang/eyeling-dog-license.n3 +13 -0
- package/examples/eyelang/eyeling-drone-corridor-planner-small.n3 +13 -0
- package/examples/eyelang/eyeling-equals.n3 +8 -0
- package/examples/eyelang/eyeling-equivalence-classes.n3 +11 -0
- package/examples/eyelang/eyeling-euler-identity.n3 +9 -0
- package/examples/eyelang/eyeling-existential-rule.n3 +9 -0
- package/examples/eyelang/eyeling-expression-eval.n3 +11 -0
- package/examples/eyelang/eyeling-family-cousins-extended.n3 +12 -0
- package/examples/eyelang/eyeling-fastpow.n3 +10 -0
- package/examples/eyelang/eyeling-fibonacci.n3 +44 -0
- package/examples/eyelang/eyeling-french-cities-reachability.n3 +22 -0
- package/examples/eyelang/eyeling-goldbach-small.n3 +22 -0
- package/examples/eyelang/eyeling-good-cobbler.n3 +9 -0
- package/examples/eyelang/eyeling-list-builtins.n3 +10 -0
- package/examples/eyelang/eyeling-list-collection-extra.n3 +9 -0
- package/examples/eyelang/eyeling-math-builtins.n3 +9 -0
- package/examples/eyelang/eyeling-string-builtins-extra.n3 +9 -0
- package/examples/eyelang/eyeling-string-builtins.n3 +10 -0
- package/examples/eyelang/eyeling-time-builtins.n3 +11 -0
- package/examples/eyelang/eyeling-time-components-extra.n3 +10 -0
- package/examples/eyelang/eyeling-witch.n3 +10 -0
- package/examples/eyelang/family-cousins.n3 +17 -0
- package/examples/eyelang/family-cousins.pl +65 -0
- package/examples/eyelang/fastpow.pl +53 -0
- package/examples/eyelang/fft8-numeric.pl +83 -0
- package/examples/eyelang/fibonacci.pl +53 -0
- package/examples/eyelang/field-nitrogen-balance.pl +70 -0
- package/examples/eyelang/flandor.pl +296 -0
- package/examples/eyelang/floating-point.pl +23 -0
- package/examples/eyelang/four-color-map.pl +127 -0
- package/examples/eyelang/fundamental-theorem-arithmetic.pl +113 -0
- package/examples/eyelang/gcd-bezout-identity.pl +48 -0
- package/examples/eyelang/gd-step-certified.pl +158 -0
- package/examples/eyelang/gdpr-compliance.pl +69 -0
- package/examples/eyelang/goldbach-1000.pl +185 -0
- package/examples/eyelang/good-cobbler.pl +14 -0
- package/examples/eyelang/gps.pl +152 -0
- package/examples/eyelang/graph-reachability.pl +36 -0
- package/examples/eyelang/gray-code-counter.pl +48 -0
- package/examples/eyelang/greatest-lower-bound-uniqueness.pl +28 -0
- package/examples/eyelang/group-inverse-uniqueness.pl +34 -0
- package/examples/eyelang/hamiltonian-cycle.pl +55 -0
- package/examples/eyelang/hamiltonian-path.pl +49 -0
- package/examples/eyelang/hamming-code.pl +105 -0
- package/examples/eyelang/hanoi.pl +20 -0
- package/examples/eyelang/heat-loss.pl +51 -0
- package/examples/eyelang/heron-theorem.pl +36 -0
- package/examples/eyelang/ideal-gas-law.pl +37 -0
- package/examples/eyelang/illegitimate-reasoning.pl +88 -0
- package/examples/eyelang/kaprekar.pl +32 -0
- package/examples/eyelang/law-of-cosines.pl +31 -0
- package/examples/eyelang/least-squares-regression.pl +81 -0
- package/examples/eyelang/list-collection.pl +33 -0
- package/examples/eyelang/lldm.pl +78 -0
- package/examples/eyelang/manufacturing-quality-control.pl +73 -0
- package/examples/eyelang/matrix.pl +296 -0
- package/examples/eyelang/microgrid-dispatch.pl +85 -0
- package/examples/eyelang/monkey-bananas.pl +45 -0
- package/examples/eyelang/n-queens.pl +23 -0
- package/examples/eyelang/n3-builtins.n3 +28 -0
- package/examples/eyelang/network-sla.pl +48 -0
- package/examples/eyelang/newton-raphson.pl +49 -0
- package/examples/eyelang/nixon-diamond.pl +37 -0
- package/examples/eyelang/odrl-dpv-healthcare-risk-ranked.pl +266 -0
- package/examples/eyelang/odrl-dpv-risk-ranked.pl +320 -0
- package/examples/eyelang/orbital-transfer-design.pl +113 -0
- package/examples/eyelang/output/access-control-policy.pl +2 -0
- package/examples/eyelang/output/ackermann.pl +12 -0
- package/examples/eyelang/output/age.pl +2 -0
- package/examples/eyelang/output/aliases-and-namespaces.pl +5 -0
- package/examples/eyelang/output/alignment-demo.pl +32 -0
- package/examples/eyelang/output/allen-interval-calculus.pl +154 -0
- package/examples/eyelang/output/ancestor.pl +6 -0
- package/examples/eyelang/output/animal.pl +4 -0
- package/examples/eyelang/output/annotation-rdf12.ttl +1 -0
- package/examples/eyelang/output/annotation.pl +4 -0
- package/examples/eyelang/output/auroracare.pl +117 -0
- package/examples/eyelang/output/backward.pl +1 -0
- package/examples/eyelang/output/basic-monadic.pl +1518 -0
- package/examples/eyelang/output/bayes-diagnosis.pl +13 -0
- package/examples/eyelang/output/bayes-therapy.pl +23 -0
- package/examples/eyelang/output/beam-deflection.pl +5 -0
- package/examples/eyelang/output/blocks-world-planning.pl +4 -0
- package/examples/eyelang/output/bmi.pl +32 -0
- package/examples/eyelang/output/braking-safety-worlds.pl +18 -0
- package/examples/eyelang/output/buck-converter-design.pl +6 -0
- package/examples/eyelang/output/cache-performance.pl +4 -0
- package/examples/eyelang/output/canary-release.pl +5 -0
- package/examples/eyelang/output/cat-koko.pl +3 -0
- package/examples/eyelang/output/clinical-trial-screening.pl +9 -0
- package/examples/eyelang/output/collatz-1000.pl +1000 -0
- package/examples/eyelang/output/combinatorics-findall-sort.pl +2 -0
- package/examples/eyelang/output/competitive-enzyme-kinetics.pl +6 -0
- package/examples/eyelang/output/complex-matrix-stability.pl +5 -0
- package/examples/eyelang/output/complex.pl +1 -0
- package/examples/eyelang/output/composition-of-injective-functions-is-injective.pl +2 -0
- package/examples/eyelang/output/context-association.pl +3 -0
- package/examples/eyelang/output/control-system.pl +6 -0
- package/examples/eyelang/output/cryptarithmetic-send-more-money.pl +6 -0
- package/examples/eyelang/output/cyclic-path.pl +16 -0
- package/examples/eyelang/output/d3-group.pl +2 -0
- package/examples/eyelang/output/dairy-energy-balance.pl +13 -0
- package/examples/eyelang/output/data-negotiation.pl +1 -0
- package/examples/eyelang/output/deep-taxonomy-10.pl +16 -0
- package/examples/eyelang/output/deep-taxonomy-100.pl +16 -0
- package/examples/eyelang/output/deep-taxonomy-1000.pl +16 -0
- package/examples/eyelang/output/deep-taxonomy-10000.pl +16 -0
- package/examples/eyelang/output/deep-taxonomy-100000.pl +16 -0
- package/examples/eyelang/output/delfour.pl +31 -0
- package/examples/eyelang/output/dense-hamiltonian-cycle.pl +4 -0
- package/examples/eyelang/output/deontic-logic.pl +4 -0
- package/examples/eyelang/output/derived-backward-rule.pl +3 -0
- package/examples/eyelang/output/derived-rule.pl +2 -0
- package/examples/eyelang/output/diamond-property.pl +4 -0
- package/examples/eyelang/output/dijkstra-findall-sort.pl +2 -0
- package/examples/eyelang/output/dijkstra-risk-path.pl +29 -0
- package/examples/eyelang/output/dijkstra.pl +16 -0
- package/examples/eyelang/output/dining-philosophers.pl +350 -0
- package/examples/eyelang/output/directional-language.ttl +1 -0
- package/examples/eyelang/output/dog.pl +1 -0
- package/examples/eyelang/output/drone-corridor-planner.pl +17 -0
- package/examples/eyelang/output/easter-computus.pl +30 -0
- package/examples/eyelang/output/electrical-rc-filter.pl +3 -0
- package/examples/eyelang/output/epidemic-policy.pl +14 -0
- package/examples/eyelang/output/equivalence-classes-overlap-implies-same-class.pl +18 -0
- package/examples/eyelang/output/eulerian-path.pl +3 -0
- package/examples/eyelang/output/ev-range-worlds.pl +19 -0
- package/examples/eyelang/output/exact-cover-sudoku.pl +3 -0
- package/examples/eyelang/output/existential-rule.pl +2 -0
- package/examples/eyelang/output/exoplanet-validation-worlds.pl +22 -0
- package/examples/eyelang/output/expression-eval.pl +1 -0
- package/examples/eyelang/output/eyeling-ackermann.n3 +12 -0
- package/examples/eyelang/output/eyeling-age-threshold.n3 +4 -0
- package/examples/eyelang/output/eyeling-alignment-demo.n3 +1 -0
- package/examples/eyelang/output/eyeling-allen-interval-calculus-small.n3 +3 -0
- package/examples/eyelang/output/eyeling-backward-recursion.n3 +9 -0
- package/examples/eyelang/output/eyeling-backward.n3 +1 -0
- package/examples/eyelang/output/eyeling-basic-monadic-small.n3 +8 -0
- package/examples/eyelang/output/eyeling-bmi.n3 +2 -0
- package/examples/eyelang/output/eyeling-cat-koko.n3 +3 -0
- package/examples/eyelang/output/eyeling-collatz-small.n3 +3 -0
- package/examples/eyelang/output/eyeling-collection.n3 +1 -0
- package/examples/eyelang/output/eyeling-complex-arithmetic.n3 +5 -0
- package/examples/eyelang/output/eyeling-context-association.n3 +4 -0
- package/examples/eyelang/output/eyeling-control-system-small.n3 +4 -0
- package/examples/eyelang/output/eyeling-crypto-builtins-extra.n3 +3 -0
- package/examples/eyelang/output/eyeling-crypto-builtins.n3 +2 -0
- package/examples/eyelang/output/eyeling-deep-taxonomy-10.n3 +32 -0
- package/examples/eyelang/output/eyeling-derived-backward-rule-flat.n3 +4 -0
- package/examples/eyelang/output/eyeling-derived-rule-flat.n3 +2 -0
- package/examples/eyelang/output/eyeling-digital-product-passport-small.n3 +3 -0
- package/examples/eyelang/output/eyeling-dijkstra-tiny.n3 +9 -0
- package/examples/eyelang/output/eyeling-dog-license.n3 +1 -0
- package/examples/eyelang/output/eyeling-drone-corridor-planner-small.n3 +5 -0
- package/examples/eyelang/output/eyeling-equals.n3 +1 -0
- package/examples/eyelang/output/eyeling-equivalence-classes.n3 +2 -0
- package/examples/eyelang/output/eyeling-euler-identity.n3 +3 -0
- package/examples/eyelang/output/eyeling-existential-rule.n3 +4 -0
- package/examples/eyelang/output/eyeling-expression-eval.n3 +3 -0
- package/examples/eyelang/output/eyeling-family-cousins-extended.n3 +6 -0
- package/examples/eyelang/output/eyeling-fastpow.n3 +4 -0
- package/examples/eyelang/output/eyeling-fibonacci.n3 +6 -0
- package/examples/eyelang/output/eyeling-french-cities-reachability.n3 +25 -0
- package/examples/eyelang/output/eyeling-goldbach-small.n3 +2 -0
- package/examples/eyelang/output/eyeling-good-cobbler.n3 +2 -0
- package/examples/eyelang/output/eyeling-list-builtins.n3 +6 -0
- package/examples/eyelang/output/eyeling-list-collection-extra.n3 +5 -0
- package/examples/eyelang/output/eyeling-math-builtins.n3 +5 -0
- package/examples/eyelang/output/eyeling-string-builtins-extra.n3 +3 -0
- package/examples/eyelang/output/eyeling-string-builtins.n3 +4 -0
- package/examples/eyelang/output/eyeling-time-builtins.n3 +4 -0
- package/examples/eyelang/output/eyeling-time-components-extra.n3 +5 -0
- package/examples/eyelang/output/eyeling-witch.n3 +2 -0
- package/examples/eyelang/output/family-cousins.n3 +8 -0
- package/examples/eyelang/output/family-cousins.pl +28 -0
- package/examples/eyelang/output/fastpow.pl +6 -0
- package/examples/eyelang/output/fft8-numeric.pl +4 -0
- package/examples/eyelang/output/fibonacci.pl +6 -0
- package/examples/eyelang/output/field-nitrogen-balance.pl +21 -0
- package/examples/eyelang/output/flandor.pl +43 -0
- package/examples/eyelang/output/floating-point.pl +9 -0
- package/examples/eyelang/output/four-color-map.pl +3 -0
- package/examples/eyelang/output/fundamental-theorem-arithmetic.pl +9 -0
- package/examples/eyelang/output/gcd-bezout-identity.pl +36 -0
- package/examples/eyelang/output/gd-step-certified.pl +79 -0
- package/examples/eyelang/output/gdpr-compliance.pl +6 -0
- package/examples/eyelang/output/goldbach-1000.pl +667 -0
- package/examples/eyelang/output/good-cobbler.pl +1 -0
- package/examples/eyelang/output/gps.pl +21 -0
- package/examples/eyelang/output/graph-reachability.pl +3 -0
- package/examples/eyelang/output/gray-code-counter.pl +1 -0
- package/examples/eyelang/output/greatest-lower-bound-uniqueness.pl +2 -0
- package/examples/eyelang/output/group-inverse-uniqueness.pl +2 -0
- package/examples/eyelang/output/hamiltonian-cycle.pl +4 -0
- package/examples/eyelang/output/hamiltonian-path.pl +121 -0
- package/examples/eyelang/output/hamming-code.pl +6 -0
- package/examples/eyelang/output/hanoi.pl +1 -0
- package/examples/eyelang/output/heat-loss.pl +5 -0
- package/examples/eyelang/output/heron-theorem.pl +4 -0
- package/examples/eyelang/output/ideal-gas-law.pl +3 -0
- package/examples/eyelang/output/illegitimate-reasoning.pl +15 -0
- package/examples/eyelang/output/kaprekar.pl +8 -0
- package/examples/eyelang/output/law-of-cosines.pl +3 -0
- package/examples/eyelang/output/least-squares-regression.pl +5 -0
- package/examples/eyelang/output/list-collection.pl +3 -0
- package/examples/eyelang/output/lldm.pl +6 -0
- package/examples/eyelang/output/manufacturing-quality-control.pl +6 -0
- package/examples/eyelang/output/matrix.pl +10 -0
- package/examples/eyelang/output/microgrid-dispatch.pl +6 -0
- package/examples/eyelang/output/monkey-bananas.pl +5 -0
- package/examples/eyelang/output/n-queens.pl +93 -0
- package/examples/eyelang/output/n3-builtins.n3 +6 -0
- package/examples/eyelang/output/network-sla.pl +4 -0
- package/examples/eyelang/output/newton-raphson.pl +3 -0
- package/examples/eyelang/output/nixon-diamond.pl +5 -0
- package/examples/eyelang/output/odrl-dpv-healthcare-risk-ranked.pl +42 -0
- package/examples/eyelang/output/odrl-dpv-risk-ranked.pl +120 -0
- package/examples/eyelang/output/orbital-transfer-design.pl +7 -0
- package/examples/eyelang/output/path-discovery.pl +3 -0
- package/examples/eyelang/output/peano-arithmetic.pl +3 -0
- package/examples/eyelang/output/peasant.pl +10 -0
- package/examples/eyelang/output/pendulum-period.pl +4 -0
- package/examples/eyelang/output/polynomial.pl +14 -0
- package/examples/eyelang/output/project-portfolio-optimization.pl +6 -0
- package/examples/eyelang/output/proof-contrapositive.pl +3 -0
- package/examples/eyelang/output/quadratic-formula.pl +6 -0
- package/examples/eyelang/output/quine-mccluskey.pl +3 -0
- package/examples/eyelang/output/radioactive-decay.pl +5 -0
- package/examples/eyelang/output/resilient-city-orchestration.pl +67 -0
- package/examples/eyelang/output/riemann-hypothesis.pl +12 -0
- package/examples/eyelang/output/sat-dpll.pl +5 -0
- package/examples/eyelang/output/security-incident-correlation.pl +3 -0
- package/examples/eyelang/output/service-impact.pl +11 -0
- package/examples/eyelang/output/sieve.pl +1 -0
- package/examples/eyelang/output/skolem-functions.pl +16 -0
- package/examples/eyelang/output/socket-age.pl +1 -0
- package/examples/eyelang/output/socket-family.pl +3 -0
- package/examples/eyelang/output/socrates.n3 +1 -0
- package/examples/eyelang/output/socrates.pl +2 -0
- package/examples/eyelang/output/statistics-summary.pl +4 -0
- package/examples/eyelang/output/sudoku.pl +2 -0
- package/examples/eyelang/output/superdense-coding.pl +6 -0
- package/examples/eyelang/output/traveling-salesman.pl +1 -0
- package/examples/eyelang/output/triple-term.n3 +2 -0
- package/examples/eyelang/output/turing.pl +12 -0
- package/examples/eyelang/output/vector-similarity.pl +4 -0
- package/examples/eyelang/output/witch.pl +7 -0
- package/examples/eyelang/output/wolf-goat-cabbage.pl +3 -0
- package/examples/eyelang/output/zebra.pl +3 -0
- package/examples/eyelang/path-discovery.pl +44998 -0
- package/examples/eyelang/peano-arithmetic.pl +31 -0
- package/examples/eyelang/peasant.pl +30 -0
- package/examples/eyelang/pendulum-period.pl +50 -0
- package/examples/eyelang/polynomial.pl +124 -0
- package/examples/eyelang/project-portfolio-optimization.pl +101 -0
- package/examples/eyelang/proof/age.pl +71 -0
- package/examples/eyelang/proof/aliases-and-namespaces.pl +78 -0
- package/examples/eyelang/proof/ancestor.pl +140 -0
- package/examples/eyelang/proof/animal.pl +68 -0
- package/examples/eyelang/proof/annotation.pl +80 -0
- package/examples/eyelang/proof/backward.pl +22 -0
- package/examples/eyelang/proof/cat-koko.pl +86 -0
- package/examples/eyelang/proof/data-negotiation.pl +76 -0
- package/examples/eyelang/proof/derived-rule.pl +43 -0
- package/examples/eyelang/proof/dog.pl +31 -0
- package/examples/eyelang/proof/electrical-rc-filter.pl +105 -0
- package/examples/eyelang/proof/existential-rule.pl +40 -0
- package/examples/eyelang/proof/floating-point.pl +160 -0
- package/examples/eyelang/proof/good-cobbler.pl +16 -0
- package/examples/eyelang/proof/group-inverse-uniqueness.pl +84 -0
- package/examples/eyelang/proof/list-collection.pl +52 -0
- package/examples/eyelang/proof/proof-contrapositive.pl +78 -0
- package/examples/eyelang/proof/socket-age.pl +32 -0
- package/examples/eyelang/proof/socket-family.pl +59 -0
- package/examples/eyelang/proof/socrates.pl +38 -0
- package/examples/eyelang/proof-contrapositive.pl +27 -0
- package/examples/eyelang/quadratic-formula.pl +54 -0
- package/examples/eyelang/quine-mccluskey.pl +143 -0
- package/examples/eyelang/radioactive-decay.pl +56 -0
- package/examples/eyelang/resilient-city-orchestration.pl +303 -0
- package/examples/eyelang/riemann-hypothesis.pl +110 -0
- package/examples/eyelang/sat-dpll.pl +80 -0
- package/examples/eyelang/security-incident-correlation.pl +69 -0
- package/examples/eyelang/service-impact.pl +41 -0
- package/examples/eyelang/sieve.pl +20 -0
- package/examples/eyelang/skolem-functions.pl +52 -0
- package/examples/eyelang/socket-age.pl +39 -0
- package/examples/eyelang/socket-family.pl +28 -0
- package/examples/eyelang/socrates.n3 +11 -0
- package/examples/eyelang/socrates.pl +19 -0
- package/examples/eyelang/statistics-summary.pl +54 -0
- package/examples/eyelang/sudoku.pl +20 -0
- package/examples/eyelang/superdense-coding.pl +84 -0
- package/examples/eyelang/traveling-salesman.pl +64 -0
- package/examples/eyelang/triple-term.n3 +9 -0
- package/examples/eyelang/turing.pl +67 -0
- package/examples/eyelang/vector-similarity.pl +56 -0
- package/examples/eyelang/witch.pl +38 -0
- package/examples/eyelang/wolf-goat-cabbage.pl +56 -0
- package/examples/eyelang/zebra.pl +44 -0
- package/eyelang.d.ts +92 -0
- package/eyeling-builtins.ttl +3 -3
- package/eyeling.js +298 -14
- package/index.d.ts +290 -283
- package/index.js +95 -1
- package/lib/builtins.js +297 -14
- package/lib/cli.js +1 -0
- package/lib/eyelang/bin.js +7 -0
- package/lib/eyelang/builtins/aggregation.mjs +81 -0
- package/lib/eyelang/builtins/alphametic.mjs +144 -0
- package/lib/eyelang/builtins/arithmetic.mjs +197 -0
- package/lib/eyelang/builtins/control.mjs +22 -0
- package/lib/eyelang/builtins/core.mjs +78 -0
- package/lib/eyelang/builtins/formula.mjs +42 -0
- package/lib/eyelang/builtins/lists.mjs +149 -0
- package/lib/eyelang/builtins/matrix.mjs +226 -0
- package/lib/eyelang/builtins/n3.mjs +483 -0
- package/lib/eyelang/builtins/number-theory.mjs +114 -0
- package/lib/eyelang/builtins/portfolio.mjs +73 -0
- package/lib/eyelang/builtins/registry.mjs +54 -0
- package/lib/eyelang/builtins/search.mjs +579 -0
- package/lib/eyelang/builtins/strings.mjs +41 -0
- package/lib/eyelang/builtins/sudoku.mjs +141 -0
- package/lib/eyelang/cli.mjs +192 -0
- package/lib/eyelang/explain.mjs +324 -0
- package/lib/eyelang/hash.mjs +294 -0
- package/lib/eyelang/index.mjs +48 -0
- package/lib/eyelang/parser.mjs +428 -0
- package/lib/eyelang/program.mjs +244 -0
- package/lib/eyelang/rdf.mjs +747 -0
- package/lib/eyelang/solver.mjs +237 -0
- package/lib/eyelang/term.mjs +328 -0
- package/package.json +15 -5
- package/test/builtins.test.js +49 -1
- package/test/eyelang/conformance/README.md +45 -0
- package/test/eyelang/conformance/cases/core/001_fact_output.pl +4 -0
- package/test/eyelang/conformance/cases/core/001_fact_query.query +1 -0
- package/test/eyelang/conformance/cases/core/002_rule_recursion.pl +7 -0
- package/test/eyelang/conformance/cases/core/002_rule_recursion.query +1 -0
- package/test/eyelang/conformance/cases/core/003_terms_and_readback.pl +16 -0
- package/test/eyelang/conformance/cases/core/003_terms_and_readback.query +1 -0
- package/test/eyelang/conformance/cases/core/004_conjunction_and_parentheses.pl +5 -0
- package/test/eyelang/conformance/cases/core/004_conjunction_and_parentheses.query +1 -0
- package/test/eyelang/conformance/cases/core/005_list_deconstruction.pl +6 -0
- package/test/eyelang/conformance/cases/core/005_list_deconstruction.query +1 -0
- package/test/eyelang/conformance/cases/core/006_comma_formula_data.pl +4 -0
- package/test/eyelang/conformance/cases/core/006_comma_formula_data.query +1 -0
- package/test/eyelang/conformance/cases/core/007_anonymous_variables.pl +5 -0
- package/test/eyelang/conformance/cases/core/007_anonymous_variables.query +1 -0
- package/test/eyelang/conformance/cases/core/008_graphic_atoms.pl +6 -0
- package/test/eyelang/conformance/cases/core/008_graphic_atoms.query +1 -0
- package/test/eyelang/conformance/cases/core/009_comments_and_whitespace.pl +5 -0
- package/test/eyelang/conformance/cases/core/009_comments_and_whitespace.query +1 -0
- package/test/eyelang/conformance/cases/core/010_variable_scope_and_reuse.pl +8 -0
- package/test/eyelang/conformance/cases/core/010_variable_scope_and_reuse.query +1 -0
- package/test/eyelang/conformance/cases/core/011_predicate_arity.pl +6 -0
- package/test/eyelang/conformance/cases/core/011_predicate_arity.query +1 -0
- package/test/eyelang/conformance/cases/core/012_nested_compound_unification.pl +5 -0
- package/test/eyelang/conformance/cases/core/012_nested_compound_unification.query +1 -0
- package/test/eyelang/conformance/cases/core/013_multiple_clauses_order.pl +6 -0
- package/test/eyelang/conformance/cases/core/013_multiple_clauses_order.query +1 -0
- package/test/eyelang/conformance/cases/core/014_failure_filters_answers.pl +7 -0
- package/test/eyelang/conformance/cases/core/014_failure_filters_answers.query +1 -0
- package/test/eyelang/conformance/cases/core/015_improper_list_unification.pl +6 -0
- package/test/eyelang/conformance/cases/core/015_improper_list_unification.query +1 -0
- package/test/eyelang/conformance/cases/core/016_zero_arity_compound.pl +4 -0
- package/test/eyelang/conformance/cases/core/016_zero_arity_compound.query +1 -0
- package/test/eyelang/conformance/cases/core/017_three_step_recursion.pl +8 -0
- package/test/eyelang/conformance/cases/core/017_three_step_recursion.query +1 -0
- package/test/eyelang/conformance/cases/core/018_quoted_atom_readback.pl +6 -0
- package/test/eyelang/conformance/cases/core/018_quoted_atom_readback.query +1 -0
- package/test/eyelang/conformance/cases/core/019_parenthesized_three_conjuncts.pl +7 -0
- package/test/eyelang/conformance/cases/core/019_parenthesized_three_conjuncts.query +1 -0
- package/test/eyelang/conformance/cases/core/020_nested_list_terms.pl +5 -0
- package/test/eyelang/conformance/cases/core/020_nested_list_terms.query +1 -0
- package/test/eyelang/conformance/cases/core/021_repeated_variable_head.pl +7 -0
- package/test/eyelang/conformance/cases/core/022_rule_head_structure.pl +5 -0
- package/test/eyelang/conformance/cases/core/023_quoted_escapes_readback.pl +5 -0
- package/test/eyelang/conformance/cases/core/024_numeric_literal_readback.pl +6 -0
- package/test/eyelang/conformance/cases/core/025_body_parentheses_with_formula_data.pl +5 -0
- package/test/eyelang/conformance/cases/core/026_underscore_named_variable_reuse.pl +5 -0
- package/test/eyelang/conformance/cases/extension/001_default_derived_output.pl +5 -0
- package/test/eyelang/conformance/cases/extension/002_materialize_focus.pl +5 -0
- package/test/eyelang/conformance/cases/extension/003_arithmetic_and_comparison.pl +12 -0
- package/test/eyelang/conformance/cases/extension/003_arithmetic_and_comparison.query +1 -0
- package/test/eyelang/conformance/cases/extension/004_strings_and_atoms.pl +6 -0
- package/test/eyelang/conformance/cases/extension/004_strings_and_atoms.query +1 -0
- package/test/eyelang/conformance/cases/extension/005_lists_aggregation_ordering.pl +10 -0
- package/test/eyelang/conformance/cases/extension/005_lists_aggregation_ordering.query +1 -0
- package/test/eyelang/conformance/cases/extension/006_formula_terms.pl +5 -0
- package/test/eyelang/conformance/cases/extension/006_formula_terms.query +1 -0
- package/test/eyelang/conformance/cases/extension/007_negation_once_generators.pl +7 -0
- package/test/eyelang/conformance/cases/extension/007_negation_once_generators.query +1 -0
- package/test/eyelang/conformance/cases/extension/008_equality_and_inequality.pl +6 -0
- package/test/eyelang/conformance/cases/extension/008_equality_and_inequality.query +1 -0
- package/test/eyelang/conformance/cases/extension/009_list_relations.pl +6 -0
- package/test/eyelang/conformance/cases/extension/009_list_relations.query +1 -0
- package/test/eyelang/conformance/cases/extension/010_append_splits.pl +3 -0
- package/test/eyelang/conformance/cases/extension/010_append_splits.query +1 -0
- package/test/eyelang/conformance/cases/extension/011_matching_and_comparison.pl +7 -0
- package/test/eyelang/conformance/cases/extension/011_matching_and_comparison.query +1 -0
- package/test/eyelang/conformance/cases/extension/012_memoize_declaration.pl +8 -0
- package/test/eyelang/conformance/cases/extension/012_memoize_declaration.query +1 -0
- package/test/eyelang/conformance/cases/extension/013_numeric_functions.pl +9 -0
- package/test/eyelang/conformance/cases/extension/013_numeric_functions.query +1 -0
- package/test/eyelang/conformance/cases/extension/014_between_enumeration.pl +3 -0
- package/test/eyelang/conformance/cases/extension/014_between_enumeration.query +1 -0
- package/test/eyelang/conformance/cases/extension/015_smallest_divisor.pl +3 -0
- package/test/eyelang/conformance/cases/extension/015_smallest_divisor.query +1 -0
- package/test/eyelang/conformance/cases/extension/016_negation_filter.pl +7 -0
- package/test/eyelang/conformance/cases/extension/016_negation_filter.query +1 -0
- package/test/eyelang/conformance/cases/extension/017_once_user_predicate.pl +5 -0
- package/test/eyelang/conformance/cases/extension/017_once_user_predicate.query +1 -0
- package/test/eyelang/conformance/cases/extension/018_findall_user_goal.pl +6 -0
- package/test/eyelang/conformance/cases/extension/018_findall_user_goal.query +1 -0
- package/test/eyelang/conformance/cases/extension/019_sort_deduplicates_atoms.pl +3 -0
- package/test/eyelang/conformance/cases/extension/019_sort_deduplicates_atoms.query +1 -0
- package/test/eyelang/conformance/cases/extension/020_append_bound_prefix_suffix.pl +4 -0
- package/test/eyelang/conformance/cases/extension/020_append_bound_prefix_suffix.query +1 -0
- package/test/eyelang/conformance/cases/extension/021_nth0_index_generation.pl +3 -0
- package/test/eyelang/conformance/cases/extension/021_nth0_index_generation.query +1 -0
- package/test/eyelang/conformance/cases/extension/022_set_nth0_edges.pl +4 -0
- package/test/eyelang/conformance/cases/extension/022_set_nth0_edges.query +1 -0
- package/test/eyelang/conformance/cases/extension/023_select_duplicate_occurrences.pl +3 -0
- package/test/eyelang/conformance/cases/extension/023_select_duplicate_occurrences.query +1 -0
- package/test/eyelang/conformance/cases/extension/024_not_member_filter.pl +6 -0
- package/test/eyelang/conformance/cases/extension/024_not_member_filter.query +1 -0
- package/test/eyelang/conformance/cases/extension/025_is_list_filter.pl +5 -0
- package/test/eyelang/conformance/cases/extension/025_is_list_filter.query +1 -0
- package/test/eyelang/conformance/cases/extension/026_nested_formula_terms.pl +5 -0
- package/test/eyelang/conformance/cases/extension/026_nested_formula_terms.query +1 -0
- package/test/eyelang/conformance/cases/extension/027_materialize_excludes_source_fact.pl +6 -0
- package/test/eyelang/conformance/cases/extension/028_numeric_and_lexical_comparison.pl +5 -0
- package/test/eyelang/conformance/cases/extension/028_numeric_and_lexical_comparison.query +1 -0
- package/test/eyelang/conformance/cases/extension/029_string_matching_filters.pl +6 -0
- package/test/eyelang/conformance/cases/extension/029_string_matching_filters.query +1 -0
- package/test/eyelang/conformance/cases/extension/030_string_and_atom_concat.pl +4 -0
- package/test/eyelang/conformance/cases/extension/030_string_and_atom_concat.query +1 -0
- package/test/eyelang/conformance/cases/extension/031_countall_empty_and_nonempty.pl +4 -0
- package/test/eyelang/conformance/cases/extension/031_countall_empty_and_nonempty.query +1 -0
- package/test/eyelang/conformance/cases/extension/032_sumall_numeric_template.pl +5 -0
- package/test/eyelang/conformance/cases/extension/032_sumall_numeric_template.query +1 -0
- package/test/eyelang/conformance/cases/extension/033_aggregate_min_template.pl +5 -0
- package/test/eyelang/conformance/cases/extension/033_aggregate_min_template.query +1 -0
- package/test/eyelang/conformance/cases/extension/034_aggregate_max_compound_key.pl +5 -0
- package/test/eyelang/conformance/cases/extension/034_aggregate_max_compound_key.query +1 -0
- package/test/eyelang/conformance/cases/extension/035_date_difference.pl +4 -0
- package/test/eyelang/conformance/cases/extension/036_extended_gcd.pl +3 -0
- package/test/eyelang/conformance/cases/extension/037_collatz_trajectory.pl +3 -0
- package/test/eyelang/conformance/cases/extension/038_kaprekar_steps.pl +3 -0
- package/test/eyelang/conformance/cases/extension/039_goldbach_pair.pl +3 -0
- package/test/eyelang/conformance/cases/extension/040_matrix_operations.pl +5 -0
- package/test/eyelang/conformance/cases/extension/041_atom_range_generators.pl +5 -0
- package/test/eyelang/conformance/cases/extension/042_n_queens_small.pl +3 -0
- package/test/eyelang/conformance/cases/extension/043_cnf_model.pl +3 -0
- package/test/eyelang/conformance/cases/extension/044_cover9_filter.pl +6 -0
- package/test/eyelang/conformance/cases/extension/045_alphametic_sum_small.pl +3 -0
- package/test/eyelang/conformance/cases/extension/046_bounded_subset.pl +4 -0
- package/test/eyelang/conformance/expected/core/001_fact_output.out +1 -0
- package/test/eyelang/conformance/expected/core/002_rule_recursion.out +2 -0
- package/test/eyelang/conformance/expected/core/003_terms_and_readback.out +13 -0
- package/test/eyelang/conformance/expected/core/004_conjunction_and_parentheses.out +1 -0
- package/test/eyelang/conformance/expected/core/005_list_deconstruction.out +2 -0
- package/test/eyelang/conformance/expected/core/006_comma_formula_data.out +1 -0
- package/test/eyelang/conformance/expected/core/007_anonymous_variables.out +1 -0
- package/test/eyelang/conformance/expected/core/008_graphic_atoms.out +3 -0
- package/test/eyelang/conformance/expected/core/009_comments_and_whitespace.out +2 -0
- package/test/eyelang/conformance/expected/core/010_variable_scope_and_reuse.out +2 -0
- package/test/eyelang/conformance/expected/core/011_predicate_arity.out +2 -0
- package/test/eyelang/conformance/expected/core/012_nested_compound_unification.out +2 -0
- package/test/eyelang/conformance/expected/core/013_multiple_clauses_order.out +2 -0
- package/test/eyelang/conformance/expected/core/014_failure_filters_answers.out +1 -0
- package/test/eyelang/conformance/expected/core/015_improper_list_unification.out +3 -0
- package/test/eyelang/conformance/expected/core/016_zero_arity_compound.out +1 -0
- package/test/eyelang/conformance/expected/core/017_three_step_recursion.out +3 -0
- package/test/eyelang/conformance/expected/core/018_quoted_atom_readback.out +3 -0
- package/test/eyelang/conformance/expected/core/019_parenthesized_three_conjuncts.out +1 -0
- package/test/eyelang/conformance/expected/core/020_nested_list_terms.out +2 -0
- package/test/eyelang/conformance/expected/core/021_repeated_variable_head.out +2 -0
- package/test/eyelang/conformance/expected/core/022_rule_head_structure.out +2 -0
- package/test/eyelang/conformance/expected/core/023_quoted_escapes_readback.out +2 -0
- package/test/eyelang/conformance/expected/core/024_numeric_literal_readback.out +3 -0
- package/test/eyelang/conformance/expected/core/025_body_parentheses_with_formula_data.out +1 -0
- package/test/eyelang/conformance/expected/core/026_underscore_named_variable_reuse.out +1 -0
- package/test/eyelang/conformance/expected/extension/001_default_derived_output.out +3 -0
- package/test/eyelang/conformance/expected/extension/002_materialize_focus.out +1 -0
- package/test/eyelang/conformance/expected/extension/003_arithmetic_and_comparison.out +10 -0
- package/test/eyelang/conformance/expected/extension/004_strings_and_atoms.out +4 -0
- package/test/eyelang/conformance/expected/extension/005_lists_aggregation_ordering.out +9 -0
- package/test/eyelang/conformance/expected/extension/006_formula_terms.out +4 -0
- package/test/eyelang/conformance/expected/extension/007_negation_once_generators.out +2 -0
- package/test/eyelang/conformance/expected/extension/008_equality_and_inequality.out +4 -0
- package/test/eyelang/conformance/expected/extension/009_list_relations.out +5 -0
- package/test/eyelang/conformance/expected/extension/010_append_splits.out +3 -0
- package/test/eyelang/conformance/expected/extension/011_matching_and_comparison.out +5 -0
- package/test/eyelang/conformance/expected/extension/012_memoize_declaration.out +2 -0
- package/test/eyelang/conformance/expected/extension/013_numeric_functions.out +7 -0
- package/test/eyelang/conformance/expected/extension/014_between_enumeration.out +3 -0
- package/test/eyelang/conformance/expected/extension/015_smallest_divisor.out +1 -0
- package/test/eyelang/conformance/expected/extension/016_negation_filter.out +2 -0
- package/test/eyelang/conformance/expected/extension/017_once_user_predicate.out +1 -0
- package/test/eyelang/conformance/expected/extension/018_findall_user_goal.out +1 -0
- package/test/eyelang/conformance/expected/extension/019_sort_deduplicates_atoms.out +1 -0
- package/test/eyelang/conformance/expected/extension/020_append_bound_prefix_suffix.out +2 -0
- package/test/eyelang/conformance/expected/extension/021_nth0_index_generation.out +1 -0
- package/test/eyelang/conformance/expected/extension/022_set_nth0_edges.out +2 -0
- package/test/eyelang/conformance/expected/extension/023_select_duplicate_occurrences.out +2 -0
- package/test/eyelang/conformance/expected/extension/024_not_member_filter.out +1 -0
- package/test/eyelang/conformance/expected/extension/025_is_list_filter.out +1 -0
- package/test/eyelang/conformance/expected/extension/026_nested_formula_terms.out +6 -0
- package/test/eyelang/conformance/expected/extension/027_materialize_excludes_source_fact.out +1 -0
- package/test/eyelang/conformance/expected/extension/028_numeric_and_lexical_comparison.out +3 -0
- package/test/eyelang/conformance/expected/extension/029_string_matching_filters.out +2 -0
- package/test/eyelang/conformance/expected/extension/030_string_and_atom_concat.out +2 -0
- package/test/eyelang/conformance/expected/extension/031_countall_empty_and_nonempty.out +1 -0
- package/test/eyelang/conformance/expected/extension/032_sumall_numeric_template.out +1 -0
- package/test/eyelang/conformance/expected/extension/033_aggregate_min_template.out +1 -0
- package/test/eyelang/conformance/expected/extension/034_aggregate_max_compound_key.out +1 -0
- package/test/eyelang/conformance/expected/extension/035_date_difference.out +2 -0
- package/test/eyelang/conformance/expected/extension/036_extended_gcd.out +1 -0
- package/test/eyelang/conformance/expected/extension/037_collatz_trajectory.out +1 -0
- package/test/eyelang/conformance/expected/extension/038_kaprekar_steps.out +1 -0
- package/test/eyelang/conformance/expected/extension/039_goldbach_pair.out +2 -0
- package/test/eyelang/conformance/expected/extension/040_matrix_operations.out +3 -0
- package/test/eyelang/conformance/expected/extension/041_atom_range_generators.out +8 -0
- package/test/eyelang/conformance/expected/extension/042_n_queens_small.out +2 -0
- package/test/eyelang/conformance/expected/extension/043_cnf_model.out +1 -0
- package/test/eyelang/conformance/expected/extension/044_cover9_filter.out +2 -0
- package/test/eyelang/conformance/expected/extension/045_alphametic_sum_small.out +4 -0
- package/test/eyelang/conformance/expected/extension/046_bounded_subset.out +5 -0
- package/test/eyelang/run-all.mjs +20 -0
- package/test/eyelang/run-conformance.mjs +80 -0
- package/test/eyelang/run-examples.mjs +126 -0
- package/test/eyelang/run-regression.mjs +640 -0
- package/test/eyelang/test-style.mjs +91 -0
- package/test/eyelang.test.js +58 -0
- package/test/run.js +1 -0
package/lib/builtins.js
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
const {
|
|
10
10
|
RDF_NS,
|
|
11
|
+
RDFS_NS,
|
|
12
|
+
OWL_NS,
|
|
11
13
|
XSD_NS,
|
|
12
14
|
CRYPTO_NS,
|
|
13
15
|
MATH_NS,
|
|
@@ -1035,6 +1037,9 @@ const XSD_HEX_BINARY_DT = XSD_NS + 'hexBinary';
|
|
|
1035
1037
|
const XSD_BASE64_BINARY_DT = XSD_NS + 'base64Binary';
|
|
1036
1038
|
const XSD_ANY_URI_DT = XSD_NS + 'anyURI';
|
|
1037
1039
|
const RDF_LANGSTRING_DT = RDF_NS + 'langString';
|
|
1040
|
+
const RDF_PLAIN_LITERAL_DT = RDF_NS + 'PlainLiteral';
|
|
1041
|
+
const RDF_XML_LITERAL_DT = RDF_NS + 'XMLLiteral';
|
|
1042
|
+
const RDFS_LITERAL_DT = RDFS_NS + 'Literal';
|
|
1038
1043
|
|
|
1039
1044
|
const XSD_STRING_LIKE_DTS = new Set([
|
|
1040
1045
|
XSD_STRING_DT,
|
|
@@ -1063,6 +1068,9 @@ const XSD_INTEGER_BOUNDS = new Map([
|
|
|
1063
1068
|
|
|
1064
1069
|
const XSD_DATATYPE_BUILTIN_DTS = new Set([
|
|
1065
1070
|
RDF_LANGSTRING_DT,
|
|
1071
|
+
RDF_PLAIN_LITERAL_DT,
|
|
1072
|
+
RDF_XML_LITERAL_DT,
|
|
1073
|
+
RDFS_LITERAL_DT,
|
|
1066
1074
|
XSD_STRING_DT,
|
|
1067
1075
|
XSD_NS + 'normalizedString',
|
|
1068
1076
|
XSD_NS + 'token',
|
|
@@ -1084,6 +1092,11 @@ const XSD_DATATYPE_BUILTIN_DTS = new Set([
|
|
|
1084
1092
|
]);
|
|
1085
1093
|
|
|
1086
1094
|
|
|
1095
|
+
const XSD_FLOAT_MAX_VALUE = 3.4028234663852886e38;
|
|
1096
|
+
const XSD_FLOAT_MIN_POSITIVE_VALUE = 1.401298464324817e-45;
|
|
1097
|
+
const XSD_DOUBLE_MAX_VALUE = Number.MAX_VALUE;
|
|
1098
|
+
const XSD_DOUBLE_MIN_POSITIVE_VALUE = Number.MIN_VALUE;
|
|
1099
|
+
|
|
1087
1100
|
// Integer-derived datatypes from XML Schema Part 2 (and commonly used ones).
|
|
1088
1101
|
const XSD_INTEGER_DERIVED_DTS = new Set([
|
|
1089
1102
|
XSD_INTEGER_DT,
|
|
@@ -1142,13 +1155,31 @@ function inferDatatypeForShorthandLexical(lex) {
|
|
|
1142
1155
|
|
|
1143
1156
|
function extractLiteralLanguageTag(litVal) {
|
|
1144
1157
|
if (typeof litVal !== 'string' || !literalHasLangTag(litVal)) return null;
|
|
1145
|
-
|
|
1158
|
+
|
|
1159
|
+
let lastQuote;
|
|
1160
|
+
let quoteLen;
|
|
1161
|
+
if (litVal.startsWith('\"\"\"')) {
|
|
1162
|
+
lastQuote = litVal.lastIndexOf('\"\"\"');
|
|
1163
|
+
quoteLen = 3;
|
|
1164
|
+
} else {
|
|
1165
|
+
lastQuote = litVal.lastIndexOf('"');
|
|
1166
|
+
quoteLen = 1;
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1146
1169
|
if (lastQuote < 0) return null;
|
|
1147
|
-
const after = lastQuote +
|
|
1170
|
+
const after = lastQuote + quoteLen;
|
|
1148
1171
|
if (after >= litVal.length || litVal[after] !== '@') return null;
|
|
1149
1172
|
const tag = litVal.slice(after + 1);
|
|
1150
|
-
if (
|
|
1151
|
-
return tag;
|
|
1173
|
+
if (!isValidLanguageTag(tag, true)) return null;
|
|
1174
|
+
return tag.toLowerCase();
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1177
|
+
function isValidLanguageTag(tag, allowDirectionalSuffix) {
|
|
1178
|
+
if (typeof tag !== 'string') return false;
|
|
1179
|
+
const pattern = allowDirectionalSuffix
|
|
1180
|
+
? /^[A-Za-z]{1,8}(?:-[A-Za-z0-9]{1,8})*(?:--(?:ltr|rtl))?$/
|
|
1181
|
+
: /^[A-Za-z]{1,8}(?:-[A-Za-z0-9]{1,8})*$/;
|
|
1182
|
+
return pattern.test(tag);
|
|
1152
1183
|
}
|
|
1153
1184
|
|
|
1154
1185
|
function literalLexicalValue(litVal) {
|
|
@@ -1207,17 +1238,18 @@ function canonicalFloatDoubleLex(n) {
|
|
|
1207
1238
|
}
|
|
1208
1239
|
|
|
1209
1240
|
function parseStringLikeDatatypeValue(lexical, dt) {
|
|
1210
|
-
|
|
1241
|
+
const value = String(lexical);
|
|
1211
1242
|
|
|
1212
1243
|
if (dt === XSD_NS + 'normalizedString') {
|
|
1213
|
-
|
|
1244
|
+
if (/[\t\n\r]/.test(value)) return null;
|
|
1214
1245
|
} else if (dt !== XSD_STRING_DT) {
|
|
1215
|
-
|
|
1246
|
+
// String-derived datatypes with whitespace facet collapse are considered
|
|
1247
|
+
// lexically valid only when the spelling is already in collapsed form.
|
|
1248
|
+
if (/[\t\n\r]/.test(value) || /^ | $/.test(value) || / {2,}/.test(value)) return null;
|
|
1216
1249
|
}
|
|
1217
1250
|
|
|
1218
1251
|
if (dt === XSD_NS + 'language') {
|
|
1219
|
-
if (
|
|
1220
|
-
value = value.toLowerCase();
|
|
1252
|
+
if (!isValidLanguageTag(value, false)) return null;
|
|
1221
1253
|
} else if (dt === XSD_NS + 'Name') {
|
|
1222
1254
|
if (!/^[:_\p{L}][:_\p{L}\p{N}.\-\u00B7\u0300-\u036F\u203F-\u2040]*$/u.test(value)) return null;
|
|
1223
1255
|
} else if (dt === XSD_NS + 'NCName') {
|
|
@@ -1229,9 +1261,51 @@ function parseStringLikeDatatypeValue(lexical, dt) {
|
|
|
1229
1261
|
return {
|
|
1230
1262
|
family: 'string',
|
|
1231
1263
|
dt,
|
|
1232
|
-
value,
|
|
1233
|
-
canonicalLex: value,
|
|
1234
|
-
canonicalLiteral: makeDatatypeTypedLiteral(value, dt),
|
|
1264
|
+
value: dt === XSD_NS + 'language' ? value.toLowerCase() : value,
|
|
1265
|
+
canonicalLex: dt === XSD_NS + 'language' ? value.toLowerCase() : value,
|
|
1266
|
+
canonicalLiteral: makeDatatypeTypedLiteral(dt === XSD_NS + 'language' ? value.toLowerCase() : value, dt),
|
|
1267
|
+
comparable: true,
|
|
1268
|
+
};
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1271
|
+
function parsePlainLiteralDatatypeValue(lexical) {
|
|
1272
|
+
const parsed = splitPlainLiteralLexical(lexical);
|
|
1273
|
+
if (!parsed) return null;
|
|
1274
|
+
const canonicalLex = `${parsed.text}@${parsed.lang}`;
|
|
1275
|
+
return {
|
|
1276
|
+
family: 'plainLiteral',
|
|
1277
|
+
dt: RDF_PLAIN_LITERAL_DT,
|
|
1278
|
+
value: parsed.text,
|
|
1279
|
+
lang: parsed.lang,
|
|
1280
|
+
canonicalLex,
|
|
1281
|
+
canonicalLiteral: makeDatatypeTypedLiteral(canonicalLex, RDF_PLAIN_LITERAL_DT),
|
|
1282
|
+
comparable: true,
|
|
1283
|
+
};
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
function splitPlainLiteralLexical(lexical) {
|
|
1287
|
+
const s = String(lexical);
|
|
1288
|
+
const at = s.lastIndexOf('@');
|
|
1289
|
+
// rdf:PlainLiteral lexical forms encode the literal as text + "@" +
|
|
1290
|
+
// language-tag. The language tag may be empty, e.g. "abc@".
|
|
1291
|
+
// A lexical with no separator at all, e.g. "abc", is ill-typed.
|
|
1292
|
+
if (at < 0) return null;
|
|
1293
|
+
const text = s.slice(0, at);
|
|
1294
|
+
const lang = s.slice(at + 1);
|
|
1295
|
+
if (lang !== '' && !isValidLanguageTag(lang, false)) return null;
|
|
1296
|
+
return { text, lang: lang.toLowerCase() };
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
function parseXmlLiteralDatatypeValue(lexical) {
|
|
1300
|
+
const s = String(lexical);
|
|
1301
|
+
if (!isWellFormedXmlFragment(s)) return null;
|
|
1302
|
+
const canonicalLex = s.trim();
|
|
1303
|
+
return {
|
|
1304
|
+
family: 'xmlLiteral',
|
|
1305
|
+
dt: RDF_XML_LITERAL_DT,
|
|
1306
|
+
value: canonicalLex,
|
|
1307
|
+
canonicalLex,
|
|
1308
|
+
canonicalLiteral: makeDatatypeTypedLiteral(canonicalLex, RDF_XML_LITERAL_DT),
|
|
1235
1309
|
comparable: true,
|
|
1236
1310
|
};
|
|
1237
1311
|
}
|
|
@@ -1319,6 +1393,11 @@ function parseFloatDoubleDatatypeValue(lexical, dt) {
|
|
|
1319
1393
|
const special = parseXsdFloatSpecialLex(s);
|
|
1320
1394
|
const value = special !== null ? special : Number(s);
|
|
1321
1395
|
if (Number.isNaN(value) && s !== 'NaN') return null;
|
|
1396
|
+
if (Number.isFinite(value)) {
|
|
1397
|
+
const abs = Math.abs(value);
|
|
1398
|
+
if (dt === XSD_FLOAT_DT && abs > 0 && (abs > XSD_FLOAT_MAX_VALUE || abs < XSD_FLOAT_MIN_POSITIVE_VALUE)) return null;
|
|
1399
|
+
if (dt === XSD_DOUBLE_DT && abs > 0 && (abs > XSD_DOUBLE_MAX_VALUE || abs < XSD_DOUBLE_MIN_POSITIVE_VALUE)) return null;
|
|
1400
|
+
}
|
|
1322
1401
|
const canonicalLex = canonicalFloatDoubleLex(value);
|
|
1323
1402
|
return {
|
|
1324
1403
|
family: 'numeric',
|
|
@@ -1408,7 +1487,11 @@ function parseBinaryDatatypeValue(lexical, dt) {
|
|
|
1408
1487
|
|
|
1409
1488
|
function parseAnyUriDatatypeValue(lexical) {
|
|
1410
1489
|
const value = String(lexical);
|
|
1411
|
-
if (/[
|
|
1490
|
+
if (/[^\u0021-\u007E]/.test(value) || /[<>"{}|\\^`]/.test(value)) return null;
|
|
1491
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
1492
|
+
if (value[i] === '%' && !/^[0-9A-Fa-f]{2}$/.test(value.slice(i + 1, i + 3))) return null;
|
|
1493
|
+
}
|
|
1494
|
+
if (!isValidIriReferenceLexical(value)) return null;
|
|
1412
1495
|
return {
|
|
1413
1496
|
family: 'anyURI',
|
|
1414
1497
|
dt: XSD_ANY_URI_DT,
|
|
@@ -1419,6 +1502,116 @@ function parseAnyUriDatatypeValue(lexical) {
|
|
|
1419
1502
|
};
|
|
1420
1503
|
}
|
|
1421
1504
|
|
|
1505
|
+
function isValidIriReferenceLexical(value) {
|
|
1506
|
+
// Minimal RFC 3987/3986 structural check for IRI references. In
|
|
1507
|
+
// particular, a relative reference may not start with a colon-bearing first
|
|
1508
|
+
// path segment such as ":abc"; this is the OWL 2 RL anyURI illtyped case.
|
|
1509
|
+
// Empty references and fragment-only references are allowed.
|
|
1510
|
+
const s = String(value);
|
|
1511
|
+
if (s === '') return true;
|
|
1512
|
+
if (/^[A-Za-z][A-Za-z0-9+.-]*:/.test(s)) return true; // absolute scheme
|
|
1513
|
+
if (s.startsWith('//') || s.startsWith('/') || s.startsWith('?') || s.startsWith('#')) return true;
|
|
1514
|
+
const cut = s.search(/[/?#]/);
|
|
1515
|
+
const firstSegment = cut < 0 ? s : s.slice(0, cut);
|
|
1516
|
+
return !firstSegment.includes(':');
|
|
1517
|
+
}
|
|
1518
|
+
|
|
1519
|
+
function isWellFormedXmlFragment(input) {
|
|
1520
|
+
const source = String(input).trim();
|
|
1521
|
+
if (!source) return false;
|
|
1522
|
+
const stack = [];
|
|
1523
|
+
let seenElement = false;
|
|
1524
|
+
let position = 0;
|
|
1525
|
+
|
|
1526
|
+
while (position < source.length) {
|
|
1527
|
+
const open = source.indexOf('<', position);
|
|
1528
|
+
if (open < 0) return stack.length === 0 && isValidXmlText(source.slice(position)) && seenElement;
|
|
1529
|
+
if (!isValidXmlText(source.slice(position, open))) return false;
|
|
1530
|
+
|
|
1531
|
+
if (source.startsWith('<!--', open)) {
|
|
1532
|
+
const close = source.indexOf('-->', open + 4);
|
|
1533
|
+
if (close < 0 || source.slice(open + 4, close).includes('--')) return false;
|
|
1534
|
+
position = close + 3;
|
|
1535
|
+
continue;
|
|
1536
|
+
}
|
|
1537
|
+
|
|
1538
|
+
if (source.startsWith('<![CDATA[', open)) {
|
|
1539
|
+
const close = source.indexOf(']]>', open + 9);
|
|
1540
|
+
if (close < 0) return false;
|
|
1541
|
+
position = close + 3;
|
|
1542
|
+
continue;
|
|
1543
|
+
}
|
|
1544
|
+
|
|
1545
|
+
if (source.startsWith('<?', open)) {
|
|
1546
|
+
const close = source.indexOf('?>', open + 2);
|
|
1547
|
+
if (close < 0) return false;
|
|
1548
|
+
position = close + 2;
|
|
1549
|
+
continue;
|
|
1550
|
+
}
|
|
1551
|
+
|
|
1552
|
+
if (source.startsWith('</', open)) {
|
|
1553
|
+
const close = source.indexOf('>', open + 2);
|
|
1554
|
+
if (close < 0) return false;
|
|
1555
|
+
const name = source.slice(open + 2, close).trim();
|
|
1556
|
+
if (!isValidXmlName(name) || stack.pop() !== name) return false;
|
|
1557
|
+
position = close + 1;
|
|
1558
|
+
continue;
|
|
1559
|
+
}
|
|
1560
|
+
|
|
1561
|
+
const close = findXmlTagEnd(source, open + 1);
|
|
1562
|
+
if (close < 0) return false;
|
|
1563
|
+
const raw = source.slice(open + 1, close);
|
|
1564
|
+
const selfClosing = /\/\s*$/.test(raw);
|
|
1565
|
+
const content = selfClosing ? raw.replace(/\/\s*$/, '').trim() : raw.trim();
|
|
1566
|
+
const nameMatch = /^([^\s/>]+)/.exec(content);
|
|
1567
|
+
if (!nameMatch || !isValidXmlName(nameMatch[1]) || !areValidXmlAttributes(content.slice(nameMatch[0].length))) return false;
|
|
1568
|
+
seenElement = true;
|
|
1569
|
+
if (!selfClosing) stack.push(nameMatch[1]);
|
|
1570
|
+
position = close + 1;
|
|
1571
|
+
}
|
|
1572
|
+
|
|
1573
|
+
return stack.length === 0 && seenElement;
|
|
1574
|
+
}
|
|
1575
|
+
|
|
1576
|
+
function findXmlTagEnd(source, start) {
|
|
1577
|
+
let quote = null;
|
|
1578
|
+
for (let i = start; i < source.length; i += 1) {
|
|
1579
|
+
const ch = source[i];
|
|
1580
|
+
if (quote) {
|
|
1581
|
+
if (ch === quote) quote = null;
|
|
1582
|
+
} else if (ch === '"' || ch === "'") {
|
|
1583
|
+
quote = ch;
|
|
1584
|
+
} else if (ch === '>') {
|
|
1585
|
+
return i;
|
|
1586
|
+
}
|
|
1587
|
+
}
|
|
1588
|
+
return -1;
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1591
|
+
function areValidXmlAttributes(source) {
|
|
1592
|
+
let rest = String(source).trim();
|
|
1593
|
+
const seen = new Set();
|
|
1594
|
+
while (rest) {
|
|
1595
|
+
const m = /^([A-Za-z_:\u0080-\uFFFF][A-Za-z0-9_.:\-\u0080-\uFFFF]*)\s*=\s*("[^"]*"|'[^']*')\s*/u.exec(rest);
|
|
1596
|
+
if (!m || seen.has(m[1]) || !isValidXmlAttributeValue(m[2].slice(1, -1))) return false;
|
|
1597
|
+
seen.add(m[1]);
|
|
1598
|
+
rest = rest.slice(m[0].length).trim();
|
|
1599
|
+
}
|
|
1600
|
+
return true;
|
|
1601
|
+
}
|
|
1602
|
+
|
|
1603
|
+
function isValidXmlAttributeValue(value) {
|
|
1604
|
+
return !/[<]/.test(value) && isValidXmlText(value);
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1607
|
+
function isValidXmlText(value) {
|
|
1608
|
+
return !/[<&]/.test(String(value).replace(/&(?:amp|lt|gt|quot|apos|#\d+|#x[0-9A-Fa-f]+);/g, ''));
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
function isValidXmlName(name) {
|
|
1612
|
+
return /^[A-Za-z_:\u0080-\uFFFF][A-Za-z0-9_.:\-\u0080-\uFFFF]*$/u.test(name) && !/^xml$/i.test(name);
|
|
1613
|
+
}
|
|
1614
|
+
|
|
1422
1615
|
function isLeapYearBigInt(year) {
|
|
1423
1616
|
if (year % 400n === 0n) return true;
|
|
1424
1617
|
if (year % 100n === 0n) return false;
|
|
@@ -1575,11 +1768,33 @@ function parseLangStringDatatypeValue(t, lexical) {
|
|
|
1575
1768
|
};
|
|
1576
1769
|
}
|
|
1577
1770
|
|
|
1771
|
+
function literalTermDatatypeKey(t) {
|
|
1772
|
+
return `${literalLexicalValue(t.value)}^^${literalDatatypeIri(t) || ''}`;
|
|
1773
|
+
}
|
|
1774
|
+
|
|
1578
1775
|
function parseDatatypeValueForDatatype(t, dt) {
|
|
1579
1776
|
if (!(t instanceof Literal) || typeof dt !== 'string' || !isSupportedDatatypeIri(dt)) return null;
|
|
1777
|
+
|
|
1778
|
+
if (dt === RDFS_LITERAL_DT) {
|
|
1779
|
+
const ownDt = literalDatatypeIri(t);
|
|
1780
|
+
if (ownDt === null || !isSupportedDatatypeIri(ownDt)) return null;
|
|
1781
|
+
const ownValue = parseDatatypeValueForDatatype(t, ownDt);
|
|
1782
|
+
if (!ownValue) return null;
|
|
1783
|
+
return {
|
|
1784
|
+
family: 'literal',
|
|
1785
|
+
dt: RDFS_LITERAL_DT,
|
|
1786
|
+
value: literalTermDatatypeKey(t),
|
|
1787
|
+
canonicalLex: literalLexicalValue(t.value),
|
|
1788
|
+
canonicalLiteral: t,
|
|
1789
|
+
comparable: false,
|
|
1790
|
+
};
|
|
1791
|
+
}
|
|
1792
|
+
|
|
1580
1793
|
const lexical = literalLexicalValue(t.value);
|
|
1581
1794
|
|
|
1582
1795
|
if (dt === RDF_LANGSTRING_DT) return parseLangStringDatatypeValue(t, lexical);
|
|
1796
|
+
if (dt === RDF_PLAIN_LITERAL_DT) return parsePlainLiteralDatatypeValue(lexical);
|
|
1797
|
+
if (dt === RDF_XML_LITERAL_DT) return parseXmlLiteralDatatypeValue(lexical);
|
|
1583
1798
|
if (literalHasLangTag(t.value)) return null;
|
|
1584
1799
|
if (XSD_STRING_LIKE_DTS.has(dt)) return parseStringLikeDatatypeValue(lexical, dt);
|
|
1585
1800
|
if (dt === XSD_BOOLEAN_DT) return parseBooleanDatatypeValue(lexical);
|
|
@@ -1605,10 +1820,11 @@ function compareDecimalExactValues(a, b) {
|
|
|
1605
1820
|
|
|
1606
1821
|
function datatypeValuesSame(a, b) {
|
|
1607
1822
|
if (!a || !b || !a.comparable || !b.comparable) return false;
|
|
1608
|
-
if (a.family === 'langString' || b.family === 'langString') {
|
|
1823
|
+
if (a.family === 'langString' || b.family === 'langString' || a.family === 'plainLiteral' || b.family === 'plainLiteral') {
|
|
1609
1824
|
return a.family === b.family && a.value === b.value && a.lang === b.lang;
|
|
1610
1825
|
}
|
|
1611
1826
|
if (a.family === 'string' && b.family === 'string') return a.value === b.value;
|
|
1827
|
+
if (a.family === 'xmlLiteral' && b.family === 'xmlLiteral') return a.value === b.value;
|
|
1612
1828
|
if (a.family === 'boolean' && b.family === 'boolean') return a.value === b.value;
|
|
1613
1829
|
if (a.family === 'anyURI' && b.family === 'anyURI') return a.value === b.value;
|
|
1614
1830
|
if (a.family === 'binary' && b.family === 'binary') {
|
|
@@ -1635,7 +1851,9 @@ function datatypeValuesSame(a, b) {
|
|
|
1635
1851
|
function datatypeValuesComparable(a, b) {
|
|
1636
1852
|
if (!a || !b || !a.comparable || !b.comparable) return false;
|
|
1637
1853
|
if (a.family === 'dateTime' && b.family === 'dateTime' && a.hasTimezone !== b.hasTimezone) return false;
|
|
1854
|
+
if (a.family === 'numeric' && b.family === 'numeric') return true;
|
|
1638
1855
|
if (a.family === 'langString' || b.family === 'langString') return a.family === b.family;
|
|
1856
|
+
if (a.family === 'plainLiteral' || b.family === 'plainLiteral') return a.family === b.family;
|
|
1639
1857
|
if (a.family === 'string' || b.family === 'string') return a.family === b.family;
|
|
1640
1858
|
return a.family === b.family;
|
|
1641
1859
|
}
|
|
@@ -1659,6 +1877,17 @@ function evalDatatypeInspectionBuiltin(g, subst, kind) {
|
|
|
1659
1877
|
const dt = literalDatatypeIri(g.s);
|
|
1660
1878
|
if (dt === null) return [];
|
|
1661
1879
|
valueTerm = internIri(dt);
|
|
1880
|
+
const out = evalBindBuiltinObject(g.o, valueTerm, subst);
|
|
1881
|
+
|
|
1882
|
+
// OWL 2 RL datatype rules often need common string literals to also
|
|
1883
|
+
// participate in generic literal comparisons, while application rules still
|
|
1884
|
+
// ask for their precise datatype explicitly. When the datatype output is
|
|
1885
|
+
// unbound, expose rdfs:Literal as an additional super-datatype answer for
|
|
1886
|
+
// xsd:string and rdf:langString; bound-object calls remain strictly exact.
|
|
1887
|
+
if (g.o instanceof Var && (dt === XSD_STRING_DT || dt === RDF_LANGSTRING_DT)) {
|
|
1888
|
+
out.push(...evalBindBuiltinObject(g.o, internIri(RDFS_LITERAL_DT), subst));
|
|
1889
|
+
}
|
|
1890
|
+
return out;
|
|
1662
1891
|
} else if (kind === 'lexicalForm') {
|
|
1663
1892
|
valueTerm = makeStringLiteral(literalLexicalValue(g.s.value));
|
|
1664
1893
|
} else if (kind === 'language') {
|
|
@@ -1727,6 +1956,57 @@ function evalDatatypeValueComparisonBuiltin(g, subst, same) {
|
|
|
1727
1956
|
return [];
|
|
1728
1957
|
}
|
|
1729
1958
|
|
|
1959
|
+
function evalOwlSameAsBuiltin(g, subst, facts, maxResults) {
|
|
1960
|
+
const out = [];
|
|
1961
|
+
const seen = new Set();
|
|
1962
|
+
const limit = typeof maxResults === 'number' && maxResults > 0 ? maxResults : Infinity;
|
|
1963
|
+
|
|
1964
|
+
function addPair(left, right) {
|
|
1965
|
+
if (out.length >= limit) return true;
|
|
1966
|
+
const key = `${termFastKey ? termFastKey(left) : termToN3(left)} ${termFastKey ? termFastKey(right) : termToN3(right)}`;
|
|
1967
|
+
if (seen.has(key)) return false;
|
|
1968
|
+
let s2 = unifyTerm(g.s, left, subst);
|
|
1969
|
+
if (s2 === null) return false;
|
|
1970
|
+
s2 = unifyTerm(g.o, right, s2);
|
|
1971
|
+
if (s2 === null) return false;
|
|
1972
|
+
seen.add(key);
|
|
1973
|
+
out.push(s2);
|
|
1974
|
+
return out.length >= limit;
|
|
1975
|
+
}
|
|
1976
|
+
|
|
1977
|
+
function addReflexive(term) {
|
|
1978
|
+
return addPair(term, term);
|
|
1979
|
+
}
|
|
1980
|
+
|
|
1981
|
+
const sameAsIri = OWL_NS + 'sameAs';
|
|
1982
|
+
const differentFromIri = OWL_NS + 'differentFrom';
|
|
1983
|
+
|
|
1984
|
+
for (const tr of facts || []) {
|
|
1985
|
+
if (tr && tr.p instanceof Iri && tr.p.value === sameAsIri) {
|
|
1986
|
+
if (addPair(tr.s, tr.o)) return out;
|
|
1987
|
+
}
|
|
1988
|
+
}
|
|
1989
|
+
|
|
1990
|
+
// owl:sameAs is reflexive. Avoid enumerating the entire active term universe
|
|
1991
|
+
// for fully-unbound goals; only add the reflexive pairs that are immediately
|
|
1992
|
+
// needed to detect explicit self-diversity (?x owl:differentFrom ?x).
|
|
1993
|
+
if (!(g.s instanceof Var) && !(g.o instanceof Var)) {
|
|
1994
|
+
if (termsEqual(g.s, g.o)) addReflexive(g.s);
|
|
1995
|
+
} else if (!(g.s instanceof Var)) {
|
|
1996
|
+
addReflexive(g.s);
|
|
1997
|
+
} else if (!(g.o instanceof Var)) {
|
|
1998
|
+
addReflexive(g.o);
|
|
1999
|
+
} else {
|
|
2000
|
+
for (const tr of facts || []) {
|
|
2001
|
+
if (tr && tr.p instanceof Iri && tr.p.value === differentFromIri && termsEqual(tr.s, tr.o)) {
|
|
2002
|
+
if (addReflexive(tr.s)) return out;
|
|
2003
|
+
}
|
|
2004
|
+
}
|
|
2005
|
+
}
|
|
2006
|
+
|
|
2007
|
+
return out;
|
|
2008
|
+
}
|
|
2009
|
+
|
|
1730
2010
|
// ===========================================================================
|
|
1731
2011
|
// Math builtin helpers
|
|
1732
2012
|
// ===========================================================================
|
|
@@ -2866,6 +3146,8 @@ function evalBuiltin(goal, subst, facts, backRules, depth, varGen, maxResults) {
|
|
|
2866
3146
|
const pv = iriValue(g.p);
|
|
2867
3147
|
if (pv === null) return null;
|
|
2868
3148
|
|
|
3149
|
+
if (pv === OWL_NS + 'sameAs') return evalOwlSameAsBuiltin(g, subst, facts, maxResults);
|
|
3150
|
+
|
|
2869
3151
|
// Super restricted mode: disable *all* builtins except => / <= (log:implies / log:impliedBy)
|
|
2870
3152
|
if (typeof getSuperRestrictedMode === 'function' && getSuperRestrictedMode()) {
|
|
2871
3153
|
const allow1 = LOG_NS + 'implies';
|
|
@@ -5208,6 +5490,7 @@ function isBuiltinPred(p) {
|
|
|
5208
5490
|
}
|
|
5209
5491
|
|
|
5210
5492
|
if (__customBuiltinHandlers.has(v)) return true;
|
|
5493
|
+
if (v === OWL_NS + 'sameAs') return true;
|
|
5211
5494
|
|
|
5212
5495
|
return (
|
|
5213
5496
|
v.startsWith(CRYPTO_NS) ||
|
package/lib/cli.js
CHANGED
|
@@ -805,6 +805,7 @@ async function main() {
|
|
|
805
805
|
`Options:\n` +
|
|
806
806
|
` -a, --ast Print parsed AST as JSON and exit.\n` +
|
|
807
807
|
` --builtin <module.js> Load a custom builtin module (repeatable).\n` +
|
|
808
|
+
` --engine <n3|eyelang> Select the N3 engine (default) or eyelang engine.\n` +
|
|
808
809
|
` -d, --deterministic-skolem Make log:skolem stable across reasoning runs.\n` +
|
|
809
810
|
` -e, --enforce-https Rewrite http:// IRIs to https:// for log dereferencing builtins.\n` +
|
|
810
811
|
` -h, --help Show this help and exit.\n` +
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Aggregation builtins that run a inner goal and collect, count, sum, or select the best answers.
|
|
2
|
+
// Each handler clones the solver so the inner goal can enumerate independently of the outer goal.
|
|
3
|
+
import { compareTerms, copyResolved, isDecimalInteger, lexicalValue, listFromItems, numberTerm, numberTextFromDouble, parseFiniteNumber, unify } from '../term.mjs';
|
|
4
|
+
|
|
5
|
+
export const aggregationBuiltins = {
|
|
6
|
+
register(registry) {
|
|
7
|
+
registry.add('findall', 3, findall);
|
|
8
|
+
registry.add('countall', 2, countall);
|
|
9
|
+
registry.add('sumall', 3, sumall);
|
|
10
|
+
registry.add('aggregate_min', 5, aggregateBest(true));
|
|
11
|
+
registry.add('aggregate_max', 5, aggregateBest(false));
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
function* findall({ solver, goal, env }) {
|
|
16
|
+
const [template, innerGoal, bag] = goal.args;
|
|
17
|
+
const collector = solver.cloneForInnerGoal(10000000);
|
|
18
|
+
const collected = [];
|
|
19
|
+
for (const answerEnv of collector.solve([innerGoal], env.clone(), 0)) collected.push(copyResolved(template, answerEnv));
|
|
20
|
+
const next = env.clone();
|
|
21
|
+
if (unify(bag, listFromItems(collected), next)) yield next;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function* countall({ solver, goal, env }) {
|
|
25
|
+
const [innerGoal, count] = goal.args;
|
|
26
|
+
const collector = solver.cloneForInnerGoal(10000000);
|
|
27
|
+
let n = 0;
|
|
28
|
+
for (const _ of collector.solve([innerGoal], env.clone(), 0)) n++;
|
|
29
|
+
const next = env.clone();
|
|
30
|
+
if (unify(count, numberTerm(n), next)) yield next;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function* sumall({ solver, goal, env }) {
|
|
34
|
+
const [template, innerGoal, sum] = goal.args;
|
|
35
|
+
const collector = solver.cloneForInnerGoal(10000000);
|
|
36
|
+
let intSum = 0n;
|
|
37
|
+
let floatMode = false;
|
|
38
|
+
let floatSum = 0;
|
|
39
|
+
for (const answerEnv of collector.solve([innerGoal], env.clone(), 0)) {
|
|
40
|
+
const text = lexicalValue(template, answerEnv);
|
|
41
|
+
if (text == null) return;
|
|
42
|
+
if (!floatMode && isDecimalInteger(text)) intSum += BigInt(text);
|
|
43
|
+
else {
|
|
44
|
+
const value = parseFiniteNumber(text);
|
|
45
|
+
if (value == null) return;
|
|
46
|
+
if (!floatMode) { floatSum = Number(intSum); floatMode = true; }
|
|
47
|
+
floatSum += value;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const result = floatMode ? numberTextFromDouble(floatSum) : intSum.toString();
|
|
51
|
+
const next = env.clone();
|
|
52
|
+
if (unify(sum, numberTerm(result), next)) yield next;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function aggregateBest(wantMin) {
|
|
56
|
+
return function* ({ solver, goal, env }) {
|
|
57
|
+
const [keyTemplate, valueTemplate, innerGoal, bestKey, bestValue] = goal.args;
|
|
58
|
+
const collector = solver.cloneForInnerGoal(10000000);
|
|
59
|
+
let has = false;
|
|
60
|
+
let key = null;
|
|
61
|
+
let value = null;
|
|
62
|
+
for (const answerEnv of collector.solve([innerGoal], env.clone(), 0)) {
|
|
63
|
+
const candidateKey = copyResolved(keyTemplate, answerEnv);
|
|
64
|
+
const candidateValue = copyResolved(valueTemplate, answerEnv);
|
|
65
|
+
if (!has) {
|
|
66
|
+
has = true;
|
|
67
|
+
key = candidateKey;
|
|
68
|
+
value = candidateValue;
|
|
69
|
+
} else {
|
|
70
|
+
const cmp = compareTerms(candidateKey, key);
|
|
71
|
+
if ((wantMin && cmp < 0) || (!wantMin && cmp > 0)) {
|
|
72
|
+
key = candidateKey;
|
|
73
|
+
value = candidateValue;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (!has) return;
|
|
78
|
+
const next = env.clone();
|
|
79
|
+
if (unify(bestKey, key, next) && unify(bestValue, value, next)) yield next;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// Reusable alphametic addition solver.
|
|
2
|
+
// It evaluates column constraints right-to-left, so examples such as
|
|
3
|
+
// SEND+MORE=MONEY and DONALD+GERALD=ROBERT do not need to express digit search
|
|
4
|
+
// with many relational select/3 and arithmetic goals.
|
|
5
|
+
import { atom, deref, listFromItems, numberTerm, properListItems, unify } from '../term.mjs';
|
|
6
|
+
|
|
7
|
+
export const alphameticBuiltins = {
|
|
8
|
+
register(registry) {
|
|
9
|
+
registry.add('alphametic_sum', 5, alphameticSum, {
|
|
10
|
+
fallbackWhenNotReady: true,
|
|
11
|
+
ready: alphameticReady,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
function alphameticReady(goal, env) {
|
|
17
|
+
return atomList(goal.args[0], env) !== null && wordList(goal.args[1], env) !== null && atomList(goal.args[2], env) !== null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function* alphameticSum({ goal, env }) {
|
|
21
|
+
const letters = atomList(goal.args[0], env);
|
|
22
|
+
const addends = wordList(goal.args[1], env);
|
|
23
|
+
const result = atomList(goal.args[2], env);
|
|
24
|
+
if (!letters || !addends || !result || letters.length > 10 || addends.length === 0) return;
|
|
25
|
+
|
|
26
|
+
const letterSet = new Set(letters);
|
|
27
|
+
for (const word of [...addends, result]) for (const letter of word) if (!letterSet.has(letter)) return;
|
|
28
|
+
|
|
29
|
+
const leading = new Set();
|
|
30
|
+
for (const word of [...addends, result]) if (word.length > 1) leading.add(word[0]);
|
|
31
|
+
const maxLen = Math.max(result.length, ...addends.map((word) => word.length));
|
|
32
|
+
const assignment = new Map();
|
|
33
|
+
const used = Array(10).fill(false);
|
|
34
|
+
|
|
35
|
+
function canUse(letter, digit) {
|
|
36
|
+
return !used[digit] && !(digit === 0 && leading.has(letter));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function assignDigit(letter, digit) {
|
|
40
|
+
assignment.set(letter, digit);
|
|
41
|
+
used[digit] = true;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function unassignDigit(letter, digit) {
|
|
45
|
+
assignment.delete(letter);
|
|
46
|
+
used[digit] = false;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function* assignAddends(column, carry, index, sum) {
|
|
50
|
+
if (index >= addends.length) {
|
|
51
|
+
yield* finishColumn(column, sum);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const word = addends[index];
|
|
55
|
+
const letter = word[word.length - 1 - column];
|
|
56
|
+
if (letter === undefined) {
|
|
57
|
+
yield* assignAddends(column, carry, index + 1, sum);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const assigned = assignment.get(letter);
|
|
61
|
+
if (assigned !== undefined) {
|
|
62
|
+
yield* assignAddends(column, carry, index + 1, sum + assigned);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
for (let digit = 0; digit <= 9; digit++) {
|
|
66
|
+
if (!canUse(letter, digit)) continue;
|
|
67
|
+
assignDigit(letter, digit);
|
|
68
|
+
yield* assignAddends(column, carry, index + 1, sum + digit);
|
|
69
|
+
unassignDigit(letter, digit);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function* finishColumn(column, sum) {
|
|
74
|
+
const resultLetter = result[result.length - 1 - column];
|
|
75
|
+
const digit = sum % 10;
|
|
76
|
+
const nextCarry = Math.floor(sum / 10);
|
|
77
|
+
if (resultLetter === undefined) {
|
|
78
|
+
if (digit === 0) yield* solveColumn(column + 1, nextCarry);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const assigned = assignment.get(resultLetter);
|
|
82
|
+
if (assigned !== undefined) {
|
|
83
|
+
if (assigned === digit) yield* solveColumn(column + 1, nextCarry);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (!canUse(resultLetter, digit)) return;
|
|
87
|
+
assignDigit(resultLetter, digit);
|
|
88
|
+
yield* solveColumn(column + 1, nextCarry);
|
|
89
|
+
unassignDigit(resultLetter, digit);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function* solveColumn(column, carry) {
|
|
93
|
+
if (column >= maxLen) {
|
|
94
|
+
if (carry !== 0) return;
|
|
95
|
+
if (assignment.size !== letters.length) return;
|
|
96
|
+
yield new Map(assignment);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
yield* assignAddends(column, carry, 0, carry);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
for (const solution of solveColumn(0, 0)) {
|
|
103
|
+
const digitTerms = letters.map((letter) => numberTerm(String(solution.get(letter))));
|
|
104
|
+
const values = [...addends, result].map((word) => wordValue(word, solution));
|
|
105
|
+
const valueTerms = values.map((value) => numberTerm(String(value)));
|
|
106
|
+
const next = env.clone();
|
|
107
|
+
if (unify(goal.args[3], listFromItems(digitTerms), next) && unify(goal.args[4], listFromItems(valueTerms), next)) yield next;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function wordValue(word, assignment) {
|
|
112
|
+
let value = 0;
|
|
113
|
+
for (const letter of word) value = value * 10 + assignment.get(letter);
|
|
114
|
+
return value;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function atomList(term, env) {
|
|
118
|
+
const items = properListItems(term, env);
|
|
119
|
+
if (!items) return null;
|
|
120
|
+
const out = [];
|
|
121
|
+
for (const item of items) {
|
|
122
|
+
const text = atomKey(deref(item, env));
|
|
123
|
+
if (text == null) return null;
|
|
124
|
+
out.push(text);
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function wordList(term, env) {
|
|
130
|
+
const items = properListItems(term, env);
|
|
131
|
+
if (!items) return null;
|
|
132
|
+
const out = [];
|
|
133
|
+
for (const item of items) {
|
|
134
|
+
const word = atomList(item, env);
|
|
135
|
+
if (!word) return null;
|
|
136
|
+
out.push(word);
|
|
137
|
+
}
|
|
138
|
+
return out;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function atomKey(term) {
|
|
142
|
+
if (term.type === 'atom' || term.type === 'string' || term.type === 'number') return term.name;
|
|
143
|
+
return null;
|
|
144
|
+
}
|