-1

.in DCG 有没有办法隐藏参数,即参数在顶级规则中传递,但我在其余规则中没有提到它,但我仍然可以访问它。

 S(Ctx,A,B) --> ...
 R1(A) --> ....
 R2(A) --> ..R5(A), { write(Ctx) }
 R3(A) --> ..add2ctx(abc,Ctx), remove4ctx(bcd,Ctx)..

就像 DCG 在差异列表上的语法糖一样,我只想跳过在规则头中声明一个变量,以及当我调用另一个规则时?

4

3 回答 3

2

不完全清楚你想要完成什么。语法规则的隐含参数用于线程状态,如大卫的回答中所述。然而,也可以与所有语法规则共享隐式逻辑变量(但请注意,这些不能用于线程状态)。这可以通过将语法规则封装在 Logtalk 参数对象中轻松实现。例如:

:- object(grammar(_Ctx_)).

    :- public(test/2).
    test(L, Z) :-
        phrase((a(Z); b(Z)), L).

    a(Y) --> [aa, X], {atom_concat(X, _Ctx_, Y)}.
    
    b(Y) --> [bb, X], {atom_concat(_Ctx_, X, Y)}.

:- end_object.

一些示例查询:

?- {grammar}.
% [ /Users/pmoura/grammar.lgt loaded ]
% (0 warnings)
true.

?- grammar(foo)::test([aa,cc], Z).
Z = ccfoo .

?- grammar(foo)::test([bb,cc], Z).
Z = foocc.

这对你有用吗?您可以在所有支持 Logtalk 的 Prolog 系统上运行此示例。您还可以在https://logtalk.org/manuals/userman/objects.html#parametric-objects阅读有关参数对象和参数变量的更多信息

于 2021-01-15T21:41:01.003 回答
2

不,那里没有。每当必须将数据传递给子句时,都必须明确地这样做。您不能定义对所有 DCG 角色隐式可见的“上下文信息”。

但是 SWI-Prolog 手册中有这样的注释:

phrase/3

通过 DCG 线程化状态的可移植解决方案可以通过将状态包装在列表中并使用 DCG 半上下文工具来实现。随后,可以使用以下谓词来访问和修改 > 状态。

state(S), [S] --> [S].
state(S0, S), [S] --> [S0].

所以这里的想法是你有一个术语来描述你从一个 DCG 规则到下一个的“当前状态”

  1. 从输入列表中获取
  2. 将其从状态S0转换为状态S
  3. 然后将其放回列表中,以便它可用于下一个规则。

例如

state(S), [S] --> [S].

不会修改状态,只是将其推回列表中。

state(S0, S), [S] --> [S0].

获取 state S0,将其映射到S并放回列表中。这应该是我认为的想法。但在那个例子中,身体里可能应该有更多的东西,即对某些人的调用p(S,S0)......

于 2021-01-15T20:13:44.680 回答
2

在 SWI-Prolog 中有一个基于 DCG 概念的即用型和久经考验的包。它确实需要一些学习,但不要害怕,它得到了很好的支持。

于 2021-01-16T03:36:50.510 回答