Subtyping Rules |
This section defines the subtyping rules for GOO in terms of subtype
methods.
(dm subtype? (t1|<union> t2|<type> => <log>)
(all? (op subtype? _ t2) (type-elts t1)))
(dm subtype? (t1|<type> t2|<union> => <log>)
(any? (op subtype? t1 _)) (type-elts t2)))
(dm subtype? (t1|<union> t2|<union> => <log>)
(all? (op subtype? _ t2)) (type-elts t1)))
(dm subtype? (t1|<class> t2|<class> => <log>)
(subclass? t1 t2))
(dm subtype? (t1|<singleton> t2|<class> => <log>)
(isa? (type-object t1) t2))
(dm subtype? (t1|<subclass> t2|<class> => <log>)
(subclass? <class> t2))
(dm subtype? (t1|<class> t2|<singleton> => <log>) #f)
(dm subtype? (t1|<singleton> t2|<singleton> => <log>)
(== (type-object t1) t2))
(dm subtype? (t1|<subclass> t2|<singleton> => <log>) #f)
(dm subtype? (t1|<class> t2|<subclass> => <log>)
(and (== t1 <class>) (== (type-class t2) <class>)))
(dm subtype? (t1|<subclass> t2|<subclass> => <log>)
(subclass? (type-class t1) (type-class t2)))
(dm subtype? (t1|<singleton> t2|<subclass> => <log>)
(and (isa? (type-object t1) <class>)
(subclass? (type-object t1) (type-class t2))))
(dm subtype? (t1|<product> t2|<type> => <log>) #f)
(dm subtype? (t1|<type> t2|<product> => <log>) #f)
(dm subtype? (t1|<product> t2|<product> => <log>)
(and (== (len (type-elts t1)) (len (type-elts t2)))
(all? (zipped subtype?) (zip (type-elts t1) (type-elts t2)))))
(dm subtype? (t1|<product> t2|<class> => <log>)
(subtype? <tup> t2))
Subtyping Rules |