UD05 · EX0 — Referencia: tasación de vehículos (original en CLIPS)¶
clips
;; #########################################################
;; # Inteligencia Artificial e Ingenieria del Conocimiento #
;; # Practica 2º Parcial, Curso 2004-2005 #
;; # Sistema Experto para la Tasación de Vehiculos #
;; #########################################################
;; #########################################################
;; # Definición de Funciones #
;; #########################################################
;; *********************************************************
;; * Función pregunta
;; * Muestra una pregunta que pasamos por parametro y
;; * se asegura que la respuesta esté entre las respuestas
;; * validas.
;; *********************************************************
(deffunction pregunta (?pregunta $?respuestasvalidas)
(printout t ?pregunta crlf)
(bind ?respuesta (read))
(if (lexemep ?respuesta)
then (bind ?respuesta (lowcase ?respuesta))
)
(while (not (member ?respuesta ?respuestasvalidas)) do
(printout t "Las respuestas esperadas son:" $?respuestasvalidas crlf crlf)
(printout t ?pregunta crlf)
(bind ?respuesta (read))
(if (lexemep ?respuesta)
then (bind ?respuesta (lowcase ?respuesta))
)
)
?respuesta
)
;; *********************************************************
;; * Función siono
;; * Muestra una pregunta en la que la respuesta solo puede
;; * ser si o no, y devuelve TRUE o FALSE en función de la
;; * respuesta.
;; *********************************************************
(deffunction siono (?pregunta)
(bind ?resp (pregunta ?pregunta si no s n))
(if (or (eq ?resp si) (eq ?resp s))
then TRUE
else FALSE
)
)
;; *********************************************************
;; * Función retasarporcentaje
;; * Modifica el valor del vehiculo segun los parametros pasados:
;; * ?operacion: "inc"/"dec" => incremento/decremento de la tasación
;; * ?preciocoche: Precio inicial del vehiculo
;; * ?porcentaje: Porcentaje de ?preciocoche a incrementar/decrementar
;; * ?maxmin: Especifica si el ?tope sera el maximo o el minimo
;; * ?tope: Cantidad tope que se usa segun ?maxmin
;; *********************************************************
(deffunction retasarporcentaje (?operacion ?preciocoche ?porcentaje ?maxmin ?tope)
(bind ?valorvar (/ (* ?preciocoche ?porcentaje) 100))
(if (eq ?maxmin "min")
then
(bind ?valorvar (max ?valorvar ?tope))
else
(bind ?valorvar (min ?valorvar ?tope))
)
(if (eq ?operacion "inc")
then (bind ?valorvar (+ ?preciocoche ?valorvar))
else (bind ?valorvar (- ?preciocoche ?valorvar))
)
?valorvar
)
;; *********************************************************
;; * Función retasarimporte
;; * Modifica el valor del vehiculo segun los parametros pasados:
;; * ?operacion: "inc"/"dec" => incremento/decremento de la tasación
;; * ?preciocoche: Precio inicial del vehiculo
;; * ?importe: Importe que se suma/resta segun ?operacion al precio
;; * inicial ?preciocoche
;; *********************************************************
(deffunction retasarimporte (?operacion ?preciocoche ?importe)
(if (eq ?operacion "inc")
then (bind ?valorvar (+ ?preciocoche ?importe))
else (bind ?valorvar (- ?preciocoche ?importe))
)
?valorvar
)
;; #########################################################
;; # Definición de Marcos #
;; #########################################################
;; *********************************************************
;; * Marco vehiculo que usaremos para definir la BD Ganvam
;; *********************************************************
(deftemplate vehiculo
(slot marca (type STRING))
(slot modelo (type STRING))
(slot anyo (type INTEGER))
(slot precio (type INTEGER))
)
;; *********************************************************
;; * Marco vehiculobuscado que usaremos para introducir el vehiculo
;; * del usuario para conseguir el precio de tasación
;; *********************************************************
(deftemplate vehiculobuscado
(slot marca (type STRING))
(slot modelo (type STRING))
(slot anyo (type INTEGER))
)
;; #########################################################
;; # Definición de Base de Hechos Inicial #
;; #########################################################
;; *********************************************************
;; * El hecho estadotasacion lo usamos para saber en que
;; * punto de la tasación del vehículo nos encontramos
;; *********************************************************
(deffacts inicio
(estadotasacion presentacion)
)
;; *********************************************************
;; * Esta es la base de hechos de vehiculos GANVAM
;; *********************************************************
(deffacts catalogocoches
(vehiculo (marca "FORD")
(modelo "FOCUS TDI 1.8")
(anyo 2000)
(precio 700000)
)
(vehiculo (marca "FORD")
(modelo "FIESTA TDDI 1.6")
(anyo 2003)
(precio 1200000)
)
(vehiculo (marca "FORD")
(modelo "FOCUS C-MAX 1.8")
(anyo 2002)
(precio 1000000)
)
(vehiculo (marca "VOLVO")
(modelo "S40")
(anyo 2000)
(precio 1600000)
)
(vehiculo (marca "VOLVO")
(modelo "S80")
(anyo 2001)
(precio 1900000)
)
)
;; #########################################################
;; # Definición de Reglas #
;; #########################################################
;; *********************************************************
;; * Regla presentacion
;; * Muestra una pantalla de información sobre el mi, el autor
;; * de la práctica, a continuación pide confirmación para
;; * seguir y muestra la pantalla de presentación de la aplicación
;; *********************************************************
(defrule presentacion
?et <- (estadotasacion presentacion)
=>
(retract ?et)
(printout t crlf crlf crlf)
(printout t "#########################################################" crlf)
(printout t "# Inteligencia Artificial e Ingenieria del Conocimiento #" crlf)
(printout t "# Practica 2º Parcial, Curso 2004-2005 #" crlf)
(printout t "# Sistema Experto para la Tasación de Vehiculos #" crlf)
(printout t "# #" crlf)
(printout t "#########################################################" crlf)
(printout t crlf crlf crlf crlf crlf crlf crlf crlf)
(bind ?respuesta (siono "¿Desea continuar con la ejecución?"))
(if (eq ?respuesta TRUE)
then
(printout t crlf crlf crlf crlf crlf crlf crlf crlf)
(printout t " ***** * ******* ********* * * " crlf)
(printout t " * * * * * * " crlf)
(printout t " * * * * * " crlf)
(printout t " * * * * * * **** * * *** " crlf)
(printout t " * * ******* * * * * * * * * * " crlf)
(printout t " #### # # # # # # # # # # " crlf)
(printout t " # # # # # ###### # # ####### " crlf)
(printout t " # # # # # # # # # # " crlf)
(printout t " # # # # # # # # # # # # " crlf)
(printout t " # # # # # # # # ## # # # # " crlf)
(printout t " #### # ####### # # # #### # ## #### " crlf)
(printout t " Sistema Experto de Tasación de Vehiculos " crlf)
(printout t crlf crlf crlf)
(printout t " .-~.------------.~-. " crlf)
(printout t " ,-~ ,'| /// || // `, ~-,_ " crlf)
(printout t " ,'''' --|--------| --------~~~ ~~- .,_ " crlf)
(printout t " > _|__~ | ~ . ____ ~ -. " crlf)
(printout t " I ,',--. . | : ,'.--. . .__) " crlf)
(printout t " I======: ::____|__________;_;: ::======( " crlf)
(printout t " ------ . .'------------------- . .' ------' " crlf)
(printout t " Ž Ž " crlf)
(printout t crlf crlf crlf)
(assert (estadotasacion inicio))
)
)
;; *********************************************************
;; * Regla inicio
;; * Pregunta al usuario los datos del vehículo, marca, modelo
;; * y año de matriculación
;; *********************************************************
(defrule inicio
?et <- (estadotasacion inicio)
=>
(retract ?et)
(printout t crlf crlf crlf)
(printout t "¿Cual es la marca del vehículo?" crlf)
(bind ?marca (upcase (readline)))
(printout t "¿Cual es el modelo del vehículo?" crlf)
(bind ?modelo (upcase (readline)))
(printout t "¿Cual es el año de matriculación?" crlf)
(bind ?anyo (read))
(assert (vehiculobuscado (marca ?marca) (modelo ?modelo) (anyo ?anyo)))
(assert (estadotasacion comprobarmotor))
)
;; *********************************************************
;; * Regla buscarganvam
;; * Esta regla se dispara si los datos introducidos por el cliente
;; * encuentran una coincidencia en la base de hechos de Ganvam
;; * Si es así, imprime la tasación inicial
;; *********************************************************
(defrule buscarganvam
(vehiculo (marca ?mc) (modelo ?mod) (anyo ?anyo) (precio ?precio))
(vehiculobuscado (marca ?mc) (modelo ?mod) (anyo ?anyo))
=>
(assert (valortasacion ?precio))
(printout t crlf crlf "La tasacion inicial para el vehiculo segun el catalogo GANVAM es de: " ?precio crlf crlf)
)
;; *********************************************************
;; * Regla noexisteganvam
;; * Esta regla se dispara si los datos introducidos por el cliente
;; * no encuentran una coincidencia en la base de hechos de Ganvam
;; * Al no encontrar el vehiculo redirige la ejecución a la
;; * regla fin, que muestra el resultado de la tasación
;; *********************************************************
(defrule noexisteganvam
(vehiculobuscado (marca ?mc) (modelo ?mod) (anyo ?anyo))
(not (vehiculo (marca ?mc) (modelo ?mod) (anyo ?anyo) (precio ?precio)))
=>
(assert (valortasacion 0))
(assert (mensajefin "No se ha encontrado el vehiculo en el catalogo GANVAM"))
(assert (estadotasacion fin))
)
;; *********************************************************
;; * Regla comprobarmotor
;; * Esta regla comprueba el estado del motor:
;; * Sin averias: No hace nada
;; * leves o graves: pide información sobre la reparación del motor
;; * muy graves: detiene la ejecución y muestra el informe final
;; *********************************************************
(defrule comprobarmotor
?et <- (estadotasacion comprobarmotor)
?valtas <- (valortasacion ?precio)
=>
(retract ?et)
(bind ?respuesta (pregunta "¿Cual es el estado del motor? (1-Sin averias 2-Con averías leves 3-Con averías graves 4-Con averías muy graves)" 1 2 3 4 ))
(if (eq ?respuesta 4)
then
(retract ?valtas)
(assert (valortasacion 0))
(assert (mensajefin "El coche no se encuentra en condiciones mecanicas."))
(assert (estadotasacion fin))
else
( if (or (eq ?respuesta 2) (eq ?respuesta 3))
then
(assert(estadotasacion repararmotor))
else
(assert(estadotasacion comprobarcarroceria))
)
)
)
;; *********************************************************
;; * Regla reparacion
;; * Esta regla pide información sobre la reparación que se ha
;; * realizado al vehiculo para descontarlo de la tasación inicial
;; *********************************************************
(defrule reparacion
?et <- (estadotasacion repararmotor)
?valtas <- (valortasacion ?pc)
=>
(retract ?et)
(retract ?valtas)
(printout t "¿Cuanto costara reparar el motor del vehiculo?" crlf)
(bind ?coste (read))
(assert (valortasacion (- ?pc ?coste)))
(assert (estadotasacion comprobarcarroceria))
)
;; *********************************************************
;; * Regla comprobarcarroceria
;; * Esta regla comprueba el estado de la carroceria:
;; * Muy buen estado: incrementa un 1% el precio del vehiculo
;; * Buen estado: No hace nada
;; * Regular: decrementa el precio del coche en un 2% con un minimo de 20000
;; * Mal estado: decrementa el precio del coche en un 4% con un minimo de 30000
;; * Muy mal estado: detiene la ejecución y muestra el informe final
;; *********************************************************
(defrule comprobarcarroceria
?et <- (estadotasacion comprobarcarroceria)
?valtas <- (valortasacion ?pc)
=>
(retract ?et)
(bind ?respuesta (pregunta "¿Cual es el estado de la carroceria? (1-Muy buen estado 2-Buen estado 3-Estado regular 4-Mal estado 5-Muy mal estado)" 1 2 3 4 5))
(if (eq ?respuesta 5)
then
(retract ?valtas)
(assert (valortasacion 0))
(assert (mensajefin "La carroceria no se encuentra en condiciones."))
(assert (estadotasacion fin))
else
(if (eq ?respuesta 1)
then
(bind ?pc (retasarporcentaje "inc" ?pc 1 "min" 0))
else
(if (eq ?respuesta 3)
then
(bind ?pc (retasarporcentaje "dec" ?pc 2 "min" 20000))
else
(if (eq ?respuesta 4)
then
(bind ?pc (retasarporcentaje "dec" ?pc 4 "min" 30000))
)
)
)
(retract ?valtas)
(assert (valortasacion ?pc))
(assert (estadotasacion comprobartapiceria))
)
)
;; *********************************************************
;; * Regla comprobartapiceria
;; * Esta regla comprueba el estado de la tapiceria:
;; * Muy buen estado o Buen estado: No hace nada
;; * Regular: decrementa el precio del coche en un 0.5% con un maximo de 50000
;; * Mal estado: decrementa el precio del coche en un 0.75% con un maximo de 100000
;; * Muy mal estado: detiene la ejecución y muestra el informe final
;; *********************************************************
(defrule comprobartapiceria
?et <- (estadotasacion comprobartapiceria)
?valtas <- (valortasacion ?pc)
=>
(retract ?et)
(bind ?respuesta (pregunta "¿Cual es el estado de la tapiceria? (1-Muy buen estado 2-Buen estado 3-Estado regular 4-Mal estado 5-Muy mal estado)" 1 2 3 4 5))
(if (eq ?respuesta 5)
then
(retract ?valtas)
(assert (valortasacion 0))
(assert (mensajefin "La tapiceria no se encuentra en condiciones."))
(assert (estadotasacion fin))
else
(if (eq ?respuesta 3)
then
(bind ?pc (retasarporcentaje "dec" ?pc 0.5 "max" 50000))
else
(if (eq ?respuesta 4)
then
(bind ?pc (retasarporcentaje "dec" ?pc 0.75 "max" 100000))
)
)
(retract ?valtas)
(assert (valortasacion ?pc))
(assert (estadotasacion comprobarruedas))
)
)
;; *********************************************************
;; * Regla comprobarruedas
;; * Esta regla comprueba el estado de las ruedas:
;; * Buen estado: No hace nada
;; * Regular: decrementa el precio del coche en 10000
;; * Mal estado: decrementa el precio del coche en 40000
;; *********************************************************
(defrule comprobarruedas
?et <- (estadotasacion comprobarruedas)
?valtas <- (valortasacion ?pc)
=>
(retract ?et)
(bind ?respuesta (pregunta "¿Cual es el estado de las ruedas? (1-Buen estado 2-Regular 3-Mal estado)" 1 2 3))
(if (eq ?respuesta 2)
then
(bind ?pc (retasarimporte "dec" ?pc 10000))
else
(if (eq ?respuesta 3)
then
(bind ?pc (retasarimporte "dec" ?pc 40000))
)
)
(retract ?valtas)
(assert (valortasacion ?pc))
(assert (estadotasacion comprobarcd))
)
;; *********************************************************
;; * Regla comprobarcd
;; * Esta regla averigua si el vehiculo dispone de cd
;; * Tiene cd: Incrementa el precio en 20000
;; * No tiene: No hace nada
;; *********************************************************
(defrule comprobarcd
?et <- (estadotasacion comprobarcd)
?valtas <- (valortasacion ?pc)
=>
(retract ?et)
(bind ?respuesta (siono "¿El vehiculo dispone de CD?"))
(if (eq ?respuesta TRUE)
then
(bind ?pc (retasarimporte "inc" ?pc 20000))
)
(retract ?valtas)
(assert (valortasacion ?pc))
(assert (estadotasacion comprobaralarma))
)
;; *********************************************************
;; * Regla comprobaralarma
;; * Esta regla averigua si el vehiculo dispone de alarma
;; * Tiene alarma: Incrementa el precio en 25000
;; * No tiene: No hace nada
;; *********************************************************
(defrule comprobaralarma
?et <- (estadotasacion comprobaralarma)
?valtas <- (valortasacion ?pc)
=>
(retract ?et)
(bind ?respuesta (siono "¿El vehiculo dispone de Alarma?"))
(if (eq ?respuesta TRUE)
then
(bind ?pc (retasarimporte "inc" ?pc 25000))
)
(retract ?valtas)
(assert (valortasacion ?pc))
(assert (estadotasacion comprobarllantas))
)
;; *********************************************************
;; * Regla comprobarllantas
;; * Esta regla averigua si el vehiculo dispone de llantas de aleación ligera
;; * Tiene llantas: Incrementa el precio en 30000
;; * No tiene: No hace nada
;; *********************************************************
(defrule comprobarllantas
?et <- (estadotasacion comprobarllantas)
?valtas <- (valortasacion ?pc)
=>
(retract ?et)
(bind ?respuesta (siono "¿El vehiculo dispone de llantas de aleacion ligera?"))
(if (eq ?respuesta TRUE)
then
(bind ?pc (retasarimporte "inc" ?pc 30000))
)
(retract ?valtas)
(assert (valortasacion ?pc))
(assert (estadotasacion comprobarestadofiscal))
)
;; *********************************************************
;; * Regla comprobarestadofiscal
;; * Esta regla averigua si el vehiculo dispone de toda la documentación
;; * fiscal en regla
;; * Esta en regla: Devuelve el resultado de la tasación
;; * No tiene: detiene la ejecución y muestra el informe final
;; *********************************************************
(defrule comprobarestadofiscal
?et <- (estadotasacion comprobarestadofiscal)
=>
(retract ?et)
(bind ?respuesta (siono "¿El vehiculo esta en regla fiscalmente?"))
(if (eq ?respuesta FALSE)
then
(assert (valortasacion 0))
(assert (mensajefin "El vehiculo no esta en regla fiscalmente."))
(assert (estadotasacion fin))
else
(assert (mensajefin "La tasacion se ha llevado a cabo correctamente"))
(assert (estadotasacion fin))
)
)
;; *********************************************************
;; * Regla informefinal
;; * Esta regla muestra el informe final del vehiculo
;; * Si el valortasacion es 0 muestra el mensaje
;; * Si el valortasacion es diferente de 0 se muestra el valor
;; * estimado para el vehiculo
;; *********************************************************
(defrule informefinal
?et <- (estadotasacion fin)
(mensajefin ?mensaje)
(valortasacion ?pc)
(vehiculobuscado (marca ?mc) (modelo ?mod) (anyo ?anyo))
=>
(printout t crlf crlf crlf crlf crlf crlf)
(printout t "#####################################################################" crlf)
(printout t "# I N F O R M E F I N A L #" crlf)
(printout t "#####################################################################" crlf crlf)
(printout t " ***** * ******* ********* * * " crlf)
(printout t " * * * * * * " crlf)
(printout t " * * * * * " crlf)
(printout t " * * * * * * **** * * *** " crlf)
(printout t " * * ******* * * * * * * * * * " crlf)
(printout t " #### # # # # # # # # # # " crlf)
(printout t " # # # # # ###### # # ####### " crlf)
(printout t " # # # # # # # # # # " crlf)
(printout t " # # # # # # # # # # # # " crlf)
(printout t " # # # # # # # # ## # # # # " crlf)
(printout t " #### # ####### # # # #### # ## #### " crlf)
(printout t " Sistema Experto de Tasación de Vehiculos " crlf crlf crlf crlf)
(printout t " Despues de comprobar eshauxtivamente el vehiculo: " crlf crlf)
(printout t " MARCA...................: " ?mc crlf)
(printout t " MODELO..................: " ?mod crlf)
(printout t " AÑO DE MATRICULACION....: " ?anyo crlf crlf)
(if (eq ?pc 0)
then
(printout t " El sistema experto SIEXTAVE (SIstema EXperto de TAsacion" crlf)
(printout t "de VEhiculos) no ha podido estimar un precio para el" crlf)
(printout t "vehiculo por el siguiente motivo:" crlf crlf)
(printout t " " ?mensaje crlf crlf)
else
(printout t " El sistema experto SIEXTAVE (SIstema EXperto de TAsacion" crlf)
(printout t "de VEhiculos) ha estimado un preció final para el vehículo de:" crlf crlf)
(printout t " " ?pc crlf crlf)
)
(printout t "##############################################################" crlf)
(retract ?et)
(halt)
)
Esta es la adaptación/traduccióna Experta¶
In [1]:
Copied!
%pip install git+https://github.com/openmotics/om-experta.git
from experta import *
from experta.fact import *
import schema
#########################################################
# Modelos de Inteligencia Artificial #
# Practica UD02, Curso 2023-2024 #
# Sistema Experto para la Tasación de Vehiculos Usados #
#########################################################
# Definición de Templates
#########################################################
class Vehiculo(Fact):
marca = Field(str)
modelo = Field(str)
anyo = Field(int)
precio = Field(float)
class VehiculoBuscado(Fact):
marca = Field(str)
modelo = Field(str)
anyo = Field(int)
class EstadoTasacion(Fact):
pass
class MensajeFin(Fact):
pass
class ValorTasacion(Fact):
pass
# Definición de Funciones
#########################################################
##########################
# Función pregunta
# Muestra una pregunta que pasamos por parametro y
# se asegura que la respuesta esté entre las respuestas
# validas.
##########################
def pregunta(textopregunta, respuestas_validas):
respuesta = None
while respuesta not in respuestas_validas:
respuesta = input(f"{textopregunta} ({'/'.join(map(str, respuestas_validas))}): ")
respuesta = respuesta.lower()
return respuesta
def preguntaabierta(textopregunta):
return input(f"{textopregunta}")
##########################
# Función si_o_no
# Devuelve true si el usuario contesta con cualquier
# palabra o letra que comience con S (aunque sea
# minúscula)
##########################
def siono(textopregunta):
respuesta = pregunta(textopregunta, ['s', 'n', 'si', 'no'])
return respuesta in ['s', 'si']
##########################
# Función retasarporcentaje
# Modifica el valor del vehiculo segun los parametros pasados:
# operacion: "inc"/"dec" => incremento/decremento de la tasación
# preciocoche: Precio inicial del vehiculo
# porcentaje: Porcentaje de preciocoche a incrementar/decrementar
# maxmin: Especifica si el tope sera el maximo o el minimo
# tope: Cantidad tope que se usa segun ?maxmin
##########################
def retasarporcentaje(self, operacion, preciocoche, porcentaje, maxmin, tope):
valor_var = (preciocoche * porcentaje) / 100
if maxmin == "min":
valor_var = max(valor_var, tope)
else:
valor_var = min(valor_var, tope)
if operacion == "inc":
valor_var += precio_coche
else:
valor_var = precio_coche - valor_var
return valor_var
##########################
# Función retasarimporte
# Modifica el valor del vehiculo segun los parametros pasados:
# operacion: "inc"/"dec" => incremento/decremento de la tasación
# preciocoche: Precio inicial del vehiculo
# importe: Importe que se suma/resta segun operacion al precio
# inicial preciocoche
##########################
def retasarimporte(self, operacion, preciocoche, importe):
if operacion == "inc":
return precio_coche + importe
else:
return precio_coche - importe
####################################################
## M O T O R D E C O N O C I M I E N T O
####################################################
class TVU(KnowledgeEngine):
# Definición de Base de Hechos Inicial
#########################################################
@DefFacts()
def hechosiniciales(self):
yield EstadoTasacion(estadotasacion="presentacion")
# Base de Datos GANVAM
#########################################################
yield Vehiculo(marca="FORD", modelo="FOCUS TDI 1.8", anyo=1999, precio=4207.08)
yield Vehiculo(marca="FORD", modelo="FIESTA TDDI 1.6", anyo=2003, precio=7212.15)
yield Vehiculo(marca="FORD", modelo="FOCUS C-MAX 1.8", anyo=2002, precio=6010.12)
yield Vehiculo(marca="VOLVO", modelo="S40", anyo=2000, precio=9616.19)
yield Vehiculo(marca="VOLVO", modelo="S80", anyo=2001, precio=11419.23)
yield Vehiculo(marca="RENAULT", modelo="CLIO", anyo=2003, precio=11419.23)
yield Vehiculo(marca="RENAULT", modelo="MEGANE II", anyo=2000, precio=8113.66)
yield Vehiculo(marca="RENAULT", modelo="5", anyo=1980, precio=1202.02)
yield Vehiculo(marca="CITROEN", modelo="XSARA", anyo=2004, precio=18030.36)
yield Vehiculo(marca="CITROEN", modelo="C5", anyo=2005, precio=30050.61)
yield Vehiculo(marca="CITROEN", modelo="2CV", anyo=1970, precio=601.01)
# Definición de Reglas
#########################################################
##########################################################
## Regla presentacion
## Muestra una pantalla de información de la práctica,
## a continuación pide confirmación para seguir y
## comienza la tasación
##########################################################
@Rule(AS.h1 << EstadoTasacion(estadotasacion="presentacion"))
def presentacion(self, h1):
print(f"\n\n\n")
print(f" ***** * ******* ********* * * ")
print(f" * * * * * * ")
print(f" * * * * * ")
print(f" * * * * * * **** * * *** ")
print(f" * * ******* * * * * * * * * * ")
print(f" #### # # # # # # # # # # ")
print(f" # # # # # ###### # # ####### ")
print(f" # # # # # # # # # # ")
print(f" # # # # # # # # # # # # ")
print(f" # # # # # # # # ## # # # # ")
print(f" #### # ####### # # # #### # ## #### ")
print(f" Sistema Experto de Tasación de Vehiculos ")
print(f"\n")
print(f" _____________")
print(f" ..---:::::::-----------. ::::;;.")
print(f" .'''''''' ;; \ '':.")
print(f" .'' ; \ '\__.")
print(f" .' ;; ; \\';")
print(f" .' ; _____; \\/")
print(f" .' :; ;' \ ___:'.")
print(f" .'--........................... : = ____:' \ \\")
print(f" ..-'' '''' o''' ; ; :")
print(f" .--'' .----- ..----... _.- --. ..-' ; ; ; ;")
print(f" .''_- '--''-----''' _-' .-'' ; ; .-.")
print(f" .' .' .' .' ; ; /. |")
print(f" /-./' .' / _.. ; ; ;;;|")
print(f" : ;-.______ / _________==. /_ \ ; ; ;;;;")
print(f" ; / | ''''''''''.---.'''''''' : /' '. |; ; _; ;;;")
print(f" /'-/ | / / / / ;|; ;-' | ;';")
print(f":- : '''----______ / / ____. . .''. ;; .-'..T' .")
print(f"'. ' ___ '': ''''''''''''''' . ; ; ;; ;.' .' '--'")
print(f" ', __ ''' ''---... :- - - - - - - - - ' ' ; ; ; ;;' .'")
print(f" /. ; '''---___ ; ; ; ;|.''")
print(f" : ': '''----. .-------. ; ; ; ;:")
print(f" \ '--__ \ \ \ / | ; ;;")
print(f" '-.. ''''---___ : .______..\ __/..-""| ; ; ;")
print(f" ''--.. '''--' . '. . ;")
print(f" ''------... ..--'' ' :")
print(f" '''''''''''''''''' \ /")
print(f" '------'")
print(f"\n")
respuesta = siono("¿Desea comenzar la tasación?")
if respuesta:
#self.retract(h1)
#self.declare(EstadoTasacion(estadotasacion="inicio"))
self.modify(h1, estadotasacion="inicio")
else:
self.halt()
##########################################################
## Regla inicio
## Pregunta al usuario los datos del vehículo, marca, modelo
## y año de matriculación
##########################################################
@Rule(AS.h1 << EstadoTasacion(estadotasacion="inicio"))
def inicio(self, h1):
marca= preguntaabierta("¿Cual es la marca del vehículo?")
modelo= preguntaabierta("¿Cual es el modelo del vehículo?")
anyo= preguntaabierta("¿Cual es el año de matriculación?")
self.declare(VehiculoBuscado(marca=marca, modelo=modelo, anyo=int(anyo)))
self.modify(h1, estadotasacion="comprobarmotor")
##########################################################
## Regla buscarganvam
## Esta regla se dispara si los datos introducidos por el cliente
## encuentran una coincidencia en la base de hechos de Ganvam
## Si es así, imprime la tasación inicial
##########################################################
@Rule(Vehiculo(marca=MATCH.mc, modelo=MATCH.mod, anyo=MATCH.anyo, precio=MATCH.precio),
VehiculoBuscado(marca=MATCH.mc, modelo=MATCH.mod, anyo=MATCH.anyo))
def buscarganvam(self, mc, mod, anyo, precio):
self.declare(ValorTasacion(valor=precio))
print(f"\nLa tasacion inicial para el vehiculo según el catálogo GANVAM es de: {precio}\n")
##########################################################
## Regla noexisteganvam
## Esta regla se dispara si los datos introducidos por el cliente
## no encuentran una coincidencia en la base de hechos de Ganvam
## Al no encontrar el vehiculo redirige la ejecución a la
## regla fin, que muestra el resultado de la tasación
##########################################################
@Rule(AS.h1 << EstadoTasacion(estadotasacion=W()), VehiculoBuscado(marca=MATCH.mc, modelo=MATCH.mod, anyo=MATCH.anyo),
NOT(Vehiculo(marca=MATCH.mc, modelo=MATCH.mod, anyo=MATCH.anyo, precio=MATCH.precio)))
def noexisteganvam(self, h1, mc, mod, anyo):
self.declare(ValorTasacion(valor=0))
self.declare(MensajeFin("No se ha encontrado el vehiculo en el catálogo GANVAM"))
self.modify(h1, estadotasacion="fin")
##########################################################
## Regla comprobarmotor
## Esta regla comprueba el estado del motor:
## Sin averias: No hace nada
## leves o graves: pide información sobre la reparación del motor
## muy graves: detiene la ejecución y muestra el informe final
##########################################################
@Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobarmotor"), AS.h2 << ValorTasacion(valor=MATCH.pc))
def comprobarmotor(self, h1, h2, pc):
respuesta = pregunta("¿Cual es el estado del motor? (1-Sin averias 2-Con averías leves 3-Con averías graves 4-Con averías muy graves)", ['1', '2', '3', '4'])
if respuesta =='4':
self.modify(h2, valor=0)
self.declare(MensajeFin("El coche no se encuentra en condiciones mecánicas."))
self.modify(h1, estadotasacion="fin")
elif respuesta == '2' or respuesta == '3':
self.modify(h1, estadotasacion="repararmotor")
else:
self.modify(h1, estadotasacion="comprobarcarroceria")
##########################################################
## Regla reparacion
## Esta regla pide información sobre la reparación que se ha
## realizado al vehiculo para descontarlo de la tasación inicial
##########################################################
@Rule(AS.h1 << EstadoTasacion(estadotasacion="repararmotor"), AS.h2 << ValorTasacion(valor=MATCH.pc))
def reparacion(self, h1, h2, pc):
coste = float(input("¿Cuánto costará reparar el motor del vehículo? "))
self.modify(h2, valor=(pc - coste))
self.modify(h1, estadotasacion="comprobarcarroceria")
##########################################################
## Regla comprobarcarroceria
## Esta regla comprueba el estado de la carroceria:
## Muy buen estado: incrementa un 1% el precio del vehiculo
## Buen estado: No hace nada
## Regular: decrementa el precio del coche en un 2% con un minimo de 120
## Mal estado: decrementa el precio del coche en un 4% con un minimo de 180
## Muy mal estado: detiene la ejecución y muestra el informe final
##########################################################
@Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobarcarroceria"), AS.h2 << ValorTasacion(valor=MATCH.pc))
def comprobarcarroceria(self, h1, h2, pc):
respuesta = int(pregunta("¿Cual es el estado de la carrocería? (1-Muy buen estado 2-Buen estado 3-Estado regular 4-Mal estado 5-Muy mal estado)", ['1', '2', '3', '4', '5']))
if respuesta == '5':
self.modify(valor=0)
self.declare(MensajeFin("La carrocería no se encuentra en condiciones."))
self.modify(h1, estadotasacion="fin")
elif respuesta == '1':
pc = retasarporcentaje("inc", pc, 1, "min", 0)
elif respuesta == '3':
pc = retasarporcentaje("dec", pc, 2, "min", 120)
elif respuesta == '4':
pc = retasarporcentaje("dec", pc, 4, "min", 180)
self.modify(h2, valor=pc)
self.modify(h1, estadotasacion="comprobartapiceria")
##########################################################
## Regla comprobartapiceria
## Esta regla comprueba el estado de la tapiceria:
## Muy buen estado o Buen estado: No hace nada
## Regular: decrementa el precio del coche en un 0.5% con un maximo de 300
## Mal estado: decrementa el precio del coche en un 0.75% con un maximo de 600
## Muy mal estado: detiene la ejecución y muestra el informe final
##########################################################
@Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobartapiceria"), AS.h2 << ValorTasacion(valor=MATCH.pc))
def comprobartapiceria(self, h1, h2, pc):
respuesta = pregunta("¿Cual es el estado de la tapicería? (1-Muy buen estado 2-Buen estado 3-Estado regular 4-Mal estado 5-Muy mal estado)", ['1', '2','3', '4', '5'])
if respuesta == 5:
self.modify(valor=0)
self.declare(MensajeFin("La tapicería no se encuentra en condiciones."))
self.modify(h1, estadotasacion="fin")
elif respuesta == 3:
pc = retasarporcentaje("dec", pc, 0.5, "max", 300)
elif respuesta == 4:
pc = retasarporcentaje("dec", pc, 0.75, "max", 600)
self.modify(h2, valor=pc)
self.modify(h1, estadotasacion="comprobarruedas")
##########################################################
## Regla comprobarruedas
## Esta regla comprueba el estado de las ruedas:
## Buen estado: No hace nada
## Regular: decrementa el precio del coche en 60
## Mal estado: decrementa el precio del coche en 240
##########################################################
@Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobarruedas"), AS.h2 << ValorTasacion(valor=MATCH.pc))
def comprobarruedas(self, h1, h2, pc):
respuesta = pregunta("¿Cual es el estado de las ruedas? (1-Buen estado 2-Regular 3-Mal estado)", ['1', '2', '3'])
if respuesta == 2:
pc = retasarimporte("dec", pc, 60)
elif respuesta == 3:
pc = retasarimporte("dec", pc, 240)
self.modify(h2, valor=pc)
self.modify(h1, estadotasacion="comprobarcd")
##########################################################
## Regla comprobarcd
## Esta regla averigua si el vehiculo dispone de cd
## Tiene cd: Incrementa el precio en 120
## No tiene: No hace nada
##########################################################
@Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobarcd"), AS.h2 << ValorTasacion(valor=MATCH.pc))
def comprobarcd(self, h1, h2, pc):
respuesta = siono("¿El vehiculo dispone de CD/MP3?")
if respuesta:
pc = retasarimporte("inc", pc, 120)
self.modify(h2, valor=pc)
self.modify(h1, estadotasacion="comprobaralarma")
##########################################################
## Regla comprobaralarma
## Esta regla averigua si el vehiculo dispone de alarma
## Tiene alarma: Incrementa el precio en 150
## No tiene: No hace nada
##########################################################
@Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobaralarma"), AS.h2 << ValorTasacion(valor=MATCH.pc))
def comprobaralarma(self, h1, h2, pc):
respuesta = siono("¿El vehiculo dispone de Alarma?")
if respuesta:
pc = retasarimporte("inc", pc, 150)
self.modify(h2, valor=pc)
self.modify(h1, estadotasacion="comprobarllantas")
##########################################################
## Regla comprobarllantas
## Esta regla averigua si el vehiculo dispone de llantas de aleación ligera
## Tiene llantas: Incrementa el precio en 180
## No tiene: No hace nada
##########################################################
@Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobarllantas"), AS.h2 << ValorTasacion(valor=MATCH.pc))
def comprobarllantas(self, h1, h2, pc):
respuesta = siono("¿El vehiculo dispone de llantas de aleacion ligera?")
if respuesta:
pc = retasarimporte("inc", pc, 180)
self.modify(h2, valor=pc)
self.modify(h1, estadotasacion="comprobarestadofiscal")
##########################################################
## Regla comprobarestadofiscal
## Esta regla averigua si el vehiculo dispone de toda la documentación
## fiscal en regla
## Esta en regla: Devuelve el resultado de la tasación
## No tiene: detiene la ejecución y muestra el informe final
##########################################################
@Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobarestadofiscal"), AS.h2 << ValorTasacion(valor=MATCH.pc))
def comprobarestadofiscal(self, h1, h2, pc):
respuesta = siono("¿El vehiculo esta en regla fiscalmente?")
if respuesta:
self.declare(MensajeFin("La tasacion se ha llevado a cabo correctamente."))
self.modify(h1, estadotasacion="fin")
else:
self.modify(h2, valor=0)
self.declare(MensajeFin("El vehiculo no esta en regla fiscalmente."))
self.modify(h1, estadotasacion="fin")
##########################################################
## Regla informefinal
## Esta regla muestra el informe final del vehiculo
## Si el valortasacion es 0 muestra el mensaje
## Si el valortasacion es diferente de 0 se muestra el valor
## estimado para el vehiculo
##########################################################
@Rule(AS.h1 << EstadoTasacion(estadotasacion="fin"), AS.h2 << ValorTasacion(valor=MATCH.pc),
MensajeFin(MATCH.msg), VehiculoBuscado(marca=MATCH.mc, modelo=MATCH.mod, anyo=MATCH.anyo))
def informefinal (self, h1, h2, pc, msg, mc, mod, anyo):
print(f"\n\n\n")
print(f"#####################################################################")
print(f"# I N F O R M E F I N A L #")
print(f"#####################################################################")
print(f" ***** * ******* ********* * * ")
print(f" * * * * * * ")
print(f" * * * * * ")
print(f" * * * * * * **** * * *** ")
print(f" * * ******* * * * * * * * * * ")
print(f" #### # # # # # # # # # # ")
print(f" # # # # # ###### # # ####### ")
print(f" # # # # # # # # # # ")
print(f" # # # # # # # # # # # # ")
print(f" # # # # # # # # ## # # # # ")
print(f" #### # ####### # # # #### # ## #### ")
print(f" Sistema Experto de Tasación de Vehiculos ")
print(f"\n\n\n")
print(f" Despues de comprobar eshauxtivamente el vehiculo: ")
print(f" MARCA...................: {mc}")
print(f" MODELO..................: {mod}")
print(f" AÑO DE MATRICULACION....: {anyo}")
print(f"\n\n\n")
if pc==0:
print(f" El sistema experto SIEXTAVE (SIstema EXperto de TAsacion")
print(f"de VEhiculos) no ha podido estimar un precio para el")
print(f"vehiculo por el siguiente motivo:\n")
print(f" {msg} \n")
else:
print(f" El sistema experto SIEXTAVE (SIstema EXperto de TAsacion")
print(f"de VEhiculos) ha estimado un preció final para el vehículo de:")
print(f" {pc}")
print(f"##############################################################")
self.retract(h1)
self.halt()
%pip install git+https://github.com/openmotics/om-experta.git from experta import * from experta.fact import * import schema ######################################################### # Modelos de Inteligencia Artificial # # Practica UD02, Curso 2023-2024 # # Sistema Experto para la Tasación de Vehiculos Usados # ######################################################### # Definición de Templates ######################################################### class Vehiculo(Fact): marca = Field(str) modelo = Field(str) anyo = Field(int) precio = Field(float) class VehiculoBuscado(Fact): marca = Field(str) modelo = Field(str) anyo = Field(int) class EstadoTasacion(Fact): pass class MensajeFin(Fact): pass class ValorTasacion(Fact): pass # Definición de Funciones ######################################################### ########################## # Función pregunta # Muestra una pregunta que pasamos por parametro y # se asegura que la respuesta esté entre las respuestas # validas. ########################## def pregunta(textopregunta, respuestas_validas): respuesta = None while respuesta not in respuestas_validas: respuesta = input(f"{textopregunta} ({'/'.join(map(str, respuestas_validas))}): ") respuesta = respuesta.lower() return respuesta def preguntaabierta(textopregunta): return input(f"{textopregunta}") ########################## # Función si_o_no # Devuelve true si el usuario contesta con cualquier # palabra o letra que comience con S (aunque sea # minúscula) ########################## def siono(textopregunta): respuesta = pregunta(textopregunta, ['s', 'n', 'si', 'no']) return respuesta in ['s', 'si'] ########################## # Función retasarporcentaje # Modifica el valor del vehiculo segun los parametros pasados: # operacion: "inc"/"dec" => incremento/decremento de la tasación # preciocoche: Precio inicial del vehiculo # porcentaje: Porcentaje de preciocoche a incrementar/decrementar # maxmin: Especifica si el tope sera el maximo o el minimo # tope: Cantidad tope que se usa segun ?maxmin ########################## def retasarporcentaje(self, operacion, preciocoche, porcentaje, maxmin, tope): valor_var = (preciocoche * porcentaje) / 100 if maxmin == "min": valor_var = max(valor_var, tope) else: valor_var = min(valor_var, tope) if operacion == "inc": valor_var += precio_coche else: valor_var = precio_coche - valor_var return valor_var ########################## # Función retasarimporte # Modifica el valor del vehiculo segun los parametros pasados: # operacion: "inc"/"dec" => incremento/decremento de la tasación # preciocoche: Precio inicial del vehiculo # importe: Importe que se suma/resta segun operacion al precio # inicial preciocoche ########################## def retasarimporte(self, operacion, preciocoche, importe): if operacion == "inc": return precio_coche + importe else: return precio_coche - importe #################################################### ## M O T O R D E C O N O C I M I E N T O #################################################### class TVU(KnowledgeEngine): # Definición de Base de Hechos Inicial ######################################################### @DefFacts() def hechosiniciales(self): yield EstadoTasacion(estadotasacion="presentacion") # Base de Datos GANVAM ######################################################### yield Vehiculo(marca="FORD", modelo="FOCUS TDI 1.8", anyo=1999, precio=4207.08) yield Vehiculo(marca="FORD", modelo="FIESTA TDDI 1.6", anyo=2003, precio=7212.15) yield Vehiculo(marca="FORD", modelo="FOCUS C-MAX 1.8", anyo=2002, precio=6010.12) yield Vehiculo(marca="VOLVO", modelo="S40", anyo=2000, precio=9616.19) yield Vehiculo(marca="VOLVO", modelo="S80", anyo=2001, precio=11419.23) yield Vehiculo(marca="RENAULT", modelo="CLIO", anyo=2003, precio=11419.23) yield Vehiculo(marca="RENAULT", modelo="MEGANE II", anyo=2000, precio=8113.66) yield Vehiculo(marca="RENAULT", modelo="5", anyo=1980, precio=1202.02) yield Vehiculo(marca="CITROEN", modelo="XSARA", anyo=2004, precio=18030.36) yield Vehiculo(marca="CITROEN", modelo="C5", anyo=2005, precio=30050.61) yield Vehiculo(marca="CITROEN", modelo="2CV", anyo=1970, precio=601.01) # Definición de Reglas ######################################################### ########################################################## ## Regla presentacion ## Muestra una pantalla de información de la práctica, ## a continuación pide confirmación para seguir y ## comienza la tasación ########################################################## @Rule(AS.h1 << EstadoTasacion(estadotasacion="presentacion")) def presentacion(self, h1): print(f"\n\n\n") print(f" ***** * ******* ********* * * ") print(f" * * * * * * ") print(f" * * * * * ") print(f" * * * * * * **** * * *** ") print(f" * * ******* * * * * * * * * * ") print(f" #### # # # # # # # # # # ") print(f" # # # # # ###### # # ####### ") print(f" # # # # # # # # # # ") print(f" # # # # # # # # # # # # ") print(f" # # # # # # # # ## # # # # ") print(f" #### # ####### # # # #### # ## #### ") print(f" Sistema Experto de Tasación de Vehiculos ") print(f"\n") print(f" _____________") print(f" ..---:::::::-----------. ::::;;.") print(f" .'''''''' ;; \ '':.") print(f" .'' ; \ '\__.") print(f" .' ;; ; \\';") print(f" .' ; _____; \\/") print(f" .' :; ;' \ ___:'.") print(f" .'--........................... : = ____:' \ \\") print(f" ..-'' '''' o''' ; ; :") print(f" .--'' .----- ..----... _.- --. ..-' ; ; ; ;") print(f" .''_- '--''-----''' _-' .-'' ; ; .-.") print(f" .' .' .' .' ; ; /. |") print(f" /-./' .' / _.. ; ; ;;;|") print(f" : ;-.______ / _________==. /_ \ ; ; ;;;;") print(f" ; / | ''''''''''.---.'''''''' : /' '. |; ; _; ;;;") print(f" /'-/ | / / / / ;|; ;-' | ;';") print(f":- : '''----______ / / ____. . .''. ;; .-'..T' .") print(f"'. ' ___ '': ''''''''''''''' . ; ; ;; ;.' .' '--'") print(f" ', __ ''' ''---... :- - - - - - - - - ' ' ; ; ; ;;' .'") print(f" /. ; '''---___ ; ; ; ;|.''") print(f" : ': '''----. .-------. ; ; ; ;:") print(f" \ '--__ \ \ \ / | ; ;;") print(f" '-.. ''''---___ : .______..\ __/..-""| ; ; ;") print(f" ''--.. '''--' . '. . ;") print(f" ''------... ..--'' ' :") print(f" '''''''''''''''''' \ /") print(f" '------'") print(f"\n") respuesta = siono("¿Desea comenzar la tasación?") if respuesta: #self.retract(h1) #self.declare(EstadoTasacion(estadotasacion="inicio")) self.modify(h1, estadotasacion="inicio") else: self.halt() ########################################################## ## Regla inicio ## Pregunta al usuario los datos del vehículo, marca, modelo ## y año de matriculación ########################################################## @Rule(AS.h1 << EstadoTasacion(estadotasacion="inicio")) def inicio(self, h1): marca= preguntaabierta("¿Cual es la marca del vehículo?") modelo= preguntaabierta("¿Cual es el modelo del vehículo?") anyo= preguntaabierta("¿Cual es el año de matriculación?") self.declare(VehiculoBuscado(marca=marca, modelo=modelo, anyo=int(anyo))) self.modify(h1, estadotasacion="comprobarmotor") ########################################################## ## Regla buscarganvam ## Esta regla se dispara si los datos introducidos por el cliente ## encuentran una coincidencia en la base de hechos de Ganvam ## Si es así, imprime la tasación inicial ########################################################## @Rule(Vehiculo(marca=MATCH.mc, modelo=MATCH.mod, anyo=MATCH.anyo, precio=MATCH.precio), VehiculoBuscado(marca=MATCH.mc, modelo=MATCH.mod, anyo=MATCH.anyo)) def buscarganvam(self, mc, mod, anyo, precio): self.declare(ValorTasacion(valor=precio)) print(f"\nLa tasacion inicial para el vehiculo según el catálogo GANVAM es de: {precio}\n") ########################################################## ## Regla noexisteganvam ## Esta regla se dispara si los datos introducidos por el cliente ## no encuentran una coincidencia en la base de hechos de Ganvam ## Al no encontrar el vehiculo redirige la ejecución a la ## regla fin, que muestra el resultado de la tasación ########################################################## @Rule(AS.h1 << EstadoTasacion(estadotasacion=W()), VehiculoBuscado(marca=MATCH.mc, modelo=MATCH.mod, anyo=MATCH.anyo), NOT(Vehiculo(marca=MATCH.mc, modelo=MATCH.mod, anyo=MATCH.anyo, precio=MATCH.precio))) def noexisteganvam(self, h1, mc, mod, anyo): self.declare(ValorTasacion(valor=0)) self.declare(MensajeFin("No se ha encontrado el vehiculo en el catálogo GANVAM")) self.modify(h1, estadotasacion="fin") ########################################################## ## Regla comprobarmotor ## Esta regla comprueba el estado del motor: ## Sin averias: No hace nada ## leves o graves: pide información sobre la reparación del motor ## muy graves: detiene la ejecución y muestra el informe final ########################################################## @Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobarmotor"), AS.h2 << ValorTasacion(valor=MATCH.pc)) def comprobarmotor(self, h1, h2, pc): respuesta = pregunta("¿Cual es el estado del motor? (1-Sin averias 2-Con averías leves 3-Con averías graves 4-Con averías muy graves)", ['1', '2', '3', '4']) if respuesta =='4': self.modify(h2, valor=0) self.declare(MensajeFin("El coche no se encuentra en condiciones mecánicas.")) self.modify(h1, estadotasacion="fin") elif respuesta == '2' or respuesta == '3': self.modify(h1, estadotasacion="repararmotor") else: self.modify(h1, estadotasacion="comprobarcarroceria") ########################################################## ## Regla reparacion ## Esta regla pide información sobre la reparación que se ha ## realizado al vehiculo para descontarlo de la tasación inicial ########################################################## @Rule(AS.h1 << EstadoTasacion(estadotasacion="repararmotor"), AS.h2 << ValorTasacion(valor=MATCH.pc)) def reparacion(self, h1, h2, pc): coste = float(input("¿Cuánto costará reparar el motor del vehículo? ")) self.modify(h2, valor=(pc - coste)) self.modify(h1, estadotasacion="comprobarcarroceria") ########################################################## ## Regla comprobarcarroceria ## Esta regla comprueba el estado de la carroceria: ## Muy buen estado: incrementa un 1% el precio del vehiculo ## Buen estado: No hace nada ## Regular: decrementa el precio del coche en un 2% con un minimo de 120 ## Mal estado: decrementa el precio del coche en un 4% con un minimo de 180 ## Muy mal estado: detiene la ejecución y muestra el informe final ########################################################## @Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobarcarroceria"), AS.h2 << ValorTasacion(valor=MATCH.pc)) def comprobarcarroceria(self, h1, h2, pc): respuesta = int(pregunta("¿Cual es el estado de la carrocería? (1-Muy buen estado 2-Buen estado 3-Estado regular 4-Mal estado 5-Muy mal estado)", ['1', '2', '3', '4', '5'])) if respuesta == '5': self.modify(valor=0) self.declare(MensajeFin("La carrocería no se encuentra en condiciones.")) self.modify(h1, estadotasacion="fin") elif respuesta == '1': pc = retasarporcentaje("inc", pc, 1, "min", 0) elif respuesta == '3': pc = retasarporcentaje("dec", pc, 2, "min", 120) elif respuesta == '4': pc = retasarporcentaje("dec", pc, 4, "min", 180) self.modify(h2, valor=pc) self.modify(h1, estadotasacion="comprobartapiceria") ########################################################## ## Regla comprobartapiceria ## Esta regla comprueba el estado de la tapiceria: ## Muy buen estado o Buen estado: No hace nada ## Regular: decrementa el precio del coche en un 0.5% con un maximo de 300 ## Mal estado: decrementa el precio del coche en un 0.75% con un maximo de 600 ## Muy mal estado: detiene la ejecución y muestra el informe final ########################################################## @Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobartapiceria"), AS.h2 << ValorTasacion(valor=MATCH.pc)) def comprobartapiceria(self, h1, h2, pc): respuesta = pregunta("¿Cual es el estado de la tapicería? (1-Muy buen estado 2-Buen estado 3-Estado regular 4-Mal estado 5-Muy mal estado)", ['1', '2','3', '4', '5']) if respuesta == 5: self.modify(valor=0) self.declare(MensajeFin("La tapicería no se encuentra en condiciones.")) self.modify(h1, estadotasacion="fin") elif respuesta == 3: pc = retasarporcentaje("dec", pc, 0.5, "max", 300) elif respuesta == 4: pc = retasarporcentaje("dec", pc, 0.75, "max", 600) self.modify(h2, valor=pc) self.modify(h1, estadotasacion="comprobarruedas") ########################################################## ## Regla comprobarruedas ## Esta regla comprueba el estado de las ruedas: ## Buen estado: No hace nada ## Regular: decrementa el precio del coche en 60 ## Mal estado: decrementa el precio del coche en 240 ########################################################## @Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobarruedas"), AS.h2 << ValorTasacion(valor=MATCH.pc)) def comprobarruedas(self, h1, h2, pc): respuesta = pregunta("¿Cual es el estado de las ruedas? (1-Buen estado 2-Regular 3-Mal estado)", ['1', '2', '3']) if respuesta == 2: pc = retasarimporte("dec", pc, 60) elif respuesta == 3: pc = retasarimporte("dec", pc, 240) self.modify(h2, valor=pc) self.modify(h1, estadotasacion="comprobarcd") ########################################################## ## Regla comprobarcd ## Esta regla averigua si el vehiculo dispone de cd ## Tiene cd: Incrementa el precio en 120 ## No tiene: No hace nada ########################################################## @Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobarcd"), AS.h2 << ValorTasacion(valor=MATCH.pc)) def comprobarcd(self, h1, h2, pc): respuesta = siono("¿El vehiculo dispone de CD/MP3?") if respuesta: pc = retasarimporte("inc", pc, 120) self.modify(h2, valor=pc) self.modify(h1, estadotasacion="comprobaralarma") ########################################################## ## Regla comprobaralarma ## Esta regla averigua si el vehiculo dispone de alarma ## Tiene alarma: Incrementa el precio en 150 ## No tiene: No hace nada ########################################################## @Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobaralarma"), AS.h2 << ValorTasacion(valor=MATCH.pc)) def comprobaralarma(self, h1, h2, pc): respuesta = siono("¿El vehiculo dispone de Alarma?") if respuesta: pc = retasarimporte("inc", pc, 150) self.modify(h2, valor=pc) self.modify(h1, estadotasacion="comprobarllantas") ########################################################## ## Regla comprobarllantas ## Esta regla averigua si el vehiculo dispone de llantas de aleación ligera ## Tiene llantas: Incrementa el precio en 180 ## No tiene: No hace nada ########################################################## @Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobarllantas"), AS.h2 << ValorTasacion(valor=MATCH.pc)) def comprobarllantas(self, h1, h2, pc): respuesta = siono("¿El vehiculo dispone de llantas de aleacion ligera?") if respuesta: pc = retasarimporte("inc", pc, 180) self.modify(h2, valor=pc) self.modify(h1, estadotasacion="comprobarestadofiscal") ########################################################## ## Regla comprobarestadofiscal ## Esta regla averigua si el vehiculo dispone de toda la documentación ## fiscal en regla ## Esta en regla: Devuelve el resultado de la tasación ## No tiene: detiene la ejecución y muestra el informe final ########################################################## @Rule(AS.h1 << EstadoTasacion(estadotasacion="comprobarestadofiscal"), AS.h2 << ValorTasacion(valor=MATCH.pc)) def comprobarestadofiscal(self, h1, h2, pc): respuesta = siono("¿El vehiculo esta en regla fiscalmente?") if respuesta: self.declare(MensajeFin("La tasacion se ha llevado a cabo correctamente.")) self.modify(h1, estadotasacion="fin") else: self.modify(h2, valor=0) self.declare(MensajeFin("El vehiculo no esta en regla fiscalmente.")) self.modify(h1, estadotasacion="fin") ########################################################## ## Regla informefinal ## Esta regla muestra el informe final del vehiculo ## Si el valortasacion es 0 muestra el mensaje ## Si el valortasacion es diferente de 0 se muestra el valor ## estimado para el vehiculo ########################################################## @Rule(AS.h1 << EstadoTasacion(estadotasacion="fin"), AS.h2 << ValorTasacion(valor=MATCH.pc), MensajeFin(MATCH.msg), VehiculoBuscado(marca=MATCH.mc, modelo=MATCH.mod, anyo=MATCH.anyo)) def informefinal (self, h1, h2, pc, msg, mc, mod, anyo): print(f"\n\n\n") print(f"#####################################################################") print(f"# I N F O R M E F I N A L #") print(f"#####################################################################") print(f" ***** * ******* ********* * * ") print(f" * * * * * * ") print(f" * * * * * ") print(f" * * * * * * **** * * *** ") print(f" * * ******* * * * * * * * * * ") print(f" #### # # # # # # # # # # ") print(f" # # # # # ###### # # ####### ") print(f" # # # # # # # # # # ") print(f" # # # # # # # # # # # # ") print(f" # # # # # # # # ## # # # # ") print(f" #### # ####### # # # #### # ## #### ") print(f" Sistema Experto de Tasación de Vehiculos ") print(f"\n\n\n") print(f" Despues de comprobar eshauxtivamente el vehiculo: ") print(f" MARCA...................: {mc}") print(f" MODELO..................: {mod}") print(f" AÑO DE MATRICULACION....: {anyo}") print(f"\n\n\n") if pc==0: print(f" El sistema experto SIEXTAVE (SIstema EXperto de TAsacion") print(f"de VEhiculos) no ha podido estimar un precio para el") print(f"vehiculo por el siguiente motivo:\n") print(f" {msg} \n") else: print(f" El sistema experto SIEXTAVE (SIstema EXperto de TAsacion") print(f"de VEhiculos) ha estimado un preció final para el vehículo de:") print(f" {pc}") print(f"##############################################################") self.retract(h1) self.halt()
Collecting git+https://github.com/openmotics/om-experta.git Cloning https://github.com/openmotics/om-experta.git to /tmp/pip-req-build-lbothyga Running command git clone --filter=blob:none --quiet https://github.com/openmotics/om-experta.git /tmp/pip-req-build-lbothyga Resolved https://github.com/openmotics/om-experta.git to commit d35d53708a46482e1ee4e3a4bc1a36bc03492913 Preparing metadata (setup.py) ... done Collecting frozendict==2.3.8 (from om-experta==1.9.8) Downloading frozendict-2.3.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (20 kB) Collecting schema==0.6.7 (from om-experta==1.9.8) Downloading schema-0.6.7-py2.py3-none-any.whl.metadata (14 kB) Downloading frozendict-2.3.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (115 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 115.3/115.3 kB 5.7 MB/s eta 0:00:00 Downloading schema-0.6.7-py2.py3-none-any.whl (14 kB) Building wheels for collected packages: om-experta Building wheel for om-experta (setup.py) ... done Created wheel for om-experta: filename=om_experta-1.9.8-py3-none-any.whl size=35883 sha256=d47388c100424fc621fbf77e59dc7c7e83a7693ffb86284b694f25b33a5c7829 Stored in directory: /tmp/pip-ephem-wheel-cache-v3rbcl33/wheels/60/c2/a6/6654a61b88863ceaf39a34de66f8591d327e3b154d58bcc3e9 Successfully built om-experta Installing collected packages: schema, frozendict, om-experta Attempting uninstall: frozendict Found existing installation: frozendict 2.4.6 Uninstalling frozendict-2.4.6: Successfully uninstalled frozendict-2.4.6 Successfully installed frozendict-2.3.8 om-experta-1.9.8 schema-0.6.7
In [2]:
Copied!
engine = TVU()
engine.reset()
engine.run()
engine = TVU() engine.reset() engine.run()
***** * ******* ********* * *
* * * * * *
* * * * *
* * * * * * **** * * ***
* * ******* * * * * * * * * *
#### # # # # # # # # # #
# # # # # ###### # # #######
# # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # ## # # # #
#### # ####### # # # #### # ## ####
Sistema Experto de Tasación de Vehiculos
_____________
..---:::::::-----------. ::::;;.
.'''''''' ;; \ '':.
.'' ; \ '\__.
.' ;; ; \';
.' ; _____; \/
.' :; ;' \ ___:'.
.'--........................... : = ____:' \ \
..-'' '''' o''' ; ; :
.--'' .----- ..----... _.- --. ..-' ; ; ; ;
.''_- '--''-----''' _-' .-'' ; ; .-.
.' .' .' .' ; ; /. |
/-./' .' / _.. ; ; ;;;|
: ;-.______ / _________==. /_ \ ; ; ;;;;
; / | ''''''''''.---.'''''''' : /' '. |; ; _; ;;;
/'-/ | / / / / ;|; ;-' | ;';
:- : '''----______ / / ____. . .''. ;; .-'..T' .
'. ' ___ '': ''''''''''''''' . ; ; ;; ;.' .' '--'
', __ ''' ''---... :- - - - - - - - - ' ' ; ; ; ;;' .'
/. ; '''---___ ; ; ; ;|.''
: ': '''----. .-------. ; ; ; ;:
\ '--__ \ \ \ / | ; ;;
'-.. ''''---___ : .______..\ __/..-| ; ; ;
''--.. '''--' . '. . ;
''------... ..--'' ' :
'''''''''''''''''' \ /
'------'
¿Desea comenzar la tasación? (s/n/si/no): si
¿Cual es la marca del vehículo?CITROEN
¿Cual es el modelo del vehículo?2CV
¿Cual es el año de matriculación?1970
La tasacion inicial para el vehiculo según el catálogo GANVAM es de: 601.01
¿Cual es el estado del motor? (1-Sin averias 2-Con averías leves 3-Con averías graves 4-Con averías muy graves) (1/2/3/4): 2
¿Cuánto costará reparar el motor del vehículo? 100
¿Cual es el estado de la carrocería? (1-Muy buen estado 2-Buen estado 3-Estado regular 4-Mal estado 5-Muy mal estado) (1/2/3/4/5): 3
¿Cual es el estado de la tapicería? (1-Muy buen estado 2-Buen estado 3-Estado regular 4-Mal estado 5-Muy mal estado) (1/2/3/4/5): 4
¿Cual es el estado de las ruedas? (1-Buen estado 2-Regular 3-Mal estado) (1/2/3): 1
¿El vehiculo dispone de CD/MP3? (s/n/si/no): n
¿El vehiculo dispone de Alarma? (s/n/si/no): n
¿El vehiculo dispone de llantas de aleacion ligera? (s/n/si/no): n
¿El vehiculo esta en regla fiscalmente? (s/n/si/no): s
#####################################################################
# I N F O R M E F I N A L #
#####################################################################
***** * ******* ********* * *
* * * * * *
* * * * *
* * * * * * **** * * ***
* * ******* * * * * * * * * *
#### # # # # # # # # # #
# # # # # ###### # # #######
# # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # ## # # # #
#### # ####### # # # #### # ## ####
Sistema Experto de Tasación de Vehiculos
Despues de comprobar eshauxtivamente el vehiculo:
MARCA...................: CITROEN
MODELO..................: 2CV
AÑO DE MATRICULACION....: 1970
El sistema experto SIEXTAVE (SIstema EXperto de TAsacion
de VEhiculos) ha estimado un preció final para el vehículo de:
501.01
##############################################################