gpt4 book ai didi

javascript - Tau-Prolog 结果在浏览器窗口中可见

转载 作者:行者123 更新时间:2023-12-04 15:32:30 25 4
gpt4 key购买 nike

我对 Tau-Prolog 和 Javascript 还很陌生。一开始我想在浏览器中展示一些由 Tau-Prolog 引擎计算的结果。

到目前为止,我只想显示我的 Prolog 数据库中包含的一些信息:

  • 数据库中的所有机器人以及与夹具/传感器等连接的接口(interface)

  • 数据库中的所有夹具/传感器以及连接到机器人的接口(interface)。

序言输出类似于:“机器人 A 适合夹持器 C(相同接口(interface) 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>

最佳答案

只是一个处理多个结果的例子,我精心设计了它在下载“tau-prolog.js”的同一文件夹中创建一个页面“tau-prolog.html”,并在我的浏览器中本地打开。然后使用开发人员工具(控制台、调试器)查看 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

编辑您的查询实际上是一个“失败驱动循环”,通常仅用于其“副作用”,因为它会在失败点撤消变量绑定(bind)。问题是,显然,他们没有记录如何正确更改 IO 处理程序。至少,我还没有发现任何有用的东西。然后快速破解:重新绑定(bind) put 函数,在 function inform(msg){...} 之后立即添加此行

      session.current_output.stream.put = inform

现在,很明显 inform(msg)应该重新考虑,因为它不理解纯文本流。也许您可以更改 inform(msg){} 以输出 <span>msg</msg>而不是 <div> ,检查\n 并对其调用 flush,然后绑定(bind)一个刷新处理程序(当前未定义)该组 <span> s 在 <div> .

注意:检查代码,很明显 IO 流不是 Tau-Prolog 的主要优先级。事实上,在 tau-prolog.js 的第 1670 行发现了这个错字:

        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>

关于javascript - Tau-Prolog 结果在浏览器窗口中可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60904783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com