Ejercicios de programacion en clips

Ejemplo:

(deffacts hechos-iniciales
(nombre juan perez)
(nombre carmen garcia)
(nombre luis fernandez)
(nombre pedro perez)
(nombre ana garcia) )

(defrule hermanos
(nombre ?nom ?ape)
(nombre ?nom2 ?ape)
=>
(printout t ?nom " " ?ape " y " ?nom2 " " ?ape " son hermanos." crlf)
)
(defrule apellido-garcia
(nombre ?nom garcia)
=>
(printout t "Hay una persona que se llama " ?nom " y tiene de apellido garcia." crlf)
)           

1: Emparejamiento de patrones
Crear un programa que introduzca en la base de conocimiento los siguientes hechos:

(fruta pera calorias 23)
(fruta manzana calorias 45)
(fruta fresa calorias 60)
(fruta platano calorias 18)
(fruta ciruela calorias 30)

Una vez introducidos esos datos crear reglas que hagan lo siguiente:

a. Escribir una regla que saque por pantalla las frutas y sus calorías con frases de este tipo:

La fruta de nombre pera tiene 23 calorias

b. Crear una regla que inserte nuevos hechos en la base de hechos para las frutas que tengan más de 20 calorías. Nota: para comprobar esa condición hay que añadir un patrón del tipo:
              (test (> ?cal 20))
                 suponiendo que la variable ?cal se ha emparejado con el valor de calorías de la fruta. El                        nuevo hecho a insertar será de la forma:
              (fruta ciruela hipercalorica)

c.Crear una regla que borre de la base de hechos la fruta que tenga menos de 30 calorías.


(deffacts hechos-iniciales
(fruta pera calorias 23)
(fruta manzana calorias 45)
(fruta fresa calorias 60)
(fruta platano calorias 18)
(fruta ciruela calorias 30) )

(defrule frutas-calorias
(fruta ?nom calorias ?cal)
=>
(printout t "la fruta de nombre " ?nom " tiene " ?cal " calorias." crlf)
)

(defrule frutas-hipercaloricas
(fruta ?nom calorias ?cal) (test (> ?cal 20))

=>
(assert (fruta ?nom hipercalorica))
)


(defrule frutas-30
?fruta <- (fruta ?nom calorias ?cal) 
(test (< ?cal 30)) 
=>
(retract ?fruta) )



2: Suma de áreas de rectángulos
Se parte de una situación inicial con los siguientes hechos:
       (rectangulo A 9 6)
       (rectangulo B 7 5)
       (rectangulo C 6 9)
       (rectangulo D 2 5)

Estos hechos representan diferentes rectángulos de nombres A, B, C y D, con unas dimensiones de base y altura que vienen dadas por los dos números siguientes.

Se quiere obtener un programa, formado por varias reglas, que efectúa la suma de todas las áreas de los rectángulos.

Indicaciones que pueden ser útiles:
Al igual que se puede poner como condición de una regla la correspondencia entre un patrón y algún elemento de la base de hechos, se puede indicar también como condición que un patrón no exista en la base de hechos. Para esto se usa el operador booleano not.
Por ejemplo, si para activar una regla es necesario que no exista en la base de hechos ningún rectángulo de base 6 se indicaría:
          (not (rectangulo ? 6 ?))
Si en la base de hechos no hay ningún rectángulo con valor de base igual a 6, la correspondencia con el patrón (rectangulo ? 6 ?) daría como resultado un valor lógico de FALSO, y su negación (not) daría un valor lógico VERDADERO.

(deffacts hechos-iniciales
(rectangulo A 9 6)
(rectangulo B 7 5)
(rectangulo C 6 9)
(rectangulo D 2 5) )

(defrule areas
(rectangulo ?nom ?base ?altura)
=>
(assert (area ?nom (* ?base ?altura)))
)

(defrule suma
(area A ?area1)(area B ?area2)(area C ?area3)(area D ?area4)
=>
(assert (sumatorio (+ ?area1 ?area2 ?area3 ?area4)))
)