Lattice Land Core Library
|
#include <primitive_upset.hpp>
Public Types | |
using | pre_universe = PreUniverse |
using | value_type = typename pre_universe::value_type |
using | memory_type = Mem |
using | this_type = PrimitiveUpset<pre_universe, memory_type> |
using | dual_type = PrimitiveUpset<typename pre_universe::dual_type, memory_type> |
template<class M > | |
using | this_type2 = PrimitiveUpset<pre_universe, M> |
using | local_type = this_type2<battery::local_memory> |
template<class M > | |
using | flat_type = FlatUniverse<typename pre_universe::increasing_type, M> |
Public Member Functions | |
CUDA constexpr | PrimitiveUpset () |
CUDA constexpr | PrimitiveUpset (value_type x) |
CUDA constexpr | PrimitiveUpset (const this_type &other) |
constexpr | PrimitiveUpset (this_type &&other)=default |
template<class M > | |
CUDA constexpr | PrimitiveUpset (const this_type2< M > &other) |
template<class M > | |
CUDA constexpr this_type & | operator= (const this_type2< M > &other) |
CUDA constexpr this_type & | operator= (const this_type &other) |
CUDA constexpr value_type | value () const |
CUDA constexpr | operator value_type () const |
CUDA constexpr local::BInc | is_top () const |
CUDA constexpr local::BDec | is_bot () const |
CUDA constexpr this_type & | tell_top () |
template<class M1 , class M2 > | |
CUDA constexpr this_type & | tell (const this_type2< M1 > &other, BInc< M2 > &has_changed) |
template<class M1 > | |
CUDA constexpr this_type & | tell (const this_type2< M1 > &other) |
CUDA constexpr this_type & | dtell_bot () |
template<class M1 , class M2 > | |
CUDA constexpr this_type & | dtell (const this_type2< M1 > &other, BInc< M2 > &has_changed) |
template<class M1 > | |
CUDA constexpr this_type & | dtell (const this_type2< M1 > &other) |
template<class Env > | |
CUDA NI TFormula< typename Env::allocator_type > | deinterpret (AVar avar, const Env &env) const |
template<class F > | |
CUDA NI F | deinterpret () const |
CUDA constexpr bool | extract (local_type &ua) const |
CUDA NI void | print () const |
Static Public Member Functions | |
static CUDA constexpr this_type | geq_k (value_type k) |
static CUDA constexpr this_type | leq_k (value_type k) |
static CUDA constexpr local_type | bot () |
static CUDA constexpr local_type | top () |
template<bool diagnose = false, class F , class Env , class M2 > | |
CUDA static NI bool | interpret_tell (const F &f, const Env &, this_type2< M2 > &tell, IDiagnostics &diagnostics) |
template<bool diagnose = false, class F , class Env , class M2 > | |
CUDA static NI bool | interpret_ask (const F &f, const Env &, this_type2< M2 > &ask, IDiagnostics &diagnostics) |
template<IKind kind, bool diagnose = false, class F , class Env , class M2 > | |
CUDA static NI bool | interpret (const F &f, const Env &env, this_type2< M2 > &value, IDiagnostics &diagnostics) |
static CUDA constexpr bool | is_supported_fun (Sig sig) |
static CUDA constexpr local_type | next (const this_type2< Mem > &a) |
static CUDA constexpr local_type | prev (const this_type2< Mem > &a) |
template<Sig sig, class M > | |
static CUDA constexpr local_type | fun (const flat_type< M > &a) |
template<Sig sig, class M1 , class M2 > | |
static CUDA constexpr local_type | fun (const flat_type< M1 > &a, const flat_type< M2 > &b) |
template<Sig sig, class Pre1 , class Mem1 , class Pre2 , class Mem2 > | |
static CUDA constexpr local_type | guarded_div (const PrimitiveUpset< Pre1, Mem1 > &a, const PrimitiveUpset< Pre2, Mem2 > &b) |
template<Sig sig, class M1 , class M2 > | |
static CUDA constexpr local_type | fun (const this_type2< M1 > &a, const this_type2< M2 > &b) |
Static Public Attributes | |
static constexpr const bool | is_abstract_universe = true |
static constexpr const bool | sequential = Mem::sequential |
static constexpr const bool | is_totally_ordered = pre_universe::is_totally_ordered |
static constexpr const bool | preserve_bot = pre_universe::preserve_bot |
static constexpr const bool | preserve_top = pre_universe::preserve_top |
static constexpr const bool | preserve_join = pre_universe::preserve_join |
static constexpr const bool | preserve_meet = pre_universe::preserve_meet |
static constexpr const bool | injective_concretization = pre_universe::injective_concretization |
static constexpr const bool | preserve_concrete_covers = pre_universe::preserve_concrete_covers |
static constexpr const bool | complemented = pre_universe::complemented |
static constexpr const bool | increasing = pre_universe::increasing |
static constexpr const char * | name = pre_universe::name |
static constexpr const bool | is_arithmetic = pre_universe::is_arithmetic |
Friends | |
template<class Pre2 , class Mem2 > | |
class | PrimitiveUpset |
using lala::PrimitiveUpset< PreUniverse, Mem >::pre_universe = PreUniverse |
using lala::PrimitiveUpset< PreUniverse, Mem >::value_type = typename pre_universe::value_type |
using lala::PrimitiveUpset< PreUniverse, Mem >::memory_type = Mem |
using lala::PrimitiveUpset< PreUniverse, Mem >::this_type = PrimitiveUpset<pre_universe, memory_type> |
using lala::PrimitiveUpset< PreUniverse, Mem >::dual_type = PrimitiveUpset<typename pre_universe::dual_type, memory_type> |
using lala::PrimitiveUpset< PreUniverse, Mem >::this_type2 = PrimitiveUpset<pre_universe, M> |
using lala::PrimitiveUpset< PreUniverse, Mem >::local_type = this_type2<battery::local_memory> |
using lala::PrimitiveUpset< PreUniverse, Mem >::flat_type = FlatUniverse<typename pre_universe::increasing_type, M> |
|
inlineconstexpr |
Initialize an upset universe to bottom.
|
inlineconstexpr |
Similar to \([\![x \geq_A i]\!]\) for any name x
where \( \geq_A \) is the lattice order.
|
inlineconstexpr |
|
constexprdefault |
|
inlineconstexpr |
|
inlinestaticconstexpr |
A pre-interpreted formula x >= value
ready to use. This is mainly for optimization purpose to avoid calling interpret
each time we need it.
|
inlinestaticconstexpr |
|
inlinestaticconstexpr |
Similar to \([\![\mathit{true}]\!]\) if preserve_bot
is true.
|
inlinestaticconstexpr |
Similar to \([\![\mathit{false}]\!]\) if preserve_top
is true.
|
inlineconstexpr |
The assignment operator can only be used in a sequential context. It is monotone but not extensive.
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
true
whenever \( a = \top \), false
otherwise.
|
inlineconstexpr |
true
whenever \( a = \bot \), false
otherwise.
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inline |
x
is a variable's name and i
the current value. If U
preserves bottom true
is returned whenever \( a = \bot \), if it preserves top false
is returned whenever \( a = \top \). We always return an exact approximation, hence for any formula \( \llbracket \varphi \rrbracket = a \), we must have \( a = \llbracket \rrbracket a \llbracket \rrbracket \) where \( \rrbracket a \llbracket \) is the deinterpretation function.
|
inline |
Deinterpret the current value to a logical constant.
|
inlineconstexpr |
Under-approximates the current element \( a \) w.r.t. \( \rrbracket a \llbracket \) into ua
. For this abstract universe, it always returns true
since the current element \( a \) is an exact representation of \( \rrbracket a \llbracket \).
|
inline |
Print the current element.
|
inlinestatic |
Expects a predicate of the form x <op> k
, k <op> x
or x in k
, where x
is any variable's name, and k
a constant. The symbol <op>
is expected to be U::sig_order()
, U::sig_strict_order()
and =
. Existential formula \( \exists{x:T} \) can also be interpreted (only to bottom) depending on the underlying pre-universe.
|
inlinestatic |
Expects a predicate of the form x <op> k
or k <op> x
, where x
is any variable's name, and k
a constant. The symbol <op>
is expected to be U::sig_order()
, U::sig_strict_order()
or !=
.
|
inlinestatic |
|
inlinestaticconstexpr |
|
inlinestaticconstexpr |
|
inlinestaticconstexpr |
|
inlinestaticconstexpr |
Unary function of type Sig: FlatUniverse -> PrimitiveUpset
.
a
is bot
, we return the bottom element of the upset lattice; and dually for top
. Otherwise, we apply the function Sig
to a
and return the result.
|
inlinestaticconstexpr |
Binary functions of type Sig: FlatUniverse x FlatUniverse -> PrimitiveUpset
.
a
or b
is bot
, we return the bottom element of the upset lattice; and dually for top
. Otherwise, we apply the function Sig
to a
and b
and return the result.
|
inlinestaticconstexpr |
Given two values a
and b
, we perform the division while taking care of the case where b == 0
. When b != 0
, the result is fun<sig>(a, b)
. Otherwise, the result depends on the type of a
and b
:
a | b | local_type | Result |
---|---|---|---|
Inc | Inc | Inc | 0 |
Inc | Dec | Dec | 0 |
Dec | Dec | Inc | 0 |
Dec | Inc | Dec | 0 |
- | - | - | bot() |
|
inlinestaticconstexpr |
|
friend |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |