Prolog上的REST服务器,它是什么样的?

作为逻辑编程入门者的一个小题名
在本文中,将使用给定的曝光方法进行一次魔术会议
创建REST服务器并测量其参数。

有什么收获? 一切都很简单-我们将在Prolog中实现(在SWI-prolog的实现中)...

所以您需要什么。 首先,下载(如果尚未下载)并放入实际的swi-prolog
从他的网站www.swi-prolog.org 。 使用初始内容创建一个类型为rest.pl的小文件会更容易
伺服器
继续使用prolog系统本身下载并编辑它,就像这样
(给出了Linux控制台的示例,但与Windows没有太大区别):

$echo "." > rest.pl $swipl ... ?- [rest]. true. ?- edit(). 

之后,将启动类似emacs的编辑器,您可以在其中输入所有内容。

因此,在开始时,我们将指示我们将使用库并编写其含义
服务器启动-序言中的字符:-可以读作“ this is”:

 :- use_module(library(http/http_server)). :- use_module(library(http/http_json)). :- http_handler(/,(M), [method(M),methods([get,post]),time_limit(10000)]).  :- http_server(http_dispatch, [port(8080)]). 

如您所见,我们计划服务将响应get和post方法。

模型问题


现在实际上我们将做什么。 根据要求,我们将在页面上显示一个带有数字输入字段的页面,在输入页面时,我们将请求发布方法并计算该斐波那契数字。

那就是:

 (get,_) :- (X),(X). (post,) :- http_parameters(,[val(,[integer])]), (). 

好吧,就是这样! 我们实际上已经编写了服务器。序言是一种声明性语言-因此我们声明了处理选项。 顺便说一句,可以使用任何语言-我决定用俄语书写。

但是,嘿,他在做什么? 毕竟,“形式”,“答案”和“缩短”是我们的谓词,尚未定义。 让我们修复它:

 ():- format('Content-type: text/html~n~n <html><body>  <br/> ~w </body></html>~n', []). ('<form method="POST"><input name="val"/></form>'). 

好吧,这里有两个计算选项-让我们只有正斐波那契数:

 ():-  > 0, (0,1,1,,),(X), format(atom(),'~w    ~w<br/>~w',[,,X]), (). ():- (X), format(atom(),'  ~w  0<br/>~w',[,X]), (). 

好吧,还有待确定实际上是多少斐波那契数:

 (_F, F1, N, N, F1) :- !. (F0, F1, I, N, F) :- F2 is F0+F1, I2 is I + 1, !,(F1, F2, I2, N, F). 

这个定义在风水中当然不是很熟悉,但是它被认为比我们用C编写时要快得多。

那会行吗? 我们检查:

  ?- . % Started server at http://localhost:8080/ true. 

因此,服务器似乎已经启动。 顺便说一下,它是多线程的! 要检查您需要打开地址
127.0.0.1:8080 /并输入一些数字-例如1000:
斐波那契数计算
1000斐波那契数等于
4346655768693745643568852767504062580
2564660517371780402481729089536555417
9490518904038798400792551692959225930
8032263477520968962323987332247116164
2996440906533187938298969649928928516003
704476137795166849228875
好吧,它起作用了!

对服务器性能的小研究-让我们检查GET方法(POST显然很大程度上取决于给定的数字,因此,当然考虑了10,000,000个数字,但要花几秒钟的时间...)

  $ ab -k -c 4 -n 4000 http://127.0.0.1:8080/ ... Concurrency Level: 4 Time taken for tests: 0.283 seconds Complete requests: 4000 Failed requests: 0 Keep-Alive requests: 4000 Total transferred: 1108000 bytes HTML transferred: 544000 bytes Requests per second: 14140.57 [#/sec] (mean) Time per request: 0.283 [ms] (mean) Time per request: 0.071 [ms] (mean, across all concurrent requests) Transfer rate: 3825.14 [Kbytes/sec] received ... 

每秒10个线程有14140个请求-这对于普通计算机来说非常好!

是的,序幕有这样的机会-合乎逻辑的外观。 因此,如果您更改了代码中的某些内容,则只需在控制台中输入

  ?- make. 

而且您所做的所有更改都将在新请求中起作用-无需重载,停止等。

希望您有兴趣看到如何使用这样一个简单的示例创建Rest Server。 当然,您可以像示例中一样静态地描述其余接口,可以输入各种变量,将URL路径的一部分用作变量-嗯,总的来说,一切都照常进行。

您可以动态地执行此操作,通过创建,删除和修改谓词来更改程序的逻辑-谓词是一种自我修改服务器,其工作取决于历史记录。 您可以连接数据库。 通常,一切都和往常一样,只是工作简单而愉快。

Source: https://habr.com/ru/post/zh-CN471610/


All Articles