use crate::core::rule::RewriteRule;
use crate::core::terms::position::PositionInLanguageTerm;
use crate::core::terms::term::{LanguageTerm, RewritableLanguageOperatorSymbol};
use crate::builtin_trs::rules::flush::{AssociativityChecker, transformation_flush_to_the_left, transformation_flush_to_the_right};
use crate::builtin_trs::rules::reorder_commute::{BasicCommutativeCheckerAndOrderer, transformation_basic_reorder_subterms_under_commutative_operator};
use crate::builtin_trs::rules::simpl_binary::{GenericBinaryOperatorSimplifier, transformation_generic_simpl_under_binary_operator};
use crate::builtin_trs::rules::simpl_unary::{GenericUnaryOperatorSimplifier, transformation_generic_simpl_under_unary_operator};
use crate::builtin_trs::rules::modulo_associative_flattened_transfo::{ModuloAssociativeGenericFlattenedChecker, transformation_modulo_associative_generic_flattened_transfo};
use super::rules::factorization::defactorize::{transformation_defactorize_left_distributive, transformation_defactorize_right_distributive};
use super::rules::factorization::distributivity_checker::DistributivityChecker;
use super::rules::factorization::factorize_modulo_ac::{transformation_factorize_left_distributive_modulo_ac, transformation_factorize_right_distributive_modulo_ac};
use super::rules::factorization::factorize_simple::{transformation_factorize_left_distributive, transformation_factorize_right_distributive};
use super::rules::modulo_ac_reorderer::{transformation_modulo_assoc_partial_reordering, ModuloAssociativePartialReorderer};
pub enum BuiltinRewriteTransformationKind<LOS : RewritableLanguageOperatorSymbol> {
AssociativeFlushRight(Box<dyn AssociativityChecker<LOS>>),
AssociativeFlushLeft(Box<dyn AssociativityChecker<LOS>>),
ReorderOperandsIfCommuteBasic(Box<dyn BasicCommutativeCheckerAndOrderer<LOS>>),
ReorderOperandsIfCommuteModuloAC(Box<dyn ModuloAssociativePartialReorderer<LOS>>),
GenericSimplifyUnderUnary(Box<dyn GenericUnaryOperatorSimplifier<LOS>>),
GenericSimplifyUnderBinary(Box<dyn GenericBinaryOperatorSimplifier<LOS>>),
FactorizeLeftDistributiveSimple(Box<dyn DistributivityChecker<LOS>>),
FactorizeLeftDistributiveModuloAC(Box<dyn DistributivityChecker<LOS>>),
FactorizeRightDistributiveSimple(Box<dyn DistributivityChecker<LOS>>),
FactorizeRightDistributiveModuloAC(Box<dyn DistributivityChecker<LOS>>),
DeFactorizeLeftDistributive(Box<dyn DistributivityChecker<LOS>>),
DeFactorizeRightDistributive(Box<dyn DistributivityChecker<LOS>>),
ModuloAssociativeGenericFlattenedTransfo(Box<dyn ModuloAssociativeGenericFlattenedChecker<LOS>>)
}
pub struct BuiltinRewriteTransformation<LOS : RewritableLanguageOperatorSymbol> {
pub kind : BuiltinRewriteTransformationKind<LOS>,
pub desc : String
}
impl<LOS : RewritableLanguageOperatorSymbol> RewriteRule<LOS> for BuiltinRewriteTransformation<LOS> {
fn get_desc(&self) -> String {
self.desc.clone()
}
fn try_apply(&self,
term : &LanguageTerm<LOS>,
context_term : &LanguageTerm<LOS>,
position_in_context_term : &PositionInLanguageTerm
) -> Option<LanguageTerm<LOS>> {
match &self.kind {
BuiltinRewriteTransformationKind::AssociativeFlushRight(
rule_application_checker
) => {
transformation_flush_to_the_right::<LOS>(
rule_application_checker,
term,
context_term,
position_in_context_term
)
},
BuiltinRewriteTransformationKind::AssociativeFlushLeft(
rule_application_checker
) => {
transformation_flush_to_the_left::<LOS>(
rule_application_checker,
term,
context_term,
position_in_context_term
)
},
BuiltinRewriteTransformationKind::ReorderOperandsIfCommuteBasic(
rule_application_checker
) => {
transformation_basic_reorder_subterms_under_commutative_operator::<LOS>(
rule_application_checker,
term,
context_term,
position_in_context_term
)
},
BuiltinRewriteTransformationKind::ReorderOperandsIfCommuteModuloAC(
rule_application_checker
) => {
transformation_modulo_assoc_partial_reordering::<LOS>(
rule_application_checker,
term,
context_term,
position_in_context_term
)
},
BuiltinRewriteTransformationKind::GenericSimplifyUnderUnary(
rule_application_checker
) => {
transformation_generic_simpl_under_unary_operator::<LOS>(
rule_application_checker,
term,
context_term,
position_in_context_term
)
},
BuiltinRewriteTransformationKind::GenericSimplifyUnderBinary(
rule_application_checker
) => {
transformation_generic_simpl_under_binary_operator::<LOS>(
rule_application_checker,
term,
context_term,
position_in_context_term
)
},
BuiltinRewriteTransformationKind::FactorizeLeftDistributiveModuloAC(
rule_application_checker
) => {
transformation_factorize_left_distributive_modulo_ac::<LOS>(
rule_application_checker,
term,
context_term,
position_in_context_term
)
},
BuiltinRewriteTransformationKind::FactorizeLeftDistributiveSimple(
rule_application_checker
) => {
transformation_factorize_left_distributive::<LOS>(
rule_application_checker,
term,
context_term,
position_in_context_term
)
},
BuiltinRewriteTransformationKind::DeFactorizeLeftDistributive(
rule_application_checker
) => {
transformation_defactorize_left_distributive::<LOS>(
rule_application_checker,
term,
context_term,
position_in_context_term
)
},
BuiltinRewriteTransformationKind::FactorizeRightDistributiveModuloAC(
rule_application_checker
) => {
transformation_factorize_right_distributive_modulo_ac::<LOS>(
rule_application_checker,
term,
context_term,
position_in_context_term
)
},
BuiltinRewriteTransformationKind::FactorizeRightDistributiveSimple(
rule_application_checker
) => {
transformation_factorize_right_distributive::<LOS>(
rule_application_checker,
term,
context_term,
position_in_context_term
)
},
BuiltinRewriteTransformationKind::DeFactorizeRightDistributive(
rule_application_checker
) => {
transformation_defactorize_right_distributive::<LOS>(
rule_application_checker,
term,
context_term,
position_in_context_term
)
},
BuiltinRewriteTransformationKind::ModuloAssociativeGenericFlattenedTransfo(
rule_application_checker
) => {
transformation_modulo_associative_generic_flattened_transfo::<LOS>(
rule_application_checker,
term,
context_term,
position_in_context_term
)
},
}
}
}