Утверждение предикатов, используя Тау Пролог для Javascript - PullRequest
0 голосов
/ 07 ноября 2019

Я уже более 2 дней пытаюсь решить эту проблему, и мне нечего показать. Поэтому, я был бы признателен за помощь в этом вопросе.

Проблема: Попытка установить новый предикат с использованием 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 Ответ

0 голосов
/ 07 ноября 2019

Синтаксическая ошибка - ключ к проблеме, вам не хватает скобок. Только некоторые диалекты Пролога не требуют их, поэтому рекомендуется всегда включать их для переносимости:

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

Я поместил решение в песочницу, запрос test.: http://tau -prolog.org / песочница / ZFgsdJkP

...