.in DCG 有没有办法隐藏参数,即参数在顶部规则中传递,但我没有在其余规则中提及它,但我仍然可以访问它。
S(Ctx,A,B) --> ...
R1(A) --> ....
R2(A) --> ..R5(A), { write(Ctx) }
R3(A) --> ..add2ctx(abc,Ctx), remove4ctx(bcd,Ctx)..
与 DCG 在差异列表上的语法糖相同的方式我只想跳过在规则头部声明一个变量,当我调用另一个规则时?
答案 0 :(得分:2)
不,没有。每当必须将数据传递给子句时,都必须明确地这样做。您不能定义一条对所有 DCG 角色隐式可见的“上下文信息”。
但是 SWI-Prolog 手册中有这个注释:
<块引用>可以通过 DCG 实现线程状态的便携式解决方案 通过将状态包装在列表中并使用 DCG 半上下文工具。 随后,可以使用以下谓词来访问和修改 > 状态。
state(S), [S] --> [S].
state(S0, S), [S] --> [S0].
所以这里的想法是你有一个术语来描述你从一个 DCG 规则到下一个的“当前状态”
S0
转换为状态 S
例如
state(S), [S] --> [S].
不修改状态,只是将其推回到列表中。
但是
state(S0, S), [S] --> [S0].
获取状态 S0
,将其映射到 S
并将其放回列表中。这应该是我认为的想法。但在那个例子中,正文中可能应该有更多的东西,即对一些 p(S,S0)
...
答案 1 :(得分: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
阅读有关参数对象和参数变量的更多信息答案 2 :(得分:2)
在 SWI-Prolog 中,有一个基于 DCG 概念的现成可用且经过实战验证的 pack。 它确实需要一些学习,但不要害怕,它得到了很好的支持。