3#include <clingo/core/core.hh>
5#include <clingo/ground/base.hh>
6#include <clingo/ground/instantiator.hh>
7#include <clingo/ground/script.hh>
8#include <clingo/ground/term.hh>
10#include <clingo/util/ordered_map.hh>
12#include <memory_resource>
15namespace CppClingo::Ground {
29using ULit = std::unique_ptr<Lit>;
46 [[nodiscard]]
auto domain() const ->
bool {
return do_domain(); }
50 [[nodiscard]]
auto single_pass() const ->
bool {
return do_single_pass(); }
53 std::vector<bool>
const &bound) -> std::pair<UMatcher, std::optional<size_t>> {
54 return do_matcher(mbr, type, bound);
57 [[nodiscard]]
auto score(std::vector<bool>
const &bound)
const ->
double {
return do_score(bound); }
66 [[nodiscard]]
auto copy() const ->
ULit {
return do_copy(); }
69 [[nodiscard]]
auto hash() const ->
size_t {
return do_hash(); }
72 friend auto operator==(
Lit const &a,
Lit const &b) ->
bool {
return a.do_equal_to(b); }
74 friend auto operator<=>(
Lit const &a,
Lit const &b) -> std::weak_ordering {
return a.do_compare_to(b); }
83 [[nodiscard]]
virtual auto do_domain() const ->
bool = 0;
84 [[nodiscard]] virtual auto do_single_pass() const ->
bool {
return false; }
85 [[nodiscard]]
virtual auto do_matcher(std::pmr::monotonic_buffer_resource &mbr,
MatcherType type,
86 std::vector<bool>
const &bound)
87 -> std::pair<UMatcher, std::optional<size_t>> = 0;
88 [[nodiscard]]
virtual auto do_score(std::vector<bool>
const &bound)
const ->
double = 0;
89 virtual void do_print(std::ostream &out)
const = 0;
90 virtual auto do_output(EvalContext
const &ctx,
OutputLit &out)
const ->
bool = 0;
91 [[nodiscard]]
virtual auto do_copy() const ->
ULit = 0;
92 [[nodiscard]] virtual auto do_hash() const ->
size_t = 0;
93 [[nodiscard]] virtual auto do_equal_to(Lit const &other) const ->
bool = 0;
94 [[nodiscard]] virtual auto do_compare_to(Lit const &other) const -> std::weak_ordering = 0;
105 [[nodiscard]]
auto do_domain() const ->
bool override;
106 [[nodiscard]] auto do_single_pass() const ->
bool override;
107 [[nodiscard]] auto do_matcher(std::pmr::monotonic_buffer_resource &mbr,
MatcherType type,
108 std::vector<
bool> const &bound)
109 -> std::pair<
UMatcher, std::optional<
size_t>> override;
110 [[nodiscard]] auto do_score(std::vector<
bool> const &bound) const ->
double override;
112 void do_print(std::ostream &out) const override;
115 [[nodiscard]] auto do_copy() const ->
ULit override;
117 [[nodiscard]] auto do_hash() const ->
size_t override;
118 [[nodiscard]] auto do_equal_to(
Lit const &other) const ->
bool override;
119 [[nodiscard]] auto do_compare_to(
Lit const &other) const -> std::weak_ordering override;
131 : ctx_{&ctx}, loc_{std::move(loc)}, name_{name}, lhs_{std::move(lhs)}, args_{std::move(args)} {}
135 [[nodiscard]]
auto do_domain() const ->
bool override;
136 [[nodiscard]] auto do_single_pass() const ->
bool override;
137 [[nodiscard]] auto do_matcher(std::pmr::monotonic_buffer_resource &mbr,
MatcherType type,
138 std::vector<
bool> const &bound)
139 -> std::pair<
UMatcher, std::optional<
size_t>> override;
140 [[nodiscard]] auto do_score(std::vector<
bool> const &bound) const ->
double override;
142 void do_print(std::ostream &out) const override;
145 [[nodiscard]] auto do_copy() const ->
ULit override;
147 [[nodiscard]] auto do_hash() const ->
size_t override;
148 [[nodiscard]] auto do_equal_to(
Lit const &other) const ->
bool override;
149 [[nodiscard]] auto do_compare_to(
Lit const &other) const -> std::weak_ordering override;
163 : lhs_{std::move(lhs)}, lower_{std::move(lower)}, upper_{std::move(upper)} {}
167 [[nodiscard]]
auto do_domain() const ->
bool override;
168 [[nodiscard]] auto do_single_pass() const ->
bool override;
169 [[nodiscard]] auto do_matcher(std::pmr::monotonic_buffer_resource &mbr,
MatcherType type,
170 std::vector<
bool> const &bound)
171 -> std::pair<
UMatcher, std::optional<
size_t>> override;
172 [[nodiscard]] auto do_score(std::vector<
bool> const &bound) const ->
double override;
174 void do_print(std::ostream &out) const override;
177 [[nodiscard]] auto do_copy() const ->
ULit override;
179 [[nodiscard]] auto do_hash() const ->
size_t override;
180 [[nodiscard]] auto do_equal_to(
Lit const &other) const ->
bool override;
181 [[nodiscard]] auto do_compare_to(
Lit const &other) const -> std::weak_ordering override;
196 : base_{&base}, atom_{std::move(atom)}, index_{index}, sign_{sign}, domain_{
domain} {}
200 [[nodiscard]]
auto do_domain() const ->
bool override;
201 [[nodiscard]] auto do_single_pass() const ->
bool override;
202 [[nodiscard]] auto do_matcher(std::pmr::monotonic_buffer_resource &mbr,
MatcherType type,
203 std::vector<
bool> const &bound)
204 -> std::pair<
UMatcher, std::optional<
size_t>> override;
205 [[nodiscard]] auto do_score(std::vector<
bool> const &bound) const ->
double override;
207 void do_print(std::ostream &out) const override;
210 [[nodiscard]] auto do_copy() const ->
ULit override;
212 [[nodiscard]] auto do_hash() const ->
size_t override;
213 [[nodiscard]] auto do_equal_to(
Lit const &other) const ->
bool override;
214 [[nodiscard]] auto do_compare_to(
Lit const &other) const -> std::weak_ordering override;
240 : state_{&state}, atom_{std::move(atom)}, p_atom_{std::move(p_atom)}, index_{index}, sign_{sign},
245 [[nodiscard]]
auto do_domain() const ->
bool override;
246 [[nodiscard]] auto do_single_pass() const ->
bool override;
247 [[nodiscard]] auto do_matcher(std::pmr::monotonic_buffer_resource &mbr,
MatcherType type,
248 std::vector<
bool> const &bound)
249 -> std::pair<
UMatcher, std::optional<
size_t>> override;
250 [[nodiscard]] auto do_score(std::vector<
bool> const &bound) const ->
double override;
251 void do_print(std::ostream &out) const override;
254 [[nodiscard]] auto do_copy() const ->
ULit override;
256 [[nodiscard]] auto do_hash() const ->
size_t override;
257 [[nodiscard]] auto do_equal_to(
Lit const &other) const ->
bool override;
258 [[nodiscard]] auto do_compare_to(
Lit const &other) const -> std::weak_ordering override;
275 assert(vars_.size() == syms_->size());
280 [[nodiscard]]
auto do_domain() const ->
bool override;
281 [[nodiscard]] auto do_single_pass() const ->
bool override;
282 [[nodiscard]] auto do_matcher(std::pmr::monotonic_buffer_resource &mbr,
MatcherType type,
283 std::vector<
bool> const &bound)
284 -> std::pair<
UMatcher, std::optional<
size_t>> override;
285 [[nodiscard]] auto do_score([[maybe_unused]] std::vector<
bool> const &bound) const ->
double override;
286 void do_print(std::ostream &out) const override;
288 [[nodiscard]] auto do_copy() const ->
ULit override;
289 [[nodiscard]] auto do_hash() const ->
size_t override;
290 [[nodiscard]] auto do_equal_to(
Lit const &other) const ->
bool override;
291 [[nodiscard]] auto do_compare_to(
Lit const &other) const -> std::weak_ordering override;
300 [[nodiscard]]
virtual auto do_check(
EvalContext const &ctx) ->
bool = 0;
302 [[nodiscard]]
auto do_domain()
const ->
bool override;
303 [[nodiscard]]
auto do_single_pass()
const ->
bool override;
304 [[nodiscard]]
auto do_matcher(std::pmr::monotonic_buffer_resource &mbr,
MatcherType type,
305 std::vector<bool>
const &bound)
306 -> std::pair<UMatcher, std::optional<size_t>>
override;
307 [[nodiscard]]
auto do_score(std::vector<bool>
const &bound)
const ->
double override;
311 [[nodiscard]]
auto do_hash()
const ->
size_t override;
312 [[nodiscard]]
auto do_equal_to(
Lit const &other)
const ->
bool override;
313 [[nodiscard]]
auto do_compare_to(
Lit const &other)
const -> std::weak_ordering
override;
323 [[nodiscard]]
auto do_check(
EvalContext const &ctx) ->
bool override;
325 void do_print(std::ostream &out)
const override;
326 [[nodiscard]]
auto do_copy() const ->
ULit override;
340 [[nodiscard]]
auto do_check(
EvalContext const &ctx) ->
bool override;
342 void do_print(std::ostream &out)
const override;
343 [[nodiscard]]
auto do_copy() const ->
ULit override;
360 [[nodiscard]]
auto do_check(
EvalContext const &ctx) ->
bool override;
362 void do_print(std::ostream &out)
const override;
363 [[nodiscard]]
auto do_copy() const ->
ULit override;
379 : lhs_{std::move(lhs)}, tuples_{std::move(tuples)}, fun_{fun}, cmp_{cmp} {}
383 [[nodiscard]]
auto do_domain() const ->
bool override;
384 [[nodiscard]] auto do_single_pass() const ->
bool override;
385 [[nodiscard]] auto do_matcher(std::pmr::monotonic_buffer_resource &mbr,
MatcherType type,
386 std::vector<
bool> const &bound)
387 -> std::pair<
UMatcher, std::optional<
size_t>> override;
388 [[nodiscard]] auto do_score(std::vector<
bool> const &bound) const ->
double override;
390 void do_print(std::ostream &out) const override;
393 [[nodiscard]] auto do_copy() const ->
ULit override;
395 [[nodiscard]] auto do_hash() const ->
size_t override;
396 [[nodiscard]] auto do_equal_to(
Lit const &other) const ->
bool override;
397 [[nodiscard]] auto do_compare_to(
Lit const &other) const -> std::weak_ordering override;
An atom base used to store derivable atoms and associated state.
Definition base.hh:212
Context object to capture state used during instantiation.
Definition instantiator.hh:35
A literal representing a Boolean.
Definition literal.hh:317
LitBool(bool value)
Construct the literal.
Definition literal.hh:320
A literal ensuring that a list of terms evaluates.
Definition literal.hh:298
A literal representing a comparison.
Definition literal.hh:98
LitComparison(UTerm lhs, Relation cmp, UTerm rhs)
Construct the literal.
Definition literal.hh:101
A literal representing a comparison.
Definition literal.hh:127
LitExternal(ScriptCallback &ctx, Location loc, String name, UTerm lhs, UTermVec args)
Construct the literal.
Definition literal.hh:130
Simple literal that discards whenever it matches to a fact.
Definition literal.hh:334
LitFactCheck(AtomBase &base, Term const &atom, Symbol &target)
Construct the literal.
Definition literal.hh:337
A literal ensuring that a list of terms evaluates.
Definition literal.hh:351
LitFailCheck(UTermVec terms)
Construct the literal.
Definition literal.hh:357
A literal representing an interval assignment.
Definition literal.hh:159
LitInterval(UTerm lhs, UTerm lower, UTerm upper)
Construct the literal.
Definition literal.hh:162
A literal similar to a symbolic literal.
Definition literal.hh:236
LitProject(ProjectState &state, Sign sign, UTerm atom, UTerm p_atom, size_t index, bool domain)
Construct the literal.
Definition literal.hh:239
An aggregate literal without conditions.
Definition literal.hh:375
LitSimpleAggr(UTerm lhs, Relation cmp, AggregateFunction fun, std::vector< UTermVec > tuples)
Construct the literal.
Definition literal.hh:378
A symbolic literal.
Definition literal.hh:192
LitSymbolic(AtomBase &base, Sign sign, UTerm atom, size_t index, bool domain)
Construct the literal.
Definition literal.hh:195
An auxiliary literal binding variables to the given symbols upon first match.
Definition literal.hh:271
LitTuple(VariableVec vars, SymbolVec &syms)
Construct the literal.
Definition literal.hh:274
The base class for groundable literals.
Definition literal.hh:34
void vars(VariableSet &vars, VarSelectMode mode) const
Get the variables in the predicate.
Definition literal.hh:40
auto copy() const -> ULit
Copy the literal.
Definition literal.hh:66
virtual ~Lit()=default
Destroy the literal.
auto score(std::vector< bool > const &bound) const -> double
Compute a score used to order rule bodies.
Definition literal.hh:57
auto domain() const -> bool
Returns true if matching literals are always fact.
Definition literal.hh:46
friend auto operator<<(std::ostream &out, Lit const &lit) -> std::ostream &
Print the literal.
Definition literal.hh:76
auto output(EvalContext const &ctx, OutputLit &out) const -> bool
Output the literal.
Definition literal.hh:63
auto hash() const -> size_t
Compute a hash for the literal.
Definition literal.hh:69
friend auto operator==(Lit const &a, Lit const &b) -> bool
Compare two literals.
Definition literal.hh:72
auto matcher(std::pmr::monotonic_buffer_resource &mbr, MatcherType type, std::vector< bool > const &bound) -> std::pair< UMatcher, std::optional< size_t > >
Returns true if the base of the literal is complete at the time of grounding.
Definition literal.hh:52
friend auto operator<=>(Lit const &a, Lit const &b) -> std::weak_ordering
Compare two literals.
Definition literal.hh:74
auto single_pass() const -> bool
Returns true if the literal can be grounded in a single pass.
Definition literal.hh:50
The state capturing the base of a projection.
Definition base.hh:368
Interface to call functions during parsing/grounding.
Definition script.hh:28
Term interface.
Definition term.hh:67
The Location of an expression in an input source.
Definition location.hh:44
Interface to output literals.
Definition output.hh:61
Reference to a string stored in a symbol store.
Definition symbol.hh:18
Variant-like class to store symbols stored in a symbol store.
Definition symbol.hh:225
std::vector< Symbol > SymbolVec
A vector of symbols.
Definition symbol.hh:220
Relation
Enumeration of supported relations.
Definition core.hh:35
Sign
Enumeration of signs (default negation).
Definition core.hh:16
AggregateFunction
Enumeration of aggregate functions.
Definition core.hh:87
VariableSet::values_container_type VariableVec
A vector of variables.
Definition base.hh:21
Util::ordered_set< size_t > VariableSet
A set of variables.
Definition base.hh:19
@ lit
Conditional literals derived during grounding.
MatcherType
Enumeration of matcher types.
Definition instantiator.hh:48
std::unique_ptr< Matcher > UMatcher
A unique pointer to a matcher.
Definition instantiator.hh:100
std::unique_ptr< Lit > ULit
A unique pointer holding a literal.
Definition literal.hh:29
std::optional< std::tuple< Ground::UTerm, AtomBase &, std::vector< size_t > > > AtomSimple
Represents a simple head literal which is either represented by a symbol term or #false captured by s...
Definition literal.hh:231
VarSelectMode
Available variable selection modes.
Definition literal.hh:21
std::vector< std::tuple< std::tuple< String, size_t, bool >, AtomBase *, std::vector< size_t > > > BaseVec
A vector of signatures, bases, and indices.
Definition literal.hh:372
std::vector< ULit > ULitVec
A vector of literals.
Definition literal.hh:31
constexpr auto stratified_index
Marker for stratified literals.
Definition literal.hh:189
@ depend
Get variables a literal depends on.
@ all
Get all variables in a literal.
@ provide
Get variables provided by a literal.
std::unique_ptr< Term > UTerm
A unique pointer holding a term.
Definition term.hh:33
std::vector< UTerm > UTermVec
A vector of terms.
Definition term.hh:35