1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
use crate::{
cache::ModuleCache,
load::ModuleLoader,
model::{check::Validate, modules::Module, References, Span},
};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
// ------------------------------------------------------------------------------------------------
// Public Macros
// ------------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------
// Public Types ❱ Formal Constraints
// ------------------------------------------------------------------------------------------------
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub struct FormalConstraint {
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
span: Option<Span>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Vec::is_empty"))]
environment: Vec<EnvironmentDef>,
body: ConstraintSentence,
}
// ------------------------------------------------------------------------------------------------
// Implementations ❱ Formal Constraints
// ------------------------------------------------------------------------------------------------
impl_has_body_for!(FormalConstraint, ConstraintSentence);
impl_has_source_span_for!(FormalConstraint);
impl References for FormalConstraint {}
impl Validate for FormalConstraint {
fn validate(
&self,
_top: &Module,
_cache: &ModuleCache,
_loader: &impl ModuleLoader,
_check_constraints: bool,
) {
todo!()
}
}
impl FormalConstraint {
// --------------------------------------------------------------------------------------------
// Constructors
// --------------------------------------------------------------------------------------------
pub fn new<V>(body: V) -> Self
where
V: Into<ConstraintSentence>,
{
Self {
span: Default::default(),
environment: Default::default(),
body: body.into(),
}
}
// --------------------------------------------------------------------------------------------
// Fields
// --------------------------------------------------------------------------------------------
pub fn with_definition<I>(self, definition: EnvironmentDef) -> Self {
let mut self_mut = self;
self_mut.environment.push(definition);
self_mut
}
pub fn with_environment(self, environment: Vec<EnvironmentDef>) -> Self {
let mut self_mut = self;
self_mut.environment = environment;
self_mut
}
get_and_set_vec!(
pub
has has_definitions,
definitions_len,
definitions,
definitions_mut,
add_to_definitions,
extend_definitions
=> environment, EnvironmentDef
);
}
// ------------------------------------------------------------------------------------------------
// Private Functions
// ------------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------
// Modules
// ------------------------------------------------------------------------------------------------
mod sequences;
pub use sequences::{MappingVariable, NamedVariables, SequenceBuilder, Variables};
mod environments;
pub use environments::{EnvironmentDef, EnvironmentDefBody};
mod functions;
pub use functions::{
FunctionCardinality, FunctionDef, FunctionParameter, FunctionSignature, FunctionType,
FunctionTypeReference, FunctionTypeReferenceInner,
};
mod sentences;
pub use sentences::{
AtomicSentence, BinaryBooleanSentence, BooleanSentence, ConnectiveOperator, ConstraintSentence,
Equation, InequalityRelation, Inequation, QuantifiedSentence, QuantifiedVariable,
QuantifiedVariableBinding, Quantifier, SimpleSentence, UnaryBooleanSentence,
};
mod terms;
pub use terms::{FunctionComposition, FunctionalTerm, Subject, Term};
mod values;
pub use values::{PredicateSequenceMember, PredicateValue, SequenceOfPredicateValues};