Está en la página 1de 36

DEFRULE

Aguilar Campos Lesly Condori Fernandez Evelyn Osorio Tabraj Diana

DEFRULE 2013

EJERCICIOS
1. Haga una regla que permita ser ledo por teclado. Esta lectura debe ser como un
hecho. (defrule inserta-hecho => (printout t "Escribe un hecho como cadena" crlf) (assert-string (read)))

. Se pide hacer una regla que calcule la hipotenusa de los 3 tringulos rectngulos
que se aprecian a continuaci n!

! " # !

3
1 !

DEFRULE 2013

"ara ello la regla que de#inas debe llamar a la #unci n hipotenusa $%a %b& que se encargar del clculo matemtico ' por e(emplo' sean los catetos del tringulo 3 ) *' entonces la regla debe mostrar el mensa(e +,a hipotenusa de los catetos 3 ) * es ! -. Soluci n! (deffunction hipotenusa (?a ?b) ; lista de argumentos (sqrt (+ (* ?a ?a) (* ?b ?b) )) ) (defrule calculahipotenusa (dimensiones ?base ?altura) => (printout t "El alor de la hipotenusa es" (hipotenusa ?base ?altura) crlf) )

"

DEFRULE 2013

".

Ha/ un programa que calcule el #actorial de un n0mero' de manera que ante un hecho como $#actorial 3& muestre por pantalla el siguiente mensa(e El #actorial de 3 es 1 (deffacts !ntroducir"factorial (factorial #) (resultado $) (numero #) )

(defrule calcular"factorial ?f$%-(factorial ?numero) ?f&%-(resultado ?resultado) (test( > ?numero ')) => (retract ?f$) (retract ?f&) (assert (factorial (- ?numero $))) (assert (resultado (* ?resultado ?numero))) )

(defrule muestra"resultado (factorial ?numero) (resultado ?resultado) (numero ?() (test(= ?numero ')) => (printout t "El factorial de " ?( " es)" ?resultado crlf) )

DEFRULE 2013

#. 2na planta industrial tiene die/ sensores identi#icados por un c digo num3rico
entre 4 ) 45. Cada sensor puede encontrarse en un estado correcto o incorrecto. Escribe una plantilla que permita representar la in#ormaci n relati6a a los sensores ) un con(unto de reglas que imprima un mensa(e de ad6ertencia si tres o ms sensores se encuentran en un estado incorrecto. S lo debe mostrarse un mensa(e de error aunque ha)a ms de tres sensores en estado incorrecto. (deftemplate sensor (slot codigo (t*pe !+,E-E.) (range ' $')) (slot estado (t*pe /01234) (allo5ed-s*mbols correcto incorrecto)) (slot isitado (t*pe /01234) (allo5ed-s*mbols no si)) ) (deffacts !ntroducir"Estados"/ensores "!ntroducimos hechos relati os al estado de un sensor" (sensor (codigo $)) (sensor (codigo &) (estado incorrecto)) (sensor (codigo 6))

DEFRULE 2013
(sensor (codigo 7) (estado incorrecto)) (sensor (codigo #)) (sensor (codigo 8)) (sensor (codigo 9)) (sensor (codigo :) (estado incorrecto)) (sensor (codigo ;)) (sensor (codigo $') (estado incorrecto)) (sensores"incorrectos ')) (defrule comprobar"estados ?f$%-(sensor (codigo ?cod) (estado incorrecto) ( isitado no)) ?f&%-(sensores"incorrectos ?num) => (retract ?f$ ?f&) (assert (sensor (codigo ?cod) (estado incorrecto) ( isitado si))) (assert (sensores"incorrectos (+ ?num $))) ) (defrule alarma (sensores"incorrectos ?num) (test(>= ?num 6)) => (printout t "<caba de saltar la alarma= ha* " ?num " sensores con estado incorrecto" crlf))

&

DEFRULE 2013

%. Si se dispone de una serie de hechos que almacenan in#ormaci n acerca del


nombre de personas ) el da de su cumplea7os' escribe una regla que dado un hecho como $comprobar8cumple $dia 948:&&. ;uestre por pantalla el nombre de las personas que cumplen a7os ese da

(deftemplate personas (slot nombre) (slot dia) ) (deftemplate comprobar-cumple (slot dia) ) (deffacts !ntroducir"personas "!ntroducir hechos a plantilla personas" (personas (nombre "Eduardo >a ier .odrigue? 4opera") (dia '9@'#)) (personas (nombre "1ercedes -ranados .odrigue?") (dia &&@$$)) (personas (nombre "!nmaculada .odrigue? 4opera") (dia 6$@$&)) (personas (nombre "2enito .odrigue?") (dia $6@';)) (personas (nombre ">osefa 4opera Aernande?")

DEFRULE 2013
(dia &8@$')) (personas (nombre "!n entado") (dia '9@'#)) (comprobar-cumple (dia '9@'#)) ) (defrule comprobar"cumple (personas (nombre ?nomb) (dia ?ddia)) (comprobar-cumple (dia ?ddia)) => (printout t " Aelicidades " ?nomb crlf) )

&.

Escribe una regla que compruebe que no e<isten dos personas que no cumplen a7os el mismo da. (de'(empla(e personas

)slo( nombre* )slo( dia* * )de''a+(s ,n(rodu+ir-personas .,n(rodu+ir /e+/os a plan(illa personas. )personas )nombre .Eduardo 0avier Rodriguez Lopera.* )dia 1$21%** )personas )nombre .3er+edes 4ranados Rodriguez.* )dia 211** )personas )nombre .,nma+ulada Rodriguez Lopera.* )dia "121 ** )personas )nombre .5eni(o Rodriguez.* )dia 1"216** )personas )nombre .0ose'a Lopera Fernandez.* 7

DEFRULE 2013
)dia &211** )personas )nombre .,nven(ado.* )dia 1$21%** *

)de'rule +omprobar-+oin+iden-+umple )personas )nombre !n* )dia !d** )personas )nombre !nn89!n* )dia !dd89!d** )no( )desa+(ivado** :; )asser( )desa+(ivado** )prin(ou( ( !n . y . !nn . +umplen a<os en di'eren(e dia. +rl'* *

$. Escribe un programa que a partir de hechos basados en la plantilla )de'(empla(e persona )slo( nombre* )slo( +umpleannos**
cree los hechos correspondientes basados en la plantilla

)de'(empla(e +umple )slo( dia* )mul(islo( personas** SOLUCION:


(deftemplate persona (slot nombre) (slot cumpleannos) )

(deftemplate cumple (slot dia) (multislot personas) ) (deffacts introducir"personas "!ntroduce personas en la plantilla persona" (persona (nombre "Eduardo >a ier .odrigue? 4opera") (cumpleannos '9@'#@$;:$)) (persona (nombre "1ercedes -ranados .odrBgue?")

DEFRULE 2013
(cumpleannos &&@$$@$;98)) (persona (nombre "!nmaculada .odrigue? 4opera") (cumpleannos 6$@$&@$;;$)) (persona (nombre "!n entado") (cumpleannos '9@'#@$;:$)) (persona (nombre "!n entado&") (cumpleannos &&@$$@$;98)) )

(defrule cumpleannos ?f$%-(persona (nombre ?nom) (cumpleannos ?cump)) ?f&%-(cumple (dia ?cump) (personas C?people)) => (retract ?f$ ?f&) (assert (cumple (dia ?cump) (personas C?people ?nom))) )

(defrule meter"fechas ?f$%- (persona (nombre ?)(cumpleannos ?cump)) (not (cumple (dia ?cump))) => (assert (cumple (dia ?cump))) )

11

DEFRULE 2013

7. =e#ine una plantilla para almacenar #echas' ) escribe una regla que compruebe si
la #echa no es 6lida. $>ota! un a7o es bisiesto si es m0ltiplo de * pero no de 455' sal6o cuando sea m0ltiplo de *55' en cu)o caso s que es bisiesto.& Donstruimos una plantilla fecha= en la cual amos a tener los slots dia que sElo podrF tomar alores comprendidos entre $ * 6$= el slot mes que sElo podrF tomar alores comprendidos entre $ * $& * el slot annoG (deftemplate fecha (slot dia (t*pe !+,E-E.) (range $ 6$)) (slot mes (t*pe !+,E-E.) (range $ $&)) (slot anno) ) Donstruimos una regla comprobar"meses"6'= en la cual emos si es correcto un mes que tenga 6' o menos dBas= en la cual mostramos un mensaHe de fecha correcta e insertamos un hecho de fecha-correcta= este hecho es para luego construir una regla para mostrar un mensaHe de error si la fecha introducida no es correctaG (defrule comprobar"meses"6' (fecha (dia ?d) (mes ?m I 7 J 8 J ; J $$) (anno ?a)) (test (%= ?d 6')) => (printout t "4a fecha " ?d "@" ?m "@" ?a " es una fecha correcta " crlf) (assert (fecha-correcta ?d ?m ?a)) )

11

DEFRULE 2013
Donstruimos una regla comprobar"meses"6$= en la cual amos a comprobar que los meses sean $= 6= #= 9= := $'= $& que son los que tienen 6$ dias= * no se a a eHecutar en otra regla= ademas como en la regla anterior hemos puesto la condiciEn de que sea menor o igual a 6'= esta regla se a a disparar en cualquier dia que tenga como meses $= 6= #= 9= := $'= $&= a no ser que el dBa introducido no estK comprendido entre el rangoG ,ambiKn se a a encargar de mostrarnos un mensaHe de fecha correcta e insertar un hecho de fecha-correcta= este hecho es para luego construir una regla para mostrar un mensaHe de error si la fecha introducida no es correctaG (defrule comprobar"meses"6$ (fecha (dia ?d) (mes ?m I $ J 6J # J 9 J : J $' J $& ) (anno ?a)) => (printout t "4a fecha " ?d "@" ?m "@" ?a " es una fecha correcta " crlf) (assert (fecha-correcta ?d ?m ?a)) ) Donstruimos una regla comprobar"mes= en la cual amos a comprobar el mes de febrero= * si el dia es menor o igual a &:G ,ambiKn se a a encargar de mostrarnos un mensaHe de fecha correcta e insertar un hecho de fecha-correcta= este hecho es para luego construir una regla para mostrar un mensaHe de error si la fecha introducida no es correctaG (defrule comprobar"mes"&: (fecha (dia ?d) (mes &) (anno ?a)) (test (%= ?d &:)) => (printout t "4a fecha " ?d "@&" "@" ?a " es una fecha correcta " crlf) (assert (fecha-correcta ?d & ?a)) ) Donstruimos una regla comprobar"bisiesto= en la cual amos a comprobar si el aLo es bisiesto= *a que puede tomar febrero un mF(imo de &; dBasG ,ambiKn se a a encargar de mostrarnos un mensaHe de fecha correcta e insertar un hecho de fecha-correcta= este hecho es para luego construir una regla para mostrar un mensaHe de error si la fecha introducida no es correctaG (defrule comprobar"bisiesto (fecha (dia ?d) (mes &) (anno ?a)) (test ( = ?d &;)) (and (test (= (mod ?a 7) ')) (test (not (= (mod ?a $'') ')))) (or (test (= (mod ?a 7) ')) (test (= (mod ?a 7'') '))) => (printout t "4a fecha " ?d "@&" "@" ?a " es una fecha correcta " crlf) (assert (fecha-correcta ?d & ?a)) )

DEFRULE 2013
Donstruimos una regla fecha"incorrecta= en la cual amos a mostrar un mensaHe de error si la fecha no es correcta= para comprobar si una fecha no es correcta= tenemos que comprobar que e(iste un hecho como fecha-correcta= en la cual si no e(iste dicho hecho significa que no es una fecha correcta * entonces muestra el mensaHe de errorG (defrule fecha"incorrecta (fecha (dia ?d) (mes ?m) (anno ?a)) (not (fecha-correcta ?d ?m ?a)) => (printout t "4a fecha " ?d "@" ?m "@" ?a " es una fecha incorrecta " crlf) )

1"

DEFRULE 2013

6. Escribe una regla que compruebe si ha) personas cu)os cumplea7os coincidan.
=ebe mostrarse un 0nico mensa(e por pantalla' aunque ha)a ms de dos personas cu)os cumplea7os coincidan o ms de dos das en los que coincidan cumplea7os Donstruimos la plantilla personas= que contendrF los slots nombre * diaG

)deftemplate personas
(slot nombre) (slot dia) ) Donstruimos un deffacts para introducir hechos de tipo personas= para que el usuario no lo tenga que introducirG ,ambiKn introducimos un hecho de tipo comprobar cumple para reali?ar las pruebas oportunasG (deffacts !ntroducir"personas "!ntroducir hechos a plantilla personas" (personas (nombre "Eduardo >a ier .odrigue? 4opera") (dia '9@'#)) (personas (nombre "1ercedes -ranados .odrigue?") (dia &&@$$)) (personas (nombre "!nmaculada .odrigue? 4opera") (dia 6$@$&)) (personas (nombre "2enito .odrigue?") (dia $6@';)) (personas (nombre ">osefa 4opera Aernande?") (dia &8@$')) (personas (nombre "!n entado") (dia '9@'#)) ) Donstruimos la regla comprobar"coinciden"cumple= es la encargada de comprobar que ha* & personas que cumplen el mismo dBa= mostrFndonos un mensaHe por pantalla *

1#

DEFRULE 2013
terminando de eHecutar la regla= *a que sElo nos interesa mostrar un mensaHe * no ariosG (defrule comprobar"coinciden"cumple (personas (nombre ?n) (dia ?d)) (e(ists (personas (nombre ?nnIM?n) (dia ?d))) (not (desacti ado)) => (assert (desacti ado)) (printout t "Na* personas que cumplen anos el mismo dia" crlf) )

1%

DEFRULE 2013

11. Ha/ un programa para calcular el #actorial de un n0mero pero que #uncione
cuando ha)a a#irmados 6arios hechos factorial a la 6e/' de manera que si en la lista de hechos se encuentran los hechos $#actorial 3& $#actorial *& $#actorial -& al e(ecutar el programa d3 la salida El #actorial de - es 495 El #actorial de * es 9* El #actorial de 3 es 1 Donstruimos un deffacts con hechos relati os a factorial= es decir factoriales (deffacts !ntroducir"factorial (factorial 6) (factorial 7) (factorial #) (resultado $) ) Donstruimos la regla mostrar"resultado= es la encargada de mostrarnos el resultado final del factorial= para ello retractamos los hechos que lo componen= es decir= factorial= facto * resultado = e insertamos un nue o hecho factorial-de %nOmero> %resultado>= asB como la inserciEn de un nue o hecho resultado $ para que posiblemente empiece la eHecuciEn de la reali?aciEn de otro factorial= tambiKn muestra el resultado del factorial por pantallaG +o introducimos aquB un hecho facto $ porque de ello *a se encarga la regla factoG (defrule mostrar"resultado ?f$%-(factorial ?num) ?f&%-(facto ?num) ?f6%-(resultado ?res) => (retract ?f$ ?f& ?f6) (assert (factorial-de ?num (* ?res ?num))) (assert (resultado $)) (printout t "El factorial de " ?num " es ) " (* ?res ?num) crlf) ) Donstruimos la regla facto= es la encargada de introducir un hecho (facto $)= es el contador de por donde a calculando el factorial que se estK eHecutandoG (defrule facto (not (facto $)) amos a calcular los

1&

DEFRULE 2013
(factorial ?num) => (assert (facto $)) ) Donstruimos la regla calcular"factorial= es la encargada de calcular el factorial en cuestiEn= para ello tenemos un hecho facto que a a ser el contador= * amos a reali?ar el factorial hasta que el hecho facto sea igual al nOmero del factorial= haciendo las modificaciones oportunas= retractando hechos e insertando hechos como el nue o resultado que pro oca = asB como el incremento del hecho factoG (defrule calcular"factorial (factorial ?fact) ?f$%-(facto ?num) ?f&%-(resultado ?res) (test (% ?num ?fact)) => (retract ?f$ ?f&) (assert (resultado (* ?num ?res))) (assert (facto (+ ?num $))) )

1$

DEFRULE 2013

11. >uestro pro#esor desea ahora considerar un #actor ms en la nota de prcticas' la


asistencia a las sesiones de prcticas. ? la nota #inal de prcticas se le restar una d3cima de punto por cada #alta de asistencia. Se desea de nue6o' obtener la nota #inal de prcticas con #ormato nomina Don Donstruimos la plantilla nota= con los slots nombre= nota$= nota& = faltas * nota-nominalG 4os slots nota$ * nota& tomarF alores comprendidos entre ' * $'G El slot faltas contendrF el nOmero de faltas del alumno= que tomarF alores comprendidos entre ' * $''= por defecto no tendrF ninguna faltaG (deftemplate nota (slot nombre (t*pe /,.!+-)) (slot nota$ (t*pe +P12E.) (range ' $')) (slot nota& (t*pe +P12E.) (range ' $')) (slot faltas (t*pe !+,E-E.) (range ' $'') (default ')) (slot nota-nominal (t*pe /01234)) ) Donstruimos un deffacts para reali?ar las pruebas= para no introducir los datos directamenteG (deffacts !ntroducir"notas"numericas "!nserciEn de notas en la plantilla nota" (nota (nombre "Eduardo >a ier .odrigue? 4opera") (nota$ :) (nota& ;) (faltas $#)) (nota (nombre "1ercedes -ranados .odrigue?") (nota$ ;G#) (nota& $') (faltas &)) (nota (nombre "!nmaculada .odrigue? 4opera") (nota$ $') (nota& ;G9#)) ) Donstruimos la regla nota"notable= en la cual se a a encargar de que nota media del e(amen$ * la nota del e(amen & menos el nOmero de faltas por 'G$ estK comprendida entre los alores >= 9 * % ;= en tal caso modificarF el slot nota-nominal de dicho alumnoG (defrule nota"notable ?f$%-(nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (faltas ?falta) (nota-nominal nil)) (test (>= (- (@ (+ ?n$ ?n&) &) (* ?falta 'G$)) 9)) (test (% (- (@ (+ ?n$ ?n&) &) (* ?falta 'G$)) ;)) => (retract ?f$)

17

DEFRULE 2013
(assert (nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (faltas ?falta) (nota-nominal notable))) ) Donstruimos la regla nota"suspenso= en la cual se a a encargar de que nota media del e(amen$ * la nota del e(amen & menos el nOmero de faltas por 'G$ estK comprendida entre los alores >= ' * % #= en tal caso modificarF el slot nota-nominal de dicho alumnoG (defrule nota"suspenso ?f$%-(nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (faltas ?falta) (nota-nominal nil)) (test (>= (- (@ (+ ?n$ ?n&) &) (* ?falta 'G$)) ')) (test (% (- (@ (+ ?n$ ?n&) &) (* ?falta 'G$)) #)) => (retract ?f$) (assert (nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (faltas ?falta) (nota-nominal suspenso))) ) Donstruimos la regla nota"aprobado= en la cual se a a encargar de que nota media del e(amen$ * la nota del e(amen & menos el nOmero de faltas por 'G$ estK comprendida entre los alores >= # * % 9= en tal caso modificarF el slot nota-nominal de dicho alumnoG (defrule nota"aprobado ?f$%-(nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (faltas ?falta) (nota-nominal nil)) (test (>= (- (@ (+ ?n$ ?n&) &) (* ?falta 'G$)) #)) (test (% (- (@ (+ ?n$ ?n&) &) (* ?falta 'G$)) 9)) => (retract ?f$) (assert (nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (faltas ?falta) (nota-nominal aprobado))) ) Donstruimos la regla nota"sobresaliente= en la cual se a a encargar de que nota media del e(amen$ * la nota del e(amen & menos el nOmero de faltas por 'G$ estK comprendida entre los alores >= ; * % ;G:= en tal caso modificarF el slot nota-nominal de dicho alumnoG (defrule nota"sobresaliente ?f$%-(nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (faltas ?falta) (nota-nominal nil)) (test (>= (- (@ (+ ?n$ ?n&) &) (* ?falta 'G$)) ;)) (test (% (- (@ (+ ?n$ ?n&) &) (* ?falta 'G$)) ;G:)) => (retract ?f$) (assert (nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (faltas ?falta) (nota-nominal sobresaliente))) ) Donstruimos la regla nota"matricula= en la cual se a a encargar de que nota media del e(amen$ * la nota del e(amen & menos el nOmero de faltas por 'G$ estK comprendida entre los alores >= ;G: * %= $'= en tal caso modificarF el slot nota-nominal de dicho alumnoG (defrule nota"matricula ?f$%-(nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (faltas ?falta) (nota-nominal nil)) (test (>= (- (@ (+ ?n$ ?n&) &) (* ?falta 'G$)) ;G:)) (test (%= (- (@ (+ ?n$ ?n&) &) (* ?falta 'G$)) $')) => (retract ?f$) (assert (nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (faltas ?falta) (nota-nominal matricula))) )

16

DEFRULE 2013

DEFRULE 2013
1 . ;odi#ica el programa anterior de manera que se imprima por pantalla la
in#ormaci n almacenada en los hechos del tipo cumple. (deftemplate persona (slot nombre) (slot cumpleannos) ) SO,2CIO> Construimos la plantilla cumple, con el slot dia y multislot personas, que contendr todas las personas que cumple aos ese da. (deftemplate cumple (slot dia) (multislot personas) ) (deffacts introducir"personas "!ntroduce personas en la plantilla persona" (persona (nombre "Eduardo >a ier .odrigue? 4opera") (cumpleannos '9@'#@$;:$)) (persona (nombre "1ercedes -ranados .odrBgue?") (cumpleannos &&@$$@$;98)) (persona (nombre "!nmaculada .odrigue? 4opera") (cumpleannos 6$@$&@$;;$)) (persona (nombre "!n entado") (cumpleannos '9@'#@$;:$)) (persona (nombre "!n entado&") (cumpleannos &&@$$@$;98)) ) (defrule cumpleannos ?f$%-(persona (nombre ?nom) (cumpleannos ?cump)) ?f&%-(cumple (dia ?cump) (personas C?people)) => (retract ?f$ ?f&) (assert (cumple (dia ?cump) (personas C?people ?nom))) ) (defrule meter"fechas ?f$%- (persona (nombre ?)(cumpleannos ?cump)) (not (cumple (dia ?cump))) => (assert (cumple (dia ?cump))) ) (defrule mostrar"cumple ?f$%- (cumple (dia ?cump) (personas ?nomb C?people)) => (retract ?f$) (assert (cumple (dia ?cump) (personas C?people))) (printout t "El dia " ?cump " cumple aLos ) " ?nomb crlf) )

DEFRULE 2013

1". Supongamos ahora que queremos resol6er el mismo problema planteado en el


e(ercicio anterior pero en esta ocasi n 6amos a optar por otra manera de representar los hechos acerca de las notas' utili/ando una 0nica plantilla. Inicialmente tendremos hechos de este tipo (nota (nombre " <na Daro 4Epe?") (nota-numerica 9G#) (nota-nominal nil)) =e manera que este hecho debera ser modi#icado por la regla correspondiente de manera que se inserte la nota nominal en la casilla nota8nominal.

(deftemplate nota (slot nombre (t*pe /,.!+-)) (slot nota (t*pe +P12E.) (range ' $')) (slot nota-nominal (t*pe /01234)) )

(deffacts !ntroducir"notas"numericas "!nserciEn de notas en la plantilla nota" (nota (nombre "Eduardo >a ier .odrigue? 4opera") (nota :)) (nota (nombre "1ercedes -ranados .odrigue?") (nota ;G#)) (nota (nombre "!nmaculada .odrigue? 4opera") (nota $')) )

(defrule nota"notable ?f$%-(nota (nombre ?nomb) (nota ?n) (nota-nominal nil)) (test (>= ?n 9)) (test (% ?n ;))

DEFRULE 2013
=> (retract ?f$) (assert (nota (nombre ?nomb) (nota ?n) (nota-nominal notable))) )

(defrule nota"suspenso ?f$%-(nota (nombre ?nomb) (nota ?n) (nota-nominal nil)) (test (>= ?n ')) (test (% ?n #)) => (retract ?f$) (assert (nota (nombre ?nomb) (nota ?n) (nota-nominal suspenso))) )

(defrule nota"aprobado ?f$%-(nota (nombre ?nomb) (nota ?n) (nota-nominal nil)) (test (>= ?n #)) (test (% ?n 9)) => (retract ?f$) (assert (nota (nombre ?nomb) (nota ?n) (nota-nominal aprobado))) )

(defrule nota"sobresaliente ?f$%-(nota (nombre ?nomb) (nota ?n) (nota-nominal nil)) (test (>= ?n ;)) (test (% ?n ;G:)) => (retract ?f$) (assert (nota (nombre ?nomb) (nota ?n) (nota-nominal sobresaliente))) )

(defrule nota"matricula ?f$%-(nota (nombre ?nomb) (nota ?n)(nota-nominal nil)) (test (>= ?n ;G:)) (test (%= ?n $')) => (retract ?f$) (assert (nota (nombre ?nomb) (nota ?n) (nota-nominal matricula))) )

"

DEFRULE 2013

1#. Supongamos ahora que el pro#esor hace dos e<menes de prcticas a lo largo
del curso' cu)as notas almacena con #ormato num3rico' obteniendo la nota #inal de prcticas como la media de ambas notas. Obtener la nota #inal de prcticas con #ormato nominal. G (deftemplate nota (slot nombre (t*pe /,.!+-)) (slot nota$ (t*pe +P12E.) (range ' $')) (slot nota& (t*pe +P12E.) (range ' $')) (slot nota-nominal (t*pe /01234)) )

(deffacts !ntroducir"notas"numericas "!nserciEn de notas en la plantilla nota" (nota (nombre "Eduardo >a ier .odrigue? 4opera") (nota$ :) (nota& ;))

DEFRULE 2013
(nota (nombre "1ercedes -ranados .odrigue?") (nota$ ;G#) (nota& $')) (nota (nombre "!nmaculada .odrigue? 4opera") (nota$ $') (nota& ;G9#)) ) (defrule nota"notable ?f$%-(nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (nota-nominal nil)) (test (>=(@ (+ ?n$ ?n&) &) 9)) (test (%(@ (+ ?n$ ?n&) &) ;)) => (retract ?f$) (assert (nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (notanominal notable))) )

(defrule nota"suspenso ?f$%-(nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (nota-nominal nil)) (test (>=(@ (+ ?n$ ?n&) &) ')) (test (%(@ (+ ?n$ ?n&) &) #)) => (retract ?f$) (assert (nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (notanominal suspenso))) )

(defrule nota"aprobado ?f$%-(nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (nota-nominal nil)) (test (>=(@ (+ ?n$ ?n&) &) #)) (test (%(@ (+ ?n$ ?n&) &) 9)) => (retract ?f$) (assert (nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (notanominal aprobado))) ) (defrule nota"sobresaliente ?f$%-(nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (nota-nominal nil)) (test (>=(@ (+ ?n$ ?n&) &) ;)) (test (%(@ (+ ?n$ ?n&) &) ;G:)) => (retract ?f$) (assert (nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (nota-nominal sobresaliente))) )

(defrule nota"matricula ?f$%-(nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (nota-nominal nil))

DEFRULE 2013
(test (>=(@ (+ ?n$ ?n&) &) ;G:)) (test (%=(@ (+ ?n$ ?n&) &) $')) => (retract ?f$) (assert (nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (nota-nominal matricula))) )

1%. Escribe un programa para a)udar a una persona a decidir qu3 plantas podra
plantar. ,a siguiente tabla indica las caractersticas de una serie de plantas $tolerancia al #ro' tolerancia a la sombra' tolerancia al clima seco' tolerancia al suelo h0medo' tolerancia al suelo cido' si puede 6i6ir en la ciudad' si puede 6i6ir en una maceta' si es #cil de cuidar ) si es de crecimiento rpido&. ,a entrada al programa debe consistir en un con(unto de hechos del tipo

(caracteristica-deseada %caracterBstica>) que indiquen caractersticas que se desee que tenga una planta. El programa debe mostrar por pantalla el nombre de las plantas que cuenten e<actamente con las caractersticas indicadas' ni ms ni menos. (deftemplate plantas (slot nombre (t*pe /,.!+-)) (multislot tolerancia (t*pe /01234)) )

(deftemplate puede-plantarse (slot planta) )

(deffacts !nsertar-plantas "!nsertar plantas en la plantilla plantas" (plantas (nombre "Nortensia") (tolerancia sombra ciudad maceta crece-rapido)) (plantas (nombre "<delfa")

&

DEFRULE 2013
(tolerancia ciudad maceta cuidado-facil crece-rapido)) (plantas (nombre "4aurel") (tolerancia frio sombra sequedad suelo-humedo ciudad cuidado-facil crece-rapido)) (plantas (nombre "1adresel a") (tolerancia ciudad maceta cuidado-facil crece-rapido)) (plantas (nombre "-ardenia") (tolerancia sombra suelo-acido maceta)) (plantas (nombre "Enebro") (tolerancia frio sequedad suelo-acido ciudad cuidadofacil)) (plantas (nombre "Qimentero") (tolerancia frio sombra suelo-humedo suelo-acido cuidad cuidado-facil)) (plantas (nombre "EscaramuHo") (tolerancia frio sombra suelo-humedo ciudad cuidadofacil)) (plantas (nombre "<ucuba") (tolerancia sombra sequedad maceta cuidado-facil)) (plantas (nombre "<?alea") (tolerancia sombra suelo-humedo suelo-acido maceta)) (caracteristica-deseada sombra) (caracteristica-deseada ciudad) (caracteristica-deseada maceta) (caracteristica-deseada crece-rapido) )

(defrule plantar (plantas (nombre ?nombre)) (forall (caracteristica-deseada ?c$) (plantas (nombre ?nombre) (tolerancia C? ?c$ C?))) (forall (plantas (nombre ?nombre) (tolerancia C? ?c& C?)) (caracteristica-deseada ?c&)) => (assert (puede-plantarse (planta ?nombre))))

(defrule imprimir (puede-plantarse (planta ?p)) => (printout t "4a planta " ?p " puede plantarse"crlf) )

DEFRULE 2013

1&. Ha/ un programa en base a la in#ormaci n del e(ercicio anterior' pero con las
siguientes di#erencias con respecto al anterior! El programa indica qu3 plantas pueden plantarse mediante hechos del tipo $puede8plantar @nombre8plantaA&' no mediante mensa(es por pantalla. El programa se7alar todas las plantas que cumplan todas las caractersticas deseadas' aunque aparte de esas cuenten con otras caractersticas. (deftemplate plantas (slot nombre (t*pe /,.!+-)) (multislot tolerancia (t*pe /01234)) ) (deffacts !nsertar-plantas "!nsertar plantas en la plantilla plantas" (plantas (nombre "Nortensia") (tolerancia sombra ciudad maceta crece-rapido)) (plantas (nombre "<delfa") (tolerancia ciudad maceta cuidado-facil crece-rapido)) (plantas (nombre "4aurel") (tolerancia frio sombra sequedad suelo-humedo ciudad cuidado-facil crece-rapido)) (plantas (nombre "1adresel a") (tolerancia ciudad maceta cuidado-facil crece-rapido)) (plantas (nombre "-ardenia") (tolerancia sombra suelo-acido maceta)) (plantas (nombre "Enebro") (tolerancia frio sequedad suelo-acido ciudad cuidado-facil)) (plantas (nombre "Qimentero")

DEFRULE 2013
(tolerancia frio sombra suelo-humedo suelo-acido cuidad cuidado-facil)) (plantas (nombre "EscaramuHo") (tolerancia frio sombra suelo-humedo ciudad cuidado-facil)) (plantas (nombre "<ucuba") (tolerancia sombra sequedad maceta cuidado-facil)) (plantas (nombre "<?alea") (tolerancia sombra suelo-humedo suelo-acido maceta)) ) (deffacts !ntroducir"caracteristicas "!ntroduce caracteristicas deseada por una planta" (caracteristica-deseada frio) (caracteristica-deseada sombra) ) hechos relati os a las

(defrule plantacion (caracteristica-deseada ?caracteristica) (plantas (nombre ?nomb$) (tolerancia C?c$ ?caracteristica C?c&)) => (assert (puede-plantarse ?nomb$)) ) (defrule mas-caracteristicas ?f$%-(puede-plantarse ?nomb) (caracteristica-deseada ?caracteristica) (not (plantas (nombre ?nomb) (tolerancia C?c$ ?caracteristica C?c&))) => (retract ?f$) )

DEFRULE 2013

1$. En una residencia de estudiantes se desea mantener in#ormaci n sobre los


estudiantes alo(ados ) las habitaciones de la residencia que ocupan. Se tendrn en cuenta las siguientes consideraciones! B Ha) habitaciones de cuatro tipos! simples' dobles' triples ) cudruples. B Es ms econ mico llenar las habitaciones ms grandes. B Codos los ocupantes de una habitaci n deben de ser del mismo se<o. BCodos los ocupantes de una habitaci n deben ser #umadores o no #umadores. =e#ine las plantillas necesarias para poder almacenar la in#ormaci n necesaria. Escribe las reglas necesarias para alo(ar a un estudiante de manera que sea asignado a una habitaci n que est3 )a parcialmente ocupada ) sea compatible o si no que sea asignado a la ma)or habitaci n libre disponible. Si no ha) ninguna habitaci n disponible para un estudiante' deber mostrase un mensa(e por pantalla indicndolo. (deftemplate estudiantes (slot nombre (t*pe /,.!+-)) (slot se(o (t*pe /01234) (allo5ed-s*mbols N 1)) (slot fumador (t*pe /01234) (allo5ed-s*mbols +3 /!)) (slot aloHado (t*pe /01234) (allo5ed-s*mbols +3 /!)) ) (deffacts introducir"estudiantes (estudiantes (nombre "Eduardo .odrigue? ")) (estudiantes (nombre "1iriam 4ope?") (se(o 1)(fumador /!)) (estudiantes (nombre "1ercedes -ranados ") (se(o 1)) (estudiantes (nombre ">oaquin Qaredes") (se(o N) (fumador /!)) (estudiantes (nombre "4ari?a Dardo?a")(se(o 1)) (estudiantes (nombre "Aelipe .amos")) (estudiantes (nombre "Rett* /olis")(se(o 1)(fumador /!)) (estudiantes (nombre ">ose 1orales")(fumador /!)) (estudiantes (nombre "<ngel <ltamirano")) )

(deftemplate habitaciones (slot tipo (t*pe /01234) (allo5ed-s*mbols simples dobles triples cuadruples)) (multislot nombres (t*pe /,.!+-) (default ?SE.!TE)) (slot num"personas (t*pe !+,E-E.) (range ' 7) (default ')) (slot se(o (t*pe /01234) (allo5ed-s*mbols !+S!AE.E+,E N 1)) (slot habitacion"fumadora (t*pe /01234)(allo5ed-s*mbols !+S!AE.E+,E +3 /!)) ) (deffacts introducir"habitaciones (habitaciones (tipo cuadruples)) (habitaciones (tipo triples)) (habitaciones (tipo dobles))

"1

DEFRULE 2013
(habitaciones (tipo simples)) ) (defrule asignar"habitacion"cuadruple (declare (salience 7'')) ?f$%-(estudiantes (nombre ?nomb) (se(o ?se(o"estudiante) (fumador ? fuma) (aloHado +3)) ?f&%-(habitaciones (tipo cuadruples) (nombres C?people) (num"personas ?num) (se(o ?se(o"habitacion) (habitacion"fumadora ?h"fuma)) (test (or (eq ?se(o"estudiante ?se(o"habitacion) (eq ?se(o"habitacion !+S!AE.E+,E))) (test (or (eq ?fuma ?h"fuma) (eq ?h"fuma !+S!AE.E+,E))) (test (% ?num 7)) => (retract ?f$ ?f&) (assert (habitaciones (tipo cuadruples) (nombres C?people ?nomb) (num"personas (+ ?num $)) (se(o ?se(o"estudiante) (habitacion"fumadora ?fuma))) (assert (estudiantes(nombre ?nomb) (se(o ?se(o"estudiante) (aloHado /!))) (printout t "Estudiante " ?nomb " )aloHado en una habitacion cuadruple" crlf) )

(defrule asignar"habitacion"triple (declare (salience 6'')) ?f$%-(estudiantes (nombre ?nomb) (se(o ?se(o"estudiante) (fumador ? fuma) (aloHado +3)) ?f&%-(habitaciones (tipo triples) (nombres C?people) (num"personas ? num) (se(o ?se(o"habitacion) (habitacion"fumadora ?h"fuma)) (test (or (eq ?se(o"estudiante ?se(o"habitacion) (eq ?se(o"habitacion !+S!AE.E+,E))) (test (or (eq ?fuma ?h"fuma) (eq ?h"fuma !+S!AE.E+,E))) (test (% ?num 6)) => (retract ?f$ ?f&) (assert (habitaciones (tipo triples) (nombres C?people ?nomb) (num"personas (+ ?num $)) (se(o ?se(o"estudiante) (habitacion"fumadora ?fuma))) (assert (estudiantes(nombre ?nomb) (se(o ?se(o"estudiante) (aloHado /!))) (printout t "Estudiante " ?nomb " )aloHado en una habitacion triple" crlf) )

(defrule asignar"habitacion"doble (declare (salience &''))

"1

DEFRULE 2013
?f$%-(estudiantes (nombre ?nomb) (se(o ?se(o"estudiante) (fumador ?fuma) (aloHado +3)) ?f&%-(habitaciones (tipo dobles) (nombres C?people) (num"personas ? num) (se(o ?se(o"habitacion) (habitacion"fumadora ?h"fuma)) (test (or (eq ?se(o"estudiante ?se(o"habitacion) (eq ?se(o"habitacion !+S!AE.E+,E))) (test (or (eq ?fuma ?h"fuma) (eq ?h"fuma !+S!AE.E+,E))) (test (% ?num &)) => (retract ?f$ ?f&) (assert (habitaciones (tipo dobles) (nombres C?people ?nomb) (num"personas (+ ?num $)) (se(o ?se(o"estudiante) (habitacion"fumadora ?fuma))) (assert (estudiantes(nombre ?nomb) (se(o ?se(o"estudiante) (aloHado /!))) (printout t "Estudiante " ?nomb " )aloHado en una habitacion doble" crlf) ) (defrule asignar"habitacion"simple (declare (salience $'')) ?f$%-(estudiantes (nombre ?nomb) (se(o ?se(o"estudiante) (fumador ?fuma) (aloHado +3)) ?f&%-(habitaciones (tipo simples) (nombres C?people) (num"personas ? num) (se(o ?se(o"habitacion)) (test (= ?num ')) => (retract ?f$ ?f&) (assert (habitaciones (tipo simples) (nombres C?people ?nomb) (num"personas (+ ?num $)) (se(o ?se(o"estudiante) (habitacion"fumadora ?fuma))) (assert (estudiantes(nombre ?nomb) (se(o ?se(o"estudiante) (aloHado /!))) (printout t "Estudiante " ?nomb " )aloHado en una habitacion simple" crlf) ) (defrule mensaHe"error (estudiantes (nombre ?nomb) (se(o ?se(o"estudiante) (fumador ? fuma) (aloHado +3)) => (printout t "El estudiante " ?nomb " no se puede aloHar= no ha* mas habitaciones disponibles" crlf) )

"

DEFRULE 2013

CO>CRO, =E ,?DOR?CORIO
=e#ina una regla +registroEso. para registrar en el template +sonidoE6alidos. los sonido 6lidos EHemplo .egistra sonido alidos s@n? Daso si) !ngrese sonido) UUU .egistra sonido alidos s@n? V Daso no) return

2sando la regla registrar! guau' miau' FiFiriFi' muu' cuacua

(deftemplate sonido" alidos (slot sonido) ) (defrule registro"so => (printout t ".egistra sonido alidos s@n?) " crlf) (bind ?reg (read)) (5hile (eq ?reg s) ""

DEFRULE 2013
(printout t "/onido) " crlf) (bind ?son (read)) (assert (sonido" alidos (sonido ?son))) (printout t ".egistra sonido alidos s@n?) " crlf) (bind ?reg (read)) ) )

=e#ina una regla +registraEas. ) un template +animaleEsonido. para registrar el +animal. ) su +sonido.. El sonido debe corresponder a +sonidoE6alidos.' si no corresponde decir +no es 6alido el sonido.' ) luego +ingrese nombre de su sonido! E(emplo Registra sonido de animal sGn% Caso si! Ingrese nombre de animal! HHH Ingrese su sonido! HHH Registra sonido de animal sGn% I Caso no! return 2sando la regla registrar! $perro guau& $gato miau& $gallo FiFiriFi& $6aca muu& $pato cuacua& (deftemplate animale"sonido (slot animal) (slot sonido) ) (defrule registra"as (sonido" alidos (sonido ?sonid)) => (printout t ".egistra sonido alidos s@n?) " crlf) (bind ?reg (read)) (if (eq ?reg s) then (printout t "!ngrese nombre de animal) " crlf) "#

DEFRULE 2013
(bind ?anim (read)) (printout t "!ngrese su sonido) " crlf) (bind ?son (read)) (if(eq ?son ?sonid) then (assert (animale"sonido (animal ?anim)(sonido ?son))) ) ) )

=e#ina la =e#ina la regla +identi#icaEanimal. que reciba un sonido ) muestre el animal que corresponde. E(emplo Ingrese el sonido! miau El animal que dice +miau. es gato

(defrule indentifica"animal (animale"sonido (animal ?anim)(sonido ?sonid)) => (printout t "!ngrese el sonido) " crlf) (bind ?s(read)) (if(eq ?s ?sonid) then (printout t "El animal que dice " ?sonid " es " ?anim crlf) else (printout t "+o e(iste animal registrado con ese sonido" crlf) ) )

"%

DEFRULE 2013

"&