Результаты Тау-Пролог видны в окне браузера
Я новичок в 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>