You are on page 1of 36

DEFRULE

Aguilar Campos Lesly Condori Fernandez Evelyn Osorio Tabraj Diana

DEFRULE 2013

EJERCICIOS
1. Haga una regla que permita ser leído 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 triángulos rectángulos
que se aprecian a continuaci n!

! " # !

$

√3
1 !

DEFRULE 2013

1

"ara ello la regla que de#inas debe llamar a la #unci n hipotenusa $%a %b& que se encargará del cálculo matemático ' por e(emplo' sean los catetos del triángulo 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) ) # .

Cada sensor puede encontrarse en un estado correcto o incorrecto. (deftemplate sensor (slot codigo (t*pe !+.DEFRULE 2013 #. S lo debe mostrarse un mensa(e de error aunque ha)a más de tres sensores en estado 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 más sensores se encuentran en un estado incorrecto.) (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)) % .E-E. 2na planta industrial tiene die/ sensores identi#icados por un c digo num3rico entre 4 ) 45.

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)) & .

)) (personas (nombre ">osefa 4opera Aernande?") $ . .DEFRULE 2013 %.odrigue? 4opera") (dia '9@'#)) (personas (nombre "1ercedes -ranados .uestre por pantalla el nombre de las personas que cumplen a7os ese día (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?") (dia $6@'. Si se dispone de una serie de hechos que almacenan in#ormaci n acerca del nombre de personas ) el día de su cumplea7os' escribe una regla que dado un hecho como $comprobar8cumple $dia 948:&&.odrigue? 4opera") (dia 6$@$&)) (personas (nombre "2enito .odrigue?") (dia &&@$$)) (personas (nombre "!nmaculada .

Eduardo 0avier Rodriguez Lopera.* )dia "121 ** )personas )nombre .* )dia 1"216** )personas )nombre ..* )dia 1$21%** )personas )nombre .0ose'a Lopera Fernandez.* 7 .5eni(o Rodriguez.3er+edes 4ranados Rodriguez.. )personas )nombre . Escribe una regla que compruebe que no e<isten dos personas que no cumplen a7os el mismo día. (de'(empla(e personas )slo( nombre* )slo( dia* * )de''a+(s .n(rodu+ir /e+/os a plan(illa personas.* )dia 211** )personas )nombre .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) ) &.n(rodu+ir-personas .nma+ulada Rodriguez Lopera.

odrigue? 4opera") (cumpleannos '9@'#@$.odrBgue?") 6 . 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 . +umplen a<os en di'eren(e dia.. )asser( )desa+(ivado** )prin(ou( ( !n .* )dia 1$21%** * )de'rule +omprobar-+oin+iden-+umple )personas )nombre !n* )dia !d** )personas )nombre !nn89!n* )dia !dd89!d** )no( )desa+(ivado** :.:$)) (persona (nombre "1ercedes -ranados .DEFRULE 2013 )dia &211** )personas )nombre . y . !nn . +rl'* * $.nven(ado.

.98)) (persona (nombre "!nmaculada .odrigue? 4opera") (cumpleannos 6$@$&@$.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$%.DEFRULE 2013 (cumpleannos &&@$$@$.$)) (persona (nombre "!n entado") (cumpleannos '9@'#@$.(persona (nombre ?)(cumpleannos ?cump)) (not (cumple (dia ?cump))) => (assert (cumple (dia ?cump))) ) 11 .:$)) (persona (nombre "!n entado&") (cumpleannos &&@$$@$.

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 .& 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 !+. $>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.) (range $ 6$)) (slot mes (t*pe !+.) (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 .E-E.DEFRULE 2013 7. =e#ine una plantilla para almacenar #echas' ) escribe una regla que compruebe si la #echa no es 6álida.E-E.

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 &.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 &.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 .)) (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)) ) 1 . dBasG .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 .

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" .

odrigue? 4opera") (dia '9@'#)) (personas (nombre "1ercedes -ranados .odrigue?") (dia &&@$$)) (personas (nombre "!nmaculada .)) (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# .odrigue? 4opera") (dia 6$@$&)) (personas (nombre "2enito . Escribe una regla que compruebe si ha) personas cu)os cumplea7os coincidan.odrigue?") (dia $6@'.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 . =ebe mostrarse un 0nico mensa(e por pantalla' aunque ha)a más de dos personas cu)os cumplea7os coincidan o más de dos días 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 .DEFRULE 2013 6.

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% .

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 .DEFRULE 2013 11.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.E-E. ? la nota #inal de prácticas se le restará una d3cima de punto por cada #alta de asistencia. >uestro pro#esor desea ahora considerar un #actor más en la nota de prácticas' la asistencia a las sesiones de prácticas.)) => (retract ?f$) 17 .odrigue? 4opera") (nota$ $') (nota& .) (range ' $')) (slot faltas (t*pe !+.!+-)) (slot nota$ (t*pe +P12E.) (range ' $')) (slot nota& (t*pe +P12E.) (faltas $#)) (nota (nombre "1ercedes -ranados .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 * % .odrigue?") (nota$ .G#) (nota& $') (faltas &)) (nota (nombre "!nmaculada .= 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 (>= (.odrigue? 4opera") (nota$ :) (nota& .(@ (+ ?n$ ?n&) &) (* ?falta 'G$)) .) (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 . Se desea de nue6o' obtener la nota #inal de prácticas 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 /..(@ (+ ?n$ ?n&) &) (* ?falta 'G$)) 9)) (test (% (.

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$)) .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 (% (.)) (test (% (.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$)) $')) => (retract ?f$) (assert (nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (faltas ?falta) (nota-nominal matricula))) ) 16 .(@ (+ ?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$)) 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 >= . * % .(@ (+ ?n$ ?n&) &) (* ?falta 'G$)) .(@ (+ ?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:)) (test (%= (.

DEFRULE 2013 1 .

:$)) (persona (nombre "1ercedes -ranados .odrigue? 4opera") (cumpleannos '9@'#@$..(persona (nombre ?)(cumpleannos ?cump)) (not (cumple (dia ?cump))) => (assert (cumple (dia ?cump))) ) (defrule mostrar"cumple ?f$%. que contendrá todas las personas que cumple años ese día.$)) (persona (nombre "!n entado") (cumpleannos '9@'#@$.odi#ica el programa anterior de manera que se imprima por pantalla la in#ormaci n almacenada en los hechos del tipo cumple.98)) (persona (nombre "!nmaculada .DEFRULE 2013 1 .odrBgue?") (cumpleannos &&@$$@$. con el slot dia y multislot personas.odrigue? 4opera") (cumpleannos 6$@$&@$. (deftemplate cumple (slot dia) (multislot personas) ) (deffacts introducir"personas "!ntroduce personas en la plantilla persona" (persona (nombre "Eduardo >a ier . .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$%.2CIO> Construimos la plantilla cumple.:$)) (persona (nombre "!n entado&") (cumpleannos &&@$$@$. (deftemplate persona (slot nombre) (slot cumpleannos) ) SO.(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) ) 1 .

) (range ' $')) (slot nota-nominal (t*pe /01234)) ) (deffacts !ntroducir"notas"numericas "!nserciEn de notas en la plantilla nota" (nota (nombre "Eduardo >a ier . (deftemplate nota (slot nombre (t*pe /.odrigue? 4opera") (nota $')) ) (defrule nota"notable ?f$%-(nota (nombre ?nomb) (nota ?n) (nota-nominal nil)) (test (>= ?n 9)) (test (% ?n . Inicialmente tendremos hechos de este tipo (nota (nombre " <na Daro 4Epe?") (nota-numerica 9G#) (nota-nominal nil)) =e manera que este hecho debería ser modi#icado por la regla correspondiente de manera que se inserte la nota nominal en la casilla nota8nominal.DEFRULE 2013 1".odrigue?") (nota .)) .!+-)) (slot nota (t*pe +P12E. 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.G#)) (nota (nombre "!nmaculada .odrigue? 4opera") (nota :)) (nota (nombre "1ercedes -ranados ..

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 => (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 .

) (range ' $')) (slot nota& (t*pe +P12E. G (deftemplate nota (slot nombre (t*pe /.DEFRULE 2013 1#.) (range ' $')) (slot nota-nominal (t*pe /01234)) ) (deffacts !ntroducir"notas"numericas "!nserciEn de notas en la plantilla nota" (nota (nombre "Eduardo >a ier .. Obtener la nota #inal de prácticas con #ormato nominal. Supongamos ahora que el pro#esor hace dos e<ámenes de prácticas a lo largo del curso' cu)as notas almacena con #ormato num3rico' obteniendo la nota #inal de prácticas como la media de ambas notas.)) # .!+-)) (slot nota$ (t*pe +P12E.odrigue? 4opera") (nota$ :) (nota& .

odrigue? 4opera") (nota$ $') (nota& .odrigue?") (nota$ .)) => (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&) &) .G#) (nota& $')) (nota (nombre "!nmaculada .)) (test (%(@ (+ ?n$ ?n&) &) .DEFRULE 2013 (nota (nombre "1ercedes -ranados .G9#)) ) (defrule nota"notable ?f$%-(nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (nota-nominal nil)) (test (>=(@ (+ ?n$ ?n&) &) 9)) (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)) % .

a entrada al programa debe consistir en un con(unto de hechos del tipo (caracteristica-deseada %caracterBstica>) que indiquen características que se desee que tenga una planta.a siguiente tabla indica las características de una serie de plantas $tolerancia al #río' 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 rápido&. El programa debe mostrar por pantalla el nombre de las plantas que cuenten e<actamente con las características indicadas' ni más ni menos. .DEFRULE 2013 (test (>=(@ (+ ?n$ ?n&) &) ..!+-)) (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") & .G:)) (test (%=(@ (+ ?n$ ?n&) &) $')) => (retract ?f$) (assert (nota (nombre ?nomb) (nota$ ?n$) (nota& ?n&) (nota-nominal matricula))) ) 1%. . (deftemplate plantas (slot nombre (t*pe /. Escribe un programa para a)udar a una persona a decidir qu3 plantas podría plantar.

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.!+-)) (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") 7 . (deftemplate plantas (slot nombre (t*pe /. El programa se7alará todas las plantas que cumplan todas las características deseadas' aunque aparte de esas cuenten con otras características.

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$) ) 6 .

=e#ine las plantillas necesarias para poder almacenar la in#ormaci n necesaria.E+.E +3 /!)) ) (deffacts introducir"habitaciones (habitaciones (tipo cuadruples)) (habitaciones (tipo triples)) (habitaciones (tipo dobles)) "1 .!+-) (default ?SE.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 /.) (range ' 7) (default ')) (slot se(o (t*pe /01234) (allo5ed-s*mbols !+S!AE. Si no ha) ninguna habitaci n disponible para un estudiante' deberá mostrase un mensa(e por pantalla indicándolo.DEFRULE 2013 1$.!TE)) (slot num"personas (t*pe !+.E+.!+-)) (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 . En una residencia de estudiantes se desea mantener in#ormaci n sobre los estudiantes alo(ados ) las habitaciones de la residencia que ocupan.. Se tendrán en cuenta las siguientes consideraciones! B Ha) habitaciones de cuatro tipos! simples' dobles' triples ) cuádruples. B Es más econ mico llenar las habitaciones más grandes.E-E.. 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. 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.E N 1)) (slot habitacion"fumadora (t*pe /01234)(allo5ed-s*mbols !+S!AE. (deftemplate estudiantes (slot nombre (t*pe /.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 .

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+.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 (% ?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 .E))) (test (or (eq ?fuma ?h"fuma) (eq ?h"fuma !+S!AE.E))) (test (or (eq ?fuma ?h"fuma) (eq ?h"fuma !+S!AE.

E))) (test (or (eq ?fuma ?h"fuma) (eq ?h"fuma !+S!AE.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+.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) ) " .

egistra sonido alidos s@n?) " crlf) (bind ?reg (read)) (5hile (eq ?reg s) "" . los sonido 6álidos EHemplo . para registrar en el template +sonidoE6alidos.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? Daso si) !ngrese sonido) UUU .DEFRULE 2013 CO>CRO. =E .?DOR?CORIO =e#ina una regla +registroEso.

' ) 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 ".' si no corresponde decir +no es 6alido el sonido.egistra sonido alidos s@n?) " crlf) (bind ?reg (read)) (if (eq ?reg s) then (printout t "!ngrese nombre de animal) " crlf) "# . ) su +sonido.. ) un template +animaleEsonido.DEFRULE 2013 (printout t "/onido) " crlf) (bind ?son (read)) (assert (sonido" alidos (sonido ?son))) (printout t ". El sonido debe corresponder a +sonidoE6alidos.egistra sonido alidos s@n?) " crlf) (bind ?reg (read)) ) ) =e#ina una regla +registraEas. para registrar el +animal.

E(emplo Ingrese el sonido! miau El animal que dice +miau. que reciba un sonido ) muestre el animal que corresponde.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. 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 "& .