27 mai 2010

CLIPS

;; rezolvarea problemei cu lupul, capra, varza si taranul care trebuie sa treaca podul
(deffacts fapte
(fail 0 1 1 0)
(fail 1 0 0 0)
(fail 0 1 1 1)
(fail 1 1 0 0)
(fail 0 0 1 1)
(fail 1 0 0 1)
(stop 0 0 0 0)
)

(deffunction fct
(?x)
(mod (+ 1 ?x) 2)
)

(defrule Taran
(stop ?t ?l ?c ?v)
(not (fail ?t1&~?t ?l ?c ?v))
=>
(assert (stop (fct ?t) ?l ?c ?v))
)

(defrule Capra
(stop ?t ?l ?t ?v)
(not (fail ?t1&~?t ?l ?c1&~?t ?v))
=>
(assert (stop (fct ?t) ?l (fct ?t) ?v))
)

(defrule Varza
(stop ?t ?l ?c ?t)
(not (fail ?t1&~?t ?l ?c ?v1&~?t))
=>
(assert (stop (fct ?t) ?l ?c (fct ?t)))
)

(defrule Lup
(stop ?t ?t ?c ?v)
(not (fail ?t1&~?t ?l1&~?t ?c ?v))
=>
(assert (stop (fct ?t) (fct ?t) ?c ?v))
)


;; un program care filtreaza numai elementele pozitive dintr-un sir

;; REZOLVARE
;; folosim un mic truc, retragem elementele negative.
;; pentru conditii mai complexe, se putea folosi not pe
;; conditia ceruta in problema.
(deffacts pb3 (rez3 6 -5 4 3 -2 -1 0))

(defrule filter-pos
?f <- (rez3 $?start ?x&:(< ?x 0) $?end)
=>
(retract ?f)
(assert (rez3 $?start $?end)))

Niciun comentariu: