@stevenvo780/st-lang 4.5.1 → 4.6.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/dist/bdd/index.d.ts +4 -0
- package/dist/bdd/index.d.ts.map +1 -0
- package/dist/bdd/index.js +29 -0
- package/dist/bdd/index.js.map +1 -0
- package/dist/bdd/manager.d.ts +122 -0
- package/dist/bdd/manager.d.ts.map +1 -0
- package/dist/bdd/manager.js +524 -0
- package/dist/bdd/manager.js.map +1 -0
- package/dist/bdd/types.d.ts +20 -0
- package/dist/bdd/types.d.ts.map +1 -0
- package/dist/bdd/types.js +28 -0
- package/dist/bdd/types.js.map +1 -0
- package/dist/categorical/fin-set.d.ts +39 -0
- package/dist/categorical/fin-set.d.ts.map +1 -0
- package/dist/categorical/fin-set.js +217 -0
- package/dist/categorical/fin-set.js.map +1 -0
- package/dist/categorical/free.d.ts +23 -0
- package/dist/categorical/free.d.ts.map +1 -0
- package/dist/categorical/free.js +168 -0
- package/dist/categorical/free.js.map +1 -0
- package/dist/categorical/functor.d.ts +40 -0
- package/dist/categorical/functor.d.ts.map +1 -0
- package/dist/categorical/functor.js +139 -0
- package/dist/categorical/functor.js.map +1 -0
- package/dist/categorical/index.d.ts +11 -0
- package/dist/categorical/index.d.ts.map +1 -0
- package/dist/categorical/index.js +33 -0
- package/dist/categorical/index.js.map +1 -0
- package/dist/categorical/limits.d.ts +64 -0
- package/dist/categorical/limits.d.ts.map +1 -0
- package/dist/categorical/limits.js +248 -0
- package/dist/categorical/limits.js.map +1 -0
- package/dist/categorical/monoidal.d.ts +14 -0
- package/dist/categorical/monoidal.d.ts.map +1 -0
- package/dist/categorical/monoidal.js +148 -0
- package/dist/categorical/monoidal.js.map +1 -0
- package/dist/categorical/poset.d.ts +14 -0
- package/dist/categorical/poset.d.ts.map +1 -0
- package/dist/categorical/poset.js +115 -0
- package/dist/categorical/poset.js.map +1 -0
- package/dist/categorical/types.d.ts +111 -0
- package/dist/categorical/types.d.ts.map +1 -0
- package/dist/categorical/types.js +15 -0
- package/dist/categorical/types.js.map +1 -0
- package/dist/csp-hoare/analysis.d.ts +51 -0
- package/dist/csp-hoare/analysis.d.ts.map +1 -0
- package/dist/csp-hoare/analysis.js +317 -0
- package/dist/csp-hoare/analysis.js.map +1 -0
- package/dist/csp-hoare/examples.d.ts +33 -0
- package/dist/csp-hoare/examples.d.ts.map +1 -0
- package/dist/csp-hoare/examples.js +108 -0
- package/dist/csp-hoare/examples.js.map +1 -0
- package/dist/csp-hoare/index.d.ts +6 -0
- package/dist/csp-hoare/index.d.ts.map +1 -0
- package/dist/csp-hoare/index.js +50 -0
- package/dist/csp-hoare/index.js.map +1 -0
- package/dist/csp-hoare/semantics.d.ts +49 -0
- package/dist/csp-hoare/semantics.d.ts.map +1 -0
- package/dist/csp-hoare/semantics.js +494 -0
- package/dist/csp-hoare/semantics.js.map +1 -0
- package/dist/csp-hoare/types.d.ts +60 -0
- package/dist/csp-hoare/types.d.ts.map +1 -0
- package/dist/csp-hoare/types.js +31 -0
- package/dist/csp-hoare/types.js.map +1 -0
- package/dist/game-theory/common-games.d.ts +50 -0
- package/dist/game-theory/common-games.d.ts.map +1 -0
- package/dist/game-theory/common-games.js +112 -0
- package/dist/game-theory/common-games.js.map +1 -0
- package/dist/game-theory/dominance.d.ts +26 -0
- package/dist/game-theory/dominance.d.ts.map +1 -0
- package/dist/game-theory/dominance.js +203 -0
- package/dist/game-theory/dominance.js.map +1 -0
- package/dist/game-theory/index.d.ts +8 -0
- package/dist/game-theory/index.d.ts.map +1 -0
- package/dist/game-theory/index.js +47 -0
- package/dist/game-theory/index.js.map +1 -0
- package/dist/game-theory/lemke-howson.d.ts +3 -0
- package/dist/game-theory/lemke-howson.d.ts.map +1 -0
- package/dist/game-theory/lemke-howson.js +269 -0
- package/dist/game-theory/lemke-howson.js.map +1 -0
- package/dist/game-theory/linalg.d.ts +7 -0
- package/dist/game-theory/linalg.d.ts.map +1 -0
- package/dist/game-theory/linalg.js +69 -0
- package/dist/game-theory/linalg.js.map +1 -0
- package/dist/game-theory/pure-nash.d.ts +3 -0
- package/dist/game-theory/pure-nash.d.ts.map +1 -0
- package/dist/game-theory/pure-nash.js +86 -0
- package/dist/game-theory/pure-nash.js.map +1 -0
- package/dist/game-theory/support-enumeration.d.ts +3 -0
- package/dist/game-theory/support-enumeration.d.ts.map +1 -0
- package/dist/game-theory/support-enumeration.js +214 -0
- package/dist/game-theory/support-enumeration.js.map +1 -0
- package/dist/game-theory/types.d.ts +57 -0
- package/dist/game-theory/types.d.ts.map +1 -0
- package/dist/game-theory/types.js +191 -0
- package/dist/game-theory/types.js.map +1 -0
- package/dist/hindley-milner/index.d.ts +7 -0
- package/dist/hindley-milner/index.d.ts.map +1 -0
- package/dist/hindley-milner/index.js +60 -0
- package/dist/hindley-milner/index.js.map +1 -0
- package/dist/hindley-milner/infer.d.ts +26 -0
- package/dist/hindley-milner/infer.d.ts.map +1 -0
- package/dist/hindley-milner/infer.js +278 -0
- package/dist/hindley-milner/infer.js.map +1 -0
- package/dist/hindley-milner/substitution.d.ts +21 -0
- package/dist/hindley-milner/substitution.d.ts.map +1 -0
- package/dist/hindley-milner/substitution.js +215 -0
- package/dist/hindley-milner/substitution.js.map +1 -0
- package/dist/hindley-milner/types.d.ts +84 -0
- package/dist/hindley-milner/types.d.ts.map +1 -0
- package/dist/hindley-milner/types.js +166 -0
- package/dist/hindley-milner/types.js.map +1 -0
- package/dist/hott/equality.d.ts +4 -0
- package/dist/hott/equality.d.ts.map +1 -0
- package/dist/hott/equality.js +108 -0
- package/dist/hott/equality.js.map +1 -0
- package/dist/hott/index.d.ts +13 -0
- package/dist/hott/index.d.ts.map +1 -0
- package/dist/hott/index.js +77 -0
- package/dist/hott/index.js.map +1 -0
- package/dist/hott/infer.d.ts +11 -0
- package/dist/hott/infer.d.ts.map +1 -0
- package/dist/hott/infer.js +465 -0
- package/dist/hott/infer.js.map +1 -0
- package/dist/hott/normalize.d.ts +5 -0
- package/dist/hott/normalize.d.ts.map +1 -0
- package/dist/hott/normalize.js +240 -0
- package/dist/hott/normalize.js.map +1 -0
- package/dist/hott/path-algebra.d.ts +25 -0
- package/dist/hott/path-algebra.d.ts.map +1 -0
- package/dist/hott/path-algebra.js +67 -0
- package/dist/hott/path-algebra.js.map +1 -0
- package/dist/hott/substitute.d.ts +3 -0
- package/dist/hott/substitute.d.ts.map +1 -0
- package/dist/hott/substitute.js +131 -0
- package/dist/hott/substitute.js.map +1 -0
- package/dist/hott/types.d.ts +126 -0
- package/dist/hott/types.d.ts.map +1 -0
- package/dist/hott/types.js +346 -0
- package/dist/hott/types.js.map +1 -0
- package/dist/index.d.ts +16 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +83 -3
- package/dist/index.js.map +1 -1
- package/dist/information-theory/index.d.ts +29 -0
- package/dist/information-theory/index.d.ts.map +1 -0
- package/dist/information-theory/index.js +323 -0
- package/dist/information-theory/index.js.map +1 -0
- package/dist/lemma-synthesis/index.d.ts +124 -0
- package/dist/lemma-synthesis/index.d.ts.map +1 -0
- package/dist/lemma-synthesis/index.js +640 -0
- package/dist/lemma-synthesis/index.js.map +1 -0
- package/dist/namespaces/logic.d.ts +42 -0
- package/dist/namespaces/logic.d.ts.map +1 -0
- package/dist/namespaces/logic.js +112 -0
- package/dist/namespaces/logic.js.map +1 -0
- package/dist/namespaces/proof-systems.d.ts +18 -0
- package/dist/namespaces/proof-systems.d.ts.map +1 -0
- package/dist/namespaces/proof-systems.js +59 -0
- package/dist/namespaces/proof-systems.js.map +1 -0
- package/dist/namespaces/reasoning.d.ts +26 -0
- package/dist/namespaces/reasoning.d.ts.map +1 -0
- package/dist/namespaces/reasoning.js +72 -0
- package/dist/namespaces/reasoning.js.map +1 -0
- package/dist/namespaces/semantics.d.ts +21 -0
- package/dist/namespaces/semantics.d.ts.map +1 -0
- package/dist/namespaces/semantics.js +64 -0
- package/dist/namespaces/semantics.js.map +1 -0
- package/dist/namespaces/solvers.d.ts +22 -0
- package/dist/namespaces/solvers.d.ts.map +1 -0
- package/dist/namespaces/solvers.js +66 -0
- package/dist/namespaces/solvers.js.map +1 -0
- package/dist/namespaces/type-theory.d.ts +22 -0
- package/dist/namespaces/type-theory.d.ts.map +1 -0
- package/dist/namespaces/type-theory.js +65 -0
- package/dist/namespaces/type-theory.js.map +1 -0
- package/dist/optimization/branch-and-bound.d.ts +11 -0
- package/dist/optimization/branch-and-bound.d.ts.map +1 -0
- package/dist/optimization/branch-and-bound.js +311 -0
- package/dist/optimization/branch-and-bound.js.map +1 -0
- package/dist/optimization/index.d.ts +5 -0
- package/dist/optimization/index.d.ts.map +1 -0
- package/dist/optimization/index.js +20 -0
- package/dist/optimization/index.js.map +1 -0
- package/dist/optimization/simplex.d.ts +8 -0
- package/dist/optimization/simplex.d.ts.map +1 -0
- package/dist/optimization/simplex.js +408 -0
- package/dist/optimization/simplex.js.map +1 -0
- package/dist/optimization/standard-form.d.ts +11 -0
- package/dist/optimization/standard-form.d.ts.map +1 -0
- package/dist/optimization/standard-form.js +112 -0
- package/dist/optimization/standard-form.js.map +1 -0
- package/dist/optimization/types.d.ts +44 -0
- package/dist/optimization/types.d.ts.map +1 -0
- package/dist/optimization/types.js +15 -0
- package/dist/optimization/types.js.map +1 -0
- package/dist/profiles/hol/connectives.d.ts +46 -0
- package/dist/profiles/hol/connectives.d.ts.map +1 -0
- package/dist/profiles/hol/connectives.js +104 -0
- package/dist/profiles/hol/connectives.js.map +1 -0
- package/dist/profiles/hol/index.d.ts +7 -0
- package/dist/profiles/hol/index.d.ts.map +1 -0
- package/dist/profiles/hol/index.js +77 -0
- package/dist/profiles/hol/index.js.map +1 -0
- package/dist/profiles/hol/rules.d.ts +31 -0
- package/dist/profiles/hol/rules.d.ts.map +1 -0
- package/dist/profiles/hol/rules.js +258 -0
- package/dist/profiles/hol/rules.js.map +1 -0
- package/dist/profiles/hol/term.d.ts +52 -0
- package/dist/profiles/hol/term.d.ts.map +1 -0
- package/dist/profiles/hol/term.js +345 -0
- package/dist/profiles/hol/term.js.map +1 -0
- package/dist/profiles/hol/type-system.d.ts +38 -0
- package/dist/profiles/hol/type-system.d.ts.map +1 -0
- package/dist/profiles/hol/type-system.js +133 -0
- package/dist/profiles/hol/type-system.js.map +1 -0
- package/dist/profiles/hol/types.d.ts +59 -0
- package/dist/profiles/hol/types.d.ts.map +1 -0
- package/dist/profiles/hol/types.js +26 -0
- package/dist/profiles/hol/types.js.map +1 -0
- package/dist/smt-lib/ast.d.ts +138 -0
- package/dist/smt-lib/ast.d.ts.map +1 -0
- package/dist/smt-lib/ast.js +73 -0
- package/dist/smt-lib/ast.js.map +1 -0
- package/dist/smt-lib/emitter.d.ts +12 -0
- package/dist/smt-lib/emitter.d.ts.map +1 -0
- package/dist/smt-lib/emitter.js +174 -0
- package/dist/smt-lib/emitter.js.map +1 -0
- package/dist/smt-lib/index.d.ts +6 -0
- package/dist/smt-lib/index.d.ts.map +1 -0
- package/dist/smt-lib/index.js +31 -0
- package/dist/smt-lib/index.js.map +1 -0
- package/dist/smt-lib/parser.d.ts +13 -0
- package/dist/smt-lib/parser.d.ts.map +1 -0
- package/dist/smt-lib/parser.js +614 -0
- package/dist/smt-lib/parser.js.map +1 -0
- package/dist/smt-lib/tokenizer.d.ts +16 -0
- package/dist/smt-lib/tokenizer.d.ts.map +1 -0
- package/dist/smt-lib/tokenizer.js +234 -0
- package/dist/smt-lib/tokenizer.js.map +1 -0
- package/dist/tactic-dsl/combinators.d.ts +6 -0
- package/dist/tactic-dsl/combinators.d.ts.map +1 -0
- package/dist/tactic-dsl/combinators.js +98 -0
- package/dist/tactic-dsl/combinators.js.map +1 -0
- package/dist/tactic-dsl/index.d.ts +39 -0
- package/dist/tactic-dsl/index.d.ts.map +1 -0
- package/dist/tactic-dsl/index.js +162 -0
- package/dist/tactic-dsl/index.js.map +1 -0
- package/dist/tactic-dsl/tactics.d.ts +21 -0
- package/dist/tactic-dsl/tactics.d.ts.map +1 -0
- package/dist/tactic-dsl/tactics.js +536 -0
- package/dist/tactic-dsl/tactics.js.map +1 -0
- package/dist/tactic-dsl/types.d.ts +54 -0
- package/dist/tactic-dsl/types.d.ts.map +1 -0
- package/dist/tactic-dsl/types.js +226 -0
- package/dist/tactic-dsl/types.js.map +1 -0
- package/dist/tests/api/namespaces.test.d.ts +9 -0
- package/dist/tests/api/namespaces.test.d.ts.map +1 -0
- package/dist/tests/api/namespaces.test.js +218 -0
- package/dist/tests/api/namespaces.test.js.map +1 -0
- package/dist/tests/bdd/manager.test.d.ts +2 -0
- package/dist/tests/bdd/manager.test.d.ts.map +1 -0
- package/dist/tests/bdd/manager.test.js +472 -0
- package/dist/tests/bdd/manager.test.js.map +1 -0
- package/dist/tests/categorical/categorical.test.d.ts +2 -0
- package/dist/tests/categorical/categorical.test.d.ts.map +1 -0
- package/dist/tests/categorical/categorical.test.js +300 -0
- package/dist/tests/categorical/categorical.test.js.map +1 -0
- package/dist/tests/csp-hoare/csp-hoare.test.d.ts +2 -0
- package/dist/tests/csp-hoare/csp-hoare.test.d.ts.map +1 -0
- package/dist/tests/csp-hoare/csp-hoare.test.js +313 -0
- package/dist/tests/csp-hoare/csp-hoare.test.js.map +1 -0
- package/dist/tests/game-theory/game-theory.test.d.ts +2 -0
- package/dist/tests/game-theory/game-theory.test.d.ts.map +1 -0
- package/dist/tests/game-theory/game-theory.test.js +252 -0
- package/dist/tests/game-theory/game-theory.test.js.map +1 -0
- package/dist/tests/hindley-milner/hindley-milner.test.d.ts +2 -0
- package/dist/tests/hindley-milner/hindley-milner.test.d.ts.map +1 -0
- package/dist/tests/hindley-milner/hindley-milner.test.js +327 -0
- package/dist/tests/hindley-milner/hindley-milner.test.js.map +1 -0
- package/dist/tests/hol/hol.test.d.ts +2 -0
- package/dist/tests/hol/hol.test.d.ts.map +1 -0
- package/dist/tests/hol/hol.test.js +340 -0
- package/dist/tests/hol/hol.test.js.map +1 -0
- package/dist/tests/hott/hott.test.d.ts +2 -0
- package/dist/tests/hott/hott.test.d.ts.map +1 -0
- package/dist/tests/hott/hott.test.js +271 -0
- package/dist/tests/hott/hott.test.js.map +1 -0
- package/dist/tests/information-theory/information-theory.test.d.ts +2 -0
- package/dist/tests/information-theory/information-theory.test.d.ts.map +1 -0
- package/dist/tests/information-theory/information-theory.test.js +291 -0
- package/dist/tests/information-theory/information-theory.test.js.map +1 -0
- package/dist/tests/lemma-synthesis/lemma-synthesis.test.d.ts +2 -0
- package/dist/tests/lemma-synthesis/lemma-synthesis.test.d.ts.map +1 -0
- package/dist/tests/lemma-synthesis/lemma-synthesis.test.js +460 -0
- package/dist/tests/lemma-synthesis/lemma-synthesis.test.js.map +1 -0
- package/dist/tests/optimization/ilp.test.d.ts +2 -0
- package/dist/tests/optimization/ilp.test.d.ts.map +1 -0
- package/dist/tests/optimization/ilp.test.js +204 -0
- package/dist/tests/optimization/ilp.test.js.map +1 -0
- package/dist/tests/optimization/lp.test.d.ts +2 -0
- package/dist/tests/optimization/lp.test.d.ts.map +1 -0
- package/dist/tests/optimization/lp.test.js +224 -0
- package/dist/tests/optimization/lp.test.js.map +1 -0
- package/dist/tests/properties/agm.property.test.d.ts +2 -0
- package/dist/tests/properties/agm.property.test.d.ts.map +1 -0
- package/dist/tests/properties/agm.property.test.js +75 -0
- package/dist/tests/properties/agm.property.test.js.map +1 -0
- package/dist/tests/properties/anti-unification.property.test.d.ts +2 -0
- package/dist/tests/properties/anti-unification.property.test.d.ts.map +1 -0
- package/dist/tests/properties/anti-unification.property.test.js +43 -0
- package/dist/tests/properties/anti-unification.property.test.js.map +1 -0
- package/dist/tests/properties/argumentation.property.test.d.ts +2 -0
- package/dist/tests/properties/argumentation.property.test.d.ts.map +1 -0
- package/dist/tests/properties/argumentation.property.test.js +51 -0
- package/dist/tests/properties/argumentation.property.test.js.map +1 -0
- package/dist/tests/properties/bayesian.property.test.d.ts +2 -0
- package/dist/tests/properties/bayesian.property.test.d.ts.map +1 -0
- package/dist/tests/properties/bayesian.property.test.js +32 -0
- package/dist/tests/properties/bayesian.property.test.js.map +1 -0
- package/dist/tests/properties/bisimulation.property.test.d.ts +2 -0
- package/dist/tests/properties/bisimulation.property.test.d.ts.map +1 -0
- package/dist/tests/properties/bisimulation.property.test.js +50 -0
- package/dist/tests/properties/bisimulation.property.test.js.map +1 -0
- package/dist/tests/properties/cdcl.property.test.d.ts +2 -0
- package/dist/tests/properties/cdcl.property.test.d.ts.map +1 -0
- package/dist/tests/properties/cdcl.property.test.js +70 -0
- package/dist/tests/properties/cdcl.property.test.js.map +1 -0
- package/dist/tests/properties/coinduction.property.test.d.ts +2 -0
- package/dist/tests/properties/coinduction.property.test.d.ts.map +1 -0
- package/dist/tests/properties/coinduction.property.test.js +34 -0
- package/dist/tests/properties/coinduction.property.test.js.map +1 -0
- package/dist/tests/properties/constructive-reals.property.test.d.ts +2 -0
- package/dist/tests/properties/constructive-reals.property.test.d.ts.map +1 -0
- package/dist/tests/properties/constructive-reals.property.test.js +59 -0
- package/dist/tests/properties/constructive-reals.property.test.js.map +1 -0
- package/dist/tests/properties/csp.property.test.d.ts +2 -0
- package/dist/tests/properties/csp.property.test.d.ts.map +1 -0
- package/dist/tests/properties/csp.property.test.js +58 -0
- package/dist/tests/properties/csp.property.test.js.map +1 -0
- package/dist/tests/properties/generators.d.ts +78 -0
- package/dist/tests/properties/generators.d.ts.map +1 -0
- package/dist/tests/properties/generators.js +348 -0
- package/dist/tests/properties/generators.js.map +1 -0
- package/dist/tests/properties/ho-unify.property.test.d.ts +2 -0
- package/dist/tests/properties/ho-unify.property.test.d.ts.map +1 -0
- package/dist/tests/properties/ho-unify.property.test.js +46 -0
- package/dist/tests/properties/ho-unify.property.test.js.map +1 -0
- package/dist/tests/properties/hyperreal.property.test.d.ts +2 -0
- package/dist/tests/properties/hyperreal.property.test.d.ts.map +1 -0
- package/dist/tests/properties/hyperreal.property.test.js +33 -0
- package/dist/tests/properties/hyperreal.property.test.js.map +1 -0
- package/dist/tests/properties/intuit-nj.property.test.d.ts +2 -0
- package/dist/tests/properties/intuit-nj.property.test.d.ts.map +1 -0
- package/dist/tests/properties/intuit-nj.property.test.js +57 -0
- package/dist/tests/properties/intuit-nj.property.test.js.map +1 -0
- package/dist/tests/properties/lambda-calc.property.test.d.ts +2 -0
- package/dist/tests/properties/lambda-calc.property.test.d.ts.map +1 -0
- package/dist/tests/properties/lambda-calc.property.test.js +35 -0
- package/dist/tests/properties/lambda-calc.property.test.js.map +1 -0
- package/dist/tests/properties/mln.property.test.d.ts +2 -0
- package/dist/tests/properties/mln.property.test.d.ts.map +1 -0
- package/dist/tests/properties/mln.property.test.js +41 -0
- package/dist/tests/properties/mln.property.test.js.map +1 -0
- package/dist/tests/properties/mltt.property.test.d.ts +2 -0
- package/dist/tests/properties/mltt.property.test.d.ts.map +1 -0
- package/dist/tests/properties/mltt.property.test.js +33 -0
- package/dist/tests/properties/mltt.property.test.js.map +1 -0
- package/dist/tests/properties/nbe.property.test.d.ts +2 -0
- package/dist/tests/properties/nbe.property.test.d.ts.map +1 -0
- package/dist/tests/properties/nbe.property.test.js +44 -0
- package/dist/tests/properties/nbe.property.test.js.map +1 -0
- package/dist/tests/properties/planning.property.test.d.ts +2 -0
- package/dist/tests/properties/planning.property.test.d.ts.map +1 -0
- package/dist/tests/properties/planning.property.test.js +51 -0
- package/dist/tests/properties/planning.property.test.js.map +1 -0
- package/dist/tests/properties/profile-bridge.property.test.d.ts +2 -0
- package/dist/tests/properties/profile-bridge.property.test.d.ts.map +1 -0
- package/dist/tests/properties/profile-bridge.property.test.js +71 -0
- package/dist/tests/properties/profile-bridge.property.test.js.map +1 -0
- package/dist/tests/properties/refinement-types.property.test.d.ts +2 -0
- package/dist/tests/properties/refinement-types.property.test.d.ts.map +1 -0
- package/dist/tests/properties/refinement-types.property.test.js +37 -0
- package/dist/tests/properties/refinement-types.property.test.js.map +1 -0
- package/dist/tests/properties/sequent-g3.property.test.d.ts +2 -0
- package/dist/tests/properties/sequent-g3.property.test.d.ts.map +1 -0
- package/dist/tests/properties/sequent-g3.property.test.js +34 -0
- package/dist/tests/properties/sequent-g3.property.test.js.map +1 -0
- package/dist/tests/properties/symbolic-diff.property.test.d.ts +2 -0
- package/dist/tests/properties/symbolic-diff.property.test.d.ts.map +1 -0
- package/dist/tests/properties/symbolic-diff.property.test.js +49 -0
- package/dist/tests/properties/symbolic-diff.property.test.js.map +1 -0
- package/dist/tests/properties/system-f.property.test.d.ts +2 -0
- package/dist/tests/properties/system-f.property.test.d.ts.map +1 -0
- package/dist/tests/properties/system-f.property.test.js +37 -0
- package/dist/tests/properties/system-f.property.test.js.map +1 -0
- package/dist/tests/properties/theorem-cache.property.test.d.ts +2 -0
- package/dist/tests/properties/theorem-cache.property.test.d.ts.map +1 -0
- package/dist/tests/properties/theorem-cache.property.test.js +38 -0
- package/dist/tests/properties/theorem-cache.property.test.js.map +1 -0
- package/dist/tests/properties/trs.property.test.d.ts +2 -0
- package/dist/tests/properties/trs.property.test.d.ts.map +1 -0
- package/dist/tests/properties/trs.property.test.js +34 -0
- package/dist/tests/properties/trs.property.test.js.map +1 -0
- package/dist/tests/properties/unification.property.test.d.ts +2 -0
- package/dist/tests/properties/unification.property.test.d.ts.map +1 -0
- package/dist/tests/properties/unification.property.test.js +42 -0
- package/dist/tests/properties/unification.property.test.js.map +1 -0
- package/dist/tests/smt-lib/emitter.test.d.ts +2 -0
- package/dist/tests/smt-lib/emitter.test.d.ts.map +1 -0
- package/dist/tests/smt-lib/emitter.test.js +155 -0
- package/dist/tests/smt-lib/emitter.test.js.map +1 -0
- package/dist/tests/smt-lib/parser.test.d.ts +2 -0
- package/dist/tests/smt-lib/parser.test.d.ts.map +1 -0
- package/dist/tests/smt-lib/parser.test.js +164 -0
- package/dist/tests/smt-lib/parser.test.js.map +1 -0
- package/dist/tests/smt-lib/tokenizer.test.d.ts +2 -0
- package/dist/tests/smt-lib/tokenizer.test.d.ts.map +1 -0
- package/dist/tests/smt-lib/tokenizer.test.js +59 -0
- package/dist/tests/smt-lib/tokenizer.test.js.map +1 -0
- package/dist/tests/tactic-dsl/tactic-dsl.test.d.ts +2 -0
- package/dist/tests/tactic-dsl/tactic-dsl.test.d.ts.map +1 -0
- package/dist/tests/tactic-dsl/tactic-dsl.test.js +259 -0
- package/dist/tests/tactic-dsl/tactic-dsl.test.js.map +1 -0
- package/dist/tests/tptp/bridge.test.d.ts +2 -0
- package/dist/tests/tptp/bridge.test.d.ts.map +1 -0
- package/dist/tests/tptp/bridge.test.js +154 -0
- package/dist/tests/tptp/bridge.test.js.map +1 -0
- package/dist/tests/tptp/emitter.test.d.ts +2 -0
- package/dist/tests/tptp/emitter.test.d.ts.map +1 -0
- package/dist/tests/tptp/emitter.test.js +128 -0
- package/dist/tests/tptp/emitter.test.js.map +1 -0
- package/dist/tests/tptp/parser.test.d.ts +2 -0
- package/dist/tests/tptp/parser.test.d.ts.map +1 -0
- package/dist/tests/tptp/parser.test.js +192 -0
- package/dist/tests/tptp/parser.test.js.map +1 -0
- package/dist/tests/tptp/tokenizer.test.d.ts +2 -0
- package/dist/tests/tptp/tokenizer.test.d.ts.map +1 -0
- package/dist/tests/tptp/tokenizer.test.js +60 -0
- package/dist/tests/tptp/tokenizer.test.js.map +1 -0
- package/dist/tptp/ast.d.ts +73 -0
- package/dist/tptp/ast.d.ts.map +1 -0
- package/dist/tptp/ast.js +35 -0
- package/dist/tptp/ast.js.map +1 -0
- package/dist/tptp/bridge.d.ts +14 -0
- package/dist/tptp/bridge.d.ts.map +1 -0
- package/dist/tptp/bridge.js +146 -0
- package/dist/tptp/bridge.js.map +1 -0
- package/dist/tptp/emitter.d.ts +5 -0
- package/dist/tptp/emitter.d.ts.map +1 -0
- package/dist/tptp/emitter.js +103 -0
- package/dist/tptp/emitter.js.map +1 -0
- package/dist/tptp/index.d.ts +7 -0
- package/dist/tptp/index.d.ts.map +1 -0
- package/dist/tptp/index.js +31 -0
- package/dist/tptp/index.js.map +1 -0
- package/dist/tptp/parser.d.ts +23 -0
- package/dist/tptp/parser.d.ts.map +1 -0
- package/dist/tptp/parser.js +440 -0
- package/dist/tptp/parser.js.map +1 -0
- package/dist/tptp/tokenizer.d.ts +14 -0
- package/dist/tptp/tokenizer.d.ts.map +1 -0
- package/dist/tptp/tokenizer.js +264 -0
- package/dist/tptp/tokenizer.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bdd/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ST BDD — Punto de entrada público
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Reduced Ordered Binary Decision Diagrams (ROBDDs) de Bryant (1986).
|
|
7
|
+
//
|
|
8
|
+
// API principal:
|
|
9
|
+
// - `BDDManager(numVars)` crea un manager con orden por defecto 0..n-1.
|
|
10
|
+
// - `variable(i)`, `not_`, `and_`, `or_`, `xor`, `implies`, `iff`, `ite`
|
|
11
|
+
// construyen y combinan BDDs canónicos.
|
|
12
|
+
// - `exists(v, b)`, `forall(v, b)` cuantifican.
|
|
13
|
+
// - `satCount`, `isSatisfiable`, `isValid`, `equivalent`, `evaluate`
|
|
14
|
+
// consultan.
|
|
15
|
+
// - `fromCNF(clauses)` ingiere SAT en formato DIMACS.
|
|
16
|
+
// - `fromFormula(ast)` ingiere árboles simbólicos.
|
|
17
|
+
//
|
|
18
|
+
// Garantías:
|
|
19
|
+
// - Canonicidad estructural: dos BDDs equivalentes son la misma
|
|
20
|
+
// referencia (apt para `equivalent` en O(1)).
|
|
21
|
+
// - Apply algorithm con memoización: AND/OR/XOR en O(|G1|·|G2|).
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.nodeId = exports.isTerminal = exports.BDDManager = void 0;
|
|
24
|
+
var manager_1 = require("./manager");
|
|
25
|
+
Object.defineProperty(exports, "BDDManager", { enumerable: true, get: function () { return manager_1.BDDManager; } });
|
|
26
|
+
var types_1 = require("./types");
|
|
27
|
+
Object.defineProperty(exports, "isTerminal", { enumerable: true, get: function () { return types_1.isTerminal; } });
|
|
28
|
+
Object.defineProperty(exports, "nodeId", { enumerable: true, get: function () { return types_1.nodeId; } });
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bdd/index.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,oCAAoC;AACpC,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,EAAE;AACF,iBAAiB;AACjB,0EAA0E;AAC1E,2EAA2E;AAC3E,4CAA4C;AAC5C,kDAAkD;AAClD,uEAAuE;AACvE,iBAAiB;AACjB,wDAAwD;AACxD,qDAAqD;AACrD,EAAE;AACF,aAAa;AACb,kEAAkE;AAClE,kDAAkD;AAClD,mEAAmE;;;AAEnE,qCAAuC;AAA9B,qGAAA,UAAU,OAAA;AAEnB,iCAA6C;AAApC,mGAAA,UAAU,OAAA;AAAE,+FAAA,MAAM,OAAA"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { BDDNode, BDDStats } from './types';
|
|
2
|
+
export declare class BDDManager {
|
|
3
|
+
numVars: number;
|
|
4
|
+
private readonly TRUE;
|
|
5
|
+
private readonly FALSE;
|
|
6
|
+
private uniqueTable;
|
|
7
|
+
private nextId;
|
|
8
|
+
private reductions;
|
|
9
|
+
private memoAnd;
|
|
10
|
+
private memoOr;
|
|
11
|
+
private memoXor;
|
|
12
|
+
private memoIte;
|
|
13
|
+
private memoNot;
|
|
14
|
+
varOrder: number[];
|
|
15
|
+
constructor(numVars: number);
|
|
16
|
+
/**
|
|
17
|
+
* Cambia el orden global de variables. Invalida memo caches porque
|
|
18
|
+
* el orden afecta la estructura de los nodos. NO reordena nodos ya
|
|
19
|
+
* construidos — si los reutilizas tras setVarOrder pueden quedar
|
|
20
|
+
* inconsistentes; recomendado para sesiones nuevas.
|
|
21
|
+
*/
|
|
22
|
+
setVarOrder(order: number[]): void;
|
|
23
|
+
/** Posición de la variable v dentro del orden actual (0 = top). */
|
|
24
|
+
private orderPos;
|
|
25
|
+
/** Devuelve la variable "top" de un nodo o +∞ si es terminal. */
|
|
26
|
+
private topVarPos;
|
|
27
|
+
true_(): BDDNode;
|
|
28
|
+
false_(): BDDNode;
|
|
29
|
+
/**
|
|
30
|
+
* Crea/recupera un nodo interno con reducción (R1) + (R2).
|
|
31
|
+
*/
|
|
32
|
+
private makeNode;
|
|
33
|
+
/** BDD de la variable i: nodo (i, FALSE, TRUE). */
|
|
34
|
+
variable(i: number): BDDNode;
|
|
35
|
+
/**
|
|
36
|
+
* Negación: implementada como ITE(b, FALSE, TRUE).
|
|
37
|
+
* Con memo dedicado para evitar recomputación.
|
|
38
|
+
*/
|
|
39
|
+
not_(b: BDDNode): BDDNode;
|
|
40
|
+
and_(a: BDDNode, b: BDDNode): BDDNode;
|
|
41
|
+
or_(a: BDDNode, b: BDDNode): BDDNode;
|
|
42
|
+
xor(a: BDDNode, b: BDDNode): BDDNode;
|
|
43
|
+
/** A → B ≡ ¬A ∨ B */
|
|
44
|
+
implies(a: BDDNode, b: BDDNode): BDDNode;
|
|
45
|
+
/** A ↔ B ≡ ¬(A ⊕ B) */
|
|
46
|
+
iff(a: BDDNode, b: BDDNode): BDDNode;
|
|
47
|
+
/**
|
|
48
|
+
* If-Then-Else canónico: ite(c, t, e).
|
|
49
|
+
* Equivale a (c ∧ t) ∨ (¬c ∧ e). Implementado con descomposición
|
|
50
|
+
* Shannon directa para mejor caché.
|
|
51
|
+
*/
|
|
52
|
+
ite(cond: BDDNode, thenB: BDDNode, elseB: BDDNode): BDDNode;
|
|
53
|
+
/**
|
|
54
|
+
* Cofactor de b respecto a (variable v = val).
|
|
55
|
+
* Si v no aparece o aparece más profundo, retorna b sin cambios.
|
|
56
|
+
*/
|
|
57
|
+
private cofactor;
|
|
58
|
+
/**
|
|
59
|
+
* Apply algorithm de Bryant — combinador binario con memoization.
|
|
60
|
+
* Maneja AND, OR, XOR (los más usados); el resto se deriva.
|
|
61
|
+
*/
|
|
62
|
+
private applyOp;
|
|
63
|
+
private memoFor;
|
|
64
|
+
private applyTerminal;
|
|
65
|
+
/** ∃v. b ≡ b[v:=0] ∨ b[v:=1] */
|
|
66
|
+
exists(v: number, b: BDDNode): BDDNode;
|
|
67
|
+
/** ∀v. b ≡ b[v:=0] ∧ b[v:=1] */
|
|
68
|
+
forall(v: number, b: BDDNode): BDDNode;
|
|
69
|
+
/**
|
|
70
|
+
* Cuenta el número de asignaciones satisfactorias sobre `numVars`.
|
|
71
|
+
* Usa bigint para soportar funciones con muchas variables.
|
|
72
|
+
*/
|
|
73
|
+
satCount(b: BDDNode): bigint;
|
|
74
|
+
/**
|
|
75
|
+
* Conteo con "skip" de variables ausentes en la rama:
|
|
76
|
+
* cada variable saltada multiplica por 2.
|
|
77
|
+
*/
|
|
78
|
+
private satCountAt;
|
|
79
|
+
isSatisfiable(b: BDDNode): boolean;
|
|
80
|
+
isValid(b: BDDNode): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Equivalencia estructural. Como el manager canonicaliza, basta con
|
|
83
|
+
* comparar identidad de referencias.
|
|
84
|
+
*/
|
|
85
|
+
equivalent(a: BDDNode, b: BDDNode): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Evalúa b sobre una asignación `assignment[i] = valor de la var i`.
|
|
88
|
+
*/
|
|
89
|
+
evaluate(b: BDDNode, assignment: boolean[]): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Construye un BDD desde CNF. Cada clausula es un array de literales
|
|
92
|
+
* en la convención DIMACS:
|
|
93
|
+
* - literal i > 0 → variable (i-1) positiva
|
|
94
|
+
* - literal i < 0 → variable (-i-1) negada
|
|
95
|
+
* El resultado es el AND de las disyunciones de cada clausula.
|
|
96
|
+
*
|
|
97
|
+
* Optimización: ordena clausulas por longitud creciente para que la
|
|
98
|
+
* unidad de propagación temprana mantenga el BDD pequeño.
|
|
99
|
+
*/
|
|
100
|
+
fromCNF(clauses: number[][]): BDDNode;
|
|
101
|
+
/**
|
|
102
|
+
* Construye un BDD desde una fórmula simbólica con sintaxis libre.
|
|
103
|
+
* Soporta: `{ kind: 'var', index: number }`, `{ kind: 'true' }`,
|
|
104
|
+
* `{ kind: 'false' }`, `{ kind: 'not', child }`,
|
|
105
|
+
* `{ kind: 'and'|'or'|'xor'|'implies'|'iff', left, right }`,
|
|
106
|
+
* `{ kind: 'ite', cond, then, else }`.
|
|
107
|
+
*
|
|
108
|
+
* Si llega algo no reconocido lanza error — el formato es estricto
|
|
109
|
+
* para evitar `any` silenciosos.
|
|
110
|
+
*/
|
|
111
|
+
fromFormula(formula: {
|
|
112
|
+
kind: string;
|
|
113
|
+
[k: string]: unknown;
|
|
114
|
+
}): BDDNode;
|
|
115
|
+
stats(): BDDStats;
|
|
116
|
+
/**
|
|
117
|
+
* Cuenta los nodos alcanzables desde `b` (sin contar terminales).
|
|
118
|
+
* Útil para comparar tamaños bajo distintos órdenes de variables.
|
|
119
|
+
*/
|
|
120
|
+
countReachable(b: BDDNode): number;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/bdd/manager.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA0BjD,qBAAa,UAAU;IAiBF,OAAO,EAAE,MAAM;IAhBlC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8C;IACnE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+C;IAErE,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,UAAU,CAAK;IAGvB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,OAAO,CAA8B;IAE7C,QAAQ,EAAE,MAAM,EAAE,CAAC;gBAEA,OAAO,EAAE,MAAM;IASlC;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAsBlC,mEAAmE;IACnE,OAAO,CAAC,QAAQ;IAIhB,iEAAiE;IACjE,OAAO,CAAC,SAAS;IASjB,KAAK,IAAI,OAAO;IAIhB,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAuBhB,mDAAmD;IACnD,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAW5B;;;OAGG;IACH,IAAI,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO;IAYzB,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO;IAIrC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO;IAIpC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO;IAIpC,qBAAqB;IACrB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO;IAIxC,uBAAuB;IACvB,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO;IAIpC;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO;IAmC3D;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAchB;;;OAGG;IACH,OAAO,CAAC,OAAO;IA6Bf,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,aAAa;IAqCrB,gCAAgC;IAChC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO;IAOtC,gCAAgC;IAChC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO;IAWtC;;;OAGG;IACH,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM;IAI5B;;;OAGG;IACH,OAAO,CAAC,UAAU;IAgBlB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO;IAIlC,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO;IAI5B;;;OAGG;IACH,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO;IAI3C;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO;IAoBpD;;;;;;;;;OASG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO;IA6BrC;;;;;;;;;OASG;IACH,WAAW,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,OAAO;IAqCrE,KAAK,IAAI,QAAQ;IAOjB;;;OAGG;IACH,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM;CAcnC"}
|
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ROBDD — Manager con unique table + apply algorithm
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Implementación clásica de Bryant (1986):
|
|
7
|
+
// - Unique table: garantiza canonicidad estructural
|
|
8
|
+
// - Apply: combinador genérico para AND/OR/XOR/... con memoización
|
|
9
|
+
// - ITE (If-Then-Else): operador universal, reduce las binarias
|
|
10
|
+
// - Quantificadores ∃/∀ implementados sobre apply
|
|
11
|
+
// - Sat counting con bigint para evitar overflow en >53 vars
|
|
12
|
+
//
|
|
13
|
+
// Convención: el orden de variables se respeta en todo el DAG.
|
|
14
|
+
// Si en una rama la variable de un hijo tiene índice de orden <=
|
|
15
|
+
// que el padre, hay un bug — el invariante de "ordered" se mantiene
|
|
16
|
+
// porque apply siempre desciende por la variable de menor orden.
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.BDDManager = void 0;
|
|
19
|
+
const types_1 = require("./types");
|
|
20
|
+
// Clave para unique table: variable + ids de hijos.
|
|
21
|
+
// Para terminales usamos 'T'/'F' como id especial.
|
|
22
|
+
function keyOf(variable, low, high) {
|
|
23
|
+
const lid = low.kind === 'terminal' ? (low.value ? 'T' : 'F') : `N${low.id}`;
|
|
24
|
+
const hid = high.kind === 'terminal' ? (high.value ? 'T' : 'F') : `N${high.id}`;
|
|
25
|
+
return `${variable}|${lid}|${hid}`;
|
|
26
|
+
}
|
|
27
|
+
function applyKey(op, a, b) {
|
|
28
|
+
const aid = a.kind === 'terminal' ? (a.value ? 'T' : 'F') : `N${a.id}`;
|
|
29
|
+
const bid = b.kind === 'terminal' ? (b.value ? 'T' : 'F') : `N${b.id}`;
|
|
30
|
+
return `${op}|${aid}|${bid}`;
|
|
31
|
+
}
|
|
32
|
+
function iteKey(c, t, e) {
|
|
33
|
+
const cid = c.kind === 'terminal' ? (c.value ? 'T' : 'F') : `N${c.id}`;
|
|
34
|
+
const tid = t.kind === 'terminal' ? (t.value ? 'T' : 'F') : `N${t.id}`;
|
|
35
|
+
const eid = e.kind === 'terminal' ? (e.value ? 'T' : 'F') : `N${e.id}`;
|
|
36
|
+
return `${cid}|${tid}|${eid}`;
|
|
37
|
+
}
|
|
38
|
+
class BDDManager {
|
|
39
|
+
numVars;
|
|
40
|
+
TRUE = { kind: 'terminal', value: true };
|
|
41
|
+
FALSE = { kind: 'terminal', value: false };
|
|
42
|
+
uniqueTable = new Map();
|
|
43
|
+
nextId = 1;
|
|
44
|
+
reductions = 0;
|
|
45
|
+
// memo caches per binary op + ite
|
|
46
|
+
memoAnd = new Map();
|
|
47
|
+
memoOr = new Map();
|
|
48
|
+
memoXor = new Map();
|
|
49
|
+
memoIte = new Map();
|
|
50
|
+
memoNot = new Map();
|
|
51
|
+
varOrder;
|
|
52
|
+
constructor(numVars) {
|
|
53
|
+
this.numVars = numVars;
|
|
54
|
+
if (numVars < 0)
|
|
55
|
+
throw new Error('BDDManager: numVars must be >= 0');
|
|
56
|
+
this.varOrder = Array.from({ length: numVars }, (_, i) => i);
|
|
57
|
+
}
|
|
58
|
+
// ----------------------------------------------------------
|
|
59
|
+
// Orden de variables
|
|
60
|
+
// ----------------------------------------------------------
|
|
61
|
+
/**
|
|
62
|
+
* Cambia el orden global de variables. Invalida memo caches porque
|
|
63
|
+
* el orden afecta la estructura de los nodos. NO reordena nodos ya
|
|
64
|
+
* construidos — si los reutilizas tras setVarOrder pueden quedar
|
|
65
|
+
* inconsistentes; recomendado para sesiones nuevas.
|
|
66
|
+
*/
|
|
67
|
+
setVarOrder(order) {
|
|
68
|
+
if (order.length !== this.numVars) {
|
|
69
|
+
throw new Error(`setVarOrder: expected ${this.numVars} vars, got ${order.length}`);
|
|
70
|
+
}
|
|
71
|
+
const seen = new Set();
|
|
72
|
+
for (const v of order) {
|
|
73
|
+
if (v < 0 || v >= this.numVars) {
|
|
74
|
+
throw new Error(`setVarOrder: variable ${v} out of range`);
|
|
75
|
+
}
|
|
76
|
+
if (seen.has(v))
|
|
77
|
+
throw new Error(`setVarOrder: variable ${v} repeated`);
|
|
78
|
+
seen.add(v);
|
|
79
|
+
}
|
|
80
|
+
this.varOrder = [...order];
|
|
81
|
+
this.uniqueTable.clear();
|
|
82
|
+
this.memoAnd.clear();
|
|
83
|
+
this.memoOr.clear();
|
|
84
|
+
this.memoXor.clear();
|
|
85
|
+
this.memoIte.clear();
|
|
86
|
+
this.memoNot.clear();
|
|
87
|
+
this.nextId = 1;
|
|
88
|
+
}
|
|
89
|
+
/** Posición de la variable v dentro del orden actual (0 = top). */
|
|
90
|
+
orderPos(v) {
|
|
91
|
+
return this.varOrder.indexOf(v);
|
|
92
|
+
}
|
|
93
|
+
/** Devuelve la variable "top" de un nodo o +∞ si es terminal. */
|
|
94
|
+
topVarPos(b) {
|
|
95
|
+
if ((0, types_1.isTerminal)(b))
|
|
96
|
+
return Number.POSITIVE_INFINITY;
|
|
97
|
+
return this.orderPos(b.variable);
|
|
98
|
+
}
|
|
99
|
+
// ----------------------------------------------------------
|
|
100
|
+
// Constructores básicos
|
|
101
|
+
// ----------------------------------------------------------
|
|
102
|
+
true_() {
|
|
103
|
+
return this.TRUE;
|
|
104
|
+
}
|
|
105
|
+
false_() {
|
|
106
|
+
return this.FALSE;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Crea/recupera un nodo interno con reducción (R1) + (R2).
|
|
110
|
+
*/
|
|
111
|
+
makeNode(variable, low, high) {
|
|
112
|
+
if (low === high) {
|
|
113
|
+
// R1: eliminación
|
|
114
|
+
this.reductions++;
|
|
115
|
+
return low;
|
|
116
|
+
}
|
|
117
|
+
const key = keyOf(variable, low, high);
|
|
118
|
+
const existing = this.uniqueTable.get(key);
|
|
119
|
+
if (existing) {
|
|
120
|
+
this.reductions++;
|
|
121
|
+
return existing;
|
|
122
|
+
}
|
|
123
|
+
const node = {
|
|
124
|
+
kind: 'internal',
|
|
125
|
+
variable,
|
|
126
|
+
low,
|
|
127
|
+
high,
|
|
128
|
+
id: this.nextId++,
|
|
129
|
+
};
|
|
130
|
+
this.uniqueTable.set(key, node);
|
|
131
|
+
return node;
|
|
132
|
+
}
|
|
133
|
+
/** BDD de la variable i: nodo (i, FALSE, TRUE). */
|
|
134
|
+
variable(i) {
|
|
135
|
+
if (i < 0 || i >= this.numVars) {
|
|
136
|
+
throw new Error(`variable(${i}): out of range 0..${this.numVars - 1}`);
|
|
137
|
+
}
|
|
138
|
+
return this.makeNode(i, this.FALSE, this.TRUE);
|
|
139
|
+
}
|
|
140
|
+
// ----------------------------------------------------------
|
|
141
|
+
// Operaciones
|
|
142
|
+
// ----------------------------------------------------------
|
|
143
|
+
/**
|
|
144
|
+
* Negación: implementada como ITE(b, FALSE, TRUE).
|
|
145
|
+
* Con memo dedicado para evitar recomputación.
|
|
146
|
+
*/
|
|
147
|
+
not_(b) {
|
|
148
|
+
if ((0, types_1.isTerminal)(b)) {
|
|
149
|
+
return b.value ? this.FALSE : this.TRUE;
|
|
150
|
+
}
|
|
151
|
+
const key = `N${b.id}`;
|
|
152
|
+
const cached = this.memoNot.get(key);
|
|
153
|
+
if (cached)
|
|
154
|
+
return cached;
|
|
155
|
+
const result = this.makeNode(b.variable, this.not_(b.low), this.not_(b.high));
|
|
156
|
+
this.memoNot.set(key, result);
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
and_(a, b) {
|
|
160
|
+
return this.applyOp('and', a, b);
|
|
161
|
+
}
|
|
162
|
+
or_(a, b) {
|
|
163
|
+
return this.applyOp('or', a, b);
|
|
164
|
+
}
|
|
165
|
+
xor(a, b) {
|
|
166
|
+
return this.applyOp('xor', a, b);
|
|
167
|
+
}
|
|
168
|
+
/** A → B ≡ ¬A ∨ B */
|
|
169
|
+
implies(a, b) {
|
|
170
|
+
return this.or_(this.not_(a), b);
|
|
171
|
+
}
|
|
172
|
+
/** A ↔ B ≡ ¬(A ⊕ B) */
|
|
173
|
+
iff(a, b) {
|
|
174
|
+
return this.not_(this.xor(a, b));
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* If-Then-Else canónico: ite(c, t, e).
|
|
178
|
+
* Equivale a (c ∧ t) ∨ (¬c ∧ e). Implementado con descomposición
|
|
179
|
+
* Shannon directa para mejor caché.
|
|
180
|
+
*/
|
|
181
|
+
ite(cond, thenB, elseB) {
|
|
182
|
+
// Casos base por terminales
|
|
183
|
+
if ((0, types_1.isTerminal)(cond))
|
|
184
|
+
return cond.value ? thenB : elseB;
|
|
185
|
+
if (thenB === elseB)
|
|
186
|
+
return thenB;
|
|
187
|
+
if ((0, types_1.isTerminal)(thenB) && (0, types_1.isTerminal)(elseB)) {
|
|
188
|
+
if (thenB.value && !elseB.value)
|
|
189
|
+
return cond;
|
|
190
|
+
if (!thenB.value && elseB.value)
|
|
191
|
+
return this.not_(cond);
|
|
192
|
+
}
|
|
193
|
+
const key = iteKey(cond, thenB, elseB);
|
|
194
|
+
const cached = this.memoIte.get(key);
|
|
195
|
+
if (cached)
|
|
196
|
+
return cached;
|
|
197
|
+
// Variable top: la de menor posición entre las tres
|
|
198
|
+
const pc = this.topVarPos(cond);
|
|
199
|
+
const pt = this.topVarPos(thenB);
|
|
200
|
+
const pe = this.topVarPos(elseB);
|
|
201
|
+
const top = Math.min(pc, pt, pe);
|
|
202
|
+
const v = this.varOrder[top];
|
|
203
|
+
const condLow = this.cofactor(cond, v, false);
|
|
204
|
+
const condHigh = this.cofactor(cond, v, true);
|
|
205
|
+
const thenLow = this.cofactor(thenB, v, false);
|
|
206
|
+
const thenHigh = this.cofactor(thenB, v, true);
|
|
207
|
+
const elseLow = this.cofactor(elseB, v, false);
|
|
208
|
+
const elseHigh = this.cofactor(elseB, v, true);
|
|
209
|
+
const low = this.ite(condLow, thenLow, elseLow);
|
|
210
|
+
const high = this.ite(condHigh, thenHigh, elseHigh);
|
|
211
|
+
const result = this.makeNode(v, low, high);
|
|
212
|
+
this.memoIte.set(key, result);
|
|
213
|
+
return result;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Cofactor de b respecto a (variable v = val).
|
|
217
|
+
* Si v no aparece o aparece más profundo, retorna b sin cambios.
|
|
218
|
+
*/
|
|
219
|
+
cofactor(b, v, val) {
|
|
220
|
+
if ((0, types_1.isTerminal)(b))
|
|
221
|
+
return b;
|
|
222
|
+
const pb = this.orderPos(b.variable);
|
|
223
|
+
const pv = this.orderPos(v);
|
|
224
|
+
if (pb > pv)
|
|
225
|
+
return b; // v viene antes que b.variable en el orden → b no depende
|
|
226
|
+
if (b.variable === v) {
|
|
227
|
+
return val ? b.high : b.low;
|
|
228
|
+
}
|
|
229
|
+
// pb < pv: b depende de algo más alto; descender
|
|
230
|
+
const low = this.cofactor(b.low, v, val);
|
|
231
|
+
const high = this.cofactor(b.high, v, val);
|
|
232
|
+
return this.makeNode(b.variable, low, high);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Apply algorithm de Bryant — combinador binario con memoization.
|
|
236
|
+
* Maneja AND, OR, XOR (los más usados); el resto se deriva.
|
|
237
|
+
*/
|
|
238
|
+
applyOp(op, a, b) {
|
|
239
|
+
// Terminales
|
|
240
|
+
const term = this.applyTerminal(op, a, b);
|
|
241
|
+
if (term)
|
|
242
|
+
return term;
|
|
243
|
+
const memo = this.memoFor(op);
|
|
244
|
+
const key = applyKey(op, a, b);
|
|
245
|
+
const cached = memo.get(key);
|
|
246
|
+
if (cached)
|
|
247
|
+
return cached;
|
|
248
|
+
// Variable top
|
|
249
|
+
const pa = this.topVarPos(a);
|
|
250
|
+
const pb = this.topVarPos(b);
|
|
251
|
+
const top = Math.min(pa, pb);
|
|
252
|
+
const v = this.varOrder[top];
|
|
253
|
+
const aLow = this.cofactor(a, v, false);
|
|
254
|
+
const aHigh = this.cofactor(a, v, true);
|
|
255
|
+
const bLow = this.cofactor(b, v, false);
|
|
256
|
+
const bHigh = this.cofactor(b, v, true);
|
|
257
|
+
const low = this.applyOp(op, aLow, bLow);
|
|
258
|
+
const high = this.applyOp(op, aHigh, bHigh);
|
|
259
|
+
const result = this.makeNode(v, low, high);
|
|
260
|
+
memo.set(key, result);
|
|
261
|
+
return result;
|
|
262
|
+
}
|
|
263
|
+
memoFor(op) {
|
|
264
|
+
if (op === 'and')
|
|
265
|
+
return this.memoAnd;
|
|
266
|
+
if (op === 'or')
|
|
267
|
+
return this.memoOr;
|
|
268
|
+
return this.memoXor;
|
|
269
|
+
}
|
|
270
|
+
applyTerminal(op, a, b) {
|
|
271
|
+
// Cortocircuitos
|
|
272
|
+
if (op === 'and') {
|
|
273
|
+
if (a === this.FALSE || b === this.FALSE)
|
|
274
|
+
return this.FALSE;
|
|
275
|
+
if (a === this.TRUE)
|
|
276
|
+
return b;
|
|
277
|
+
if (b === this.TRUE)
|
|
278
|
+
return a;
|
|
279
|
+
if (a === b)
|
|
280
|
+
return a;
|
|
281
|
+
}
|
|
282
|
+
else if (op === 'or') {
|
|
283
|
+
if (a === this.TRUE || b === this.TRUE)
|
|
284
|
+
return this.TRUE;
|
|
285
|
+
if (a === this.FALSE)
|
|
286
|
+
return b;
|
|
287
|
+
if (b === this.FALSE)
|
|
288
|
+
return a;
|
|
289
|
+
if (a === b)
|
|
290
|
+
return a;
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
// xor
|
|
294
|
+
if (a === this.FALSE)
|
|
295
|
+
return b;
|
|
296
|
+
if (b === this.FALSE)
|
|
297
|
+
return a;
|
|
298
|
+
if (a === this.TRUE)
|
|
299
|
+
return this.not_(b);
|
|
300
|
+
if (b === this.TRUE)
|
|
301
|
+
return this.not_(a);
|
|
302
|
+
if (a === b)
|
|
303
|
+
return this.FALSE;
|
|
304
|
+
}
|
|
305
|
+
if ((0, types_1.isTerminal)(a) && (0, types_1.isTerminal)(b)) {
|
|
306
|
+
const av = a.value;
|
|
307
|
+
const bv = b.value;
|
|
308
|
+
let r;
|
|
309
|
+
if (op === 'and')
|
|
310
|
+
r = av && bv;
|
|
311
|
+
else if (op === 'or')
|
|
312
|
+
r = av || bv;
|
|
313
|
+
else
|
|
314
|
+
r = av !== bv;
|
|
315
|
+
return r ? this.TRUE : this.FALSE;
|
|
316
|
+
}
|
|
317
|
+
return undefined;
|
|
318
|
+
}
|
|
319
|
+
// ----------------------------------------------------------
|
|
320
|
+
// Cuantificadores
|
|
321
|
+
// ----------------------------------------------------------
|
|
322
|
+
/** ∃v. b ≡ b[v:=0] ∨ b[v:=1] */
|
|
323
|
+
exists(v, b) {
|
|
324
|
+
if (v < 0 || v >= this.numVars)
|
|
325
|
+
throw new Error(`exists: var ${v} out of range`);
|
|
326
|
+
const c0 = this.cofactor(b, v, false);
|
|
327
|
+
const c1 = this.cofactor(b, v, true);
|
|
328
|
+
return this.or_(c0, c1);
|
|
329
|
+
}
|
|
330
|
+
/** ∀v. b ≡ b[v:=0] ∧ b[v:=1] */
|
|
331
|
+
forall(v, b) {
|
|
332
|
+
if (v < 0 || v >= this.numVars)
|
|
333
|
+
throw new Error(`forall: var ${v} out of range`);
|
|
334
|
+
const c0 = this.cofactor(b, v, false);
|
|
335
|
+
const c1 = this.cofactor(b, v, true);
|
|
336
|
+
return this.and_(c0, c1);
|
|
337
|
+
}
|
|
338
|
+
// ----------------------------------------------------------
|
|
339
|
+
// Queries
|
|
340
|
+
// ----------------------------------------------------------
|
|
341
|
+
/**
|
|
342
|
+
* Cuenta el número de asignaciones satisfactorias sobre `numVars`.
|
|
343
|
+
* Usa bigint para soportar funciones con muchas variables.
|
|
344
|
+
*/
|
|
345
|
+
satCount(b) {
|
|
346
|
+
return this.satCountAt(b, 0);
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Conteo con "skip" de variables ausentes en la rama:
|
|
350
|
+
* cada variable saltada multiplica por 2.
|
|
351
|
+
*/
|
|
352
|
+
satCountAt(b, depth) {
|
|
353
|
+
if ((0, types_1.isTerminal)(b)) {
|
|
354
|
+
if (!b.value)
|
|
355
|
+
return 0n;
|
|
356
|
+
// Todas las variables restantes son libres: 2^(numVars - depth)
|
|
357
|
+
const skipped = BigInt(this.numVars - depth);
|
|
358
|
+
return 1n << skipped;
|
|
359
|
+
}
|
|
360
|
+
const pos = this.orderPos(b.variable);
|
|
361
|
+
// Variables entre depth y pos están skipped → 2^(pos - depth)
|
|
362
|
+
const skipped = BigInt(pos - depth);
|
|
363
|
+
const factor = 1n << skipped;
|
|
364
|
+
const low = this.satCountAt(b.low, pos + 1);
|
|
365
|
+
const high = this.satCountAt(b.high, pos + 1);
|
|
366
|
+
return factor * (low + high);
|
|
367
|
+
}
|
|
368
|
+
isSatisfiable(b) {
|
|
369
|
+
return b !== this.FALSE;
|
|
370
|
+
}
|
|
371
|
+
isValid(b) {
|
|
372
|
+
return b === this.TRUE;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Equivalencia estructural. Como el manager canonicaliza, basta con
|
|
376
|
+
* comparar identidad de referencias.
|
|
377
|
+
*/
|
|
378
|
+
equivalent(a, b) {
|
|
379
|
+
return a === b;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Evalúa b sobre una asignación `assignment[i] = valor de la var i`.
|
|
383
|
+
*/
|
|
384
|
+
evaluate(b, assignment) {
|
|
385
|
+
if (assignment.length < this.numVars) {
|
|
386
|
+
throw new Error(`evaluate: assignment length ${assignment.length} < numVars ${this.numVars}`);
|
|
387
|
+
}
|
|
388
|
+
let cur = b;
|
|
389
|
+
while (!(0, types_1.isTerminal)(cur)) {
|
|
390
|
+
const v = cur.variable;
|
|
391
|
+
const val = assignment[v];
|
|
392
|
+
if (val === undefined) {
|
|
393
|
+
throw new Error(`evaluate: missing assignment for var ${v}`);
|
|
394
|
+
}
|
|
395
|
+
cur = val ? cur.high : cur.low;
|
|
396
|
+
}
|
|
397
|
+
return cur.value;
|
|
398
|
+
}
|
|
399
|
+
// ----------------------------------------------------------
|
|
400
|
+
// Conversión desde CNF / fórmulas
|
|
401
|
+
// ----------------------------------------------------------
|
|
402
|
+
/**
|
|
403
|
+
* Construye un BDD desde CNF. Cada clausula es un array de literales
|
|
404
|
+
* en la convención DIMACS:
|
|
405
|
+
* - literal i > 0 → variable (i-1) positiva
|
|
406
|
+
* - literal i < 0 → variable (-i-1) negada
|
|
407
|
+
* El resultado es el AND de las disyunciones de cada clausula.
|
|
408
|
+
*
|
|
409
|
+
* Optimización: ordena clausulas por longitud creciente para que la
|
|
410
|
+
* unidad de propagación temprana mantenga el BDD pequeño.
|
|
411
|
+
*/
|
|
412
|
+
fromCNF(clauses) {
|
|
413
|
+
if (clauses.length === 0)
|
|
414
|
+
return this.TRUE;
|
|
415
|
+
// Validación de literales
|
|
416
|
+
for (const cl of clauses) {
|
|
417
|
+
for (const lit of cl) {
|
|
418
|
+
if (lit === 0)
|
|
419
|
+
throw new Error('fromCNF: literal 0 not allowed (DIMACS)');
|
|
420
|
+
const v = Math.abs(lit) - 1;
|
|
421
|
+
if (v >= this.numVars) {
|
|
422
|
+
throw new Error(`fromCNF: literal ${lit} exceeds numVars ${this.numVars}`);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
// Ordenar clausulas: cortas primero (más restrictivas)
|
|
427
|
+
const ordered = [...clauses].sort((a, b) => a.length - b.length);
|
|
428
|
+
let acc = this.TRUE;
|
|
429
|
+
for (const clause of ordered) {
|
|
430
|
+
let disj = this.FALSE;
|
|
431
|
+
for (const lit of clause) {
|
|
432
|
+
const v = Math.abs(lit) - 1;
|
|
433
|
+
const x = this.variable(v);
|
|
434
|
+
const litBdd = lit > 0 ? x : this.not_(x);
|
|
435
|
+
disj = this.or_(disj, litBdd);
|
|
436
|
+
}
|
|
437
|
+
acc = this.and_(acc, disj);
|
|
438
|
+
if (acc === this.FALSE)
|
|
439
|
+
return acc; // cortocircuito UNSAT
|
|
440
|
+
}
|
|
441
|
+
return acc;
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Construye un BDD desde una fórmula simbólica con sintaxis libre.
|
|
445
|
+
* Soporta: `{ kind: 'var', index: number }`, `{ kind: 'true' }`,
|
|
446
|
+
* `{ kind: 'false' }`, `{ kind: 'not', child }`,
|
|
447
|
+
* `{ kind: 'and'|'or'|'xor'|'implies'|'iff', left, right }`,
|
|
448
|
+
* `{ kind: 'ite', cond, then, else }`.
|
|
449
|
+
*
|
|
450
|
+
* Si llega algo no reconocido lanza error — el formato es estricto
|
|
451
|
+
* para evitar `any` silenciosos.
|
|
452
|
+
*/
|
|
453
|
+
fromFormula(formula) {
|
|
454
|
+
const k = formula.kind;
|
|
455
|
+
if (k === 'true')
|
|
456
|
+
return this.TRUE;
|
|
457
|
+
if (k === 'false')
|
|
458
|
+
return this.FALSE;
|
|
459
|
+
if (k === 'var') {
|
|
460
|
+
const idx = formula.index;
|
|
461
|
+
if (typeof idx !== 'number')
|
|
462
|
+
throw new Error('fromFormula: var.index must be number');
|
|
463
|
+
return this.variable(idx);
|
|
464
|
+
}
|
|
465
|
+
if (k === 'not') {
|
|
466
|
+
const child = formula.child;
|
|
467
|
+
return this.not_(this.fromFormula(child));
|
|
468
|
+
}
|
|
469
|
+
if (k === 'and' || k === 'or' || k === 'xor' || k === 'implies' || k === 'iff') {
|
|
470
|
+
const left = formula.left;
|
|
471
|
+
const right = formula.right;
|
|
472
|
+
const L = this.fromFormula(left);
|
|
473
|
+
const R = this.fromFormula(right);
|
|
474
|
+
if (k === 'and')
|
|
475
|
+
return this.and_(L, R);
|
|
476
|
+
if (k === 'or')
|
|
477
|
+
return this.or_(L, R);
|
|
478
|
+
if (k === 'xor')
|
|
479
|
+
return this.xor(L, R);
|
|
480
|
+
if (k === 'implies')
|
|
481
|
+
return this.implies(L, R);
|
|
482
|
+
return this.iff(L, R);
|
|
483
|
+
}
|
|
484
|
+
if (k === 'ite') {
|
|
485
|
+
const c = formula.cond;
|
|
486
|
+
const t = formula.then;
|
|
487
|
+
const e = formula.else;
|
|
488
|
+
return this.ite(this.fromFormula(c), this.fromFormula(t), this.fromFormula(e));
|
|
489
|
+
}
|
|
490
|
+
throw new Error(`fromFormula: unknown kind "${k}"`);
|
|
491
|
+
}
|
|
492
|
+
// ----------------------------------------------------------
|
|
493
|
+
// Stats / introspección
|
|
494
|
+
// ----------------------------------------------------------
|
|
495
|
+
stats() {
|
|
496
|
+
return {
|
|
497
|
+
nodes: this.uniqueTable.size,
|
|
498
|
+
reductions: this.reductions,
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Cuenta los nodos alcanzables desde `b` (sin contar terminales).
|
|
503
|
+
* Útil para comparar tamaños bajo distintos órdenes de variables.
|
|
504
|
+
*/
|
|
505
|
+
countReachable(b) {
|
|
506
|
+
const seen = new Set();
|
|
507
|
+
const stack = [b];
|
|
508
|
+
while (stack.length > 0) {
|
|
509
|
+
const cur = stack.pop();
|
|
510
|
+
if (cur === undefined)
|
|
511
|
+
break;
|
|
512
|
+
if ((0, types_1.isTerminal)(cur))
|
|
513
|
+
continue;
|
|
514
|
+
if (seen.has(cur.id))
|
|
515
|
+
continue;
|
|
516
|
+
seen.add(cur.id);
|
|
517
|
+
stack.push(cur.low);
|
|
518
|
+
stack.push(cur.high);
|
|
519
|
+
}
|
|
520
|
+
return seen.size;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
exports.BDDManager = BDDManager;
|
|
524
|
+
//# sourceMappingURL=manager.js.map
|