我正在制作一个使用prolog的AI项目,但我希望它能在线发布。我发现了pengines(http://pengines.swi-prolog.org/docs/documentation.html,http://www.swi-prolog.org/pldoc/doc_for?object=section(%27packages/pengines.html%27))这应该是Prolog的javascript实现,但我似乎无法理解如何使用它。
我尝试使用pengines npm包(https://www.npmjs.com/package/pengines)并使用默认的express-generator app运行pengines docs中的代码:
<html lang="en">
<head>
<script src="/vendor/jquery/jquery-2.0.3.min.js"></script>
<script src="/pengine/pengines.js"></script>
<script type="text/x-prolog">
main :-
repeat,
pengine_input(X),
pengine_output(X),
X == stop.
</script>
<script>
var pengine = new Pengine({
oncreate: handleCreate,
onprompt: handlePrompt,
onoutput: handleOutput
});
function handleCreate() {
pengine.ask('main');
}
function handlePrompt() {
pengine.input(prompt(this.data));
}
function handleOutput() {
$('#out').html(this.data);
}
</script>
</head>
<body>
<div id="out"></div>
</body>
但它只返回一个错误:
http://localhost:3000/pengine/create 无法加载资源:服务器响应状态为404 (未找到)
如果有人可以解释如何在javascript中使用pengines或其他prolog实现,我将非常感激。
谢谢!
答案 0 :(得分:3)
我知道这篇文章已经很老了,但是对于其他人来说:
我正在制作一个使用prolog的AI项目,但我希望它能在线发布。我发现了pengines(http://pengines.swi-prolog.org/docs/documentation.html,http://www.swi-prolog.org/pldoc/doc_for?object=section(%27packages/pengines.html%27)),它应该是Prolog的javascript实现
它实际上不是Prolog的实现,它只是一个用JavaScript编写的客户端,可以与托管引擎进程的Prolog服务器通信。 JavaScript客户端通过HTTP和称为Prolog传输协议(PLTP)的特定协议与pengine-server对话。
使用JavaScript客户端,您可以发送简单查询,例如pengine.ask("member(X, [1,2,3])")
等,前提是pengine服务器已将member/2
谓词公开为可以安全地从远程使用。但是,当您在代码片段中进行演示时,您也可以在<script type="text/x-prolog">
内编写prolog代码,并让JavaScript-Client将该prolog源代码发送给将其添加到其知识库的服务器。
http://localhost:3000/pengine/create无法加载资源: 服务器响应状态为404(未找到)
在JavaScript客户端创建Pengine之前,必须有一个运行某个地方的pengine服务器。在您的代码段中,未提供任何URL,因此客户端将默认使用host-url。您还可以在创建引擎时明确指定URL。
这是一个从source-repo示例中获取的简单pengines服务器的示例:
:- module(pengine_server,
[ server/1 % +Port
]).
:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/http_server_files)).
:- use_module(library(http/http_files)).
:- use_module(library(pengines)).
:- use_module(pengine_sandbox:library(pengines)).
:- http_handler(/, http_reply_from_files(web, []), [prefix]).
server(Port) :-
http_server(http_dispatch, [port(Port)]).
它对pengines API进行沙盒化,如果你想让其他谓词可用,你可以添加:
:- use_module(pengine_sandbox:library(semweb/rdf_db)).
sandbox:safe_primitive(rdf_db:rdf(_,_,_)).
答案 1 :(得分:1)
您可以查看关于pengines的SWI prolog's manual page。它包含3个示例,说明如何使用JavaScript创建pengine并与之交互。超过here,您可以找到文档。希望这可以帮助您解决问题。祝你好运!