3#include <clingo/input/literal.hh>
4#include <clingo/input/term.hh>
8namespace CppClingo::Input {
13class TheoryTermSymbol;
14class TheoryTermVariable;
16class TheoryTermFunction;
17class TheoryTermUnparsed;
22 std::variant<TheoryTermSymbol, TheoryTermVariable, TheoryTermTuple, TheoryTermFunction, TheoryTermUnparsed>;
40 [[nodiscard]]
auto loc() const ->
Location const & {
return loc_; }
42 [[nodiscard]]
auto value() const ->
Symbol const & {
return *value_; }
62 : loc_{std::move(
loc)}, name_{
name}, anonymous_{is_anonymous} {}
65 [[nodiscard]]
auto loc() const ->
Location const & {
return loc_; }
67 [[nodiscard]]
auto name() const ->
String const & {
return *name_; }
69 [[nodiscard]]
auto anonymous() const ->
bool {
return anonymous_; }
84 return std::tuple{
a_loc = &TheoryTermTuple::loc_,
a_type = &TheoryTermTuple::type_,
85 a_elems = &TheoryTermTuple::elems_};
92 [[nodiscard]]
auto loc() const ->
Location const & {
return loc_; }
112 a_args = &TheoryTermFunction::args_};
121 [[nodiscard]]
auto loc() const ->
Location const & {
return loc_; }
123 [[nodiscard]]
auto name() const ->
String const & {
return *name_; }
149 return std::tuple{
a_loc = &TheoryTermUnparsed::loc_,
a_elems = &TheoryTermUnparsed::elems_};
156 [[nodiscard]]
auto loc() const ->
Location const & {
return loc_; }
198 [[nodiscard]]
auto op() const ->
String const & {
return *op_; }
212 return std::tuple{
a_loc = &TheoryElement::loc_,
a_tuple = &TheoryElement::tuple_,
213 a_cond = &TheoryElement::cond_};
238template <
bool HasSign>
239class TheoryAtom :
public std::conditional_t<HasSign, Signed, Unsigned>,
public Expression<TheoryAtom<HasSign>> {
242 using Base = std::conditional_t<HasSign, Signed, Unsigned>;
246 if constexpr (HasSign) {
248 a_elems = &TheoryAtom::elems_,
a_rhs = &TheoryAtom::rhs_};
250 return std::tuple{
a_loc = &TheoryAtom::loc_,
a_name = &TheoryAtom::name_,
a_elems = &TheoryAtom::elems_,
251 a_rhs = &TheoryAtom::rhs_};
257 : loc_{std::move(
loc)}, name_{std::move(
name)}, elems_{std::move(
elems)}, rhs_{std::move(
rhs)} {
258 static_assert(!HasSign);
263 :
Signed{sign}, loc_{std::move(
loc)}, name_{std::move(
name)}, elems_{std::move(
elems)}, rhs_{std::move(
rhs)} {
264 static_assert(HasSign);
268 [[nodiscard]]
auto loc() const ->
Location const & {
return loc_; }
270 [[nodiscard]]
auto name() const ->
Term const & {
return name_; }
274 [[nodiscard]]
auto rhs() const -> std::optional<
TheoryRGuard> const & {
return rhs_; }
280 std::optional<TheoryRGuard> rhs_;
294 : loc_{std::move(loc)}, type_(type), elems_{std::move(elems)} {
301inline auto operator<=>(TheoryTermTuple
const &a, TheoryTermTuple
const &b) -> std::strong_ordering {
308 : loc_{std::move(loc)}, name_(name), args_{std::move(args)} {
315inline auto operator==(TheoryTermFunction
const &a, TheoryTermFunction
const &b) ->
bool {
319inline auto operator<=>(TheoryTermFunction
const &a, TheoryTermFunction
const &b) -> std::strong_ordering {
326 : loc_{std::move(loc)}, elems_{std::move(elems)} {
333inline auto operator<=>(TheoryTermUnparsed
const &a, TheoryTermUnparsed
const &b) -> std::strong_ordering {
The Location of an expression in an input source.
Definition location.hh:44
Class managing the lifetime of a String.
Definition symbol.hh:93
Class managing the lifetime of a Symbol.
Definition symbol.hh:306
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
auto as_string_span(T const &vec) -> StringSpan
Convert a collection of shared strings into a string span.
Definition symbol.hh:196
std::span< String const > StringSpan
A span of strings.
Definition symbol.hh:87
TheoryTermTupleType
Enumeration of theory term tuple types.
Definition core.hh:165
Sign
Enumeration of signs (default negation).
Definition core.hh:16