Practica 1.
Calcular la suma de los 100 primeros números
; Programa para calcular la suma de los 100 primeros números de manera directa
(assert (suma 100))
(defrule suma-100
?f1<-(suma ?x)
=>
(retract ?f1)
(assert (solucion (/ (* ?x (+ ?x 1)) 2)))
)
Aunque lo mejor es hacerlo por el método normal...
(assert (suma 0))
(assert (i 0))
; Otra forma de hacerlo seria....
(deffacts sumatorio
(suma 0)
(i 0)
)
; En este caso no el primero deberemos hacer (reset) y luego (run)
(defrule suma-100
?f1<-(suma ?x)
?f2<-(i ?y)
=>
(retract ?f1)
(retract ?f2)
(if (= ?y 100) then
(printout t ?x)
else
(assert (suma (+ ?x ?y)))
(assert (i (+ 1 ?y))))
)
Calcular el factorial de un numero
(assert (numero 7))
(assert (factorial 1)) ;Debe empezar valiendo 1
(defrule factorial
?f1<-(numero ?x)
?f2<-(factorial ?y)
=>
(retract ?f1)
(if(< 1 ?x) then
(assert (numero (+ ?x -1)) ; (- ?x 1)
(retract ?f2) ; debe ponerse aquí para no borrar el factorial en caso de no cumplirse
(assert (factorial (* ?y ?x)))
)
Calcular la suma de los 100 primeros números y después restarle 50
(assert (suma 0))
(assert (i 0))
; para realizar la nueva operación de restar fijamos un OBJETIVO
(assert (objetivo suma))
(defrule suma-100
?f1<-(suma ?x)
?f2<-(i ?y)
?f3<-(objetivo suma)
=>
(retract ?f1)
(retract ?f2)
(if (= ?y 100) then
(retract ?f3)
(assert (objetivo resta))
(printout t ?x)
else
(assert (suma (+ ?x ?y)))
(assert (i (+ 1 ?y))))
)
(defrule resta-50
?f1<-(suma ?x)
?f2<-(objetivo resta)
=>
(retract ?f2)
(assert suma(+ ?x -50))
(printout t "El final es " ?x crlf)
)
Calcular el producto escalar de dos vectores
(assert (vector1 10 20))
(assert (vector2 2 3))
(defrule producto-escalar
?f1<-(vector1 ?x ?y)
?f2<-(vector2 ?w ?z)
=>
(retract ?f1)
(retract ?f2)
(assert (producto (+ (* ?x ?w) (* ?y ?z)))) ; esto debe hacerse así ;)
)
PD: Puede que haya algunos errores o no en los paréntesis
quizás para evitar el copypasting...