Prolog DCG:所有规则中的隐藏参数?
。在DCG中,是否有一种隐藏参数的方法,即参数在顶级规则中传递,但我在其余规则中没有提及,但我仍然可以访问它Prolog DCG:所有规则中的隐藏参数?,prolog,dcg,hidden-variables,Prolog,Dcg,Hidden Variables,。在DCG中,是否有一种隐藏参数的方法,即参数在顶级规则中传递,但我在其余规则中没有提及,但我仍然可以访问它 S(Ctx,A,B) --> ... R1(A) --> .... R2(A) --> ..R5(A), { write(Ctx) } R3(A) --> ..add2ctx(abc,Ctx), remove4ctx(bcd,Ctx).. 与DCG语法糖化差异列表的方式相同,我只想跳过在规则头中声明一个变量,当我调用另一个规则时?不,没有。每当必须将数据
S(Ctx,A,B) --> ...
R1(A) --> ....
R2(A) --> ..R5(A), { write(Ctx) }
R3(A) --> ..add2ctx(abc,Ctx), remove4ctx(bcd,Ctx)..
与DCG语法糖化差异列表的方式相同,我只想跳过在规则头中声明一个变量,当我调用另一个规则时?不,没有。每当必须将数据传递给子句时,必须显式地这样做。您不能定义对所有DCG角色隐式可见的“上下文信息” 但SWI Prolog手册中有以下注释: 可以实现通过DCG线程化状态的可移植解决方案 通过将状态包装在列表中并使用DCG文本工具。 随后,可以使用以下谓词访问和修改>状态
state(S), [S] --> [S].
state(S0, S), [S] --> [S0].
所以这里的想法是,你有一个术语来描述一个“当前状态”,你可以通过这个术语将土豆从一个DCG规则加热到下一个DCG规则
S0
转换为状态S
state(S), [S] --> [S].
不修改状态,只将其推回到列表中
但是
获取状态
S0
,将其映射到S
,并将其放回列表中。我想这应该是我的想法。但在那个例子中,身体中可能还有更多的东西,即调用一些p(S,S0)
。并不完全清楚您想要完成什么。语法规则的隐式参数用于线程状态,如David的回答中所述。不过,也可以与所有语法规则共享隐式逻辑变量(但请注意,这些不能用于线程状态)。这可以通过将语法规则封装在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系统上运行此示例。您还可以在SWI Prolog中的中阅读更多有关参数对象和参数变量的信息。在DCG概念的基础上,有一个现成的、经过战斗验证的工具。
它确实需要一些学习,但不要担心,它得到了很好的支持。当然可以使用在Prolog数据库中断言某些子句(显然,某些事实),但这听起来。。。不正确。谢谢,我也发现了:,但很难理解..因此state()是传递状态信息的快捷方式,而不是使用semi-ctx符号排序是&否,我希望能够添加到上下文并从上下文中删除。还有一件事我没有提到,让事情复杂化的是,我将有多个开始规则,这些规则将接受Ctx arg,例如,像单个语法中的“多个语法”,也就是说,我将使用DCG解析不同的文本模板,并在匹配时调用操作,比如match-text-PATTERN=>action。F.e.“增加$V”;“添加元素$V”;“添加项$V”=>{lst+=$V}。如果有类似的模板,比如说SET vs LIST,则使用Ctx作为选择器ctx@sten对象参数是逻辑变量。但是有一个Prolog术语()的逻辑赋值库可以提供解决方案。使用此库的一个示例是一些Prolog系统提供属性化变量。可以使用指定给对象参数的属性来表示上下文。但是请注意,这样的解决方案是不可移植的(相关示例:)。EDCG也可以作为Logtalk库使用,因此在大多数Prolog系统中都是可用的。这也是一个更强大的版本,在该包中的一个。
?- {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.