使用Prolog与Javascript - Pengines

时间:2016-03-13 17:45:17

标签: javascript node.js npm prolog swi-prolog


我正在制作一个使用prolog的AI项目,但我希望它能在线发布。我发现了pengines(http://pengines.swi-prolog.org/docs/documentation.htmlhttp://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实现,我将非常感激。

谢谢!

2 个答案:

答案 0 :(得分:3)

我知道这篇文章已经很老了,但是对于其他人来说:

  

我正在制作一个使用prolog的AI项目,但我希望它能在线发布。我发现了pengines(http://pengines.swi-prolog.org/docs/documentation.htmlhttp://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,您可以找到文档。希望这可以帮助您解决问题。祝你好运!