Prolog 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语法糖化差异列表的方式相同,我只想跳过在规则头中声明一个变量,当我调用另一个规则时?不,没有。每当必须将数据

。在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.