【问题标题】:Prolog HTTP dynamically add links to htmlProlog HTTP 动态添加指向 html 的链接
【发布时间】:2017-11-04 03:10:02
【问题描述】:

我是序言和声明式编程的新手,我很难实现以下目标。

我正在关注this tutorial,现在想在一个页面上显示一些链接。要显示哪些链接取决于某些事实/变量。

这是我当前的代码:

link_collection(Request) :-
http_parameters(Request,
[
    foo(Foo, [optional(true)])
]),
reply_html_page(
    [title('Dynamic Link Collection')],
    [
        a([href='/questionalice'], 'Question Alice'),       /* Should only show if has(investigate, body) is true */
        a([href='/questionbob'], 'Question Bob'),          /* Should only show if Foo = bar */
        a([href='/investigatebody'], 'Investigate Body')   /* Show always */
    ]
).

请注意,“排列”的数量不允许我只是“或”link_collection 语句。我也希望条件任意复杂。

【问题讨论】:

  • 当写像a这样的HTML标签时,你需要把html//1括起来。试试html([a(href='...', ...), ...]),对你有用吗?
  • 否 - reply_html_page 自动将其包装在 html//1 中。此代码工作正常,但链接是静态的并且始终显示,无论条件如何。

标签: prolog swi-prolog


【解决方案1】:

您的问题可以在非常笼统的背景下得到回答,也就是说,即使不考虑 HTTP 的具体用例。

一般问题似乎是:我如何动态地选择一些可用选项的子集。

为此,假设您不仅仅将每个链接表示为“自身”,而是表示为Link-Condition 形式的,解释为只应包含Link 如果 Conditiontrue

让我们首先考虑我们想要表达的条件,并定义何时它们为真。重要的是,您的条件还取决于 Foo 的值,因此必须考虑到这一点:

is_true_with_foo(_, has(investigate, body)) :- has(investigate, body)。 is_true_with_foo(Foo, Foo = bar) :- Foo = bar。 is_true_with_foo(_, true)。

因此,这描述了何时特定条件为真,也取决于Foo 的值。

现在,您的示例条件可以表示如下:

链接条件(Foo, [ a([href='/questionalice'], '问题 Alice')-has(investigate, body), a([href='/questionbob'], '问题 Bob')-(Foo = bar), a([href='/investigatebody'], '调查身体')-true ])。

要描述列表的子序列,请考虑使用 DCG ()。

例如:

链接子集([],_)-> []。 links_subset([L-Cond|Ls], Foo) --> ( { is_true_with_foo(Foo, Cond) } -> [大] ; [] ), 链接子集(Ls,Foo)。

您现在可以调用:

?- links_conditions(Foo, LCs0), 短语(links_subset(LCs0,no),LCs)。

并在LCs 中获取剩余链接。在这种情况下:

LCs = [a([href='/questionalice'], '问题 Alice'),
a([href='/investigatebody'], 'Investigate Body')]。

所以,我们可以在回复中使用生成的链接:

链接集合(请求):- http_parameters(请求, [foo(Foo, [optional(true)])]), links_conditions(Foo, LCs0), 短语(links_subset(LCs0, Foo), LCs), reply_html_page([title('Dynamic Link Collection')], LCs)。

注意Foo 在这些谓词中是如何传递的。

P.S.:您的示例 sn-p 存在基本语法错误,因此我怀疑您的代码是否可以正常工作。

【讨论】:

  • 很有趣的尝试,我会详细研究它,明天评估它。只是想知道:您引用了我的 sn-p 中的哪些语法错误?我密切关注本教程,我的代码是我发布的原始 sn-p 的一个不太通用的版本,运行良好。事实上,我已经遇到过使用 DCG 和 html 的解决方案,包括使用 \include,但是您的解决方案似乎更优雅。
  • 在你的 sn-p 中有 2 个语法错误,在第二个和第三个链接表示中。第一个语法错误发生在:a([href='/questionbob']), 'Question Bob')。注意(第二个)关闭) 没有匹配的(!第三个链接的表示中存在相同的错误。
  • 哎呀,是的,在设计示例 sn-p 时,一定是由于复制和粘贴而滑入的。
  • 在尝试了解决方案之后,我想知道您是否找到了一种使用任意数量的条件变量(如 Foo)的方法?
  • 搜索“Prolog 元解释器”,看看为什么会这样!我认为对现代 Prolog 进行系统而全面的介绍将有助于您解决此类更复杂的任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多