Categories
General

Práctica sesión 6

Sesión correspondiente al mismo dia de teoria 26/10/2010.

En la clase de hoy Carlos ha explicado diversos aspectos que voy a comentar a continuación:

  • Función random

La estructura de la función random es → random(X), donde X será el número hasta el cual podremos llegar sin incluirlo a él mismo, si ponemos 10 comenzará por el 0 y llegará hasta el 9.

Ejemplo visto en clase:

golpear(QUIEN):- F is random(10).

Como se puede observar no empleamos F = random(10) porque el operador igual realiza asignaciones tomando en este caso random(10) como un átomo. Para evitar esto usamos “is” que nos sirve para operaciones aritméticas.

Pero aún asi hay un problema, si tenemos:

vida(jugador, 25).

Si se desea que al golpear al jugador se reste el número generado por random a la vida actual del jugador, podriamos pensar que con lo siguiente resultará:

vida(QUIEN, X), Y is X-F.

Ante esto tenemos que aclarar diversas cuestiones:

-Ponemos Y porque no se puede usar X, no está permitido usar la misma variable a ambos lados.

-Aunque puede parecer que el problema esté resuelto, cuando restemos a X la F y mostremos Y (donde guardamos el resultado) nos aparecerá el resultado correcto, pero si golpeamos nuevamente, los 25 de vida (vida inicial del personaje) no habrán variado, no podemos modificar de esta forma un hecho mientras el programa esté en ejecución.

Para poder arreglar este problema existen los predicados dinámicos.

  • Predicados dinámicos

·Nos permite añadir o eliminar cláusulas en nuestra base de conocimientos durante la ejecución.

·Se pueden añadir y eliminar hechos o reglas de cualquier predicado que sea dinámico, aunque lo habitual es añadir o eliminar hechos sólamente.

Nos permitirán modificar los datos de nuestra base de conocimientos durante la ejecución de nuestros programas.

Existen distintos tipos de predicados dinámicos y cada uno de ellos nos permitirá modificar de una manera u otra nuestros programas en tiempo de ejecución:

1-dynamic – Nos permite crear predicados dinámicos. // :-dynamic predicado/aridad

2-assert – Nos permite introducir hechos de un predicado dinámico. //assert(predicado(Variable/s)).

3-listing – Nos lista todo el contenido de la base de conocimientos actualmente. Aunque nombre de forma distinta a las variables.

4-retract – Elimina hechos existentes de un predicado de la base de conocimientos. // retract(predicado(Variable/s).

Si tratamos de borrar un hecho inexistente en nuestra base de conocimientos nos dirá que “No”, pues no es posible eliminar un hecho inexistente.

Si ponemos ?-retract(predicado(_)) borrará el primero que encuentre.

5-retractall – Elimina todos los hechos existentes de un predicado de la base de conocimientos. //retractall(predicado(Variable/s).

6-abolish – Elimina todo absolutamente, tanto hechos como predicados dinámicos. //abolish predicado/aridad.

  • Operador “->”

-Se asocia a la estructura condicional IF…THEN…ELSE

“a → c” es igual a IF “a” THEN “c”

“a → c; e” es igual a IF “a” THEN “c” ELSE “e”

-Es similar a “(a, c); e”.

-Si alguna de las partes tuviera más de 1 objeto se deben usar paréntesis.

Ejemplo: (a, b) → (c, d);(e, f)

Como se puede observar ponemos “a” y “b” entre paréntesis, al igual que las variables de las otras dos partes.

-Si la estructura está contenida en el interior de una regla, para no afectar al resto introducimos toda la estructura entre ( ).

Ejemplo: b, (a → c; e), f

Esto es todo!!! que no es poco