(deffacts empty-stack "Empty stack" (stack)) (defrule push-value "Push" ?push-value <- (push-value ?value) ?stack <- (stack $?rest) => (retract ?push-value ?stack) (assert (stack ?value $?rest)) (printout t "Pushed value " ?value crlf)) (defrule pop-value-valid "Pop (valid)" ?pop-value <- (pop-value) ?stack <- (stack ?value $?rest) => (retract ?pop-value ?stack) (assert (stack $?rest)) (printout t "Popped value " ?value crlf)) (defrule pop-value-invalid ?pop-value <- (pop-value) (stack) => (retract ?pop-value) (printout t "Popping value from empty stack: ERROR" crlf))