有没有办法从swi-prolog中的表单传递复合词作为参数

时间:2016-11-22 15:19:01

标签: forms prolog swi-prolog

我使用swi-prolog 7.3.31。

我有以下形式的复合词question

question(q_(Question),y_(Yes),n_(No))

其中YesNo可以是atom或其他复合词question,依此类推。

我正在使用reply_html_page的表单,其中我显示问题Question的文字,并且我有两个提交按钮,其中一个用于'是'一个用于' no'。

以下是我的表单中的“是”和#39;按钮:

form([class = 'form-inline ',
      action = '/choice_handler',
      method = 'POST'], [
      input([name = choice,
             id = choice,
             type = hidden,
             class = 'form-control',
             value = 'yes']),
      input([name = question,
             type = hidden,
             value = Yes ]),
      button([class = 'btn btn-default yes',
              type = submit], ['yes']) ])

这是我的问题,我想传递Yes的值以递归显示新问题或最终结果,但是我没有这样做,因为输入表单的value必须是原子而不是偶然术语。

因此问题:有没有办法将复合词传递给handler

1 个答案:

答案 0 :(得分:1)

请注意,在交换数据时,原子通常足够,因为您可以使用 atom_to_term/3 将原子转换为复合词:

atom_to_term(+Atom, -Term, -Bindings)

  

使用选项variable_names将{Atom'作为read_term/2的输入,并返回Term中的读取项和Bindings中的变量绑定。绑定是Name = Var个对的列表,因此可以访问实际的变量名。另见read_term/2。如果Atom没有有效语法,则会引发syntax_error异常。新代码应该使用read_term_from_atom / 3。

示例

?- atom_to_term('the(f(X,Y),Z)', Term, Bindings).
Term = the(f(_1596, _1598), _1604),
Bindings = ['X'=_1596, 'Y'=_1598, 'Z'=_1604].

因此,在适当的一般假设下,你可以简单地取原子并恢复复合词。