3#include <clingo/core/backend.hh>
4#include <clingo/core/core.hh>
5#include <clingo/core/symbol.hh>
7#include <clingo/util/small_vector.hh>
30 using OptGuard = std::optional<std::pair<String, size_t>>;
34 auto str(
String val) ->
size_t {
return do_str(val); }
42 auto elem(
IndexSpan tuple,
size_t cond) ->
size_t {
return do_elem(tuple, cond); }
45 do_atom(type, atom_uid, name, elems, guard);
51 virtual auto do_str(
String val) ->
size_t = 0;
52 virtual auto do_num(
Number const &val) ->
size_t = 0;
53 virtual auto do_fun(
String name, std::span<size_t const> args) ->
size_t = 0;
55 virtual auto do_sym(
Symbol sym) ->
size_t = 0;
56 virtual auto do_elem(
IndexSpan tuple,
size_t cond) ->
size_t = 0;
68 void boolean(
bool value) { do_boolean(value); }
73 auto delayed(
Sign sign, std::optional<size_t> uid) ->
size_t {
return do_delayed(sign, uid); }
76 virtual void do_lit(
Sign sign,
Symbol sym,
size_t uid) = 0;
77 virtual void do_boolean(
bool value) = 0;
78 virtual auto do_delayed(
Sign sign, std::optional<size_t> uid) ->
size_t = 0;
87 using BdElem = std::pair<SymbolSpan, IndexSpan>;
96 using HdElem = std::pair<SymbolSpan, std::span<std::tuple<Symbol, size_t, size_t>
const>>;
100 using Guard = std::pair<Relation, Symbol>;
107 using CondLit = std::pair<std::optional<size_t>,
size_t>;
111 using DisjElem = std::tuple<Symbol, size_t, IndexSpan>;
127 void project_atom(
size_t p_atom,
size_t atom) { do_project_atom(p_atom, atom); }
134 void rule(std::optional<std::tuple<Symbol, size_t, bool>> head) { do_rule(head); }
149 do_weak_constraint(weight, prio, terms);
155 do_heuristic(atom,
uid, weight, prio, type);
172 auto cond_id() ->
size_t {
return do_cond_id(); }
176 do_bd_aggr(
uid, fun, elems, guards);
182 do_hd_aggr(
uid, fun, elems, guards);
209 virtual auto do_uid(
bool fact) ->
size_t = 0;
211 virtual void do_fact(
Symbol sym,
size_t uid) = 0;
213 virtual void do_project_atom(
size_t p_atom,
size_t atom) = 0;
215 virtual auto do_body() ->
OutputLit & = 0;
216 virtual void do_rule(std::optional<std::tuple<Symbol, size_t, bool>> head) = 0;
218 virtual void do_project(
Symbol atom,
size_t uid) = 0;
219 virtual auto do_aggr_rule(std::optional<size_t>
uid) ->
size_t = 0;
220 virtual auto do_theory_rule(std::optional<size_t>
uid) ->
size_t = 0;
221 virtual auto do_disjunctive_rule(std::optional<size_t>
uid) ->
size_t = 0;
227 virtual void do_show_atom(
Symbol atom,
size_t uid) = 0;
228 virtual void do_show_term(
Symbol term) = 0;
230 virtual auto do_cond() ->
OutputLit & = 0;
231 virtual auto do_cond_id() ->
size_t = 0;
241 virtual void do_flush() = 0;
242 virtual void do_classical_negation(
size_t atom_a,
size_t atom_b) = 0;
243 virtual void do_end_ground() = 0;
An arbitrary precision integer.
Definition number.hh:27
Interface to output literals.
Definition output.hh:61
virtual ~OutputLit()=default
Destroy the output.
void lit(Sign sign, Symbol sym, size_t uid)
Output the given symbolic literal.
Definition output.hh:66
auto delayed(Sign sign, std::optional< size_t > uid) -> size_t
Delay or output a previously added aggregate/conditional literal/theory.
Definition output.hh:73
void boolean(bool value)
Output the given boolean constant.
Definition output.hh:68
Interface to output statements.
Definition output.hh:82
void simplify(std::function< TruthValue(prg_lit_t)> const &pred)
Simplify stored state in the output.
Definition output.hh:206
auto uid(bool fact=false) -> size_t
Generate a new unique id for a literal.
Definition output.hh:121
auto theory_rule(std::optional< size_t > uid) -> size_t
Output a theory atom rule.
Definition output.hh:142
std::pair< SymbolSpan, std::span< std::tuple< Symbol, size_t, size_t > const > > HdElem
A head aggregate element.
Definition output.hh:96
void disjunction(size_t uid, DisjElemSpan elems)
Complete a delayed disjunction.
Definition output.hh:185
auto aggr_rule(std::optional< size_t > uid) -> size_t
Output a head aggregate rule.
Definition output.hh:140
std::pair< std::optional< size_t >, size_t > CondLit
A conditional literal.
Definition output.hh:107
void show_atom(Symbol atom, size_t uid)
Output the given atom.
Definition output.hh:163
void project(Symbol atom, size_t uid)
Output the given external.
Definition output.hh:138
void weak_constraint(Number const &weight, Number const *prio, SymbolSpan terms)
Output the given weak constraint.
Definition output.hh:148
std::span< DisjElem const > DisjElemSpan
A span of disjunction elements.
Definition output.hh:113
void edge(Symbol src, Symbol dst)
Output the given edge statement.
Definition output.hh:160
void bd_aggr(size_t uid, AggregateFunction fun, BdElemSpan elems, GuardSpan guards)
Complete a delayed body aggregate.
Definition output.hh:175
void external(Symbol atom, size_t uid, ExternalType type)
Output the given external.
Definition output.hh:136
virtual ~OutputStm()=default
Destroy the output.
std::pair< Relation, Symbol > Guard
A rhs guard.
Definition output.hh:100
auto cond_id() -> size_t
Commit a condition of simple literals returning its id.
Definition output.hh:172
void bd_sort(size_t uid, BdSortElemSpan elems, Symbol guard)
Complete a delayed sort aggregate.
Definition output.hh:179
std::span< HdElem const > HdElemSpan
A span of body aggregate elements.
Definition output.hh:98
auto cond() -> OutputLit &
Return an output for a condition.
Definition output.hh:170
void project_atom(size_t p_atom, size_t atom)
Adds a projection rule for the given atom.
Definition output.hh:127
std::pair< SymbolSpan, IndexSpan > BdElem
A body aggregate element.
Definition output.hh:87
void hd_aggr(size_t uid, AggregateFunction fun, HdElemSpan elems, GuardSpan guards)
Complete a delayed head aggregate.
Definition output.hh:181
void rule(std::optional< std::tuple< Symbol, size_t, bool > > head)
Output the given rule.
Definition output.hh:134
auto theory() -> OutputTheory &
Return a theory output.
Definition output.hh:191
auto body() -> OutputLit &
Get an output for body literals.
Definition output.hh:130
std::span< Guard const > GuardSpan
The guards of an aggregate.
Definition output.hh:102
auto disjunctive_rule(std::optional< size_t > uid) -> size_t
Output a disjunctive rule.
Definition output.hh:144
void classical_negation(size_t atom_a, size_t atom_b)
Handle classical negation of two atoms.
Definition output.hh:198
std::tuple< Symbol, size_t, IndexSpan > DisjElem
A disjunction element.
Definition output.hh:111
void end_ground()
End the current (incremental) grounding step.
Definition output.hh:200
void cond_lit(size_t uid, CondLitSpan elems)
Complete a delayed conditional literal.
Definition output.hh:188
void fact(Symbol sym, size_t uid)
Output the given fact.
Definition output.hh:124
std::span< std::pair< Symbol, IndexSpan > const > BdSortElemSpan
A span of sort aggregate elements.
Definition output.hh:91
void heuristic(Symbol atom, size_t uid, Number const &weight, Number const *prio, HeuristicType type)
Output the given heuristic statement.
Definition output.hh:154
std::span< BdElem const > BdElemSpan
A span of body aggregate elements.
Definition output.hh:89
void flush()
Flush all delayed rule assuming they are completely defined.
Definition output.hh:196
void show_term(Symbol term)
Output the given term.
Definition output.hh:167
void mark(SymbolCollector &gc)
Mark owned symbols.
Definition output.hh:203
std::span< CondLit const > CondLitSpan
A span of conditional literals.
Definition output.hh:109
Interface to output literals.
Definition output.hh:20
auto str(String val) -> size_t
Output the given symbolic literal.
Definition output.hh:34
auto fun(String name, IndexSpan args) -> size_t
Output the given symbolic literal.
Definition output.hh:38
virtual ~OutputTheory()=default
Destroy the output.
std::optional< std::pair< String, size_t > > OptGuard
An optional guard of string and term indices.
Definition output.hh:30
auto num(Number const &num) -> size_t
Output the given symbolic literal.
Definition output.hh:36
void atom(AtomType type, size_t atom_uid, Symbol name, IndexSpan elems, OptGuard guard=std::nullopt)
Output the given atom.
Definition output.hh:44
auto elem(IndexSpan tuple, size_t cond) -> size_t
Output the given element.
Definition output.hh:42
AtomType
The type of a theory atom.
Definition output.hh:23
@ body
The atom occurs in the body.
@ head
The atom occurs in the head.
@ directive
The atom is a body.
auto tup(TheoryTermTupleType type, IndexSpan args) -> size_t
Output the given tuple.
Definition output.hh:40
auto sym(Symbol sym) -> size_t
Output the given symbol.
Definition output.hh:48
Reference to a string stored in a symbol store.
Definition symbol.hh:18
Helper class to mark owned symbols.
Definition symbol.hh:429
Variant-like class to store symbols stored in a symbol store.
Definition symbol.hh:225
int32_t prg_lit_t
A program literal.
Definition backend.hh:27
std::unique_ptr< OutputStm > UOutputStm
Unique pointer for statement output.
Definition output.hh:250
std::span< size_t const > IndexSpan
A span of indices.
Definition output.hh:15
std::vector< size_t > IndexVec
A vector of indices.
Definition output.hh:17
std::span< Symbol const > SymbolSpan
A span of symbols.
Definition symbol.hh:218
TheoryTermTupleType
Enumeration of theory term tuple types.
Definition core.hh:165
HeuristicType
Available heuristic types.
Definition core.hh:172
ExternalType
Available external types.
Definition core.hh:177
Sign
Enumeration of signs (default negation).
Definition core.hh:16
TruthValue
Truth values for expressions.
Definition core.hh:80
AggregateFunction
Enumeration of aggregate functions.
Definition core.hh:87
@ pred
Only consider predicates.