Programación Específica > Programación Lógica

 Implementacion De Laberinto En Prolog

<< < (2/2)

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 &#34;casillas&#34;(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 &#34;casillas&#34; al azar.genera(A) :-       A &#62; 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 &#34;usado&#34; 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 &#34;casillas&#34;(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 &#62; 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 &#62; 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

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa