Результаты Tau-Prolog видны в окне браузера - PullRequest
2 голосов
/ 28 марта 2020

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

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

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

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

Вывод пролога будет выглядеть примерно так: «Робот А подходит для 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);
}

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

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

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

<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 Ответ

1 голос
/ 29 марта 2020

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

Остерегайтесь деталей, таких как

  • , как вы загружаете файл Prolog? в моем примере я выбрал более простой способ, передав «программу» в строку
  • как начать взаимодействие с интерпретатором? в моем примере я выбрал кнопку и самый простой обработчик c 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 Ваш запрос действительно ' управляемый отказом l oop ', обычно используемый только для его «побочных эффектов», так как он отменяет привязки переменных в точке отказа. Проблема становится в том, что, по-видимому, они не документировали, как правильно менять обработчики ввода-вывода. По крайней мере, я не нашел ничего полезного. Быстрый взлом: перепривязать функцию put, добавив эту строку сразу после function inform(msg){...}

      session.current_output.stream.put = inform

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

Примечание: при проверке кода становится ясно, что потоки ввода-вывода не являются основным приоритетом Tau-Prolog. Действительно, в строке 1670 тау-пролога. js нашли эту опечатку:

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

Очевидно, Stram должно быть Stream.

edit

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

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

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

    results show here...
    
    
...