Prolog Web应用程序

2020-06-22 23:22:06

Prolog非常适合开发Web应用程序。Web页面自然地表示为Prolog术语,并且可以方便地创建、检查和递归处理。我们区分客户端和服务器应用程序。本页更详细地说明了如何使用PROLOG执行这些任务。对Web开发的支持因Prolog系统而异。在最基本的层面上,几个让我们访问网络数据流的简单谓词,例如SICStus-Prolog和Scryer-Prolog中的库(套接字)提供的谓词,就足以构建初级的Web应用程序。当然,最广泛使用的Prolog系统通常远远超过这一点,并为这类应用程序提供更全面和更高级别的支持。例如,SICStus、Prolog和其他几个系统附带了用于WWW编程的枕头库。在SICStus中,它可以作为图书馆(枕头)使用。tau-prolog是一个用JavaScript编写的Prolog解释器,可以无缝嵌入到Web应用程序中。客户端从服务器获取页面。使用Scryer和Prolog,我们可以很容易地通过HTTP和使用http_open/3的HTTPS来获取页面。示例:这将打开Stream来阅读页面。http_open/3的第三个参数是一个选项列表,我们可以使用这些选项来获取报头字段并控制连接的各个方面。由于在上面的示例中指定了https方案,因此会自动建立并使用安全连接。您可以使用库(套接字)显式建立安全连接。一旦我们获得了网页的流句柄,我们就可以通过几种方式读取该页面。例如,我们可以一次读取一个字符,或者使用DCG以一种纯粹的方式处理流。很多时候,将HTML页面转换为以统一方式反映页面结构的PROLOG术语是最方便的。谓词LOAD_HTML/3执行此转换:?-http_open(";https://www.metalevel.at/prolog";,流,[]),LOAD_HTML(STREAM(流),DOM,[]).Stream=.,DOM=[Element(HTML,[],[Element(Head,[],[Element(Head,[],[Element(Title,.)])])。

有关更多信息,请参见库(SGML),以及用于解析标记语言(如XML)的相关谓词。纯Prolog已经使得处理这样一个SGML元素的嵌套列表非常方便,其中每个元素都表示为一个元素(名称、属性、内容)。我们可以使用内置的PROLOG功能简单地递归地处理这样的结构。令人惊讶的是,我们可以做得更好:在Scryer Prolog中,库(XPath)允许我们通过XPath规范以直接的方式访问HTML元素。例如,让我们获取页面上显示的所有列表项的文本,继续前面的示例:?-use_module(library(Xpath))。是真的。?-http_open(";https://www.metalevel.at/prolog";,流,[]),LOAD_HTML(STREAM(流),DOM,[]),XPATH(DOM,//li(文本),Item).Stream=.,DOM=.,Item=";Introduction";;Stream=.,DOM=.,Item=";;流=.,DOM=.,项目=#34;基本概念;流=.,DOM=.,项目=#34;数据结构;等等。

关于回溯,报告了所有解决方案。对于服务器应用程序,我们使用SWI-PROLOG,这是一种PROLOG方言,具有对健壮而高效的多线程的出色支持。首先,考虑一个非常初级的HTTP服务器:该代码片段使用HTTP Unix守护程序库来实现一个简单地使用“Hello!”响应的服务器!满足每一个请求。该库使用可以在命令行上使用的选项隐式地增加代码。要运行服务器,请将代码片段复制到server.pl并通过以下命令了解更多信息:例如,您可以使用以下命令在端口13040上启动服务器:一旦服务器正在运行,您可以通过浏览到http://127.0.0.1:3040.对其进行测试。在更现实的HTTP客户端服务器中,响应当然取决于客户端的实际请求。服务器库将解析后的请求表示为名称(值)元素列表,这些元素可以很容易地在Prolog中处理。使用不同的或附加的http_handler/3指令,您可以更改服务器的行为。例如,要提供当前目录中的文件,请改用以下指令:要发出HTML页面,您有几个选项:您可以简单地在stdout上发出您想要的任何回复,如上面的示例所示。这很容易出错,很容易忘记结束标记等。

您可以使用库(http/html_write)从Prolog术语创建HTML页面。下面是一个示例,使用DCG的非终端html//1将序言术语转换为HTML并打印出来:

根据任务的不同,其中一些选项会比其他选项更合适。有关详细信息,请参阅HTTP服务器和库。要运行基于Prolog的HTTPS服务器,请参阅LetSWICcrypt。Proloxy是一个基于Prolog的代理,它使用可扩展的Prolog子句进行灵活配置。P引擎允许