Você está na página 1de 9

SISTEMAS EXPERTOS 1

CARLOS CHAVEZ SANCHEZ

MISONEROS Y CANIBALES

1) DESCRIPCION DEL PROBLEMA

3 caníbales y 3 misioneros querían cruzar un río, pero solo había una canoa en la
que solo cabían dos personas a la vez. Todos los misioneros podían remar la canoa,
pero solo uno de los caníbales podía remar. Mientras el número de caníbales y de
misioneros juntos (ya sea en el barco o en ambos lados del río) era igual, todo
estaba bien. Pero al solo haber más caníbales que misioneros, los caníbales se
comían a los misioneros. ¿Puedes cruzarlos a todos de un lado del río al otro sin
que se pierda ninguno?

2) SOLUCION DEL PROBLEMA

Situación al principio.

Primero 1 misionero y un canibal (no el que puede remar) cruzan.


SISTEMAS EXPERTOS 2
CARLOS CHAVEZ SANCHEZ

El misionero regresa.

Entonces el canibal que rema y el otro canibal cruzan.

El canibal que rema regresa.

Dos misioneros cruzan al otro lado.


SISTEMAS EXPERTOS 3
CARLOS CHAVEZ SANCHEZ

Un misionero y un canibal regresan.

El canibal que rema y un misionero cruzan otra vez.

El misionero regresa con otro canibal, dejando al canibal que rema en el otro lado.

Los dos misioneros que todavía están en el lado original cruzan, y así los tres
misioneros están todos al otro lado del río.

El canibal que rema tiene que hacer dos viajes para ir a traer a los otros dos
SISTEMAS EXPERTOS 4
CARLOS CHAVEZ SANCHEZ

canibales, uno por uno, que todavía están al otro lado del río.

Ahora ya todos están al otro lado del río y pueden hacer lo que quieran.
SISTEMAS EXPERTOS 5
CARLOS CHAVEZ SANCHEZ

3) SOLUCION EN CLIPS

(defmodule MAIN
(export deftemplate estado)
(export defglobal misionero-inicial canibal-inicial))

;;;*************
;;;* TEMPLATES *
;;;*************

;;; The status facts hold the state


;;; information of the search tree.

(deftemplate MAIN::estado
(slot busqueda (type INTEGER) (range 1 ?VARIABLE))
(slot parent (type FACT-ADDRESS SYMBOL) (allowed-symbols no-parent))
(slot costa-1-misionero (type INTEGER) (range 0 ?VARIABLE))
(slot costa-1-canibal (type INTEGER) (range 0 ?VARIABLE))
(slot costa-2-misionero (type INTEGER) (range 0 ?VARIABLE))
(slot costa-2-canibal (type INTEGER) (range 0 ?VARIABLE))
(slot ubicacion-bote(type SYMBOL) (allowed-values shore-1 shore-2))
(slot ultimo-movimiento (type STRING)))

;;;*****************
;;;* INITIAL STATE *
;;;*****************

(defglobal MAIN ?*misioneros-iniciales* = 3


?*canibales-iniciales* = 3)

(deffacts MAIN::posiciones-iniciales
(status (busqueda 1)
(parent no-parent)
(costa-1-misionero ?*misioneros-iniciales*)
(costa-2-misionero 0)
(costa-1-canibal ?*canibales-iniciales*)
(costa-2-canibales 0)
(ubicacion-bote costa-1)
(ultimo-movimiento "No movido.")))

(deffacts MAIN::informacion-bote
(bote-lleva 2))

;;;****************************************
;;;* FUNCTION FOR MOVE DESCRIPTION STRING *
;;;****************************************

(deffunction MAIN::move-string (?misioneros ?canibales ?costa)


(switch ?misioneros
(case 0 then
(if (eq ?canibales 1)
then (format nil "mover 1 canibal-a %s.%n" ?costa)
else (format nil "mover %d canibal-a %s.%n" ?canibales ?costa)))
(case 1 then
(switch ?canibales
(case 0 then
(format nil "mover 1 misionero a %s.%n" ?costa))
(case 1 then
(format nil "mover 1 misionero y un canibal a %s.%n" ?costa))
(default then
(format nil "mover 1 misionero y %d canibales a %s.%n"
?canibales ?costa))))
(default
(switch ?canibales
(case 0 then
(format nil "mover %d misioneros a %s.%n" ?misioneros ?costa))
(case 1 then
(format nil "mover %d misioneros and 1 canibal a %s.%n"
?misioneros ?costa))
(default then
(format nil "mover %d misionero %d canibales a %s.%n"
?misioneros ?canibales ?costa))))))
SISTEMAS EXPERTOS 6
CARLOS CHAVEZ SANCHEZ

;;;***********************
;;;* GENERATE PATH RULES *
;;;***********************

(defrule MAIN::costa-1-mover
?node <- (estado (buscar ?num)
(ubicacion-bote costa-1)
(costa-1-misioneros ?s1m)
(costa-1-canibales ?s1c)
(costa-2-misioneros ?s2m)
(costa-2-canibales ?s2c))
(bote-puede-soportar ?limit)
=>
(bind ?max-misioneros (min ?s1m ?limit))
(loop-for-count (?misioneros 0 ?max-misioneros)
(bind ?min-canibales (max 0 (- 1 ?misioneros)))
(bind ?max-canibales (min ?s1c (- ?limit ?misioneros)))
(loop-for-count (?canibales ?min-canibales ?max-canibales)
(duplicate ?node (buscar =(+ 1 ?num))
(parent ?node)
(costa-1-misioneros (- ?s1m ?misioneros))
(costa-1-canibales (- ?s1c ?canibales))
(costa-2-misioneros (+ ?s2m ?misioneros))
(costa-2-canibales (+ ?s2c ?canibales))
(ubicacion-bote costa-2)
(ultimo-movimiento (move-string ?misioneros ?canibales costa-
2))))))

(defrule MAIN::costa-2-mover
?node <- (estado (buscar ?num)
(ubicacion-bore costa-2)
(costa-1-misioneros ?s1m)
(costa-1-canibales ?s1c)
(costa-2-misioneros ?s2m)
(costa-2-canibales ?s2c))
(bote-puede-soportar ?limit)
=>
(bind ?max-misioneros (min ?s2m ?limit))
(loop-for-count (?misioneros 0 ?max-misioneros)
(bind ?min-canibales (max 0 (- 1 ?misioneros)))
(bind ?max-canibales (min ?s1c (- ?limit ?misioneros)))
(loop-for-count (?canibales ?min-canibales ?max-canibales)
(duplicate ?node (buscar =(+ 1 ?num))
(parent ?node)
(costa-1-misioneros (- ?s1m ?misioneros))
(costa-1-canibales (- ?s1c ?canibales))
(costa-2-misioneros (+ ?s2m ?misioneros))
(costa-2-canibales (+ ?s2c ?canibales))
(ubicacion-bote costa-2)
(ultimo-movimiento (move-string ?misioneros ?canibales costa-
1))))))

;;;******************************
;;;* CONSTRAINT VIOLATION RULES *
;;;******************************

(defmodule CONSTRAINTS
(import MAIN deftemplate estado))

(defrule CONSTRAINTS::canibales-comen-misioneros
(declare (auto-focus TRUE))
?node <- (status (costa-1-misioneros ?s1m)
(costa-1-canibales ?s1c)
(costa-2-misioneros ?s2m)
(costa-2-canibales ?s2c))
(test (or (and (> ?s2c ?s2m) (<> ?s2m 0))
(and (> ?s1c ?s1m) (<> ?s1m 0))))
=>
(retract ?node))

(defrule CONSTRAINTS::circular-path
(declare (auto-focus TRUE))
(estado (buscar ?sd1)
SISTEMAS EXPERTOS 7
CARLOS CHAVEZ SANCHEZ

(ubicacion-bote ?bl)
(costa-1-misioneros ?s1m)
(costa-2-canibales ?s1c)
(costa-2-misioneros ?s2m)
(costa-2-canibales ?s2c))
?node <- (estado (buscar ?sd2&:(< ?sd1 ?sd2))
(ubicacion-bote ?bl)
(costa-1-misioneros ?s1m)
(costa-1-canibales ?s1c)
(costa-2-misioneros ?s2m)
(costa-2-canibales ?s2c))
=>
(retract ?node))

;;;*********************************
;;;* FIND AND PRINT SOLUTION RULES *
;;;*********************************

(defmodule SOLUCION
(import MAIN deftemplate estado)
(import MAIN defglobal misionero-inicial canibales-inicial))

(deftemplate SOLUTION::movimientos
(slot id (type FACT-ADDRESS SYMBOL) (allowed-symbols no-parent))
(multislot lista-movimientos
(type STRING)))

(defrule SOLUTION::solucion-reconocida
(declare (auto-focus TRUE))
?node <- (status (parent ?parent)
(costa-2-misioneros ?m&:(= ?m ?*misionero-inicial*))
(costa-2-canivales ?c&:(= ?c ?*canibales-inicial*))
(ultimo-movimientos ?movimiento))
=>
(retract ?node)
(assert (movimiento (id ?parent) (lista-movimientos ?move))))

(defrule SOLUCION::further-solution
?node <- (estado (parent ?parent)
(ultimo-movimiento ?movimiento))
?mv <- (movimientos (id ?node) (lista-movimientos $?rest))
=>
(modify ?mv (id ?parent) (lista-movimientos ?movimientos ?rest)))

(defrule SOLUCION::print-solution
?mv <- (movimiento (id no-parent) (lista-movimientos "sin movimiento." $?m))
=>
(retract ?mv)
(printout t t "Solution found: " t t)
(progn$ (?move ?m) (printout t ?movimiento)))

4)PASOS
SISTEMAS EXPERTOS 8
CARLOS CHAVEZ SANCHEZ

4.1) CARGAR HECHOS Y REGLAS >(reset) >(run)

4.2) CORRER SOLUCION >(run)


SISTEMAS EXPERTOS 9
CARLOS CHAVEZ SANCHEZ

Você também pode gostar