💡 clingexplaid
This library collects tools for explaining why an ASP program is unsatisfiable. We build on top of the clingo API to offer preprocessing, subset computation, and constraint analysis helpers for building explanation systems. This repository is part of the Potassco suite.
📦 Installation
Clingo-Explaid can easily be installed with pip:
pip install clingexplaid
Requirements : python >= 3.11 & clingo >= 5.7.1
Building from Source
Please refer to DEVELOPEMENT
🚀 Getting Started
The following Examples show use-cases for clingexplaid's API.
Pre-Processing
Transforming facts to Assumptions
from clingexplaid.preprocessors import AssumptionPreprocessor
from clingexplaid.preprocessors import (
FilterSignature,
FilterPattern,
)
PROGRAM = """
a(book;magazine;video).
b(test).
c(1..10).
d(1..3).
"""
ap = AssumptionPreprocessor(filters=[FilterSignature("a", 1), FilterPattern("d(2)")])
result = ap.process(PROGRAM)
# You can either use the return value of `ap.process`
print(result)
# Or use `ap.control` with your transformed program already added
print(ap.control)
Transforming facts to Assumptions with custom Control
import clingo
from clingexplaid.preprocessors import AssumptionPreprocessor, FilterSignature, FilterPattern
FILE = "local/encoding.lp"
ctl = clingo.Control("0")
ap = AssumptionPreprocessor(control=ctl, filters=[FilterSignature("a", 1), FilterPattern("d(2)")])
ap.process_files([FILE])
# The transformed files are added to ctl so it can be directly used
ctl.ground([("base", [])])
ctl.solve()
Computing relevant subsets (MUS, MSS, MCS)
Finding a single MUS
from clingexplaid.preprocessors import AssumptionPreprocessor, FilterSignature
from clingexplaid.unsat import SubsetComputer
PROGRAM = """
a(1..3).
{b(4..6)}.
a(X) :- b(X).
:- a(X), X>=3.
"""
ap = AssumptionPreprocessor(filters={FilterSignature("a", 1)})
ap.process(PROGRAM)
ap.control.ground([("base", [])])
sc = SubsetComputer(ap.control, ap.assumptions)
def shrink_on_core(core) -> None:
mus = sc.mus(core)
print(mus)
ap.control.solve(assumptions=list(ap.assumptions), on_core=shrink_on_core)
The SubsetComputer.mus() method can simple be swapped with
SubsetComputer.mss() or SubsetComputer.mcs() to compute the respective
other subset types
Finding multiple MUSs
from clingexplaid.preprocessors import AssumptionPreprocessor
from clingexplaid.unsat import SubsetComputer
PROGRAM = """
a(1..3).
b(1..3).
:- a(X), b(X).
"""
ap = AssumptionPreprocessor()
ap.process(PROGRAM)
ap.control.ground([("base", [])])
sc = SubsetComputer(ap.control, ap.assumptions)
for i, mus in enumerate(sc.multiple()):
print(f"{i}:", mus)
Finding multiple MUSs with a custom Lattice
Clingo-Explaid's SubsetComputer uses an internal Lattice to decide the
order in which subset candidates are explored. By default it uses the
AssumptionLattice, which is defined in this MUS core utilities repository
musclingo. You can also use your own
lattice, by defining a custom LatticeFactory that provides it to the
SubsetComputer. The following is an example showing this by re-implementing
the AssumptionLattice.
from clingexplaid.preprocessors import AssumptionPreprocessor
from clingexplaid.unsat import SubsetComputer
from clingexplaid.unsat.lattice import LatticeFactory
PROGRAM = """
a(1..3).
b(1..3).
:- a(X), b(X).
"""
class MyLatticeFactory(LatticeFactory):
def __init__(self, bias: bool):
super().__init__()
self._bias = bias
def new(self, literals: set[int]):
return AssumptionLattice(literals, bias=self._bias)
ap = AssumptionPreprocessor()
ap.process(PROGRAM)
ap.control.ground([("base", [])])
sc = SubsetComputer(ap.control, ap.assumptions, lattice_factory=MyLatticeFactory(True))
for i, mus in enumerate(sc.multiple()):
print(f"{i}:", mus)
Finding multiple relevant subsets (MUS, MSS, and MCS)
from clingexplaid.preprocessors import AssumptionPreprocessor
from clingexplaid.unsat import SubsetComputer
from clingexplaid.unsat.sets import [
MinimalUnsatisfiableSubset,
MaximalSatisfiableSubset,
MinimalCorrectionSet
]
PROGRAM = """
a(1..3).
b(1..3).
:- a(X), b(X).
"""
ap = AssumptionPreprocessor()
ap.process(PROGRAM)
ap.control.ground([("base", [])])
sc = SubsetComputer(ap.control, ap.assumptions)
types = [MinimalUnsatisfiableSubset, MaximalSatisfiableSubset, MinimalCorrectionSet]
for i, subset in enumerate(sc.multiple(types)):
print(f"{i}:", subset)
Unsatisfiable Constraints
from clingexplaid.unsat_constraints import UnsatConstraintComputer
PROGRAM = """
a(1..3).
{b(4..6)}.
a(X) :- b(X).
:- a(X), X>=3.
"""
ucc = UnsatConstraintComputer()
ucc.parse_string(PROGRAM)
unsat_constraints = ucc.get_unsat_constraints()
for uc_id, unsat_constraint in unsat_constraints.items():
print(f"Unsat Constraint {uc_id}:", unsat_constraint)
Metadata
Release files for clingexplaid 1.5.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| clingexplaid-1.5.1.tar.gz | 108.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| clingexplaid-1.5.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 142.0 kB
Release files / clingexplaid-1.5.1.tar.gz
| Download URL | clingexplaid-1.5.1.tar.gz |
|---|---|
| Size | 108.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
23b4feecda9329b106bcd59ba07a85c74ef7c4edd65c46d04a8b102e03f1f361
|
|
BLAKE2b-256 checksum How to use checksums |
7d73c39d603ecda6e16e1403cbbfe98ead9a810edf7341f8cdf6a1e46778f01d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency logRelease files / clingexplaid-1.5.1-py3-none-any.whl
| Download URL | clingexplaid-1.5.1-py3-none-any.whl |
|---|---|
| Size | 33.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7494e0de8ef7157ffedf9e99399a1bf0ffb76163bf9da44b7fb37345b44b6be8
|
|
BLAKE2b-256 checksum How to use checksums |
8ae3cfa36459cb14a14ac948919443580444e084180b1ac95a4db70af67586e2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency log