z3-z3-4.13.0.src.ast.func_decl_dependencies.h Maven / Gradle / Ivy
The newest version!
/*++
Copyright (c) 2006 Microsoft Corporation
Module Name:
func_decl_dependencies.h
Abstract:
Author:
Leonardo de Moura (leonardo) 2010-12-15.
Revision History:
--*/
#pragma once
#include "ast/ast.h"
#include "util/obj_hashtable.h"
// Set of dependencies
typedef obj_hashtable func_decl_set;
/**
\brief Collect uninterpreted function declarations (with arity > 0) occurring in \c n.
*/
void collect_func_decls(ast_manager & m, expr * n, func_decl_set & r, bool ng_only = false);
/**
\brief Auxiliary data-structure used for tracking dependencies between function declarations.
The following pattern of use is expected:
func_decl_dependencies & dm;
func_decl_set * S = dm.mk_func_decl_set();
dm.collect_func_decls(t_1, S);
...
dm.collect_func_decls(t_n, S);
dm.insert(f, S);
*/
class func_decl_dependencies {
typedef obj_map dependency_graph;
ast_manager & m_manager;
dependency_graph m_deps;
class top_sort;
public:
func_decl_dependencies(ast_manager & m):m_manager(m) {}
~func_decl_dependencies() {
reset();
}
void reset();
/**
\brief Create a dependency set.
This set should be populated using #collect_func_decls.
After populating the set, it must be used as an argument for the #insert method.
\remark The manager owns the set.
\warning Failure to call #insert will produce a memory leak.
*/
func_decl_set * mk_func_decl_set() { return alloc(func_decl_set); }
/**
\brief Store the uninterpreted function declarations used in \c n into \c s.
*/
void collect_func_decls(expr * n, func_decl_set * s);
/**
\brief Store the uninterpreted function declarations (in non ground terms) used in \c n into \c s.
*/
void collect_ng_func_decls(expr * n, func_decl_set * s);
/**
\brief Insert \c f in the manager with the given set of dependencies.
The insertion succeeds iff
1- no cycle is created between the new entry and
the already existing dependencies.
2- \c f was not already inserted into the manager.
Return false in case of failure.
\remark The manager is the owner of the dependency sets.
*/
bool insert(func_decl * f, func_decl_set * s);
/**
\brief Return true if \c f is registered in this manager.
*/
bool contains(func_decl * f) const { return m_deps.contains(f); }
func_decl_set * get_dependencies(func_decl * f) const { func_decl_set * r = nullptr; m_deps.find(f, r); return r; }
/**
\brief Erase \c f (and its dependencies) from the manager.
*/
void erase(func_decl * f);
void display(std::ostream & out);
};