Skip to main content

badge-docs badge-license badge-pypi

💡 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)

Source distribution for clingexplaid 1.5.1
File Size Uploaded
clingexplaid-1.5.1.tar.gz 108.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for clingexplaid 1.5.1
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

1.5.1 This release

2 release files

1.4.0

2 release files

1.3.5

2 release files

1.3.4

2 release files

1.3.3

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.16

2 release files

1.0.14

2 release files

1.0.13

2 release files

1.0.12

2 release files

1.0.11

2 release files

1.0.9

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page