Dado un tablero de NxM llevar una ficha de que ocupa 2 casilleros desde la posicion 1,1 hasta la N,M con movimientos de a un casilleros en los cuatro sentidos norte, sur, este y oeste con obstaculos. Resolverlo como sistema de produccion, luego me pregunto las 3 caracteristicas de los sistemas de produccion (admisible, tentativo, informado) La resolucion que voy a dar es muy parecida a la puesta anteriormente, solo que trabajo con coordenadas y no con horientacion vertical horizontal, aunque Cabrera me dijo que es mejor usar la orientacion, para mi es mas intuitivo asi.

domains
	%Un casillero tiene dos coordenadas
	casillero = casillero(integer, integer)
	%Una ficha ocupa dos casilleros
	ficha = ficha(casillero,casillero)
	lista = ficha*

predicates

	%Mueve una ficha de una posición a otra
	nondeterm mover(ficha,ficha).
	%Determina si un casillero esta ocupado
	nondeterm ocupado(casillero).
	%Determina si una ficha está en una posición válida
	nondeterm valida(ficha).
	%Determina si un casillero pertenece al tablero
	adentro(casillero).
	% Hace un recorrido en profundidad (estado de inicio, estado final, limite de profundidad, lista de estados de la solucion, lista de estados ya recorridos
	nondeterm recorrido(ficha,ficha,integer,lista,lista).
	%Determina si un estado pertenece a una lista de estados
	nondeterm pertenece(ficha,lista).
	%Determina la rotacion
	nondeterm delta(integer).
	%Determina las coordenadas de movimiento
	nondeterm deltamov(integer,integer).
	%Determina el tamaño del tablero
	tamanio(integer,integer).

clauses

	%-----------------------Base de conocimientos global--------------------------------
	ocupado(casillero(4,1)).
	%El tablero es de 5 casillas por 5 casillas
	tamanio(5,6).
	%-----------------------FIN Base de conocimientos global--------------------------------

	%-------------------------------------- Estados posibles --------------------------------
	%Una ficha esta en una posicion valida si esta en casilleros libres, dentro del tablero y tiene casilleros adyacentes
	%ficha vertical, mismo X
	valida(ficha(casillero(X1,Y1),casillero(X1,Y2))):-not(ocupado(casillero(X1,Y1))),not(ocupado(casillero(X1,Y2))),adentro(casillero(X1,Y1)),adentro(casillero(X1,Y2)).
	%ficha horizontal, mismo Y
	valida(ficha(casillero(X1,Y1),casillero(X2,Y1))):-not(ocupado(casillero(X1,Y1))),not(ocupado(casillero(X2,Y1))),adentro(casillero(X1,Y1)),adentro(casillero(X2,Y1)).
	%Un casillero pertenece al tablero si sus dos coordenadas pertenecen
	adentro(casillero(X,Y)):-X>0, Y>0, tamanio(MX,MY), X<=MX, Y<=MY.
	
	%-------------------------------------- Auxiliares --------------------------------
	%delta usado para las adyacencias y rotaciones
	delta(-1). delta(1).
	%delta de movimiento, dos coordenadas
	deltamov(0,1). deltamov(1,0). deltamov(0,-1). deltamov(-1,0). 
	%El estado pertenece a la lista, si es igual a la cabeza
	pertenece(X,[X|_]).
	%Dos piezas tmb son iguales aunque estén expresadas con las coord al revés
	pertenece(ficha(casillero(X1,Y1),casillero(Y2,X2)),[ficha(casillero(X2,Y2),casillero(X1,Y1))|_]).
	%O si pertenece a la cola
	pertenece(X,[_|T]) :- pertenece(X,T),!.
	%-------------------------------------- FIN Auxiliares --------------------------------
	
	%---------------------------------------Reglas del proceso -----------------------------
	%Muevo la pieza
	mover(ficha(casillero(X1,Y1),casillero(X2,Y2)),ficha(casillero(X3,Y3),casillero(X4,Y4))):- deltamov(DX,DY), X3 = X1+DX, X4 = X2+DX, Y3 = Y1+DY, Y4 = Y2+DY, valida(ficha(casillero(X3,Y3),casillero(X4,Y4))).
	%Roto la pieza de | a _ con el casillero de arriba como pivote
	mover(ficha(casillero(X1,Y1),casillero(X1,_)),ficha(casillero(X1,Y1),casillero(X3,Y1))):- delta(Num), X3=X1+Num,valida(ficha(casillero(X1,Y1),casillero(X3,Y1))).
	%Roto la pieza de | a _ con el casillero de abajo como pivote
	mover(ficha(casillero(X1,_),casillero(X1,Y1)),ficha(casillero(X3,Y1),casillero(X1,Y1))):- delta(Num), X3=X1+Num,valida(ficha(casillero(X3,Y1),casillero(X1,Y1))).
	%Roto la pieza de _ a | con el primer casillero como pivote
	mover(ficha(casillero(X1,Y1),casillero(_,Y1)),ficha(casillero(X1,Y1),casillero(X1,Y3))):- delta(Num), Y3=Y1+Num,valida(ficha(casillero(X1,Y1),casillero(X1,Y3))).
	%Roto la pieza de _ a | con el segundo casillero como pivote
	mover(ficha(casillero(_,Y1),casillero(X1,Y1)),ficha(casillero(X1,Y3),casillero(X1,Y1))):- delta(Num), Y3=Y1+Num,valida(ficha(casillero(X1,Y3),casillero(X1,Y1))).
	%---------------------------------------FIN Reglas del proceso ----------------------------------
	
	%-------------------------------------- Estrategia de control------------------------------------
	%El recorrido termina si el estado inicial es igual al final
	recorrido(E,E,_,[E],_):-!.
	%O se agrega un nuevo estado a los visitados, y se vuelve a probar
	recorrido(EI, EF, N, [EI|R], Visitados):- N>0, N1=N-1, mover(EI, E2), not(pertenece(E2, Visitados)), recorrido(E2, EF, N1,R, [E2|Visitados]),!.
	%-------------------------------------- FIN Estrategia de control------------------------------------
Goal
	Inicial = ficha(casillero(1,1),casillero(1,2)),Final = ficha(casillero(5,5),casillero(5,6)),recorrido(Inicial, Final, 20, L, [Inicial]).
materias/75/23/final_0_20081210_1.txt · Última modificación: 2008/12/11 09:26 por carnaza
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia: CC Attribution-Noncommercial-Share Alike 3.0 Unported


Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki