Documentation Manual Interfaz de promesas

Interfaz de promesas

Una promesa es un objeto que representa la terminación o el fracaso de una operación asíncrona. El paquete promises de Tau Prolog extiende los prototipos de pl.type.Session y pl.type.Thread para añadir nuevos métodos para cargar programas y consultar objetivos, devolviendo promesas.

Tau Prolog utilizando promesas

El paquete promises añade tres nuevos méotodos:

Además, añade un cuarto método, promiseAsnwers, para buscar todas las respuestas computadas, devolviendo un generador asíncrono.

const pl = require("tau-prolog");
require("tau-prolog/modules/promises.js")(pl);

(async() => {

    const program = `
        plus(z, Y, Y).
        plus(s(X), Y, s(Z)) :- plus(X, Y, Z).
    `;
    const goal = "plus(X, Y, s(s(s(z)))).";
    const session = pl.create();
    await session.promiseConsult(program);
    await session.promiseQuery(goal);

    for await (let answer of session.promiseAnswers())
        console.log(session.format_answer(answer));
    // X = z, Y = s(s(s(z))) ;
    // X = s(z), Y = s(s(z)) ;
    // X = s(s(z)), Y = s(z) ;
    // X = s(s(s(z))), Y = z.

})();

Tau Prolog utilizando Observables

Nótese que es posible utilizar la interfaz de promesas junto a librerías de programación reactiva, si soportan la conversión de generadores asíncronos a observables, como RxJS a partir de la versión 7.0.0.

const Rx = require("rxjs");
const pl = require("tau-prolog");
require("tau-prolog/modules/promises.js")(pl);

(async() => {

    const program = `
        plus(z, Y, Y).
        plus(s(X), Y, s(Z)) :- plus(X, Y, Z).
    `;
    const goal = "plus(X, Y, s(s(s(z)))).";
    const session = pl.create();
    await session.promiseConsult(program);
    await session.promiseQuery(goal);

    const plus = Rx.from(session.promiseAnswers());
    plus.subscribe(x => console.log(session.format_answer(x)));
    // X = z, Y = s(s(s(z))) ;
    // X = s(z), Y = s(s(z)) ;
    // X = s(s(z)), Y = s(z) ;
    // X = s(s(s(z))), Y = z.

})();