29 mai 2010

Implementarea unei stive in Clips

; fapte de indeplinit
(deffacts init
(push 5)
(pop)
(push abc)
(push 12)
(top)
(pop)
(top)
)

(defrule stack_init
; nu avem nici o condiţie în LHS; regula se execută la începutul programului
=>
; se iniţializează stiva cu un fapt vid
; celelalte reguli nu se vor aprinde decât dacă există un fapt stack
(assert (stack))
)

(defrule stack_push
?f1 <- (push ?element)
?f2 <- (stack $?stacklist)
=>
; o regulă se aplică o singură dată pentru aceeaşi condiţie
; în acest caz se şterge f1 pentru că se schimbă f2 şi deci se schimbă LHS ca întreg
(retract ?f1 ?f2)
; se introduce elementul în stivă
(assert (stack ?element $?stacklist))
(printout t "Push: " ?element crlf)
)

(defrule stack_pop
?f1 <- (pop)
?f2 <- (stack ?element $?stacklist)
=>
(retract ?f1 ?f2)
; se scoate elementul din stivă
(assert (stack $?stacklist))
(printout t "Pop: " ?element crlf)
)

(defrule stack_top
(top)
(stack ?element $?stacklist)
=>
(printout t "Top: " ?element crlf)
; aici nu avem nevoie să ştergem fapte, LHS rămâne neschimbată
)

Niciun comentariu: