From aaa931e0d53533665db4814fd1bb238014ee409b Mon Sep 17 00:00:00 2001
From: Nuno Lopes <a-nlopes@microsoft.com>
Date: Thu, 25 Sep 2014 15:56:01 +0100
Subject: [PATCH 1/2] fix build with gcc

Signed-off-by: Nuno Lopes <a-nlopes@microsoft.com>
---
 src/muz/base/dl_context.cpp | 4 ++--
 src/muz/base/dl_context.h   | 2 +-
 src/muz/base/dl_rule.cpp    | 2 +-
 src/muz/fp/dl_cmds.cpp      | 4 ++--
 src/muz/rel/product_set.h   | 1 -
 src/smt/theory_arith_core.h | 2 +-
 6 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/src/muz/base/dl_context.cpp b/src/muz/base/dl_context.cpp
index f79a65705..aa415d187 100644
--- a/src/muz/base/dl_context.cpp
+++ b/src/muz/base/dl_context.cpp
@@ -324,7 +324,7 @@ namespace datalog {
         m_bind_variables.add_var(m.mk_const(var));
     }
 
-    expr_ref context::bind_variables(expr* fml, bool is_forall) {
+    expr_ref context::bind_vars(expr* fml, bool is_forall) {
         return m_bind_variables(fml, is_forall);
     }
 
@@ -1078,7 +1078,7 @@ namespace datalog {
    
     void context::get_raw_rule_formulas(expr_ref_vector& rules, svector<symbol>& names){
         for (unsigned i = 0; i < m_rule_fmls.size(); ++i) {
-	  expr_ref r = bind_variables(m_rule_fmls[i].get(), true);
+	  expr_ref r = bind_vars(m_rule_fmls[i].get(), true);
 	  rules.push_back(r.get());
 	  //            rules.push_back(m_rule_fmls[i].get());
 	  names.push_back(m_rule_names[i]);
diff --git a/src/muz/base/dl_context.h b/src/muz/base/dl_context.h
index 85d4b7c0e..e96752721 100644
--- a/src/muz/base/dl_context.h
+++ b/src/muz/base/dl_context.h
@@ -287,7 +287,7 @@ namespace datalog {
           universal (if is_forall is true) or existential 
           quantifier.
          */
-        expr_ref bind_variables(expr* fml, bool is_forall);
+        expr_ref bind_vars(expr* fml, bool is_forall);
 
         /**
            Register datalog relation.
diff --git a/src/muz/base/dl_rule.cpp b/src/muz/base/dl_rule.cpp
index 2015d4eea..c4a14845d 100644
--- a/src/muz/base/dl_rule.cpp
+++ b/src/muz/base/dl_rule.cpp
@@ -370,7 +370,7 @@ namespace datalog {
     }
 
     void rule_manager::bind_variables(expr* fml, bool is_forall, expr_ref& result) {
-        result = m_ctx.bind_variables(fml, is_forall);
+        result = m_ctx.bind_vars(fml, is_forall);
     }
 
     void rule_manager::flatten_body(app_ref_vector& body) {
diff --git a/src/muz/fp/dl_cmds.cpp b/src/muz/fp/dl_cmds.cpp
index 9807cec4a..bb9a1bc10 100644
--- a/src/muz/fp/dl_cmds.cpp
+++ b/src/muz/fp/dl_cmds.cpp
@@ -103,7 +103,7 @@ struct dl_context {
     void add_rule(expr * rule, symbol const& name) {
         init();
         if (m_collected_cmds) {
-            expr_ref rl = m_context->bind_variables(rule, true);
+            expr_ref rl = m_context->bind_vars(rule, true);
             m_collected_cmds->m_rules.push_back(rl);
             m_collected_cmds->m_names.push_back(name);
             m_trail.push(push_back_vector<dl_context, expr_ref_vector>(m_collected_cmds->m_rules));
@@ -116,7 +116,7 @@ struct dl_context {
 
     bool collect_query(expr* q) {
         if (m_collected_cmds) {
-            expr_ref qr = m_context->bind_variables(q, false);
+            expr_ref qr = m_context->bind_vars(q, false);
             m_collected_cmds->m_queries.push_back(qr);
             m_trail.push(push_back_vector<dl_context, expr_ref_vector>(m_collected_cmds->m_queries));
             return true;
diff --git a/src/muz/rel/product_set.h b/src/muz/rel/product_set.h
index ebfe339fe..238a33d8a 100644
--- a/src/muz/rel/product_set.h
+++ b/src/muz/rel/product_set.h
@@ -248,7 +248,6 @@ namespace datalog {
 
 
     class product_set_factory {
-        friend class product_set_factory;
         unsigned char m_data[0];
     public:
         enum initial_t {
diff --git a/src/smt/theory_arith_core.h b/src/smt/theory_arith_core.h
index 9dae2d0c4..d2e0c27a4 100644
--- a/src/smt/theory_arith_core.h
+++ b/src/smt/theory_arith_core.h
@@ -959,7 +959,7 @@ namespace smt {
             typename atoms::iterator hi_inf1 = begin2, hi_sup1 = begin2;
             bool flo_inf, fhi_inf, flo_sup, fhi_sup;
    //         std::cout << atoms.size() << "\n";
-            ptr_addr_hashtable<typename atom> visited;
+            ptr_addr_hashtable<atom> visited;
             for (unsigned i = 0; i < atoms.size(); ++i) {
                 atom* a1 = atoms[i];
                 lo_inf1 = next_inf(a1, A_LOWER, lo_inf, end, flo_inf);

From b7397b696716008d2552566597e66da2144958e5 Mon Sep 17 00:00:00 2001
From: Nuno Lopes <a-nlopes@microsoft.com>
Date: Thu, 25 Sep 2014 16:27:20 +0100
Subject: [PATCH 2/2] relations with no columns are not always non-empty. fix
 that in the udoc datalog backend

Signed-off-by: Nuno Lopes <a-nlopes@microsoft.com>
---
 src/muz/rel/udoc_relation.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/muz/rel/udoc_relation.cpp b/src/muz/rel/udoc_relation.cpp
index 75fb03c9e..1e448f861 100644
--- a/src/muz/rel/udoc_relation.cpp
+++ b/src/muz/rel/udoc_relation.cpp
@@ -63,7 +63,7 @@ namespace datalog {
         m_elems.push_back(fact2doc(f));
     }
     bool udoc_relation::empty() const {
-        if (get_signature().empty()) return false;
+        if (m_elems.is_empty()) return true;
         // TBD: make this a complete check
         for (unsigned i = 0; i < m_elems.size(); ++i) {
             if (!dm.is_empty(m_elems[i])) return false;