;Rules (defrule push-value ?push-value <- (push-value ?value) ?queue <- (queue $?rest) => (retract ?push-value ?queue) (assert (queue $?rest ?value)) (printout t "Pushing value: " ?value crlf)) (defrule pop-value-valid ?pop-value <- (pop-value) ?queue <- (queue ?value $?rest) => (retract ?pop-value ?queue) (assert (queue $?rest)) (printout t "Poping value: " ?value crlf)) (defrule pop-value-invalid ?pop-value <- (pop-value) (queue) => (retract ?pop-value) (printout t "Error. Poping from empty queue!" crlf)) ;Testing (assert (queue)) (assert (push-value X)) (run) (assert (push-value Y)) (run) (assert (pop-value)) (run) (assert (pop-value)) (run) (assert (pop-value)) (run)