Programación Específica > Programación Lógica
Implementacion De Laberinto En Prolog
noqueteden:
Es una buena idea. Muchas gracias. He intentado modelar tu idea de esta forma:
--- Código: Text --- %asignacion de valor-literal de la fruta(la pera es 0,el limon es 1,...)fruta(0,pera).fruta(1,limon).fruta(2,kiwi).fruta(3,lima).fruta(4,coco).fruta(5,fresa).fruta(6,melon). :-%inicializacion de los booleanos para saber si una fruta se ha usado ya o noretractall(usado(_,_)),assert(usado(0,0)),assert(usado(1,0)),assert(usado(2,0)),assert(usado(3,0)),assert(usado(4,0)),assert(usado(5,0)),assert(usado(6,0)),%inicializacion de las "casillas"(numero(_,_,_))retractall(numero(_,_,_)),assert(numero(0,0,nada)),assert(numero(0,1,nada)),assert(numero(0,2,nada)),assert(numero(0,3,nada)),assert(numero(1,0,nada)),assert(numero(1,1,nada)),assert(numero(1,2,nada)),assert(numero(1,3,nada)),assert(numero(2,0,nada)),assert(numero(2,1,nada)),assert(numero(2,2,nada)),assert(numero(2,3,nada)),assert(numero(3,0,nada)),assert(numero(3,1,nada)),assert(numero(3,2,nada)),assert(numero(3,3,nada)). %deberia asignar las 7 frutas que existen en 7 "casillas" al azar.genera(A) :- A > 0, random(0,3,X), random(0,3,Y), numero(X,Y,nada), dame_fruta(J), retract(numero(X,Y,nada)), fruta(J,D), assert(numero(X,Y,D)), B is A-1, genera(B). %devuelve aleatoriamente una fruta no usada hasta el momento dame_fruta(J) :- aleatorio_fruta(J), retract(usado(J,0)), assert(usado(J,1)). %devuelve una fruta no usada aleatorio_fruta(J) :- alea(J),no_usado(J). %genera al azar un valor entre 0 y 6(posibles valores de las frutas)alea(J) :- random(0,6,J). %indica si un elemento de "usado" es 0(no usado)no_usado(J) :- usado(J,0). %mostrar por pantalla aquellas posiciones que contienen frutas muestra(A,B,J) :- fruta(_,J), numero(A,B,J). %la ejecución por consola deberia ser:%?- [ej].%?- genera(7).%?- muestra(A,B,J).%Tras lo cual se deberian suceder 7 posiciones de "casillas"(numero(_,_,_))%con un valor de fruta distinto cada una de ellas.
El problema es que cuando se genera aleatoriamente un valor para tomar una fruta y esta ya ha sido usada(usado(C,1)) se devuelve falso y por tanto se interrumpe el proceso de asignacion de frutas a "casillas"(numeros).
¿De qué forma podría solucionarlo?
Agradeciendo la respuesta, envio un saludo.
fuhrer:
Me imagino que es aquí donde se detiene.
--- Código: Text --- genera(A) :- A > 0, random(0,3,X), random(0,3,Y), numero(X,Y,nada), dame_fruta(J), retract(numero(X,Y,nada)), fruta(J,D), assert(numero(X,Y,D)), B is A-1, genera(B). entonces lo que deberias hacer es agregar:
--- Código: Text --- genera(A) :- A > 0, genera(A). con esto garantizas a que vuelva a entrar e intente obtener otra fruta, hasta que el valor de A sea menor o igual a cero.
Hasta luego.
Navegación
[*] Página Anterior
Ir a la versión completa