(in-package "ONTOLINGUA-USER")

(define-ontology ranges (frame-ontology)
  "This ontology defines a generic ontology of ranges."
  :maturity :moderate
  :generality :moderate
  :issues ("Parts of this were snipped out of the jat-generic ontology."))


(in-ontology 'ranges)


(define-class INTEGER-RANGE (?class)
  "An integer range is a class of integers specified by lower
and upper bounds.  Instances of an integer-range are integers."
  :iff-def (and (class ?class)
                (subclass-of ?class integer)
                (= (value-cardinality ?class I-LOWER-BOUND) 1)
                (= (value-cardinality ?class I-UPPER-BOUND) 1)
                (forall ?i (=> (instance-of ?i ?class)
                               (and (=< (i-lower-bound ?class) ?i)
                                    (=< ?i (i-upper-bound ?class)))))))

(define-function I-LOWER-BOUND (?range) :-> ?integer
  "(I-LOWER-BOUND r) denotes the integer lower bound of range r."
  :def (and (integer-range ?range)
            (integer ?integer)))

(define-function I-UPPER-BOUND (?range) :-> ?integer
  "(I-UPPER-BOUND r) denotes the integer upper bound of range r."
  :def (and (integer-range ?range)
            (integer ?integer)))


(define-class REAL-RANGE (?class)
  "An real range is a class of real numbers specified by lower
and upper bounds.  Instances of an real-range are real numbers."
  :iff-def (and (class ?class)
                (subclass-of ?class real-number)
                (= (value-cardinality ?class R-LOWER-BOUND) 1)
                (= (value-cardinality ?class R-UPPER-BOUND) 1)
                (forall ?i (=> (instance-of ?i ?class)
                               (and (=< (r-lower-bound ?class) ?i)
                                    (=< ?i (r-upper-bound ?class)))))))

(define-function R-LOWER-BOUND (?range) :-> ?real
  "(R-LOWER-BOUND r) denotes the real lower bound of range r."
  :def (and (real-range ?range)
            (real-number ?real)))

(define-function R-UPPER-BOUND (?range) :-> ?real
  "(R-UPPER-BOUND r) denotes the real upper bound of range r."
  :def (and (real-range ?range)
            (real-number ?real)))