use crate::core::terms::{position::PositionInLanguageTerm, term::{LanguageTerm, RewritableLanguageOperatorSymbol}};
use super::distributivity_checker::DistributivityChecker;
pub(crate) fn transformation_defactorize_left_distributive<
LOS : RewritableLanguageOperatorSymbol
>(
checker : &Box<dyn DistributivityChecker<LOS>>,
term : &LanguageTerm<LOS>,
_context_term : &LanguageTerm<LOS>,
_position_in_context_term : &PositionInLanguageTerm
) -> Option<LanguageTerm<LOS>> {
let op1 = &term.operator;
if checker.is_binary(op1) {
let x = term.sub_terms.first().unwrap();
let right_sub_term = term.sub_terms.get(1).unwrap();
if checker.is_binary(&right_sub_term.operator) {
let op2 = &right_sub_term.operator;
if checker.is_left_distributive_over(op1,op2) {
let y = right_sub_term.sub_terms.first().unwrap();
let z = right_sub_term.sub_terms.get(1).unwrap();
let new_left = LanguageTerm::new(
op1.clone(),
vec![
x.clone(),
y.clone()
]
);
let new_right = LanguageTerm::new(
op1.clone(),
vec![
x.clone(),
z.clone(),
]
);
return Some(
LanguageTerm::new(
op2.clone(),
vec![
new_left,
new_right
]
)
);
}
}
}
None
}
pub(crate) fn transformation_defactorize_right_distributive<
LOS : RewritableLanguageOperatorSymbol
>(
checker : &Box<dyn DistributivityChecker<LOS>>,
term : &LanguageTerm<LOS>,
_context_term : &LanguageTerm<LOS>,
_position_in_context_term : &PositionInLanguageTerm
) -> Option<LanguageTerm<LOS>> {
let op1 = &term.operator;
if checker.is_binary(op1) {
let left_sub_term = term.sub_terms.first().unwrap();
let x = term.sub_terms.get(1).unwrap();
if checker.is_binary(&left_sub_term.operator) {
let op2 = &left_sub_term.operator;
if checker.is_right_distributive_over(op1,op2) {
let y = left_sub_term.sub_terms.first().unwrap();
let z = left_sub_term.sub_terms.get(1).unwrap();
let new_left = LanguageTerm::new(
op1.clone(),
vec![
y.clone(),
x.clone()
]
);
let new_right = LanguageTerm::new(
op1.clone(),
vec![
z.clone(),
x.clone()
]
);
return Some(
LanguageTerm::new(
op2.clone(),
vec![
new_left,
new_right
]
)
);
}
}
}
None
}