Clingo
Loading...
Searching...
No Matches
head_literal.hh
1#pragma once
2
3#include <clingo/input/aggregate.hh>
4#include <clingo/input/literal.hh>
5#include <clingo/input/theory.hh>
6
7#include <utility>
8
9namespace CppClingo::Input {
10
13
15class HdLitSimple : public Expression<HdLitSimple> {
16 public:
18 static constexpr auto attributes() { return std::tuple{a_lit = &HdLitSimple::lit_}; }
19
21 HdLitSimple(Lit lit) : lit_{std::move(lit)} {}
23 [[nodiscard]] auto loc() const -> Location const & { return location(lit_); }
25 [[nodiscard]] auto lit() const -> Lit const & { return lit_; }
26
27 private:
28 Lit lit_;
29};
30
32using HdLitDisjunctionElement = std::variant<Lit, CondLit>;
35
37class HdLitDisjunction : public Expression<HdLitDisjunction> {
38 public:
40 static constexpr auto attributes() {
41 return std::tuple{a_loc = &HdLitDisjunction::loc_, a_elems = &HdLitDisjunction::elems_};
42 }
43
46 : loc_{std::move(loc)}, elems_{std::move(elems)} {}
48 [[nodiscard]] auto loc() const -> Location const & { return loc_; }
50 [[nodiscard]] auto elems() const -> HdLitDisjunctionElementArray const & { return elems_; }
51
52 private:
53 Location loc_;
55};
56
58class HdLitAggregateElement : public Expression<HdLitAggregateElement> {
59 public:
61 static constexpr auto attributes() {
62 return std::tuple{a_loc = &HdLitAggregateElement::loc_, a_tuple = &HdLitAggregateElement::tuple_,
63 a_lit = &HdLitAggregateElement::lit_, a_cond = &HdLitAggregateElement::cond_};
64 }
65
68 : loc_{std::move(loc)}, tuple_{std::move(tuple)}, lit_{std::move(lit)}, cond_{std::move(cond)} {}
70 [[nodiscard]] auto loc() const -> Location const & { return loc_; }
72 [[nodiscard]] auto tuple() const -> TermArray const & { return tuple_; }
74 [[nodiscard]] auto lit() const -> Lit const & { return lit_; }
76 [[nodiscard]] auto cond() const -> LitArray const & { return cond_; }
77
78 private:
79 Location loc_;
80 TermArray tuple_;
81 Lit lit_;
82 LitArray cond_;
83};
86
90class HdLitAggregate : public Expression<HdLitAggregate> {
91 public:
93 static constexpr auto attributes() {
94 return std::tuple{a_loc = &HdLitAggregate::loc_, a_lhs = &HdLitAggregate::lhs_, a_fun = &HdLitAggregate::fun_,
95 a_elems = &HdLitAggregate::elems_, a_rhs = &HdLitAggregate::rhs_};
96 }
97
100 RGuard rhs)
101 : loc_{std::move(loc)}, fun_(fun), elems_(std::move(elems)), lhs_{std::move(lhs)}, rhs_{std::move(rhs)} {}
104 : HdLitAggregate{std::move(loc), std::nullopt, fun, std::move(elems), std::nullopt} {}
107 Term rhs)
108 : HdLitAggregate{std::move(loc), std::nullopt, fun, std::move(elems), std::make_pair(rel, std::move(rhs))} {}
109
111 [[nodiscard]] auto loc() const -> Location const & { return loc_; }
113 [[nodiscard]] auto fun() const -> AggregateFunction { return fun_; }
115 [[nodiscard]] auto elems() const -> HdLitAggregateElementArray const & { return elems_; }
117 [[nodiscard]] auto lhs() const -> LGuard const & { return lhs_; }
119 [[nodiscard]] auto rhs() const -> RGuard const & { return rhs_; }
120
121 private:
122 Location loc_;
125 LGuard lhs_;
126 RGuard rhs_;
127};
128
130using HdLit = std::variant<HdLitSimple, HdLitDisjunction, HdLitAggregate, HdLitSetAggregate, HdLitTheoryAtom>;
133
135
136} // namespace CppClingo::Input
A record that friend declares and defines comparison operators.
Definition attributes.hh:60
An element of a head aggregate.
Definition head_literal.hh:58
static constexpr auto attributes()
The record attributes.
Definition head_literal.hh:61
auto tuple() const -> TermArray const &
The tuple of the element.
Definition head_literal.hh:72
auto cond() const -> LitArray const &
The condition of the element.
Definition head_literal.hh:76
auto loc() const -> Location const &
The location of the element.
Definition head_literal.hh:70
HdLitAggregateElement(Location loc, TermArray tuple, Lit lit, LitArray cond)
Construct a head aggregate element.
Definition head_literal.hh:67
auto lit() const -> Lit const &
The distinguished head literal of the element.
Definition head_literal.hh:74
A head aggregate.
Definition head_literal.hh:90
auto loc() const -> Location const &
The location of the aggregate.
Definition head_literal.hh:111
HdLitAggregate(Location loc, AggregateFunction fun, HdLitAggregateElementArray elems)
Construct a head set aggregate.
Definition head_literal.hh:103
static constexpr auto attributes()
The record attributes.
Definition head_literal.hh:93
auto elems() const -> HdLitAggregateElementArray const &
The vector of elements.
Definition head_literal.hh:115
HdLitAggregate(Location loc, AggregateFunction fun, HdLitAggregateElementArray elems, Relation rel, Term rhs)
Construct a head set aggregate.
Definition head_literal.hh:106
auto fun() const -> AggregateFunction
The aggregate function.
Definition head_literal.hh:113
auto lhs() const -> LGuard const &
An optional left guard.
Definition head_literal.hh:117
auto rhs() const -> RGuard const &
An optional right guard.
Definition head_literal.hh:119
HdLitAggregate(Location loc, LGuard lhs, AggregateFunction fun, HdLitAggregateElementArray elems, RGuard rhs)
Construct a head set aggregate.
Definition head_literal.hh:99
A disjunction of conditional literals.
Definition head_literal.hh:37
static constexpr auto attributes()
The record attributes.
Definition head_literal.hh:40
auto loc() const -> Location const &
The location of the disjunction.
Definition head_literal.hh:48
auto elems() const -> HdLitDisjunctionElementArray const &
The elements of the disjunction.
Definition head_literal.hh:50
HdLitDisjunction(Location loc, HdLitDisjunctionElementArray elems)
Wrap a literal in a head literal.
Definition head_literal.hh:45
A single literal in a rule head.
Definition head_literal.hh:15
static constexpr auto attributes()
The record attributes.
Definition head_literal.hh:18
auto lit() const -> Lit const &
The literal.
Definition head_literal.hh:25
auto loc() const -> Location const &
The location of the literal.
Definition head_literal.hh:23
HdLitSimple(Lit lit)
Wrap a literal in a head literal.
Definition head_literal.hh:21
The Location of an expression in an input source.
Definition location.hh:44
auto location(T const &x) -> Location const &
Get the location of an expression.
Definition location.hh:123
Relation
Enumeration of supported relations.
Definition core.hh:35
AggregateFunction
Enumeration of aggregate functions.
Definition core.hh:87
std::optional< std::pair< Term, Relation > > LGuard
Definition aggregate.hh:14
std::optional< std::pair< Relation, Term > > RGuard
An optional right guard of an aggregate.
Definition aggregate.hh:16
std::variant< Lit, CondLit > HdLitDisjunctionElement
An element of a disjunction.
Definition head_literal.hh:32
std::variant< HdLitSimple, HdLitDisjunction, HdLitAggregate, HdLitSetAggregate, HdLitTheoryAtom > HdLit
A head literal.
Definition head_literal.hh:130
constexpr auto a_elems
Definition attributes.hh:23
constexpr auto a_cond
Definition attributes.hh:20
constexpr auto a_lhs
Definition attributes.hh:27
constexpr auto a_lit
Definition attributes.hh:28
constexpr auto a_rhs
Definition attributes.hh:36
constexpr auto a_tuple
Definition attributes.hh:42
constexpr auto a_loc
Definition attributes.hh:29
constexpr auto a_fun
Definition attributes.hh:25
std::variant< LitBool, LitComparison, LitSymbolic > Lit
Variant holding the different literal types.
Definition literal.hh:129
std::variant< TermVariable, TermSymbol, TermTuple, TermFunction, TermAbs, TermUnary, TermBinary > Term
Variant holding the different term types.
Definition term.hh:45