mirror of
https://github.com/Z3Prover/z3
synced 2025-05-09 00:35:47 +00:00
Z3 sources
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
3f9edad676
commit
e9eab22e5c
1186 changed files with 381859 additions and 0 deletions
95
lib/spc_literal_selection.h
Normal file
95
lib/spc_literal_selection.h
Normal file
|
@ -0,0 +1,95 @@
|
|||
/*++
|
||||
Copyright (c) 2006 Microsoft Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
spc_literal_selection.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Superposition Calculus Literal Selection
|
||||
|
||||
Author:
|
||||
|
||||
Leonardo de Moura (leonardo) 2008-02-05.
|
||||
|
||||
Revision History:
|
||||
|
||||
--*/
|
||||
#ifndef _SPC_LITERAL_SELECTION_H_
|
||||
#define _SPC_LITERAL_SELECTION_H_
|
||||
|
||||
#include"spc_clause.h"
|
||||
#include"order.h"
|
||||
|
||||
namespace spc {
|
||||
|
||||
/**
|
||||
\brief Abstract functor for literal selection.
|
||||
*/
|
||||
class literal_selection {
|
||||
public:
|
||||
virtual ~literal_selection() {}
|
||||
/**
|
||||
\brief Updates the selected status flag of the literals of the given clause.
|
||||
*/
|
||||
virtual void operator()(clause * cls) = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
\brief Never selects a literal. This strategy is supposed to be good for planning problems
|
||||
of TPTP.
|
||||
*/
|
||||
class no_literal_selection : public literal_selection {
|
||||
public:
|
||||
virtual void operator()(clause * cls) {}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
\brief Selects a negative literal l with the largest V(l)
|
||||
where V is defined as:
|
||||
|
||||
- difference in symbol count for the left-right hand sides of equalities, .
|
||||
|
||||
- symbol count for other predicates
|
||||
|
||||
*/
|
||||
class diff_literal_selection : public literal_selection {
|
||||
protected:
|
||||
ast_manager & m_manager;
|
||||
public:
|
||||
diff_literal_selection(ast_manager & m):m_manager(m) {}
|
||||
virtual void operator()(clause * cls);
|
||||
};
|
||||
|
||||
/**
|
||||
\brief Selects a negative literal using the following algo:
|
||||
|
||||
- if there is x != y, select it.
|
||||
|
||||
- else if there is negative ground literal, select the smallest one.
|
||||
|
||||
- else if use the approach in diff_literal_selection.
|
||||
*/
|
||||
class complex_literal_selection : public diff_literal_selection {
|
||||
public:
|
||||
complex_literal_selection(ast_manager & m):diff_literal_selection(m) {}
|
||||
virtual void operator()(clause * cls);
|
||||
};
|
||||
|
||||
/**
|
||||
\brief Similar to diff_literal_selection, but a literal
|
||||
is not selected if the clause contains a positive literal
|
||||
greater than all other literals.
|
||||
*/
|
||||
class max_no_selection : public diff_literal_selection {
|
||||
order & m_order;
|
||||
public:
|
||||
max_no_selection(order & o):diff_literal_selection(o.get_manager()), m_order(o) {}
|
||||
virtual void operator()(clause * cls);
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
#endif /* _SPC_LITERAL_SELECTION_H_ */
|
Loading…
Add table
Add a link
Reference in a new issue