0

在那里,我已经尝试这个问题超过 2 天了,但没有任何东西可以显示。因此,希望能在这个问题上提供一些帮助。

问题:尝试使用 Tau Prolog for Javascript 断言新谓词会返回错误结果。使用 SWI-Prolog 时,完全相同的查询结果为 True。

该程序取自textareaHTML 页面中的一个。一切都仅在一台计算机上是本地的。

**Prolog rules**
<textarea class="example-textinput example-program" id="program">
breads([parmesan, honeywheat]).
</textarea>

**Javascript in the same HTML page**
<script>
var session = pl.create();
var program = document.getElementById("program").value;
session.consult(program);
session.query(`asserta(chosen_meats(variable_to_be_asserted)).`);
session.answers(show())
function show() {
    // Return callback function
    return function (answer) {
        // Valid answer
        console.log(answer);
        if (pl.type.is_substitution(answer)) {
            // Get the value of the food
            var output = answer.lookup("X");
            console.log(output);
        }
    };
}
</script>

我尝试过:在 Prolog 中声明动态谓词。例如

<textarea class="example-textinput example-program" id="program">
    breads([parmesan, honeywheat]).
    :- dynamic chosen_meats/1.
</textarea>

asserta, assertz and assert调用查询时更改为,。

结果:在回调函数 show() 中,每当尝试断言时,总是会打印出 false。

{ref: 6065, id: "throw", args: Array(1), indicator: "throw/1"} 只要完成查询,就会打印出术语 chosen_meats(X).。但是,当使用 tostring 方法时,正常的谓词调用如在 session.query("breads(X)."); 处给出正确的输出 。"[parmesan,honeywheat]"

编辑:在线 Tau Prolog 给出了相同的问题 http://tau-prolog.org/ 错误已扩展为:

error parsing program: error(syntax_error('. or operator expected'), [line(1), column(11), found(client)])

为了

:-dynamic client/1.

assertz(client(x)).
4

1 回答 1

1

语法错误是问题的线索,您缺少一些括号。只有一些 Prolog 方言不需要它们,因此最好始终包含它们以实现可移植性:

:- dynamic(chosen_meats/2).
?- asserta(chosen_meats(chicken, roast)).
true.

我将解决方案放在沙箱中,查询test.http ://tau-prolog.org/sandbox/ZFgsdJkP

于 2019-11-07T12:23:36.393 回答