metaSMT git
|
00001 #pragma once 00002 00003 #include <boost/variant.hpp> 00004 #include <boost/mpl/vector.hpp> 00005 00006 namespace metaSMT { 00007 struct nil { 00008 bool operator< (nil const &) const { return false; }; 00009 template<typename STREAM> friend STREAM & 00010 operator<< (STREAM & out, nil const & ) { out << "nil"; return out; } 00011 }; 00012 00013 namespace logic { 00014 namespace tag { 00015 00016 #define PRINT(Tag, body) template<typename STREAM> \ 00017 friend STREAM & operator<< (STREAM & out, Tag const & self) \ 00018 { out << body; return out; } 00019 #define TAG( NAME ) struct NAME##_tag { \ 00020 bool operator<(NAME##_tag const &) const {return false;} \ 00021 PRINT(NAME##_tag, #NAME) \ 00022 }; 00023 00024 // variable tag 00025 struct var_tag { unsigned id; 00026 PRINT(var_tag, "var_tag[" << self.id << "]") 00027 bool operator< (var_tag const & other) const { 00028 return id < other.id; 00029 } 00030 }; 00031 00032 // constants 00033 TAG(true) 00034 TAG(false) 00035 00036 // unary 00037 TAG(not) 00038 00039 // binary 00040 TAG(equal) 00041 TAG(nequal) 00042 TAG(implies) 00043 00044 TAG(and) 00045 TAG(nand) 00046 TAG(or) 00047 TAG(nor) 00048 TAG(xor) 00049 TAG(xnor) 00050 00051 TAG(ite) 00052 00053 #undef PRINT 00054 #undef TAG 00055 // 00056 // tag variant Predicate 00057 typedef boost::mpl::vector< 00058 false_tag 00059 , true_tag 00060 , not_tag 00061 , equal_tag 00062 , nequal_tag 00063 , and_tag 00064 , nand_tag 00065 , or_tag 00066 , nor_tag 00067 , xor_tag 00068 , xnor_tag 00069 , implies_tag 00070 , ite_tag 00071 , var_tag 00072 >::type Predicate_Tags; 00073 00074 typedef boost::make_variant_over< Predicate_Tags >::type Predicate_Tag; 00075 00076 } // namespace tag 00077 } // namespace logic 00078 } // namespace metaSMT 00079 00080 // vim: ft=cpp:ts=2:sw=2:expandtab