write una recursividad listas lista explicados elementos ejercicios consultas comandos agregar prolog

prolog - una - Prólogo: resultados redundantes en cláusulas que involucran variables anónimas



variables en prolog (1)

Bueno, para Prolog, el subrayado es simplemente una variable anónima . Entonces el predicado a a/1 es equivalente a:

a(X) :- b(Y), c(X).

Ahora puede parecer inútil retroceder sobre la cláusula b(Y) , ya que una vez que se satisface, la Y no se usa en ninguna parte, y por lo tanto no debería tener impacto en el resto del programa. Además, Y no tiene efecto sobre X por lo que b(Y) no debería tener la más mínima influencia sobre X

Sin embargo, en Prolog real, hay algunas cosas que pueden tener impacto:

  1. el predicado b/1 podría realizar E / S. Diga que el predicado se implementa como:

    b(a) :- print(a). b(a) :- print(b).

    luego imprimirá a en la primera rama b en la segunda.

  2. b/1 podría generar una excepción en una segunda, tercera, ... ruta. En cuyo caso, es probable que deseemos manejar el error;

  3. b/1 podría usar asserta/1 , assertz/1 , etc. y alterar el programa . Por ejemplo, podría agregar hechos para c/1 manera que en la segunda ejecución c/1 tenga otros resultados.

  4. Muchos intérpretes de Prolog tienen una tienda no rastreable de modo que las diferentes rutas de retroceso pueden compartir información entre sí.

  5. otras facilidades de codificación para que el resultado de b/1 pueda tener un impacto en c/1 .

Puede evitar este retroceso sobre b/1 utilizando el meta predicado de once/1 . Por ejemplo:

a(X) :- once(b(_)), c(X).

Considere el siguiente programa Prolog.

a(X) :- b(_), c(X). b(1). b(2). b(3). c(1).

Ejecutando la consulta:

a(X).

en SWI-Prolog, obtenemos tres resultados, todos X = 1.

Dado que no nos importa la variable anónima, ¿qué impide que SWI-Prolog devuelva un solo resultado? ¿Por qué no se realiza esta optimización?

Gracias