Escolar Documentos
Profissional Documentos
Cultura Documentos
MISONEROS Y CANIBALES
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?
Situación al principio.
El misionero regresa.
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 *
;;;*************
(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 *
;;;*****************
(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 *
;;;****************************************
;;;***********************
;;;* 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