use geoit::governance::expr::Expr;
use geoit::governance::rule::TransformOp;
use geoit::*;
fn main() {
let alg = Algebra::new(Signature::new(0, 0, 3).unwrap());
let class = GeomClassBuilder::new(&alg).grades(&[1]).build();
let body = Expr::Add(
Expr::add(
Expr::mul(Expr::param(0), Expr::gen(0)),
Expr::mul(Expr::param(1), Expr::gen(1)),
),
Expr::mul(Expr::param(2), Expr::gen(2)),
);
let gov = GovernanceBuilder::new(alg)
.class("Vector", class)
.construction("Vector", "Vector", 3, body)
.rule("Reverse", &["Vector"], "Vector", TransformOp::Reverse)
.build();
println!("Rules: {:?}", gov.rule_names());
let params = vec![Scalar::from(3), Scalar::from(4), Scalar::from(5)];
let mv = gov.construct("Vector", ¶ms).unwrap();
let geoit = gov.govern(&mv, "Vector").unwrap();
println!("Original: {:?}", geoit.mv());
println!("Proof: {:?}", geoit.proof());
let reversed = gov.transform("Reverse", &[&geoit]).unwrap();
println!("Reversed: {:?}", reversed.mv());
println!("Proof: {:?}", reversed.proof());
println!("Same Mv: {}", reversed.mv() == geoit.mv());
}