0

我想按照本教程在节点服务器上使用 Tau Prolog 和 JavaScript ,效果很好。我需要将答案转换为与 JavaScript 兼容的格式,尤其是列表到数组或对象,反之亦然。

我以返回列表的方式更改了 Prolog 程序和目标

程序:test(t, [64,65,100,120]).

目标:test(t, X).

它返回

console.log(session.format_answer(answer));

X = [64,65,100,120]

控制台也是如此。如何仅获取列表并将其分配给 js 变量?

我试过

answer.lookup("X")

这给了我

Term {
ref: 1258,
id: '.',
args: [
Num { is_float: false, value: 64 },
Term { ref: 1257, id: '.', args: [Array], indicator: './2' }
],
indicator: './2'
}

访问起来不是很舒服。该args数组似乎是列表。我设法获得了单个列表元素

console.log(answer.links.X.args[1].args[1].args);

获取第三个列表元素。
在 JavaScript 中使用复杂答案和列表的最佳方式是什么?

4

1 回答 1

1

为了完整起见,我在这里复制了这个答案

您可以编写一个函数来将 Prolog 列表转换为数组:

function fromList(xs) {
    var arr = [];
    while(pl.type.is_term(xs) && xs.indicator === "./2") {
        arr.push(xs.args[0]);
        xs = xs.args[1];
    }
    if(pl.type.is_term(xs) && xs.indicator === "[]/0")
        return arr;
    return null;
}

例子:

var session = pl.create();
session.query("X = [1,2,3].");
session.answer(a => console.log(fromList(a.lookup("X")))); // [ {...}, {...}, {...} ]

请注意,数组中的元素仍然是Tau Prolog 对象

于 2021-12-20T12:28:18.317 回答