-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcnf.hpp
61 lines (55 loc) · 1.86 KB
/
cnf.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#ifndef CNF_H
#define CNF_H
#include <string>
#include <stack>
#include <memory>
using namespace std;
class TreeNode {
public:
TreeNode(const string val);
~TreeNode();
// void Free();
string value;
int valueType; // 0: literal, 1: unary op, 2: binary op
shared_ptr<TreeNode> left, right;
weak_ptr<TreeNode> parent;
bool is_compact;
};
class CnfTree {
public:
CnfTree();
~CnfTree();
void clean(shared_ptr<TreeNode> root);
void make_tree(const string expr);
vector<string> get_literals();
void check_parent();
string get_prefix();
string get_postfix();
string get_infix();
string get_minisat_form();
int get_max_literal();
void implFree();
void NNF();
void CNF();
private:
// stack<shared_ptr<TreeNode>*> op_stack; // Not stack of TreeNode list
stack<shared_ptr<TreeNode>> exp_stack;
shared_ptr<TreeNode> make_sub_tree(const string expr);
void check_parent(shared_ptr<TreeNode> node, int* count0, int* count1);
void set_parent(shared_ptr<TreeNode> node);
string get_prefix(shared_ptr<TreeNode> node);
string get_postfix(shared_ptr<TreeNode> node);
string get_infix(shared_ptr<TreeNode> node);
string get_minisat_form(shared_ptr<TreeNode> node);
shared_ptr<TreeNode> implFree(shared_ptr<TreeNode> node);
shared_ptr<TreeNode> NNF(shared_ptr<TreeNode> node);
shared_ptr<TreeNode> CNF(shared_ptr<TreeNode> node);
shared_ptr<TreeNode> distr(shared_ptr<TreeNode> node1, shared_ptr<TreeNode> node2);
void compact_tree(shared_ptr<TreeNode>& node);
shared_ptr<TreeNode> root;
vector<string> literals;
int CNF_clauses;
};
int node_num = 0;
void reset(shared_ptr<TreeNode>& node);
#endif