ROBDD equivalence and implication proofs for SPDX expressions
Dependencies
| Project | Its central workflow | MoonSPDX v0.2 boundary |
|---|---|---|
| clbbbb/moonbit-license-audit | Scan project evidence and inventories, apply policies and obligations, compare findings, suggest remediation | MoonSPDX does not scan files or decide compliance; it proves Boolean expression claims and produces counterexamples |
| liyun/moonseal | Audit MoonBit release readiness and dependencies, generate CycloneDX/SARIF/provenance outputs | MoonSPDX does not parse manifests, audit releases, generate SBOMs, detect license text, or emit provenance |
moon update
moon test --target wasm-gc
moon run cmd/main --target js -- demomoon run cmd/main --target js -- equivalent \
--left 'MIT AND (Apache-2.0 OR BSD-3-Clause)' \
--right 'MIT AND Apache-2.0 OR MIT AND BSD-3-Clause'moon run cmd/main --target js -- implies \
--premise 'MIT' \
--conclusion 'MIT AND Apache-2.0'COUNTEREXAMPLE Apache-2.0=false, MIT=truecommute|equivalent|MIT OR Apache-2.0|Apache-2.0 OR MIT
distribute|equivalent|MIT AND (Apache-2.0 OR BSD-3-Clause)|MIT AND Apache-2.0 OR MIT AND BSD-3-Clause
subset|implies|MIT AND Apache-2.0|MITmoon run cmd/main --target js -- verify \
--claims 'commute|equivalent|MIT OR Apache-2.0|Apache-2.0 OR MIT\ndistribute|equivalent|MIT AND (Apache-2.0 OR BSD-3-Clause)|MIT AND Apache-2.0 OR MIT AND BSD-3-Clause\nsubset|implies|MIT AND Apache-2.0|MIT'moonspdx equivalent --left TEXT --right TEXT [--json]
moonspdx implies --premise TEXT --conclusion TEXT [--json]
moonspdx fingerprint --expression TEXT [--json]
moonspdx model --expression TEXT [--json]
moonspdx truth-table --expression TEXT [--json]
moonspdx verify --claims TEXT [--json]
moonspdx compare --left TEXT --right TEXT [--json]
moonspdx influence --expression TEXT [--json]
moonspdx normalize --expression TEXT
moonspdx inspect --expression TEXT
moonspdx demolet left = @moonspdx.parse_expression(
"MIT AND (Apache-2.0 OR BSD-3-Clause)",
).unwrap()
let right = @moonspdx.parse_expression(
"MIT AND Apache-2.0 OR MIT AND BSD-3-Clause",
).unwrap()
let proof = @moonspdx.prove_equivalent(left, right)
.unwrap()
assert_true(proof.holds())
let suite = @moonspdx.verify_claims(
"subset|implies|MIT AND Apache-2.0|MIT",
).unwrap()
assert_true(suite.all_proven())let limits = @moonspdx.SemanticLimits::new(16, 2048, 25000).unwrap()
let proof = @moonspdx.prove_implication_with_limits(
left,
right,
limits,
).unwrap()moon fmt --check
moon check --target wasm-gc --deny-warn
moon check --target wasm --deny-warn
moon check --target js --deny-warn
moon check --target native --deny-warn
moon test --target wasm-gc
moon test --target wasm
moon test --target js
moon test --target nativepub struct AtomInfluence {
atom : String
relevant : Bool
when_false : TruthAssignment?
when_true : TruthAssignment?
false_result : Bool
true_result : Bool
} derive(Eq, Debug)fn Diagnostic::new(code : String, location : String, message : String, expected : String, actual : String) -> Diagnosticpub enum Expression {
Atom(LicenseAtom)
And(Expression, Expression)
Or(Expression, Expression)
} derive(Eq, Debug)pub struct InfluenceReport {
expression : String
influences : Array[AtomInfluence]
relevant : Int
redundant : Int
decision_nodes : Int
operations : Int
} derive(Eq, Debug)pub struct SemanticClaim {
name : String
relation : ClaimRelation
left : Expression
right : Expression
} derive(Eq, Debug)pub struct SemanticComparison {
left : String
right : String
relation : SemanticRelation
left_implies_right : SemanticProof
right_implies_left : SemanticProof
} derive(Eq, Debug)fn SemanticLimits::new(max_variables : Int, max_nodes : Int, max_operations : Int) -> Result[SemanticLimits, Diagnostic]pub struct SemanticProof {
relation : String
left : String
right : String
holds : Bool
variables : Array[String]
decision_nodes : Int
operations : Int
counterexample : TruthAssignment?
} derive(Eq, Debug)pub struct SemanticSummary {
expression : String
variables : Array[String]
decision_nodes : Int
operations : Int
fingerprint : String
model : TruthAssignment?
} derive(Eq, Debug)fn analyze_influence_with_limits(expression : Expression, limits : SemanticLimits) -> Result[InfluenceReport, Diagnostic]fn compare_semantics(left : Expression, right : Expression) -> Result[SemanticComparison, Diagnostic]fn compare_semantics_with_limits(left : Expression, right : Expression, limits : SemanticLimits) -> Result[SemanticComparison, Diagnostic]fn prove_equivalent_with_limits(left : Expression, right : Expression, limits : SemanticLimits) -> Result[SemanticProof, Diagnostic]fn prove_implication(premise : Expression, conclusion : Expression) -> Result[SemanticProof, Diagnostic]fn prove_implication_with_limits(premise : Expression, conclusion : Expression, limits : SemanticLimits) -> Result[SemanticProof, Diagnostic]fn semantic_summary_with_limits(expression : Expression, limits : SemanticLimits) -> Result[SemanticSummary, Diagnostic]fn verify_claims_with_limits(source : String, limits : SemanticLimits) -> Result[ProofSuite, Diagnostic]Install
Download zipROBDD equivalence and implication proofs for SPDX expressions
Dependencies