Утверждение предикатов с использованием Tau Prolog для Javascript
Вот, я пытаюсь решить эту проблему уже более двух дней, и мне нечего показать. Поэтому был бы признателен за помощь в этом вопросе.
Проблема: попытка утверждения нового предиката с использованием Tau Prolog для Javascript возвращает ложный результат. Тот же самый запрос дает True при использовании SWI-Prolog.
Программа взята из textarea
на HTML-странице. Все локально только на одном компьютере.
**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>
Что я пытался: объявление динамических предикатов в Прологе. Например
<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).
сделано. Однако обычный вызов предикатов, например
session.query("breads(X).");
дает правильный вывод на
"[parmesan,honeywheat]"
, когда используется метод tostring.
Изменить: Online 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)).
1 ответ
Ключ к разгадке проблемы - синтаксическая ошибка, вам не хватает скобок. Они не требуются только для некоторых диалектов Пролога, поэтому лучше всегда включать их для переносимости:
:- dynamic(chosen_meats/2).
?- asserta(chosen_meats(chicken, roast)).
true.
Я кладу решение в песочницу, запрос test.
: http://tau-prolog.org/sandbox/ZFgsdJkP