Module clingo.symbolic_atoms
Functions and classes to work with symbolic atoms.
Examples
>>> from clingo.symbol import Function, Number
>>> from clingo.control import Control
>>> ctl = Control()
>>> ctl.add('base', [], """\
... p(1).
... { p(3) }.
... #external p(1..3).
...
... q(X) :- p(X).
... """)
>>> ctl.ground([("base", [])])
>>> len(ctl.symbolic_atoms)
6
>>> ctl.symbolic_atoms[Function("p", [Number(2)])] is not None
True
>>> ctl.symbolic_atoms[Function("p", [Number(4)])] is None
True
>>> ctl.symbolic_atoms.signatures
[('p', 1, True), ('q', 1, True)]
>>> [(str(x.symbol), x.is_fact, x.is_external)
... for x in ctl.symbolic_atoms.by_signature("p", 1)]
[('p(1)', True, False), ('p(3)', False, False), ('p(2)', False, True)]
Expand source code
'''
Functions and classes to work with symbolic atoms.
Examples
--------
>>> from clingo.symbol import Function, Number
>>> from clingo.control import Control
>>> ctl = Control()
>>> ctl.add('base', [], """\\
... p(1).
... { p(3) }.
... #external p(1..3).
...
... q(X) :- p(X).
... """)
>>> ctl.ground([("base", [])])
>>> len(ctl.symbolic_atoms)
6
>>> ctl.symbolic_atoms[Function("p", [Number(2)])] is not None
True
>>> ctl.symbolic_atoms[Function("p", [Number(4)])] is None
True
>>> ctl.symbolic_atoms.signatures
[('p', 1, True), ('q', 1, True)]
>>> [(str(x.symbol), x.is_fact, x.is_external)
... for x in ctl.symbolic_atoms.by_signature("p", 1)]
[('p(1)', True, False), ('p(3)', False, False), ('p(2)', False, True)]
'''
from typing import Collection, Iterator, List, Optional, Tuple
from ._internal import _c_call, _ffi, _handle_error, _lib, _to_str
from .symbol import Symbol
__all__ = ["SymbolicAtom", "SymbolicAtoms"]
class SymbolicAtom:
"""
Captures a symbolic atom and provides properties to inspect its state.
"""
def __init__(self, rep, it):
self._rep = rep
self._it = it
def match(self, name: str, arity: int, positive: bool = True) -> bool:
"""
Check if the atom matches the given signature.
Parameters
----------
name
The name of the function.
arity
The arity of the function.
positive
Whether to match positive or negative signatures.
Returns
-------
Whether the atom matches.
See Also
--------
clingo.symbol.Symbol.match
"""
return self.symbol.match(name, arity, positive)
@property
def is_external(self) -> bool:
"""
Whether the atom is an external atom.
"""
return _c_call(
"bool", _lib.clingo_symbolic_atoms_is_external, self._rep, self._it
)
@property
def is_fact(self) -> bool:
"""
Whether the atom is a fact.
"""
return _c_call("bool", _lib.clingo_symbolic_atoms_is_fact, self._rep, self._it)
@property
def literal(self) -> int:
"""
The program literal associated with the atom.
"""
return _c_call(
"clingo_literal_t", _lib.clingo_symbolic_atoms_literal, self._rep, self._it
)
@property
def symbol(self) -> Symbol:
"""
The representation of the atom in form of a symbol.
"""
return Symbol(
_c_call(
"clingo_symbol_t",
_lib.clingo_symbolic_atoms_symbol,
self._rep,
self._it,
)
)
class SymbolicAtoms(Collection[SymbolicAtom]):
"""
This class provides read-only access to the atom base of the grounder.
"""
def __init__(self, rep):
self._rep = rep
def _iter(self, p_sig) -> Iterator[SymbolicAtom]:
p_it = _ffi.new("clingo_symbolic_atom_iterator_t*")
p_valid = _ffi.new("bool*")
_handle_error(_lib.clingo_symbolic_atoms_begin(self._rep, p_sig, p_it))
while _c_call(p_valid, _lib.clingo_symbolic_atoms_is_valid, self._rep, p_it[0]):
yield SymbolicAtom(self._rep, p_it[0])
_handle_error(_lib.clingo_symbolic_atoms_next(self._rep, p_it[0], p_it))
def __iter__(self) -> Iterator[SymbolicAtom]:
yield from self._iter(_ffi.NULL)
def __contains__(self, symbol) -> bool:
if not isinstance(symbol, Symbol):
return False
it = _c_call(
"clingo_symbolic_atom_iterator_t",
_lib.clingo_symbolic_atoms_find,
self._rep,
symbol._rep,
)
return _c_call("bool", _lib.clingo_symbolic_atoms_is_valid, self._rep, it)
def __getitem__(self, symbol: Symbol) -> Optional[SymbolicAtom]:
it = _c_call(
"clingo_symbolic_atom_iterator_t",
_lib.clingo_symbolic_atoms_find,
self._rep,
symbol._rep,
)
if not _c_call("bool", _lib.clingo_symbolic_atoms_is_valid, self._rep, it):
return None
return SymbolicAtom(self._rep, it)
def __len__(self) -> int:
return _c_call("size_t", _lib.clingo_symbolic_atoms_size, self._rep)
def by_signature(
self, name: str, arity: int, positive: bool = True
) -> Iterator[SymbolicAtom]:
"""
Return an iterator over the symbolic atoms with the given signature.
Arguments
---------
name
The name of the signature.
arity
The arity of the signature.
positive
The sign of the signature.
"""
p_sig = _ffi.new("clingo_signature_t*")
_handle_error(
_lib.clingo_signature_create(name.encode(), arity, positive, p_sig)
)
yield from self._iter(p_sig)
@property
def signatures(self) -> List[Tuple[str, int, bool]]:
"""
The list of predicate signatures occurring in the program.
The Boolean indicates the sign of the signature.
"""
size = _c_call("size_t", _lib.clingo_symbolic_atoms_signatures_size, self._rep)
p_sigs = _ffi.new("clingo_signature_t[]", size)
_handle_error(_lib.clingo_symbolic_atoms_signatures(self._rep, p_sigs, size))
return [
(
_to_str(_lib.clingo_signature_name(c_sig)),
_lib.clingo_signature_arity(c_sig),
_lib.clingo_signature_is_positive(c_sig),
)
for c_sig in p_sigs
]
Classes
class SymbolicAtom (rep, it)
-
Captures a symbolic atom and provides properties to inspect its state.
Expand source code
class SymbolicAtom: """ Captures a symbolic atom and provides properties to inspect its state. """ def __init__(self, rep, it): self._rep = rep self._it = it def match(self, name: str, arity: int, positive: bool = True) -> bool: """ Check if the atom matches the given signature. Parameters ---------- name The name of the function. arity The arity of the function. positive Whether to match positive or negative signatures. Returns ------- Whether the atom matches. See Also -------- clingo.symbol.Symbol.match """ return self.symbol.match(name, arity, positive) @property def is_external(self) -> bool: """ Whether the atom is an external atom. """ return _c_call( "bool", _lib.clingo_symbolic_atoms_is_external, self._rep, self._it ) @property def is_fact(self) -> bool: """ Whether the atom is a fact. """ return _c_call("bool", _lib.clingo_symbolic_atoms_is_fact, self._rep, self._it) @property def literal(self) -> int: """ The program literal associated with the atom. """ return _c_call( "clingo_literal_t", _lib.clingo_symbolic_atoms_literal, self._rep, self._it ) @property def symbol(self) -> Symbol: """ The representation of the atom in form of a symbol. """ return Symbol( _c_call( "clingo_symbol_t", _lib.clingo_symbolic_atoms_symbol, self._rep, self._it, ) )
Instance variables
var is_external : bool
-
Whether the atom is an external atom.
Expand source code
@property def is_external(self) -> bool: """ Whether the atom is an external atom. """ return _c_call( "bool", _lib.clingo_symbolic_atoms_is_external, self._rep, self._it )
var is_fact : bool
-
Whether the atom is a fact.
Expand source code
@property def is_fact(self) -> bool: """ Whether the atom is a fact. """ return _c_call("bool", _lib.clingo_symbolic_atoms_is_fact, self._rep, self._it)
var literal : int
-
The program literal associated with the atom.
Expand source code
@property def literal(self) -> int: """ The program literal associated with the atom. """ return _c_call( "clingo_literal_t", _lib.clingo_symbolic_atoms_literal, self._rep, self._it )
var symbol : Symbol
-
The representation of the atom in form of a symbol.
Expand source code
@property def symbol(self) -> Symbol: """ The representation of the atom in form of a symbol. """ return Symbol( _c_call( "clingo_symbol_t", _lib.clingo_symbolic_atoms_symbol, self._rep, self._it, ) )
Methods
def match(self, name: str, arity: int, positive: bool = True) ‑> bool
-
Check if the atom matches the given signature.
Parameters
name
- The name of the function.
arity
- The arity of the function.
positive
- Whether to match positive or negative signatures.
Returns
Whether the atom matches.
See Also
Expand source code
def match(self, name: str, arity: int, positive: bool = True) -> bool: """ Check if the atom matches the given signature. Parameters ---------- name The name of the function. arity The arity of the function. positive Whether to match positive or negative signatures. Returns ------- Whether the atom matches. See Also -------- clingo.symbol.Symbol.match """ return self.symbol.match(name, arity, positive)
class SymbolicAtoms (rep)
-
This class provides read-only access to the atom base of the grounder.
Expand source code
class SymbolicAtoms(Collection[SymbolicAtom]): """ This class provides read-only access to the atom base of the grounder. """ def __init__(self, rep): self._rep = rep def _iter(self, p_sig) -> Iterator[SymbolicAtom]: p_it = _ffi.new("clingo_symbolic_atom_iterator_t*") p_valid = _ffi.new("bool*") _handle_error(_lib.clingo_symbolic_atoms_begin(self._rep, p_sig, p_it)) while _c_call(p_valid, _lib.clingo_symbolic_atoms_is_valid, self._rep, p_it[0]): yield SymbolicAtom(self._rep, p_it[0]) _handle_error(_lib.clingo_symbolic_atoms_next(self._rep, p_it[0], p_it)) def __iter__(self) -> Iterator[SymbolicAtom]: yield from self._iter(_ffi.NULL) def __contains__(self, symbol) -> bool: if not isinstance(symbol, Symbol): return False it = _c_call( "clingo_symbolic_atom_iterator_t", _lib.clingo_symbolic_atoms_find, self._rep, symbol._rep, ) return _c_call("bool", _lib.clingo_symbolic_atoms_is_valid, self._rep, it) def __getitem__(self, symbol: Symbol) -> Optional[SymbolicAtom]: it = _c_call( "clingo_symbolic_atom_iterator_t", _lib.clingo_symbolic_atoms_find, self._rep, symbol._rep, ) if not _c_call("bool", _lib.clingo_symbolic_atoms_is_valid, self._rep, it): return None return SymbolicAtom(self._rep, it) def __len__(self) -> int: return _c_call("size_t", _lib.clingo_symbolic_atoms_size, self._rep) def by_signature( self, name: str, arity: int, positive: bool = True ) -> Iterator[SymbolicAtom]: """ Return an iterator over the symbolic atoms with the given signature. Arguments --------- name The name of the signature. arity The arity of the signature. positive The sign of the signature. """ p_sig = _ffi.new("clingo_signature_t*") _handle_error( _lib.clingo_signature_create(name.encode(), arity, positive, p_sig) ) yield from self._iter(p_sig) @property def signatures(self) -> List[Tuple[str, int, bool]]: """ The list of predicate signatures occurring in the program. The Boolean indicates the sign of the signature. """ size = _c_call("size_t", _lib.clingo_symbolic_atoms_signatures_size, self._rep) p_sigs = _ffi.new("clingo_signature_t[]", size) _handle_error(_lib.clingo_symbolic_atoms_signatures(self._rep, p_sigs, size)) return [ ( _to_str(_lib.clingo_signature_name(c_sig)), _lib.clingo_signature_arity(c_sig), _lib.clingo_signature_is_positive(c_sig), ) for c_sig in p_sigs ]
Ancestors
- collections.abc.Collection
- collections.abc.Sized
- collections.abc.Iterable
- collections.abc.Container
- typing.Generic
Instance variables
var signatures : List[Tuple[str, int, bool]]
-
The list of predicate signatures occurring in the program.
The Boolean indicates the sign of the signature.
Expand source code
@property def signatures(self) -> List[Tuple[str, int, bool]]: """ The list of predicate signatures occurring in the program. The Boolean indicates the sign of the signature. """ size = _c_call("size_t", _lib.clingo_symbolic_atoms_signatures_size, self._rep) p_sigs = _ffi.new("clingo_signature_t[]", size) _handle_error(_lib.clingo_symbolic_atoms_signatures(self._rep, p_sigs, size)) return [ ( _to_str(_lib.clingo_signature_name(c_sig)), _lib.clingo_signature_arity(c_sig), _lib.clingo_signature_is_positive(c_sig), ) for c_sig in p_sigs ]
Methods
def by_signature(self, name: str, arity: int, positive: bool = True) ‑> Iterator[SymbolicAtom]
-
Return an iterator over the symbolic atoms with the given signature.
Arguments
name
- The name of the signature.
arity
- The arity of the signature.
positive
- The sign of the signature.
Expand source code
def by_signature( self, name: str, arity: int, positive: bool = True ) -> Iterator[SymbolicAtom]: """ Return an iterator over the symbolic atoms with the given signature. Arguments --------- name The name of the signature. arity The arity of the signature. positive The sign of the signature. """ p_sig = _ffi.new("clingo_signature_t*") _handle_error( _lib.clingo_signature_create(name.encode(), arity, positive, p_sig) ) yield from self._iter(p_sig)