Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Para ambas partes se incluye el código fuente, tanto impreso en este documento,
como en fichero digital adjunto.
La presente revisión constituye una actualización del trabajo original. Éste fue
calificado con “Sobresaliente”. La nueva versión contiene una corrección cosmética a
la galería de casos de flujo en el cruce tipo (eliminación de diagramas redundantes) y
otros arreglos menores.
SS.EE. EN MAPLE/GRÖBNER
D\O 1 2 3 4 5 6 7 8
1 - - - - - - - -
2 - - B - C,B - D,C,B -
3 - - - - - - - -
4 A,D,C - - - C - D,C -
5 - - - - - - - -
6 A,D - B,A,D - - - D -
7 - - - - - - - -
8 A - B,A - C,B,A - - -
ℰ𝑆 = 𝐸1 ∪ 𝐸3 ∪ 𝐸5 ∪ 𝐸7 ;
Se pueden entender los estados prohibidos o estados de colisión como aquellos en los
que los tramos de cruce {A,B,C,D} son ocupados más de una vez por tráfico procedente
de varios haces de rutas con distinto origen.
Volviendo al diagrama de rutas podemos empezar a definir algunas reglas de
producción:
A1 A2 A3 A4 TRAMO_A
0 0 0 0 0
0 0 0 1 0
0 0 1 0 0
0 0 1 1 1
0 1 0 0 0
0 1 0 1 1
0 1 1 0 1
0 1 1 1 1
1 0 0 0 0
1 0 0 1 1
1 0 1 0 1
1 0 1 1 1
1 1 0 0 1
1 1 0 1 1
1 1 1 0 1
1 1 1 1 1
#----------------------------------------------------
# http://www.linkedin.com/in/alfonsofr
#----------------------------------------------------
restart;
with(Groebner):
with(Ore_algebra):
# También se admiten inputs referidas a tramos del cruce que permitirían modelizar,
A:=poly_algebra(SV,characteristic=2):
Orde:=MonomialOrder(A,'plex'(SV)):
fu:=v->v^2-v:
iI:=map(fu,[SV]);
# y tautología y contradicción:
`&AND`:=(m::algebraic,n::algebraic) ->Reduce(`m`*`n`,iI,Orde):
`&IMP`:=(m::algebraic,n::algebraic) ->Reduce(1+`m`+`m`*`n`,iI,Orde):
`&IFF`:=(m::algebraic,n::algebraic) ->Reduce(1+`m`+`n`,iI,Orde):
`&XOR`:=(m::algebraic,n::algebraic) ->Reduce(`m`+`n`,iI,Orde):
t:=1:
c:=0:
#----------------------------------------------------
#----------------------------------------------------
# Reglas:
# Origen de tráfico 1:
# Origen de tráfico 2:
# Origen de tráfico 3:
# Origen de tráfico 4:
# Detección de colisiones:
# Los hechos potenciales son: 1R,1F,1L ,2R,2F,2L, 3R,3F,3L, 4R,4F,4L y sus negaciones
iK := [ NEG(RULE01),NEG(RULE02),NEG(RULE03),NEG(RULE04),NEG(RULE05),NEG(RULE06),
NEG(RULE07),NEG(RULE08),NEG(RULE09),NEG(RULE10),NEG(RULE11),NEG(RULE12),
NEG(RULE13),NEG(RULE14),NEG(RULE15),NEG(RULE16) ]:
#----------------------------------------------------
# EJEMPLO 1:
#----------------------------------------------------
# Hay que alimentar el sistema con los 16 estados: 12 luces + 4 tramos de cruce.
iJ:=[NEG(L1),NEG(R3),
NEG(NEG(F1)),NEG(NEG(R1)), NEG(NEG(L5)),NEG(NEG(F5)),NEG(NEG(R5)),
NEG(NEG(L3)),NEG(NEG(F3)), NEG(NEG(L7)),NEG(NEG(F7)),NEG(NEG(R7)),
Base:=Basis([op(iI),op(iJ),op(iK)],Orde);
# Comprobamos:
Reduce(A1,Base,Orde);
Reduce(D1,Base,Orde);
Reduce(C1,Base,Orde);
Reduce(B3,Base,Orde);
Reduce(A3,Base,Orde);
Reduce(D7,Base,Orde);
# Véanse diagramas.
#----------------------------------------------------
# EJEMPLO 2:
#----------------------------------------------------
# Hay que alimentar el sistema con los 16 estados: 12 luces + 4 tramos de cruce.
iJ2:=[NEG(L1),NEG(L3),
NEG(NEG(F1)),NEG(NEG(R1)), NEG(NEG(L5)),NEG(NEG(F5)),NEG(NEG(R5)),
NEG(NEG(R3)),NEG(NEG(F3)), NEG(NEG(L7)),NEG(NEG(F7)),NEG(NEG(R7)),
Base:=Basis([op(iI),op(iJ2),op(iK)],Orde);
Los clientes del establecimiento serán los usuarios del sistema, el cual
responderá con conocimiento de experto a las preguntas que se le hagan.
1. Definición de tareas.
2. Adquisición de conocimientos.
3. Conceptualización del problema.
4. Formalización del problema.
5. Implementación de Sistemas Basados en Conocimiento (SBC).
(Todas_las_características_satisfechas OR
Todas_las_características_revisadas AND NOT
Todas_las_características_satisfechas))
FASE SEGUNDA: ADQUISICIÓN DE CONOCIMIENTO
Con este fin en mira se planteó una visita a una tienda real de
mascotas donde se realizaría una entrevista al dependiente de la misma
para efectuar una posterior educción de conocimiento sobre las notas
tomadas.
Ensayo de educción:
Se supone una visita hipotética a la tienda real de mascotas y
acuarios donde se realizaron una serie de preguntas al encargado con el
fin de obtener información acerca del funcionamiento general del
establecimiento, así como de otras particularidades.
Glosario de términos:
- Animal: Clase base con tres posibles tipos: Pez, Mamífero o Ave.
- Pez: tipo derivado de animal.
- Mamífero: tipo derivado de animal.
- Ave: tipo derivado de animal.
- Precio: Atributo de un animal. Se comparará con el precio máximo
que un cliente esté dispuesto a pagar.
- Carácter: Atributo de un animal.
- Tamaño: Atributo de un animal.
- Color: Atributo de un animal.
- Especie: Atributo único para cada animal, que constituye una
superclave de identificación.
- Solicitud: Lista de todos los atributos que puede tener un animal.
Puede tener alguno o todos sus campos vacíos o sin rellenar
- Canario: Ave muy pequeña, amarilla o verde de carácter alegre.
- Loro: Ave mediana, azulada o verde, de carácter agresivo.
- Cacatúa: Ave pequeña, blanca, de carácter tranquilo.
- Gato andaluz: Mamífero mediano, negro, gris o rojizo, de carácter
cariñoso.
- Gato persa: Mamífero mediano, gris, de carácter cariñoso (más
caro).
- Perro salchicha o teckel: Mamífero grande, rojizo, de carácter
cariñoso.
- Perro Boxer: Mamífero grande, pardo o rojizo, de carácter agresivo.
- Perro Chihuahua: Mamífero mediano, pardo o gris, de carácter
alegre.
- Pez Tropical: Pez pequeño, gris, negro o rojizo, de carácter agresivo.
- Pez Tropical decorativo: muy pequeño, negro, gris, amarillo, verde,
rojizo o azulado de carácter tranquilo.
- Pez Resistente: muy pequeño, negro, gris o azulado de carácter
tranquilo.
- Pez Limpiador: pequeño, gris, pardo o verdoso de carácter
tranquilo.
Librería de casos:
- El cliente no tiene ninguna idea previa: Se le asigna el animal en
stock con mayor precio.
- El cliente sabe sólo el precio máximo que quiere pagar: Se le asigna
el animal con precio máximo de entre los que tienen un precio igual
o inferior al especificado, si existe. Si no: Fallo.
- El cliente sabe una o más características que desea, que no incluyen
el precio: Se le asigna el animal de mayor precio de los que encajen
con todas las características. Si no encaja ninguno: falla.
- El cliente sabe dos o más características que desea, incluyendo el
precio máximo a pagar: Se le asigna el animal con precio máximo de
entre los que tienen un precio igual o inferior al especificado y
encajan con todas las características. Si no existe ninguno: falla.
- Si hay un fallo se despide al cliente y no se le asigna (vende) ningún
animal.
FASE TERCERA: CONCEPTUALIZACIÓN DEL PROBLEMA
Análisis:
Síntesis:
- Preguntar al cliente.
- Confrontar Atributos.
- Hallar los Animales más adecuados.
- Hallar el más caro de los Animales Adecuados.
- Realizar la venta.
El Sistema Experto debe ir obteniendo los campos de la Solicitud
haciendo preguntas al cliente, e ir buscando los Animales que se ajusten a
los atributos especificados, para finalmente decidirse por uno, o devolver
un Fallo. De este modo, la solución hallada será siempre la mejor.
Tipos de conocimientos:
Estratégicos o de control: Aquellos que fijan la secuencia de pasos
que el S.E. debe seguir para efectuar una venta.
Tácticos u Operativos: Cómo y cuándo debe el S.E. añadir a sus
conocimientos genéricos información actual acerca de la Solicitud.
Factuales o declarativos: Especifican lo que es cierto acerca de la
Solicitud, para la cual se busca la mejor venta posible.
Universo de discurso:
Es el conjunto de conceptos acerca del cual se expresan los
conocimientos. Los conceptos primordiales en este Sistema son los
Atributos de los Animales, y todos los valores que pueden tomar, valores
que serán definidos más adelante.
Estudio declarativo:
Relaciones y sus propiedades:
Conocimientos factuales:
Información que el Sistema Experto conoce a priori
Metaconocimientos:
Se obtendrá el valor
Animal +
que toma el Atributo Accederá al conocimiento
Tipo_de_
Obtener_Atributos en ese tipo de animal disponible sobre el Animal
_Atributo a
(definido por la consultado si existe
comprobar
especie)
- Los tres tipos de Animal presentan una relación Fraternal entre sí, al
ser subclases del mismo Marco Clase.
Proceso de control:
- PracLISP.BAT
- Respnoimp.TXT
- Tienda.CLP
PracLISP.BAT
(reset)
(load "tienda.clp")
(run)
Tienda.CLP
;
########################################################################################
#####
; #
#
; # Allegro CLISP #
; #
#
; # Trabajo Práctico: SISTEMA EXPERTO
#
; # TIENDA DE ANIMALES DOMÉSTICOS
#
; #
#
; # Alfonso de la Fuente Ruiz
#
; #
#
; #
#
;
########################################################################################
#####
;
########################################################################################
#####
(defmodule MAIN
(export deftemplate venta)
(export deftemplate animal-seleccionado)
(export deftemplate ani)
(export deftemplate solicitud)
)
;
########################################################################################
#####
;
########################################################################################
#####
; CONOCIMIENTO A PRIORI:
;
########################################################################################
#####
;
########################################################################################
#####
(deftemplate MAIN::venta
(slot estado (type SYMBOL)
(allowed-symbols saludo pregunta-dinero respuesta-dinero annadir-animales
eliminar-caros
comprobar-cond-bucle preguntar-atributo obtener-
atributo comprobar-respuesta
comprobar-aves comprobar-peces comprobar-mamiferos
obtener-mas-caro comprobacion-venta
vender despedir-con-venta despedir-sin-venta))
(slot tipoatr (type SYMBOL)
(allowed-symbols precio caracter tamanno color especie)
(default precio))
(slot cond-bucle (type SYMBOL) (allowed-symbols TRUE FALSE) (default FALSE))
(slot respuesta-valida (type SYMBOL) (allowed-symbols TRUE FALSE) (default
FALSE))
(slot respuesta-atributo (type STRING) (default "no importa")))
;
########################################################################################
#####
(deftemplate MAIN::animal-seleccionado
(slot precio (type NUMBER) (default 0) )
(slot caracter (type SYMBOL) (default noespecifica)
(allowed-symbols noespecifica tranquilo alegre carinnoso
agresivo))
(slot tamanno (type SYMBOL) (default noespecifica)
(allowed-symbols noespecifica muypequenno pequenno mediano
grande))
(slot color (type SYMBOL) (default noespecifica)
(allowed-symbols noespecifica blanco negro pardo gris amarillo
verde rojizo azul))
(slot tipoani (type SYMBOL) (default noespecifica)
(allowed-symbols ave pez mamifero noespecifica))
(slot especie (type SYMBOL) (default noespecifica)
(allowed-symbols noespecifica canario loro cacatua
gatoandaluz gatopersa
teckel boxer chihuahua peztropical pezdecorativo
pezresistente pezlimpiador)))
;
########################################################################################
#####
(deftemplate MAIN::ani
(slot precio (type NUMBER) (default 0) )
(slot caracter (type SYMBOL) (default noespecifica)
(allowed-symbols noespecifica tranquilo alegre carinnoso
agresivo))
(slot tamanno (type SYMBOL) (default noespecifica)
(allowed-symbols noespecifica muypequenno pequenno mediano
grande))
(slot color (type SYMBOL) (default noespecifica)
(allowed-symbols noespecifica blanco negro pardo gris amarillo
verde rojizo azul))
(slot tipoani (type SYMBOL) (default noespecifica)
(allowed-symbols ave pez mamifero noespecifica))
(slot especie (type SYMBOL) (default noespecifica)
(allowed-symbols noespecifica canario loro cacatua
gatoandaluz gatopersa
teckel boxer chihuahua peztropical pezdecorativo
pezresistente pezlimpiador)))
;
########################################################################################
#####
;
########################################################################################
#####
;
########################################################################################
#####
; REGLAS:
;
########################################################################################
#####
;
########################################################################################
#####
(defrule MAIN::entrar-tienda
=>
(printout t crlf)
(printout t "######################################" crlf crlf)
(printout t "Sistema Experto desarrollado por:" crlf)
(printout t "Alfonso de la Fuente Ruiz" crlf crlf)
(printout t "######################################" crlf crlf)
(assert (venta (estado saludo)
(tipoatr precio)
(cond-bucle FALSE)
(respuesta-valida FALSE)
(respuesta-atributo "")))
(assert (animal-seleccionado
(tipoani noespecifica)
(precio 0)
(caracter noespecifica)
(tamanno noespecifica)
(color noespecifica)
(especie noespecifica)))
(assert (solicitud
(precio 0)
(caracter noespecifica)
(tamanno noespecifica)
(color noespecifica)))
)
;
########################################################################################
#####
(defrule MAIN::saludar
?var1 <- (venta (estado saludo))
=>
(printout t "Bienvenido a la Tienda de Animales:" crlf)
(modify ?var1 (estado pregunta-dinero))
)
;
########################################################################################
#####
(defrule MAIN::cuanto-dinero
?var1 <- (venta (estado pregunta-dinero))
?var2 <- (solicitud (precio ?dinero))
?var3 <- (animal-seleccionado)
=>
(printout t crlf "######################################" crlf crlf)
(printout t "Veamos en qué podemos ayudarle..." crlf)
(printout t "¿Cuánto tenía pensado gastar (0..20000 euro-cents.)?" crlf)
(printout t "(Si no lo sabe o no lo ha pensado aún, responda 0)" crlf "EURO: >> ")
(bind ?dinero (read stdin))
(modify ?var1 (estado respuesta-dinero)
(tipoatr precio)
(cond-bucle FALSE)
(respuesta-valida FALSE)
(respuesta-atributo ""))
(modify ?var2 (precio ?dinero) (caracter noespecifica) (tamanno noespecifica) (color
noespecifica))
(modify ?var3 (precio 0) (caracter noespecifica)
(tamanno noespecifica) (color noespecifica)
(tipoani noespecifica)(especie noespecifica))
)
;
########################################################################################
#####
;
########################################################################################
#####
(defrule MAIN::mala-respuesta-dinero
?var1 <- (venta (estado respuesta-dinero))
?var2 <- (solicitud (precio ?dinero&:(not (valido ?dinero))))
=>
(printout t crlf "######################################" crlf
crlf "No le entiendo; por favor, especifique una cantidad entre 0 y
20000:" crlf)
(modify ?var1 (estado pregunta-dinero))
(modify ?var2 (precio 20000))
)
;
########################################################################################
#####
(defrule MAIN::buena-respuesta-dinero
?var1 <- (venta (estado respuesta-dinero) (cond-bucle ?cond))
?var2 <- (solicitud (precio ?dinero&:(valido ?dinero)))
=>
(modify ?var1 (estado annadir-animales) (cond-bucle FALSE))
)
;
########################################################################################
#####
(defrule MAIN::annade-animales
?var1 <- (venta (estado annadir-animales))
?var2 <- (solicitud (precio ?precio-deseado))
=>
(assert (ani
(tipoani ave)
(precio 6500)
(caracter tranquilo)
(tamanno pequenno)
(color blanco)
(especie cacatua)))
(assert (ani
(tipoani ave)
(precio 5900)
(caracter agresivo)
(tamanno mediano)
(color azul)
(especie loro)))
(assert (ani
(tipoani ave)
(precio 4700)
(caracter agresivo)
(tamanno mediano)
(color verde)
(especie loro)))
(assert (ani
(tipoani ave)
(precio 1200)
(caracter alegre)
(tamanno muypequenno)
(color amarillo)
(especie canario)))
(assert (ani
(tipoani ave)
(precio 900)
(caracter alegre)
(tamanno muypequenno)
(color verde)
(especie canario)))
(assert (ani
(tipoani pez)
(precio 1300)
(caracter tranquilo)
(tamanno pequenno)
(color gris)
(especie pezlimpiador)))
(assert (ani
(tipoani pez)
(precio 900)
(caracter tranquilo)
(tamanno pequenno)
(color pardo)
(especie pezlimpiador)))
(assert (ani
(tipoani pez)
(precio 2100)
(caracter tranquilo)
(tamanno pequenno)
(color verde)
(especie pezlimpiador)))
(assert (ani
(tipoani pez)
(precio 2500)
(caracter tranquilo)
(tamanno muypequenno)
(color negro)
(especie pezresistente)))
(assert (ani
(tipoani pez)
(precio 1600)
(caracter tranquilo)
(tamanno muypequenno)
(color gris)
(especie pezresistente)))
(assert (ani
(tipoani pez)
(precio 3900)
(caracter tranquilo)
(tamanno muypequenno)
(color azul)
(especie pezresistente)))
(assert (ani
(tipoani pez)
(precio 8900)
(caracter tranquilo)
(tamanno muypequenno)
(color azul)
(especie pezdecorativo)))
(assert (ani
(tipoani pez)
(precio 8400)
(caracter tranquilo)
(tamanno muypequenno)
(color rojizo)
(especie pezdecorativo)))
(assert (ani
(tipoani pez)
(precio 6900)
(caracter tranquilo)
(tamanno muypequenno)
(color verde)
(especie pezdecorativo)))
(assert (ani
(tipoani pez)
(precio 5000)
(caracter tranquilo)
(tamanno muypequenno)
(color amarillo)
(especie pezdecorativo)))
(assert (ani
(tipoani pez)
(precio 4300)
(caracter tranquilo)
(tamanno muypequenno)
(color gris)
(especie pezdecorativo)))
(assert (ani
(tipoani pez)
(precio 6500)
(caracter tranquilo)
(tamanno muypequenno)
(color negro)
(especie pezdecorativo)))
(assert (ani
(tipoani pez)
(precio 3600)
(caracter agresivo)
(tamanno pequenno)
(color gris)
(especie peztropical)))
(assert (ani
(tipoani pez)
(precio 4000)
(caracter agresivo)
(tamanno pequenno)
(color negro)
(especie peztropical)))
(assert (ani
(tipoani pez)
(precio 4500)
(caracter agresivo)
(tamanno pequenno)
(color rojizo)
(especie peztropical)))
(assert (ani
(tipoani mamifero)
(precio 11500)
(caracter alegre)
(tamanno mediano)
(color pardo)
(especie chihuahua)))
(assert (ani
(tipoani mamifero)
(precio 13500)
(caracter alegre)
(tamanno mediano)
(color gris)
(especie chihuahua)))
(assert (ani
(tipoani mamifero)
(precio 17900)
(caracter agresivo)
(tamanno grande)
(color pardo)
(especie boxer)))
(assert (ani
(tipoani mamifero)
(precio 19500)
(caracter agresivo)
(tamanno grande)
(color rojizo)
(especie boxer)))
(assert (ani
(tipoani mamifero)
(precio 16900)
(caracter carinnoso)
(tamanno grande)
(color rojizo)
(especie teckel)))
(assert (ani
(tipoani mamifero)
(precio 13900)
(caracter carinnoso)
(tamanno mediano)
(color gris)
(especie gatopersa)))
(assert (ani
(tipoani mamifero)
(precio 9900)
(caracter carinnoso)
(tamanno mediano)
(color negro)
(especie gatoandaluz)))
(assert (ani
(tipoani mamifero)
(precio 9000)
(caracter carinnoso)
(tamanno mediano)
(color gris)
(especie gatoandaluz)))
(assert (ani
(tipoani mamifero)
(precio 10500)
(caracter carinnoso)
(tamanno mediano)
(color rojizo)
(especie gatoandaluz)))
(defrule MAIN::elimina-caros
(declare (salience 1000))
(venta (estado eliminar-caros))
(solicitud (precio ?precio-tope))
?var1 <- (ani (precio ?coste-animal) (color ?color) (especie ?especie))
(test (> ?coste-animal ?precio-tope))
=>
(retract ?var1)
)
;
########################################################################################
#####
(defrule MAIN::caros-eliminados-quedan
(declare (salience 500))
?var1 <- (venta (estado eliminar-caros) (cond-bucle ?cond))
(ani (color ?color) (especie ?especie))
=>
(modify ?var1 (cond-bucle TRUE) (estado comprobar-cond-bucle))
)
;
########################################################################################
#####
(defrule MAIN::caros-eliminados-todos
?var1 <- (venta (estado eliminar-caros) (cond-bucle ?cond))
=>
(printout t crlf "No tenemos nada tan barato" crlf)
(modify ?var1 (cond-bucle FALSE) (estado comprobar-cond-bucle))
)
;
########################################################################################
#####
;
########################################################################################
#####
(defrule MAIN::comprueba-cond-bucle
?var1 <- (venta (cond-bucle ?cond) (estado comprobar-cond-bucle))
=>
(if ?cond
then (modify ?var1 (estado preguntar-atributo) (tipoatr tamanno) (respuesta-
atributo ""))
else (modify ?var1 (estado obtener-mas-caro))
)
)
;
########################################################################################
#####
; BUCLE DE PREGUNTAS:
;
########################################################################################
#####
(defrule MAIN::obtener-atributo
?var1 <- (venta (estado preguntar-atributo) (tipoatr ?atributo))
=>
(if (eq ?atributo tamanno)
then (printout t crlf "¿Cómo de grande es el animal que busca?" crlf crlf
"[(Muy pequenno) (Pequenno) (Mediano) (Grande) (No
sé / No importa)]:" crlf ">> ")
)
(if (eq ?atributo caracter)
then (printout t crlf "¿Qué carácter quiere que tenga su animal?" crlf crlf
"[(Tranquilo) (Alegre) (Carinnoso) (Agresivo) (No
sé / No importa)]:" crlf ">> ")
)
(if (eq ?atributo color)
then (printout t crlf "¿De qué color quiere que sea su animal?" crlf crlf
"[(Negro) (Pardo) (Gris) (Blanco) (Amarillo)
(Azul) (Verde) (Rojizo) (No sé / No importa)]:" crlf crlf
"(NOTA: Lógicamente no tenemos todos los animales
en todos los colores)" crlf ">> ")
)
; FUERA DE LOS IF:
(bind ?respuesta (readline stdin))
(modify ?var1 (respuesta-atributo ?respuesta) (estado comprobar-respuesta))
)
;
########################################################################################
#####
(defrule MAIN::comprueba-respuesta
?var1 <- (venta (estado comprobar-respuesta) (tipoatr ?atributo) (respuesta-atributo
?respuesta))
?var2 <- (solicitud)
=>
(printout t crlf "Comprobando existencias..." crlf)
(bind ?respuestavalida FALSE)
(if (eq ?atributo tamanno)
then
(if (eq (lowcase ?respuesta) "muy pequenno" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (tamanno muypequenno))
else
(if (eq (lowcase ?respuesta) "pequenno" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (tamanno pequenno))
else
(if (eq (lowcase ?respuesta) "mediano" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (tamanno mediano))
else
(if (eq (lowcase ?respuesta) "grande" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (tamanno grande))
else
(if (comprueba-no-importa ?respuesta )
then (bind ?respuestavalida TRUE)
(modify ?var2 (tamanno noespecifica))
)))))
else
(if (eq ?atributo caracter)
then
(if (eq (lowcase ?respuesta) "tranquilo" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (caracter tranquilo))
else
(if (eq (lowcase ?respuesta) "alegre" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (caracter alegre))
else
(if (eq (lowcase ?respuesta) "carinnoso" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (caracter carinnoso))
else
(if (eq (lowcase ?respuesta) "agresivo" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (caracter agresivo))
else
(if (comprueba-no-importa ?respuesta )
then (bind ?respuestavalida TRUE)
(modify ?var2 (caracter noespecifica))
)))))
else
(if (eq ?atributo color)
then
(if (eq (lowcase ?respuesta) "negro" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (color negro))
else
(if (eq (lowcase ?respuesta) "pardo" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (color pardo))
else
(if (eq (lowcase ?respuesta) "blanco" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (color blanco))
else
(if (eq (lowcase ?respuesta) "gris" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (color gris))
else
(if (eq (lowcase ?respuesta) "amarillo" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (color amarillo))
else
(if (eq (lowcase ?respuesta) "verde" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (color verde))
else
(if (eq (lowcase ?respuesta) "rojizo" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (color rojizo))
else
(if (eq (lowcase ?respuesta) "azul" )
then (bind ?respuestavalida TRUE)
(modify ?var2 (color azul))
else
(if (comprueba-no-importa ?respuesta )
then (bind ?respuestavalida TRUE)
(modify ?var2 (color noespecifica))
else
(bind ?respuestavalida FALSE)
))))))))))))
; FUERA DE LOS IF:
(if (eq ?respuestavalida TRUE)
then (modify ?var1 (estado comprobar-aves))
else (printout t crlf "Lo siento, no le he entendido bien:" crlf)
(modify ?var1 (estado preguntar-atributo))
)
)
;
########################################################################################
#####
(defrule MAIN::comprueba-aves
(declare (salience 1000))
?var1 <- (venta (tipoatr ?atributo) (estado comprobar-aves) (respuesta-atributo
?respuesta))
(solicitud (caracter ?carsol) (tamanno ?tamsol) (color ?colsol))
?var2 <- (ani (tipoani ave) (caracter ?carani) (tamanno ?tamani) (color ?colani))
=>
(if (eq ?atributo caracter)
then (if (and (neq ?carani ?carsol) (neq noespecifica ?carsol))
then (retract ?var2)
)
)
(if (eq ?atributo tamanno)
then (if (and (neq ?tamani ?tamsol) (neq noespecifica ?tamsol))
then (retract ?var2)
)
)
(if (eq ?atributo color)
then (if (and (neq ?colani ?colsol) (neq noespecifica ?colsol))
then (retract ?var2)
)
)
)
;
########################################################################################
#####
(defrule MAIN::fin-aves
?var1 <- (venta (estado comprobar-aves))
=>
(modify ?var1 (estado comprobar-peces))
)
;
########################################################################################
#####
(defrule MAIN::comprueba-peces
(declare (salience 1000))
?var1 <- (venta (tipoatr ?atributo) (estado comprobar-peces) (respuesta-atributo
?respuesta))
(solicitud (caracter ?carsol) (tamanno ?tamsol) (color ?colsol))
?var2 <- (ani (tipoani pez) (caracter ?carani) (tamanno ?tamani) (color ?colani))
=>
(if (eq ?atributo caracter)
then (if (and (neq ?carani ?carsol) (neq noespecifica ?carsol))
then (retract ?var2)
)
)
(if (eq ?atributo tamanno)
then (if (and (neq ?tamani ?tamsol) (neq noespecifica ?tamsol))
then (retract ?var2)
)
)
(if (eq ?atributo color)
then (if (and (neq ?colani ?colsol) (neq noespecifica ?colsol))
then (retract ?var2)
)
)
)
;
########################################################################################
#####
(defrule MAIN::fin-peces
?var1 <- (venta (estado comprobar-peces))
=>
(modify ?var1 (estado comprobar-mamiferos))
)
;
########################################################################################
#####
(defrule MAIN::comprueba-mamiferos
(declare (salience 1000))
?var1 <- (venta (tipoatr ?atributo) (estado comprobar-mamiferos) (respuesta-atributo
?respuesta))
(solicitud (caracter ?carsol) (tamanno ?tamsol) (color ?colsol))
?var2 <- (ani (tipoani mamifero) (caracter ?carani) (tamanno ?tamani) (color ?colani))
=>
(if (eq ?atributo caracter)
then (if (and (neq ?carani ?carsol) (neq noespecifica ?carsol))
then (retract ?var2)
)
)
(if (eq ?atributo tamanno)
then (if (and (neq ?tamani ?tamsol) (neq noespecifica ?tamsol))
then (retract ?var2)
)
)
(if (eq ?atributo color)
then (if (and (neq ?colani ?colsol) (neq noespecifica ?colsol))
then (retract ?var2)
)
)
)
;
########################################################################################
#####
(defrule MAIN::fin-mamiferos
(declare (salience -1000))
?var1 <- (venta (estado comprobar-mamiferos) (tipoatr ?atributo))
=>
(if (eq ?atributo tamanno)
then (modify ?var1 (tipoatr caracter) (estado preguntar-atributo)))
(if (eq ?atributo caracter)
then (modify ?var1 (tipoatr color) (estado preguntar-atributo)))
(if (eq ?atributo color)
then (modify ?var1 (estado obtener-mas-caro)) ; _Ya se han comprobado todos
los atributos...
)
)
;
########################################################################################
#####
; FIN BUCLE DE PREGUNTAS.
;
########################################################################################
#####
(defrule MAIN::obten-mas-caro
(declare (salience 1000))
(venta (estado obtener-mas-caro))
?var1 <- (ani
(tipoani ?tipo)
(precio ?prec)
(caracter ?car)
(tamanno ?tam)
(color ?col)
(especie ?esp))
?var2 <- (animal-seleccionado (precio ?coste))
=>
(if (< ?coste ?prec)
then (modify ?var2
(tipoani ?tipo)
(precio ?prec)
(caracter ?car)
(tamanno ?tam)
(color ?col)
(especie ?esp))
else (retract ?var1)
)
)
;
########################################################################################
#####
(defrule MAIN::obtenido-mas-caro
?var1 <- (venta (estado obtener-mas-caro))
=>
(modify ?var1 (estado comprobacion-venta))
)
;
########################################################################################
#####
(defrule MAIN::comprobar-venta
?var1 <- (venta (estado comprobacion-venta))
?var2 <- (animal-seleccionado (especie ?esp))
=>
(if (eq ?esp noespecifica)
then (modify ?var1 (estado despedir-sin-venta))
else (modify ?var1 (estado vender))
)
)
;
########################################################################################
#####
(defrule MAIN::vender-animal
?var1 <- (venta (estado vender))
?var2 <- (animal-seleccionado
(tipoani ?tipo)
(precio ?prec)
(caracter ?car)
(tamanno ?tam)
(color ?col)
(especie ?esp))
=>
(printout t crlf "Creo que tenemos exactamente lo que busca." crlf)
(printout t "El animal que hemos seleccionado para usted es:" crlf crlf)
(printout t "###################" crlf)
(printout t "ESPECIE: " ?esp crlf)
(printout t "###################" crlf)
(printout t "TIPO: " ?tipo crlf)
(printout t "CARÁCTER: " ?car crlf)
(printout t "TAMAÑO: " ?tam crlf)
(printout t "COLOR: " ?col crlf)
(printout t crlf "PRECIO: " ?prec crlf)
(printout t "###################" crlf crlf)
(modify ?var1 (estado despedir-con-venta))
)
;
########################################################################################
#####
(defrule MAIN::despide-con-venta
?var1 <- (venta (estado despedir-con-venta))
=>
(printout t crlf "###############################" crlf crlf)
(printout t "Ha sido un placer ayudarle." crlf)
(printout t "Le aseguro que ha hecho usted una buena compra." crlf)
(printout t "Se lleva uno de nuestros mejores ejemplares." crlf crlf)
(printout t "Vuelva cuando quiera." crlf crlf)
(printout t "###############################" crlf crlf)
(printout t "FIN DEL PROGRAMA." crlf crlf);
)
;
########################################################################################
#####
(defrule MAIN::despide-sin-venta
?var1 <- (venta (estado despedir-sin-venta))
=>
(printout t crlf "###############################" crlf crlf)
(printout t "Sentimos no poder ayudarle:" crlf)
(printout t "No disponemos de ningún animal con esas características." crlf crlf)
(printout t "Vuelva cuando quiera." crlf crlf)
(printout t "###############################" crlf crlf)
(printout t "FIN DEL PROGRAMA." crlf crlf);
)
;
########################################################################################
#####
; END OF CODE
;
########################################################################################
#####
respnoimp.TXT
no
no se
no sé
nose
nosé
no lo se
no lo sé
nolose
nolosé
aun no lo se
aún no lo se
aun no lo sé
aún no lo sé
no lo he pensado
no lo había pensado
cualquiera
cualquiera de esos
cualquiera de esas
no importa
no me importa
no lo he decidido
ni idea
no tengo ni idea
ninguno
ninguna
ninguno de esos
ninguna de esas
nada
nada de eso
ese no
eso no
esa no
esos no
esas no
decide tú
decida usted
el que quieras
el que quiera
el que tu quieras
el que tú quieras
la que quieras
la que quiera
la que tu quieras
la que tú quieras
lo que quieras
lo que quiera
lo que tu quieras
lo que tú quieras
BIBLIOGRAFÍA
Se incluye a continuación una selección de referencias bibliográficas consultadas por el
alumno para la realización del presente trabajo y el estudio de la asignatura.
Crédito fotografías:
Sistema de control semafórico: http://abigail-
taller3uajms.blogspot.com/2009/04/enfoque-practico-de-la-informatica-
en.html
Avenida de América:
http://www.flickr.com/photos/alair2525/2853979984/sizes/l/
Semáforo Montevideo: http://www.flickr.com/photos/juanchoo/2488947101/
Penjat Copenhagen: http://www.flickr.com/photos/natgg/2467746175/
Light men: http://www.flickr.com/photos/hectorgomez/3374149103/
http://creativecommons.org/licenses/by-nc-sa/2.5/