Since the method don't uses self at all the compiler don't know with implementation of A to use since there could be a other implementation like
struct BB;
impl A for BB {
fn is_true(&self) -> bool {
false
}
fn both_true<T: A, U: A>(t: &T, u: &U) -> bool{
false
}
}
an if i write A::both_true(...) the compiler has no idea what implementation to use the one from AA or the one from BB. The method signature even allow you to do <BB as A>::both_true(&aa1, &aa2).
You more likely want to have both_true() as a free standing function with the same signature as you have now or you change the signature of the method to some think like