2

我目前正在做一个需要一些用 Prolog 编写的 Web 应用程序的项目,我选择使用著名的 SWI-Prolog PWP 库。它解析一个script with prolog queries inside an HTML file.

我有一个页面响应以下请求示例:

/user?id=N

其中N是一个整数值。

但我无法读取IDHTML 文件中请求的查询字符串。

我有 .pl 文件:

showUser(UserId, Request) :- 
    reply_pwp_file(mydir('user_page.html'), [mime_type('text/html')], Request).

我不知道如何读取UserIdRequest再次检索查询字符串中的 UserId。

我在 HTML 标记中尝试了这种方式:

<span pwp:ask="http_parameters(Request, [id(UserId, [optional(true)])])." pwp:use="UserId" />

以前有人遇到过这种麻烦吗?

非常感谢。

这里有一些有趣的链接可以帮助我们:

4

2 回答 2

1

我花了一些时间,但至少我已经能够运行我在 ~/pl-devel/packages/http/examples 中找到的 demo_pwp.pl。现在,之后

?- server(1234).

我打开网址

http://localhost:1234/user_id.pwp?user_id=1&user_name=carlo

我在~/pl-devel/packages/http/examples/pwp/user_id.pwp文件中写的地方

<?xml version="1.0"?>
<!DOCTYPE html>

<html xmlns:pwp="http://www.cs.otago.ac.nz/staffpriv/ok/pwp.pl">

<head>
  <title>Context variables for PWP scripts</title>
</head>
<body>
  <p>This PWP demo lists the context-parameters that are passed into
     the script.
  </p>
  <ul>
    <li pwp:ask="member(Name=Value, CONTEXT)">
      <span class=name pwp:use="Name"/>
      =
      <span class=value pwp:use="writeq(Value)"/>
    </li>
  </ul>
  <!-- here is the specific part for my answer -->
  <p pwp:ask="memberchk('QUERY'=Q, CONTEXT),memberchk(user_id=UID,Q),memberchk(user_name=NAME,Q)">
     UID : <span pwp:use="UID"/> / NAME : <span pwp:use="NAME"/>
  </p>
  <!-- nested access is well thought -->
  <p pwp:ask="member('QUERY'=Q,CONTEXT)">
     UID : <span pwp:use="UID" pwp:ask="member(user_id=UID,Q)"/>
   / NAME : <span pwp:use="NAME" pwp:ask="member(user_name=NAME,Q)"/>
  </p>
</body>

</html>

(这是 context.pwp 的副本,在底部添加了我的信息)我得到了

This PWP demo lists the context-parameters that are passed into the script.
...    
-   QUERY = [user_id='1',user_name=carlo]
...    
UID : 1 / NAME : carlo 
UID : 1 / NAME : carlo 

然后我可以确认 Giulio 建议的指导方针是可以的。

于 2013-04-09T13:44:53.490 回答
0

这真是出乎意料,因为我已经很长时间没有搅动 Prolog,但我对用 Prolog 编写 Web 应用程序的努力感到有点好笑,而且因为我很同情(长话短说:我在几年前就试过了,但它不是纯粹的 Prolog)我想我可以借此机会通过阅读文档向您指出我注意到的内容。顺便说一句,它的清晰性和可扩展性并不是PWP “著名”的原因,我想。

但是,在您链接的 PWP 页面的某个地方隐藏了一个关于属性的简介pwp:use,据说Term它的值是 a。

Term是 Prolog 术语;中的变量Term受上下文约束。空Term被视为该属性的缺失值。Prolog 变量CONTEXT指的是整个上下文,一个列表Name = Value,其中Name是一个 Prolog 原子,它包含上下文变量的名称,并且Value是一个任意的 Prolog 术语。

埋在其他地方,即文档页面reply_pwp_page/3哦,reply_pwp_file/3你链接的页面中没有,真的,即使你使用它)还有另一个有趣的片段列出了所谓的初始上下文的内容,特别是:

QUERY[是一个]Var=Value表示查询参数的列表

由于没有关于使用查询参数列表的提示或建议甚至示例——但这对于被迫在 Prolog 中编写 Web 应用程序的人来说几乎不是最糟糕的问题——我个人的看法是查询参数的名称id只是id(希望这Var只是一个错误的名称Param,而不是一个真正的 Prolog 变量)并且该值只是该值,但是我们对转换或在解析查询字符串期间可能自动发生的任何事情一无所知,因为在查询字符串一切都是字符串,但您可能需要一个数字id,并且您可能需要自行将该字符串转换为数字。我想在某个地方确实有一些神奇的谓词在做这件事。Prolog 不是很棒吗?

因此,在没有任何其他线索的情况下,非常感谢那些编写此文件的人......我的疯狂猜测是您需要以下元素,span尽管如此,这是一个空的,这在任何合理有效的 HTML 文档中都是非法的:

<span pwp:ask="..."/>

在哪里,作为ask值,您应该提供一个遍历CONTEXT列表的查询(通过member/2,也许?),直到它找到一个形式的术语'QUERY'=QueryParameters;那么在QueryParameters你应该有实际的查询参数列表,所以你需要以与之前列表相同的方式遍历它CONTEXT,当你在这里找到表单的一个术语时,id=N你最终N应该包含你几乎没有获得的用户ID的值.

现在,我真的希望它比我所概述的更简单。请记住,通过查看您指向的文档,这只是一个疯狂的猜测。但是,虽然其他人很可能会因为多种原因忙于否决这个答案(希望因为它完全错误,而且解决方案更简单),但我的最后一个建议是让您讨论项目的限制再次与负责它们的人一起,因为当有很多框架时,在 Prolog 中编写 Web 应用程序确实是一件不合理的事情(我说的是框架,而不仅仅是为了“更大的利益”而扔进标准库的一些模块)用其他语言编写的,文档非常好,更易于理解,当然也更易于使用。

于 2013-04-09T00:00:34.233 回答