Práctica 4
Mostrar los elementos de la lista
(assert (lista Juan Pedro Francisco Amparo Almudena))
(defrule mostrar-miembros
?f1->(lista ?x $?resto)
=>
(retract f1)
(assert (lista ?resto))
(printout t ?x " " )
)
Mostrar los elementos impares
(assert (posicion 1))
(defrule mostrar-impares
?f1->(lista ?x $?resto)
?f2->(posicion ?p)
=>
(retract f1)
(retract f2)
(if (oddp ?p) then
(prinout t ?x " " ))
(assert (lista ?resto))
(assert (posicion (+ ?x 1)))
)
Contar cuantos elementos tiene la lista
(assert (elementos 0))
(defrule contar-elementos
?f1->(lista ?x $?resto)
?f2->(elementos ?p)
=>
(retract f1)
(retract f2)
(assert (lista ?resto))
(assert (elementos (+ ?x 1)))
)
Producto escalar de 2 vectores
(assert (v 23 45 56))
(assert (v 22 12 11))
(defrule producto-escalar
?f1->(v ?a ?b ?c)
?f2->(v ?d ?e ?f)
(test(neq ?a ?d))
=>
(assert (producto (+ (* ?a ?d) (* ?b ?e) (* ?c ?f))))
)
(defrule mostrar-producto
(producto ?x)
=>
(printout t "El producto es " ?x crlf)
)
Ordenar la lista por nombres
(assert (lista Juan Pedro Francisco Amparo Almudena))
(assert (listaordenada))
(defrule ordenar-lista
?f1->(lista ?e $?resto)
?f2->(listaordenada ?x ?y $?resto2)
=>
(retract f1)
(retract f2)
(if (< ?e ?x) then
(assert (listaordenada ?e ?x ?y ?resto2)
else
(assert (listaordenada ?x ?e ?y ?resto2))
(assert (lista ?resto))
)
Hacer el producto de una matriz
(assert (v 1 3 5))
(assert (m1 1 3 5))
(assert (m2 2 4 6))
(assert (m3 3 5 8))
(defrule producto-matriz
(m1 ?m11 ?m12 ?m13)
(m2 ?m21 ?m22 ?m23)
(m3 ?m31 ?m32 ?m33)
(v ?v1 ?v2 ?v3)
=>
(assert (vector (+ (* ?m11 ?v1) (* ?m12 ?v2) (* ?m13 ?v3)) (+ (* ?m21 ?v1 ) (* ?m22 ?v2 ) (* ?m23 ?v3)) (+ (* ?m31 ?v1 ) (* ?m32 ?v2) (* ?m33 ?v3)))
)
(defrule mostrar-vector
(vector $?x)
=>
(printout t "El vector es " ?x crlf)
)
)
Obtener persona
(assert (lista Juan Machado 34 Pedro Ridruejo 22 Francisco Alcalde 25 Antonio Aznar 56 Almudena Calero 99))
(defrule obtener-persona
?f1->(lista ?nom ?app ?edad $?resto)
=>
(retract f1)
(assert (persona ?nom ?app))
(assert (lista ?resto))
)
Obtener persona mayor de 22
(assert (lista Juan Machado 34 Pedro Ridruejo 22 Francisco Alcalde 25 Antonio Aznar 56 Almudena Calero 99))
(defrule obtener-persona-mayor-22
?f1->(lista ?nom ?app ?edad $?resto)
=>
(retract f1)
(if (< 22 ?edad) then
(assert (persona ?nom ?app)))
(assert (lista ?resto))
)
Ordenar la lista
(assert (lista Juan Machado 34 Pedro Ridruejo 22 Francisco Alcalde 25 Antonio Aznar 56 Almudena Calero 99))
(assert (listaordenada)
(defrule ordenar-lista
?f1->(lista ?nom ?app ?edad $?resto)
?f2->(listaordenada ?nom1 ?app1 ?edad1 $?resto1)
=>
(retract f1)
(if (< ?nom ?nom1) then
(assert (listaordenada ?nom ?app ?edad ?nom1 ?app1 ?edad1 $?resto1))
else
(assert (listaordenada ?nom1 ?app1 ?edad1 ?nom ?app ?edad $?resto1))
(assert (lista ?resto))
)