Результаты Тау-Пролог видны в окне браузера

Я новичок в Tau-Prolog и Javascript. Вначале я хотел бы показать некоторые результаты, вычисленные движком Тау-Пролог в браузере.

Пока что все, что я хочу показать, это некоторая информация, содержащаяся в моей базе данных Prolog:

  • Все роботы в базе данных и интерфейс для подключения к захвату / датчику и т. Д.

  • Все захваты / датчики в базе данных и интерфейс для подключения к роботу.

Вывод пролога будет примерно таким: "Робот A подходит для Gripper C (тот же интерфейс Z)". Я запрограммировал это в SWI-Prolog, и пока он работает нормально.

Теперь я хотел бы показать результаты в HTML-элементе:

<div class="example-result" id="show_result1"></div>

Вот что я до сих пор придумал:

function queryRG() {   
    var session = pl.create(1000);
    var parsed = session.consult("code.pl");
    //if (parsed !== true) { console.log(pl.format_answer(parsed)) }


    var query1 = session.query("queryRG.");

    var callback = function(answer){

        var result1 = document.getElementById("show_result1");

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

        if (pl.type.is_substitution(answer)){

            var ab = answer.toString();

            result.innerHTML = result.innerHTML + ab;
        }   
    }
    session.answer(callback);
}

Я вижу все (правильные) результаты в консоли, но не могу сделать их видимыми на веб-сайте. Спасибо за вашу помощь!

Отредактировано:

После помощи @CapelliC я сейчас придумал эту версию. Тем не менее у меня есть проблема, что ожидаемый результат отображается в консоли, но не на сайте:

<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Playground</title>
</head>
<body>
    <script type="text/javascript" src="tau-prolog.js"></script>
    <h1>Playground4</h1>
<script>

    function queryRG() {
      var session = pl.create(1000)

      var code_pl = `
        robot('Robot1','A', 1, 550).
        robot('Robot2','C', 2, 340).
        robot('Robot3','A', 2, 200).
        robot('Robot4','B', 3, 260).

        gripper('Gripper1', 'B', 50).
        gripper('Gripper2', 'A', 60).
        gripper('Gripper3', 'C', 30).
        gripper('Gripper4', 'C', 80).
        gripper('Gripper5', 'A', 20).
        gripper('Gripper6', 'B', 30).
        gripper('Gripper7', 'C', 90).

        query_robots :-robot(Name,Interface,Size,Price), write('The database contains: '),write(Name), write(', with Interface: '), write(Interface), write(', Size: '), write(Size) , write(', Price: '), write(Price), nl, fail.
      `
      var parsed = session.consult(code_pl)
      var query = session.query('query_robots.')

      function inform(msg) {
        show_result1.innerHTML += '<div>' + msg + '</div>'
      }

      var count_answers = 0
      var callback = function(answer) {
        if (answer === false) {
          inform('DONE, #answers='+count_answers)
          return
        }
        if (answer === null) {
          inform('TIMEOUT, #answers='+count_answers)
          return
        }
        // loop
        ++count_answers
        inform(pl.format_answer(answer))
        session.answer(callback)
      }
      // start the query loop
      session.answer(callback)
    }
    </script>

    <div id=show_result1>
      <h3>results show here...</h3>
    </div>
    <button onclick="queryRG()">Click to run</button>
</body>
</html>

1 ответ

Решение

Просто пример обработки нескольких результатов, я создал его, создав страницу tau-prolog.html в той же папке, где был загружен tau-prolog.js, и открыв ее локально в моем браузере. Затем с помощью инструментов разработчика (консоль, отладчик) взглянули на внутреннюю работу Tau Prolog.

Остерегайтесь деталей, например

  • как вы загружаете файл Prolog? в моем примере я выбрал более простой способ, передав "программу" в строку
  • как начать взаимодействие с переводчиком? в моем примере я выбрал кнопку и самый простой обработчик onclick="...", который циклически извлекает все ответы. Ясно, что не подходит для каждого сценария, но он иллюстрирует специфическую рекурсию, которую допускает Javascript. Особо отметим, что переменная session остаются в сфере действия среди вызовов.
  • когда вы получите ответ, только тогда обратный вызов может решить, цикл или выход...
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>test tau-prolog</title>
    <script src=tau-prolog.js></script>
  </head>
  <body>
    <script>
    function queryRG() {
      var session = pl.create(1000)

      var code_pl = `
        :- use_module(library(lists)).
        fruit(apple).
        fruit(pear).
        fruit(banana).
        fruits_in(Xs, X) :- member(X, Xs), fruit(X).
      `
      var parsed = session.consult(code_pl)
      var query = session.query('fruits_in([banana,lemon,apple],X).')

      function inform(msg) {
        show_result1.innerHTML += '<div>' + msg + '</div>'
      }

      var count_answers = 0
      var callback = function(answer) {
        if (answer === false) {
          inform('DONE, #answers='+count_answers)
          return
        }
        if (answer === null) {
          inform('TIMEOUT, #answers='+count_answers)
          return
        }
        // loop
        ++count_answers
        inform(pl.format_answer(answer))
        session.answer(callback)
      }
      // start the query loop
      session.answer(callback)
    }
    </script>

    <div id=show_result1>
      <h3>results show here...</h3>
    </div>
    <button onclick="queryRG()">Click to run</button>
  </body>
</html>

Результат щелчка по [Click to run] ожидаемый:

results show here...
X = banana ;
X = apple ;
DONE, #answers=2

HTH

edit Ваш запрос на самом деле представляет собой "цикл, управляемый сбоями", который обычно используется только для его "побочных эффектов", поскольку он отменяет привязки переменных в точке сбоя. Проблема заключается в том, что, видимо, не задокументировали, как правильно менять обработчики ввода-вывода. По крайней мере, ничего полезного не нашел. Тогда быстрый взлом: перепривязать функцию put, добавив эту строку сразу послеfunction inform(msg){...}

      session.current_output.stream.put = inform

Теперь ясно, что inform(msg)следует переосмыслить, потому что он не понимает потоковую передачу обычного текста. Возможно, вы могли бы изменить inform(msg){} для вывода<span>msg</msg> вместо <div>, проверьте \n и вызовите flush для этого, а затем привяжите обработчик flush (в настоящее время не определен) к этой группе <span>с в <div>.

Примечание: изучив код, становится ясно, что потоки ввода-вывода не являются основным приоритетом Tau-Prolog. Действительно, в строке 1670 файла tau-prolog.js обнаружена опечатка:

        return new Stram( this.stream, this.mode, this.alias, this.type, this.reposition, this.eof_action );

Ясно, Stram должно быть Stream.

редактировать

Лучшая идея - получить читаемый результат без обработки flush(): упрощать

    function inform(msg){
       show_result1.innerHTML += msg
    }

и изменим разметку:

    <h3>results show here...</h3>
    <pre id=show_result1>
    </pre>
Другие вопросы по тегам