inline bool gte(const T1& lhs, const T2& rhs) { return lhs.get_head() >= rhs.get_head() && ( !(rhs.get_head() >= lhs.get_head()) || gte(lhs.get_tail(), rhs.get_tail())); }
inline bool gt(const T1& lhs, const T2& rhs) { return lhs.get_head() > rhs.get_head() || ( !(rhs.get_head() > lhs.get_head()) && gt(lhs.get_tail(), rhs.get_tail())); }
inline bool neq(const T1& lhs, const T2& rhs) { return lhs.get_head() != rhs.get_head() || neq(lhs.get_tail(), rhs.get_tail()); }
inline bool lt(const T1& lhs, const T2& rhs) { return lhs.get_head() < rhs.get_head() || ( !(rhs.get_head() < lhs.get_head()) && lt(lhs.get_tail(), rhs.get_tail())); }
inline bool eq(const T1& lhs, const T2& rhs) { return lhs.get_head() == rhs.get_head() && eq(lhs.get_tail(), rhs.get_tail()); }