template<class F, class... Args>
concept Invocable = requires(F&& f, Args&&... args) {
invoke(std::forward<F>(f), std::forward<Args>(args)...); // not required to be equality-preserving
};
template<class F, class... Args>
concept RegularInvocable = Invocable<F, Args...>;
template<class F, class... Args>
concept Predicate = RegularInvocable<F, Args...> && Boolean<invoke_result_t<F, Args...>>;
template<class R, class T, class U>
concept Relation =
Predicate<R, T, T> && Predicate<R, U, U> &&
CommonReference<const remove_reference_t<T>&, const remove_reference_t<U>&> &&
Predicate<R,
common_reference_t<const remove_reference_t<T>&, const remove_reference_t<U>&>,
common_reference_t<const remove_reference_t<T>&, const remove_reference_t<U>&>> &&
Predicate<R, T, U> && Predicate<R, U, T>;
common_reference_t<const remove_reference_t<T>&, const remove_reference_t<U>&>
template<class R, class T, class U>
concept StrictWeakOrder = Relation<R, T, U>;