.in DCG 有没有办法隐藏参数,即参数在顶级规则中传递,但我在其余规则中没有提到它,但我仍然可以访问它。
S(Ctx,A,B) --> ...
R1(A) --> ....
R2(A) --> ..R5(A), { write(Ctx) }
R3(A) --> ..add2ctx(abc,Ctx), remove4ctx(bcd,Ctx)..
就像 DCG 在差异列表上的语法糖一样,我只想跳过在规则头中声明一个变量,以及当我调用另一个规则时?
.in DCG 有没有办法隐藏参数,即参数在顶级规则中传递,但我在其余规则中没有提到它,但我仍然可以访问它。
S(Ctx,A,B) --> ...
R1(A) --> ....
R2(A) --> ..R5(A), { write(Ctx) }
R3(A) --> ..add2ctx(abc,Ctx), remove4ctx(bcd,Ctx)..
就像 DCG 在差异列表上的语法糖一样,我只想跳过在规则头中声明一个变量,以及当我调用另一个规则时?
不完全清楚你想要完成什么。语法规则的隐含参数用于线程状态,如大卫的回答中所述。然而,也可以与所有语法规则共享隐式逻辑变量(但请注意,这些不能用于线程状态)。这可以通过将语法规则封装在 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阅读有关参数对象和参数变量的更多信息
不,那里没有。每当必须将数据传递给子句时,都必须明确地这样做。您不能定义对所有 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].
获取 state S0
,将其映射到S
并放回列表中。这应该是我认为的想法。但在那个例子中,身体里可能应该有更多的东西,即对某些人的调用p(S,S0)
......
在 SWI-Prolog 中有一个基于 DCG 概念的即用型和久经考验的包。它确实需要一些学习,但不要害怕,它得到了很好的支持。