clingo
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
statements.hh
Go to the documentation of this file.
1 // {{{ GPL License
2 
3 // This file is part of gringo - a grounder for logic programs.
4 // Copyright (C) 2013 Roland Kaminski
5 
6 // This program is free software: you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation, either version 3 of the License, or
9 // (at your option) any later version.
10 
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 
16 // You should have received a copy of the GNU General Public License
17 // along with this program. If not, see <http://www.gnu.org/licenses/>.
18 
19 // }}}
20 
21 #ifndef _GRINGO_OUTPUT_STATEMENTS_HH
22 #define _GRINGO_OUTPUT_STATEMENTS_HH
23 
26 #include <gringo/unique_list.hh>
27 
28 namespace Gringo { namespace Output {
29 
30 // {{{ declaration of Rule
31 
32 struct Rule : Statement {
33  Rule();
35  virtual void printPlain(std::ostream &out) const;
36  virtual void toLparse(LparseTranslator &x);
37  virtual void printLparse(LparseOutputter &out) const;
38  virtual Rule *clone() const;
39  virtual bool isIncomplete() const;
40  virtual ~Rule();
41 
44 };
45 
46 struct RuleRef : Statement {
47  virtual void printPlain(std::ostream &out) const;
48  virtual Rule *clone() const;
49  virtual void toLparse(LparseTranslator &x);
50  virtual void printLparse(LparseOutputter &out) const;
51  virtual bool isIncomplete() const;
52  virtual ~RuleRef();
53 
56 };
57 // }}}
58 // {{{ declaration of LparseRule
59 
61  using HeadVec = std::vector<std::reference_wrapper<PredicateDomain::element_type>>;
62 
64  LparseRule(ULit &&b1, ULit &&b2);
65  LparseRule(SAuxAtom head, ULit &&b1, ULit &&b2);
66  LparseRule(PredicateDomain::element_type &head, ULit &&b1, ULit &&b2 = nullptr);
72  virtual void printPlain(std::ostream &out) const;
73  virtual void toLparse(LparseTranslator &x);
74  virtual void printLparse(LparseOutputter &out) const;
75  virtual LparseRule *clone() const;
76  virtual bool isIncomplete() const;
77  virtual ~LparseRule();
78 
79  bool choice;
83 };
84 
85 // }}}
86 // {{{ declaration of WeightRule
87 
89  using ULitBoundVec = std::vector<std::pair<ULit, unsigned>>;
90 
92  virtual void printPlain(std::ostream &out) const;
93  virtual void toLparse(LparseTranslator &x);
94  virtual void printLparse(LparseOutputter &out) const;
95  virtual WeightRule *clone() const;
96  virtual bool isIncomplete() const;
97  virtual ~WeightRule();
98 
101  unsigned lower;
102 };
103 
104 // }}}
105 // {{{ declaration of HeadAggregateState
106 
108  struct Cond {
110  size_t hash() const;
111  bool operator==(Cond const &x) const;
113  unsigned headNum;
115  };
116  using CondVec = std::vector<Cond>;
117 
119  unsigned imported = 0;
120  bool fact = false;
121 };
122 
126  using element_type = std::pair<Value const, HeadAggregateState>;
127 
128  // Note has much in common with BodyAggregateState
131  void accumulate(ValVec const &tuple, AggregateFunction fun, PredicateDomain::element_type *head, unsigned headNum, LitVec const &lits, Location const &loc);
132  bool defined() const;
133  Bounds::Interval range(AggregateFunction fun) const;
134  unsigned generation() const;
135  bool fact(bool) const;
136  static element_type &ignore();
137 
140  union {
141  int64_t intMin;
143  };
144  union {
145  int64_t intMax;
147  };
148  unsigned _generation;
149  bool todo = false;
150 };
151 
152 // }}}
153 // {{{ declaration of HeadAggregateRule
154 
156  using BoundsVec = std::vector<std::pair<Relation, Value>>;
157 
158  static void printElem(std::ostream &out, HeadAggregateState::ElemSet::value_type const &x);
159  virtual void toLparse(LparseTranslator &x);
160  virtual void printPlain(std::ostream &out) const;
161  virtual void printLparse(LparseOutputter &out) const;
162  virtual bool isIncomplete() const;
163  virtual HeadAggregateRule *clone() const;
164  virtual ~HeadAggregateRule();
165 
170 };
171 
172 // }}}
173 // {{{ declaration of DisjunctionState
174 
176  using ElemSet = std::vector<std::pair<PredicateDomain::element_type *, ULitVec>>;
177  using element_type = std::pair<Value const, DisjunctionState>;
178 
180  DisjunctionState(unsigned generation);
181  void accumulate(PredicateDomain::element_type *head, LitVec const &lits);
182  bool defined() const;
183  unsigned generation() const;
184  bool fact(bool) const;
185  static element_type &ignore();
186 
188  unsigned _generation;
189 };
190 
191 // }}}
192 // {{{ declaration of DisjunctionRule
193 
195  static void printElem(std::ostream &out, DisjunctionState::ElemSet::value_type const &x);
196  virtual void toLparse(LparseTranslator &x);
197  virtual void printPlain(std::ostream &out) const;
198  virtual void printLparse(LparseOutputter &out) const;
199  virtual bool isIncomplete() const;
200  virtual DisjunctionRule *clone() const;
201  virtual ~DisjunctionRule();
202 
203  DisjunctionState *repr = nullptr;
205 };
206 
207 // }}}
208 // {{{ declaration of Minimize
209 
210 struct Minimize : Statement {
211  virtual void toLparse(LparseTranslator &x);
212  virtual void printPlain(std::ostream &out) const;
213  virtual void printLparse(LparseOutputter &out) const;
214  virtual bool isIncomplete() const;
215  virtual Minimize *clone() const;
216  virtual ~Minimize();
217 
219 };
220 
221 // }}}
222 // {{{ declaration of LparseMinimize
223 
224 using ULitWeightVec = std::vector<std::pair<ULit, unsigned>>;
227  virtual void toLparse(LparseTranslator &x);
228  virtual void printPlain(std::ostream &out) const;
229  virtual void printLparse(LparseOutputter &out) const;
230  virtual bool isIncomplete() const;
231  virtual LparseMinimize *clone() const;
232  virtual ~LparseMinimize();
233 
236 };
237 
238 // }}}
239 
240 } } // namespace Output Gringo
241 
242 #endif // _GRINGO_OUTPUT_STATEMENTS_HH
CondVec conds
Definition: statements.hh:118
std::vector< SAuxAtom > SAuxAtomVec
Definition: literals.hh:41
virtual void printLparse(LparseOutputter &out) const
Definition: statements.cc:168
void accumulate(ValVec const &tuple, AggregateFunction fun, PredicateDomain::element_type *head, unsigned headNum, LitVec const &lits, Location const &loc)
Definition: statements.cc:354
SAuxAtom head
Definition: statements.hh:99
virtual void printPlain(std::ostream &out) const
Definition: statements.cc:60
virtual void printPlain(std::ostream &out) const
Definition: statements.cc:754
virtual void toLparse(LparseTranslator &x)
Definition: statements.cc:625
Bounds::Interval range(AggregateFunction fun) const
Definition: statements.cc:404
unsigned lower
Definition: statements.hh:101
Definition: statements.hh:225
virtual WeightRule * clone() const
Definition: statements.cc:318
virtual Rule * clone() const
Definition: statements.cc:132
Definition: locatable.hh:30
Rule()
Definition: statements.cc:58
bool fact(bool) const
Definition: statements.cc:411
virtual bool isIncomplete() const
Definition: statements.cc:706
virtual void printLparse(LparseOutputter &out) const
Definition: statements.cc:298
DisjunctionState * repr
Definition: statements.hh:203
MinimizeList elems
Definition: statements.hh:218
virtual void toLparse(LparseTranslator &x)
Definition: statements.cc:417
virtual DisjunctionRule * clone() const
Definition: statements.cc:707
virtual bool isIncomplete() const
Definition: statements.cc:110
virtual ~LparseRule()
Definition: statements.cc:274
bool todo
Definition: statements.hh:149
PredicateDomain::element_type * head
Definition: statements.hh:112
Definition: statements.hh:46
virtual void printLparse(LparseOutputter &out) const
Definition: statements.cc:563
virtual void printPlain(std::ostream &out) const
Definition: statements.cc:724
Definition: value.hh:113
virtual ~RuleRef()
Definition: statements.cc:185
bool fact
Definition: statements.hh:120
virtual ~HeadAggregateRule()
Definition: statements.cc:605
Definition: statement.hh:60
ElemSet elems
Definition: statements.hh:187
std::vector< Cond > CondVec
Definition: statements.hh:116
static element_type & ignore()
Definition: statements.cc:620
virtual bool isIncomplete() const
Definition: statements.cc:322
std::vector< std::pair< PredicateDomain::element_type *, ULitVec >> ElemSet
Definition: statements.hh:176
unsigned imported
Definition: statements.hh:119
ElemSet elems
Definition: statements.hh:139
Definition: statement.hh:47
static element_type & ignore()
Definition: statements.cc:412
virtual bool isIncomplete() const
Definition: statements.cc:766
virtual void toLparse(LparseTranslator &x)
Definition: statements.cc:294
virtual ~LparseMinimize()
Definition: statements.cc:768
HeadAggregateState()
Definition: statements.cc:333
Definition: lparseoutputter.hh:38
virtual void printLparse(LparseOutputter &out) const
Definition: statements.cc:685
Definition: statements.hh:88
virtual void printPlain(std::ostream &out) const
Definition: statements.cc:213
virtual void printLparse(LparseOutputter &out) const
Definition: statements.cc:251
ULitWeightVec lits
Definition: statements.hh:235
BoundsVec bounds
Definition: statements.hh:166
typename element_map::value_type element_type
Definition: domain.hh:160
Definition: statements.hh:123
std::vector< ULit > ULitVec
Definition: literal.hh:55
LitVec body
Definition: statements.hh:55
Definition: statements.hh:32
ULitBoundVec body
Definition: statements.hh:100
bool choice
Definition: statements.hh:79
virtual LparseRule * clone() const
Definition: statements.cc:269
ULitVec body
Definition: statements.hh:43
std::vector< std::reference_wrapper< PredicateDomain::element_type >> HeadVec
Definition: statements.hh:61
bool fact(bool) const
Definition: statements.cc:619
virtual ~Minimize()
Definition: statements.cc:742
virtual void toLparse(LparseTranslator &x)
Definition: statements.cc:72
Definition: value.hh:166
virtual HeadAggregateRule * clone() const
Definition: statements.cc:597
Cond(PredicateDomain::element_type *head, unsigned headNum, Output::ULitVec &&lits)
Definition: statements.cc:328
Definition: unique_list.hh:145
std::vector< std::pair< Relation, Value >> BoundsVec
Definition: statements.hh:156
virtual void toLparse(LparseTranslator &x)
Definition: statements.cc:138
std::vector< std::pair< ULit, unsigned >> ULitBoundVec
Definition: statements.hh:89
virtual Minimize * clone() const
Definition: statements.cc:741
unsigned generation() const
Definition: statements.cc:618
WeightRule(SAuxAtom head, unsigned lower, ULitBoundVec &&body)
Definition: statements.cc:279
PredicateDomain::element_type * head
Definition: statements.hh:42
static void printElem(std::ostream &out, DisjunctionState::ElemSet::value_type const &x)
Definition: statements.cc:688
void accumulate(PredicateDomain::element_type *head, LitVec const &lits)
Definition: statements.cc:612
virtual void printLparse(LparseOutputter &out) const
Definition: statements.cc:761
std::unique_ptr< Literal > ULit
Definition: literal.hh:41
virtual bool isIncomplete() const
Definition: statements.cc:596
virtual Rule * clone() const
Definition: statements.cc:104
virtual void toLparse(LparseTranslator &x)
Definition: statements.cc:718
static void printElem(std::ostream &out, HeadAggregateState::ElemSet::value_type const &x)
Definition: statements.cc:566
Bounds bounds
Definition: statements.hh:138
HeadVec head
Definition: statements.hh:80
virtual ~Rule()
Definition: statements.cc:118
Value::POD valMax
Definition: statements.hh:146
ULitVec body
Definition: statements.hh:82
virtual LparseMinimize * clone() const
Definition: statements.cc:767
Definition: statements.hh:210
virtual void printPlain(std::ostream &out) const
Definition: statements.cc:697
unsigned _generation
Definition: statements.hh:148
Value::POD valMin
Definition: statements.hh:142
Definition: statements.hh:107
virtual bool isIncomplete() const
Definition: statements.cc:273
virtual bool isIncomplete() const
Definition: statements.cc:177
virtual void printLparse(LparseOutputter &out) const
Definition: statements.cc:737
virtual void toLparse(LparseTranslator &x)
Definition: statements.cc:750
std::vector< std::pair< FWValVec, ULitVec >> MinimizeList
Definition: statement.hh:42
virtual void printPlain(std::ostream &out) const
Definition: statements.cc:120
LparseRule(ULitVec &&body)
Definition: statements.cc:190
bool defined() const
Definition: statements.cc:617
virtual ~DisjunctionRule()
Definition: statements.cc:713
Definition: statements.hh:108
unsigned generation() const
Definition: statements.cc:410
AggregateFunction fun
Definition: statements.hh:167
HeadAggregateState * repr
Definition: statements.hh:168
int x
Definition: utility.cc:65
bool defined() const
Definition: statements.cc:403
Definition: unique_list.hh:157
unsigned headNum
Definition: statements.hh:113
Definition: statements.hh:60
std::shared_ptr< AuxAtom > SAuxAtom
Definition: literals.hh:40
Definition: statements.hh:155
std::vector< std::reference_wrapper< Literal >> LitVec
Definition: literal.hh:54
std::vector< Value > ValVec
Definition: value.hh:41
ULitVec body
Definition: statements.hh:169
virtual void toLparse(LparseTranslator &x)
Definition: statements.cc:227
Output::ULitVec lits
Definition: statements.hh:114
int64_t intMin
Definition: statements.hh:141
DisjunctionState()
Definition: statements.cc:610
PredicateDomain::element_type * head
Definition: statements.hh:54
Value prio
Definition: statements.hh:234
std::unique_ptr< FunctionTerm > fun(char const *name, T &&...args)
Definition: term_helper.hh:67
std::vector< std::pair< ULit, unsigned >> ULitWeightVec
Definition: statements.hh:224
Definition: statements.hh:175
int64_t intMax
Definition: statements.hh:145
AggregateFunction
Definition: base.hh:54
virtual bool isIncomplete() const
Definition: statements.cc:740
Definition: statements.hh:194
bool operator==(Cond const &x) const
LparseMinimize(Value prio, ULitWeightVec &&lits)
Definition: statements.cc:747
virtual ~WeightRule()
Definition: statements.cc:323
std::pair< Value const, HeadAggregateState > element_type
Definition: statements.hh:126
SAuxAtomVec auxHead
Definition: statements.hh:81
virtual void printPlain(std::ostream &out) const
Definition: statements.cc:582
LparseOutputter & out
Definition: output.cc:685
virtual void printLparse(LparseOutputter &out) const
Definition: statements.cc:95
std::pair< Value const, DisjunctionState > element_type
Definition: statements.hh:177
virtual void printPlain(std::ostream &out) const
Definition: statements.cc:280
unsigned _generation
Definition: statements.hh:188
ULitVec body
Definition: statements.hh:204