(defclass myT ()())
(defclass myM (myT)())
(defclass myB (myM)())

(defclass myU ()())
(defclass myD (myU)())

(defmethod cv ((self myU) (xt myT)) (print "cv(T) in U"))
(defmethod ctv ((self myU) (xb myB)) (print "ctv(B) in U"))
(defmethod inv ((self myU) (xm myM)) (print "inv(M) in U"))
(defmethod cv ((self myD) (xm myM)) (print "cv(M) in D"))
(defmethod ctv ((self myD) (xm myM)) (print "ctv(M) in D"))
(defmethod inv ((self myD) (xm myM)) (print "inv(M) in D"))

(setq at (make-instance 'myT))
(setq am (make-instance 'myM))
(setq ab (make-instance 'myB))
(setq au (make-instance 'myU))
(setq ad (make-instance 'myD))

(print "-- first test suite")
(cv au at)
(cv au am)
(cv au ab)
;;(ctv au at)
;;(ctv au am)
(ctv au ab)
(inv au am)
(inv au ab)
(print "-- second/third test suite")
(cv ad at)
(cv ad am)
(cv ad ab)
;;(ctv ad at)
(ctv ad am)
(ctv ad ab)
(inv ad am)
(inv ad ab)

"-- first test suite"
"cv(T) in U"
"cv(T) in U"
"cv(T) in U"
"ctv(B) in U"
"-- second/thirsd test suite"
"cv(T) in U"
"cv(M) in D"
"cv(M) in D"
"ctv(M) in D"
"ctv(M) in D"