A type is semantic w.r.t. two other types if it can interpret one type as another
interface Semantic : Type -> Type -> Typepres .signature = sig => Semantic (a <~.~> b) (Op sig)pres .signature = sig => Semantic (a <~.~> b) (Term sig y)pres .signature = sig => Semantic (Coproduct a b) (Op sig)pres .signature = sig => Semantic (Coproduct a b) (Term sig y)pres .signature = sig => Semantic (Extension a x) (Op sig)pres .signature = sig => Semantic (Extension a x) (Term sig y)pres .signature = sig => Semantic (Frex a x) (Op sig)pres .signature = sig => Semantic (Frex a x) (Term sig y)pres .signature = sig => Semantic (Model pres) (Op sig)pres .signature = sig => Semantic (Model pres) (Term sig x)pres .signature = sig => Semantic (ModelOver pres x) (Op sig)pres .signature = sig => Semantic (ModelOver pres x) (Term sig y)pres .signature = sig => Semantic (Free pres x) (Op sig)pres .signature = sig => Semantic (Free pres x) (Term sig y)Semantic (Algebra sig) (Op sig)Semantic (Algebra sig) (Term sig x)Semantic (SetoidAlgebra sig) (Op sig)Semantic (SetoidAlgebra sig) (Term sig x)0 .SemType : Semantic a b => a -> b -> Type.Sem : {auto __con : Semantic a b} -> (x : a) -> (y : b) -> x .SemType y