;;;====================================================== ;;; Cuando el jugador est  a una distancia menor a 10 de ;;; la pelota, patea y ser  gol cuando la pelota est‚ a ;;; una distancia menor a 20 de la porter¡a ;;;====================================================== ;(watch all) ; *********** ; deftemplate ; *********** ;(deftemplate distancia ; (slot pelota-jugador) ; (slot pelota-porteria)) ; ******** ; deffacts ; ******** (deffacts inicio (hecho dist_pel_jug)) ; ************ ; deffunctions ; ************ (deffunction de_nuevo () (printout t " Volver a empezar (s/n) ") (if (eq (read) s) then (assert (hecho dist_pel_jug)))) ; ******* ; Reglas ; ******* (defrule distancia_pelota_jugador (hecho dist_pel_jug) => (printout t "distancia de pelota al jugador = ") (assert (pelota-jugador (read))) ) (defrule dist_pel_jug_correcta ?hecho <-(hecho dist_pel_jug) ?dist <-(pelota-jugador ?distancia&: (and (integerp ?distancia)(>= ?distancia 0))) => (retract ?hecho ?dist) (assert (pelota-jugador ?distancia)) (assert (hecho dist_pel_por)) ) (defrule dist_pel_jug_incorrecta ?hecho <-(hecho dist_pel_jug) ?dist <-(pelota-jugador ?distancia&: (or(not (integerp ?distancia)) (< ?distancia 0))) => (printout t "La distancia entre el jugador y la pelota debe ser un numero positivo " crlf) (retract ?hecho ?dist) (assert (hecho dist_pel_jug)) ) (defrule distancia_pelota_porteria (hecho dist_pel_por) => (printout t "distancia de pelota a la porteria = ") (assert (pelota-porteria (read))) ) (defrule dist_pel_por_correcta ?hecho <-(hecho dist_pel_por) ?dist <-(pelota-porteria ?distancia&: (and (integerp ?distancia)(>= ?distancia 0))) => (retract ?hecho ?dist) (assert (pelota-porteria ?distancia)) (assert (hecho ver_chut)) ) (defrule dist_pel_por_incorrecta ?hecho <-(hecho dist_pel_por) ?dist <-(pelota-porteria ?distancia&: (or(not (integerp ?distancia)) (< ?distancia 0))) => (printout t "La distancia entre la pelota y la porteria debe ser un numero positivo " crlf) (retract ?hecho ?dist) (assert (hecho dist_pel_por)) ) (defrule ver_si_jug_pel_pos ?hecho<-(hecho ver_chut) (pelota-jugador ?dist&: (<= ?dist 10)) => (retract ?hecho) (assert (hecho chutar))) (defrule ver_si_jug_pel_por_pos ?hecho <- (hecho chutar) ?dist1 <-(pelota-porteria ?distancia&: (<= ?distancia 20)) ?dist2 <-(pelota-jugador ?dist) => (printout t "Goooooooool!!" crlf) (retract ?hecho ?dist1 ?dist2) (de_nuevo)) (defrule chutar_fallo ?hecho <- (hecho chutar) ?dist1 <-(pelota-porteria ?distancia&: (> ?distancia 20)) ?dist2 <-(pelota-jugador ?dist) => (printout t "Fuera!!" crlf) (retract ?hecho ?dist1 ?dist2) (de_nuevo)) (defrule no_chutar ?hecho<-(hecho ver_chut) ?dist1 <-(pelota-jugador ?dist&: (> ?dist 10)) ?dist2 <- (pelota-porteria ?distancia) => (printout t "Estoy lejos de la pelota " crlf) (retract ?hecho ?dist1 ?dist2) (assert (hecho dist_pel_jug)))) (reset) (run)