Trabajo Práctico deInteligencia Artificial ”Juego TA-TE-TI” Integrantes del grupo: Nombre y Apellido Alonso, Gabriel Giorcelli, Leonardo Padrón 80895 80126 Docente: Cabrera, José Luis Cuatrimestre/Año: 1er. Cuatrimestre/2003 Consigna del TP que alguien gane el juego). Código Fuente en Prolog (comentado) domains . determinar la secuencia de movidas que resulte óptima para llegar a la solución (es decir.Partiendo de un estado inicial. Implementar el programa en el lenguaje Prolog. char.*/ .estado.estado=f(char.char. columna 2) y (fila 1. (fila 1.integer.*/ estadolis=estado* /*Lista de estado donde se guardara la secuencia de estados que resulte optima.integer. Lo mismo sucede con las filas 2 y 3.char.char) /*El estado es un functor de 9 posiciones cada una de las cuales representa una posicion (fila.char.estadolis) /*Chequea que el nuevo estado no este en la lista de estados. es decir las posiciones 1.*/ ponerficha(estado.*/ sol(estadolis.*/ predicates ingresardatos /*Permite ingresar los datos del estado inicial. Se expresa por filas. comenzando por el nivel 1.*/ inicio(estadolis.*/ imprilis(estadolis) /*Imprime por pantalla la secuencia de estados para llegar a la solucion optima.char.*/ mem(estado.char) /*Coloca una ficha en el tablero y a partir de ello se obtiene un nuevo estado.*/ condterm(estado) /*Evalua si se cumple o no la condicion de terminacion del juego TA-TE-TI.*/ deterturno(char. En cuanto encuentra una solucion para un determinado nivel de profundidad termina la busqueda.char. es decir la ficha ("X" o "O") que se debe colocar en el tablero en la correspondiente movida.integer) /*Busca soluciones para distintos niveles de profundidad.char) /*Determina el turno. columna 1).char.2. columna) del tablero de TA-TE-TI. columna 3) del tablero. siguiendo por el 2 y asi sucesivamente.char) /*Busca una solucion para un determinado nivel de profundidad. es decir que no haya repeticion de estados.estadolis.char.3 del fuctor corresponde a las posiciones (fila 1. POS9)].POS4. readchar(POS3). write("Fila 3 Columna 2 (ingrese 'X' o 'O' o '_'): "). write("\n"). inicio(LISTAINI.POS6.-. . write("\n").PROF. write("Fila 1 Columna 1 (ingrese 'X' o 'O' o '_'): "). write("\n"). write("----.POS5.1). write("Ingrese el Estado Inicial". readchar(_).INI.\n\n"). write("Presione una tecla para obtener la solucion optima"). readchar(POS6).POS2.!. inicio(LISTAINI.INI). readchar(POS7). write("\n\n").POS3. readchar(TURNOINI).PROFN). readchar(POS4). write("\n"). write("\n"). readchar(POS9). write("Fila 2 Columna 3 (ingrese 'X' o 'O' o '_'): "). write("\n"). write("Fila 2 Columna 2 (ingrese 'X' o 'O' o '_'): "). readchar(POS2).PROF):PROFN=PROF+1._.PROF):sol(LISTAINI. readchar(POS8). readchar(POS5). inicio(LISTAINI. write("Fila 1 Columna 2 (ingrese 'X' o 'O' o '_'): ").POS8. write("Fila 1 Columna 3 (ingrese 'X' o 'O' o '_'): ")."\n\n").INI.-. write("\n"). inicio([f(POS1. write("\n\n").TURNOINI.clauses ingresardatos:write("JUEGO TA-TE-TI \n"). write("Fila 3 Columna 1 (ingrese 'X' o 'O' o '_'): ").INI. write("Fila 3 Columna 3 (ingrese 'X' o 'O' o '_'): "). readchar(POS1). write("Fila 2 Columna 1 (ingrese 'X' o 'O' o '_'): "). write("\n"). write("Seleccione quien comienza ('X' o 'O'): ").-.POS7. Y.TURNONUEVO).POS9).POS4.POS4. POS2='_'.POS6.POS9).POS3. sol([X|L].POS6. write("La solucion optima es: ". POS5='_'.POS7.TURNO.POS4. .POS2. POS1='_'.POS2.POS6.POS3. POS6='_'.[X|L])).Y. Y=f(TURNO.POS6.POS6.POS7.POS7.POS5. clearwindow.POS5.TURNO):N1=N-1. POS3='_'. ponerficha(X.POS5.POS8.TURNO.TURNO.LS.POS6._.!.POS9).POS7.POS8.POS9).POS6.POS5.POS3. ponerficha(X.POS3.POS3.POS2."\n".POS4.3.N1.POS4.sol([Y.POS4.POS2. ponerficha(X.POS8.POS3.POS9).POS9).POS5.POS2. ponerficha(X.N.POS2.POS7.POS2.POS5.POS8.POS5.TURNO.Y.POS9).Y.LS.POS9).POS6.POS2.POS5.TURNO. Y=f(POS1.POS7.POS7.7.TURNO):X=f(POS1.POS6.TURNO):X=f(POS1.POS3.POS2.POS4.POS9).sol([X|L].POS9). deterturno(TURNO._):condterm(X).POS4.POS3.[X|L].TURNO):X=f(POS1.TURNO):X=f(POS1.POS7."\n").POS9).POS4.POS4.POS5. Y=f(POS1.1. POS7='_'.5. ponerficha(X.POS3.POS8. Y=f(POS1.POS2.POS3.X|L].TURNO). Y=f(POS1.POS3.POS7. Y=f(POS1.ponerficha(X.POS2.POS8.POS7.POS6.POS8. Y=f(POS1.POS6. ponerficha(X.POS8.POS5.POS8.POS8.POS8.TURNO):X=f(POS1.POS3.2.POS6.TURNO):X=f(POS1.4.POS5.POS5.POS3.POS8.N1>0.POS9). imprilis([X|L]).TURNO. not(mem(Y.POS7.POS4.POS9).POS2.POS9).Y.TURNONUEVO).POS7.POS5.POS4.POS2.POS6.POS8. POS4='_'.Y. ponerficha(X._.POS4.POS8.POS7.6.Y.Y.TURNO):X=f(POS1. TURNO.FICHA.POS9)._.POS4._."\n")._. mem(X._)):FICHA<>'_'.ponerficha(X. condterm(f(FICHA. ponerficha(X._._." ".POS3._. POS9='_'."\n").FICHA)):FICHA<>'_'._.TURNO):X=f(POS1." ".POS4.POS7. deterturno('O'.POS5.POS8.FICHA._._._. deterturno('X'.FICHA._.POS8._._.POS9). Y=f(POS1.POS7.[_|L]):-mem(X.POS4.POS7.POS6._. mem(X.POS2.POS6.L).POS6. condterm(f(FICHA._.POS2._.FICHA.POS3.POS5.POS3.POS3._._.POS9.FICHA. imprilis([X|L]):imprilis(L). write(POS1._. ." ". write(POS7.POS8.POS9)._. write("Presione un tecla para ir al siguiente estado").POS5.POS7.POS5.POS5.FICHA._._. condterm(f(_._.FICHA.FICHA."\n").POS9).POS2._.POS3.TURNO).FICHA._. write(POS4.POS4._._.POS6.Y." ". condterm(f(_.POS3.9.POS6._._)):FICHA<>'_'.POS6.FICHA._)):FICHA<>'_'.POS2. condterm(f(FICHA.FICHA)):FICHA<>'_'._. Y=f(POS1._)):FICHA<>'_'._.POS7.Y." ".FICHA)):FICHA<>'_'. write("\n\n\n")._. imprilis([]). X=f(POS1.FICHA. POS8='_'.POS2. condterm(f(_.FICHA.FICHA.FICHA.FICHA.TURNO):X=f(POS1. condterm(f(_._._._.POS5._._.'O')._.POS8." "."\n".POS2. readchar(_)._.POS8. condterm(f(_.8.'X').POS4.FICHA.FICHA.FICHA._)):FICHA<>'_'.[X|_]). /*Llama a la clausula para ingresar los datos. /*Limpia la pantalla.goal clearwindow.*/ ingresardatos.*/ Informe Final . Como se comienza por un nivel de profundidad 1. se pide al usuario que ingrese el estado inicial del tablero. Nota 1: No se encuentran validados los datos que debe ingresar el usuario. Una vez ingresado el estado inicial. En caso contrario. Para ello. el lenguaje utiliza el método de backtracking. esto asegura que la solución hallada será la que requiera de menor cantidad de secuencias de estado (sino encuentra con nivel 1 prueba con nivel 2 y así sucesivamente). . Esto también se reitera de manera recursiva hasta que se llega a la solución (para algún nivel de profundidad mayor o igual a 1). el compilador busca soluciones para un nivel de profundidad igual a 1. Nota 2: Se adjunta un diskette con el archivo ejecutable y con el archivo fuente. A partir de este estado. Primero se chequea la condición de terminación. sino se cumple se aplica una regla y se chequea la condición de terminación sobre el nuevo estado obtenido. se llega a la solución y esta secuencia de estados se imprime por pantalla. Esto se realiza de manera recursiva hasta que se cumpla la condición de terminación o no se pueda profundizar más. Si se cumple la condición. se aumenta el nivel de profundidad en 1 y se repite el proceso para este nuevo nivel de profundidad.El programa en Prolog funciona de la siguiente manera: Para comenzar. se busca la secuencia de movidas óptima (que será la que requiera de menor cantidad de pasos o secuencias).