(deffacts max-num
    (loop-max 100))

(defrule loop-assert
    (loop-max ?n)
    =>
    (bind ?i 1)
    (while (<= ?i ?n) do
        (assert (number ?i))
        (bind ?i (+ ?i 1))))

(defrule try-number
    (number ?n)
    =>
    (assert (try-number ?n)))

(defrule largest-unknown
    ?attempt <- (try-number ?n)
    (not (largest ?))
    =>
    (retract ?attempt)
    (assert (largest ?n)))

(defrule largest-smaller
    ?old-largest <- (largest ?n1)
    ?attempt <- (try-number ?n2&:(> ?n2 ?n1))
    =>
    (retract ?old-largest ?attempt)
    (assert (largest ?n2)))

(defrule largest-bigger
    (largest ?n1)
    ?attempt <- (try-number ?n2&:(<= ?n2 ?n1))
    =>
    (retract ?attempt))

(defrule print-largest
    (declare (salience -1))
    (largest ?n)
    =>
    ;(printout t "Largest number is " ?n crlf)
    )
 
(defglobal ?*time* = (time))
(set-reset-globals FALSE)
(deffunction run-n-times (?n)
  (while (> ?n 0) do
         (reset)
         (run)
         (bind ?n (- ?n 1))))

(run-n-times 1000)

(printout t "Elapsed time: " (- (time) ?*time*) crlf)


   