13 friend std::hash<self_type>;
19 using node_ptr =
typename table_type::node_ptr;
26 using label_type =
typename table_type::node_type::label_type;
31 static table_type& table() {
32 static table_type instance;
36 template<
class V,
typename R,
typename ...Args>
37 R visit_result(
const Args& ...args)
const {
45 basic_boolean_function() : _root(nullptr) {}
51 _root(table().new_var(_label))
79 return self_type(table().
ite(_root, then_node._root, else_node._root));
88 return _root->index() == o._root->index();
97 return _root->index() != o._root->index();
104 return self_type(table().apply_not(_root));
111 return self_type(table().apply_and(_root, o._root));
118 _root = table().apply_and(_root, o._root);
126 return self_type(table().apply_or(_root, o._root));
133 _root = table().apply_or(_root, o._root);
142 return self_type(table().apply_xor(_root, o._root));
149 _root = table().apply_xor(_root, o._root);
160 _root->accept(visitor);
166 template<
class AssignT>
168 return visit_result<execute_visitor<self_type, AssignT>,
bool>(assign);
175 return visit_result<is_wire_visitor<self_type>,
bool>();
182 return visit_result<is_negation_visitor<self_type>,
bool>();
189 return visit_result<is_conjunction_visitor<self_type>,
bool>();
196 return visit_result<is_disjunction_visitor<self_type>,
bool>();
203 return visit_result<is_exclusive_disjunction_visitor<self_type>,
bool>();
218 struct hash<
boloq::basic_boolean_function<T>> {
219 std::hash<typename boloq::basic_boolean_function<T>::node_ptr> hash_fn;
221 return hash_fn(bf._root);
static const self_type one()
0 定節点
Definition: boolean_function.h:64
bool is_negation() const
論理否定を表すかどうかを判定します
Definition: boolean_function.h:181
bool execute(const AssignT &assign) const
論理関数を評価します
Definition: boolean_function.h:167
boloq の名前空間
Definition: boolean_function.h:3
bool is_wire() const
f(x) = x かどうかを判定します
Definition: boolean_function.h:174
二分決定図を操作する基本的なクラスです
Definition: boolean_function.h:9
self_type & operator|=(const self_type &o)
or演算を適用します
Definition: boolean_function.h:132
Definition: boolean_function.h:215
basic_boolean_function(const label_type &_label)
コンストラクタ
Definition: boolean_function.h:50
self_type & operator&=(const self_type &o)
and演算を適用します
Definition: boolean_function.h:117
bool is_conjunction() const
論理積を表すかどうかを判定します
Definition: boolean_function.h:188
basic_boolean_function(const node_ptr &r)
visitor 内で生成するためのコンストラクタ
Definition: boolean_function.h:57
self_type operator&(const self_type &o) const
and演算を行った結果を返します
Definition: boolean_function.h:110
self_type operator^(const self_type &o) const
Definition: boolean_function.h:141
self_type & operator^=(const self_type &o)
or演算を適用します
Definition: boolean_function.h:148
void accept(V &visitor) const
visitorを受理します
Definition: boolean_function.h:159
bool operator!=(const self_type &o) const
違う論理関数を表現しているか比較します
Definition: boolean_function.h:96
self_type ite(const self_type &then_node, const self_type &else_node) const
ITE関数を実行します
Definition: boolean_function.h:78
bool operator==(const self_type &o) const
同じ論理関数を表現しているか比較します
Definition: boolean_function.h:87
bool is_exclusive_disjunction() const
排他的論理和を表すかどうかを判定します
Definition: boolean_function.h:202
bool is_disjunction() const
論理和を表すかどうかを判定します
Definition: boolean_function.h:195
static const self_type zero()
1 定節点
Definition: boolean_function.h:71
typename table_type::node_ptr node_ptr
実際に操作されるノードの型
Definition: boolean_function.h:19
self_type operator~() const
not演算を行った結果を返します
Definition: boolean_function.h:103
self_type operator|(const self_type &o) const
Definition: boolean_function.h:125
typename table_type::node_type::label_type label_type
ラベルの型を表します
Definition: boolean_function.h:26