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]).