Implict state passing 应用文本传递附加参数

Implict state passing 应用文本传递附加参数,implict-state-passing,prolog,dcg,implicit-state-passing,dcg-semicontext,Implict State Passing,Prolog,Dcg,Implicit State Passing,Dcg Semicontext,这是Mat之前的一个问题的后续问题 从这个开始 e([number(0)],t1,Uc0,Uc0,Bc0,Bc0)--->[]。 e([编号(1)],t2,Uc0,Uc0,Bc0,Bc0)--->[]。 e([编号(2)],t3,Uc0,Uc0,Bc0,Bc0)--->[]。 e([op(neg),[Arg]],u1(e),[Uc0],Uc1,Bc0,Bc1)--> [_], e(Arg,e,Uc0,Uc1,Bc0,Bc1)。 e([op(ln),[Arg]],u2(e),[Uc0],Uc

这是Mat之前的一个问题的后续问题

从这个开始

e([number(0)],t1,Uc0,Uc0,Bc0,Bc0)--->[]。
e([编号(1)],t2,Uc0,Uc0,Bc0,Bc0)--->[]。
e([编号(2)],t3,Uc0,Uc0,Bc0,Bc0)--->[]。
e([op(neg),[Arg]],u1(e),[Uc0],Uc1,Bc0,Bc1)-->
[_],   
e(Arg,e,Uc0,Uc1,Bc0,Bc1)。
e([op(ln),[Arg]],u2(e),[Uc0],Uc1,Bc0,Bc1)-->
[_],   
e(Arg,e,Uc0,Uc1,Bc0,Bc1)。
e([op(add),[Left,Right]],b1(E0,E1),Uc0,Uc2,[| Bc0],Bc2)-->
[_,_], 
e(左,E0,Uc0,Uc1,Bc0,Bc1),
e(右,E1,Uc1,Uc2,Bc1,Bc2)。
e([op(sub),[Left,Right]],b2(E0,E1),Uc0,Uc2,[| Bc0],Bc2)-->
[_,_], 
e(左,E0,Uc0,Uc1,Bc0,Bc1),
e(右,E1,Uc1,Uc2,Bc1,Bc2)。
e(U、B、EL、Es):-
长度(UL,U),
长度(BL,B),
词组(e(EL,Es,UL,[],BL,[])。
e(N,EL,Es):-
长度([| Ls],N),
短语(e(EL,Es,,[],,[]),Ls)。
e_计数(e,计数):-
长度([| Ls],E),
findall(,短语(e(,,,,[],,[]),Ls),Sols),
长度(Sols,Count)。
然后阅读

对于一个变量,使用一个列表和一个只包含 这个变量。如果要传递多个变量,请使用 一个列表,包含形式为f(…)的单个项,捕获所有 要传递的变量。这也是值得的 我自己的问题

演变成这个

e(f([number(0)],t1,Uc0,Uc0,Bc0,Bc0))-->[]。
e(f([数字(1)],t2,Uc0,Uc0,Bc0,Bc0))-->[]。
e(f([数字(2)],t3,Uc0,Uc0,Bc0,Bc0))-->[]。
e(f([op(neg),[Arg]],u1(e),[Uc0],Uc1,Bc0,Bc1))-->
[_], 
e(f(Arg,e,Uc0,Uc1,Bc0,Bc1))。
e(f([op(ln),[Arg]],u2(e),[Uc0],Uc1,Bc0,Bc1))-->
[_], 
e(f(Arg,e,Uc0,Uc1,Bc0,Bc1))。
e(f([op(add),[Left,Right]],b1(E0,E1),Uc0,Uc2,[[u124; Bc0],Bc2])——>
[_,_], 
e(f(左,E0,Uc0,Uc1,Bc0,Bc1)),
e(f(右,E1,Uc1,Uc2,Bc1,Bc2))。
e(f([op(sub),[Left,Right]],b2(E0,E1),Uc0,Uc2,[[u124; Bc0],Bc2])-->
[_,_],
e(f(左,E0,Uc0,Uc1,Bc0,Bc1)),
e(f(右,E1,Uc1,Uc2,Bc1,Bc2))。
e(U、B、EL、Es):-
长度(UL,U),
长度(BL,B),
短语(e(f(EL,Es,UL,[],BL,[]),u)。
e_N(N,EL,Es):-
长度([| Ls],N),
短语(e(f(EL,Es,,[],,[])),Ls)。
e_计数(e,计数):-
长度([| Ls],E),
findall(,短语(e(f(u,u,,[],,[])),Ls),Sols),
长度(Sols,Count)。
这是可行的,但需要注意的是,
使用一个列表,其中包含一个形式为f(…)
的术语,而这里的
f(…)
不在列表中

我哪里出错了

补充 工具书类
  • 马库斯·特里斯卡
  • 马库斯·特里斯卡
  • 现在就学习序言吧
隐式状态传递的变量名约定 通常情况下,在使用时,变量是命名的

S0
&rightarrow<代码>S1&rightarrow&向右箭头<代码>S

然而,对于我的单元二叉树示例,我将它们命名为

S0
&rightarrow<代码>S1&rightarrow&向右箭头<代码>序列号

Sn
结尾,而不是
S

e、 g

标准

e(S0,S):-
这里

e(S0,S2):-
原因是这个例子有一个非常罕见的特性,即每个DCG谓词的长度都在增加

e、 g

e([number(0)],t1,Uc0,Uc0,Bc0,Bc0)-->
e([op(neg),[Arg]],u1(e),[Uc0],Uc1,Bc0,Bc1)-->
e([op(add),[Left,Right]],b1(E0,E1),Uc0,Uc2,[| Bc0],Bc2)-->
因此,以
xn
结尾可以让我再次检查准确性

参考:

6.1.3终端序列的变量名称惯例

该TR使用名为S0、S1、…、S的变量来表示终端序列 在处理语法规则或展开时用作参数 把语法规则变成从句。在这个符号中,变量S0,S1, …S可以看作是一个状态序列,其中S0表示 初始状态和代表最终状态的变量S。 因此,如果变量Si表示给定序列中的终端序列 状态下,变量Si+1将表示剩余的 使用语法规则解析Si后的终端序列

DCG总是描述一个列表

但是哪一个列表呢您必须决定如何使用该机制

在上述情况下,您似乎已经使用了专用的DCG来描述一个列表,该列表的长度可以作为搜索深度的度量

这完全可以,而且是DCG的一种非常自然的使用

但是,您只能描述一个列表,不能同时描述两个列表,至少不能以“主要”方式描述。当然,您可以通过DCGarguments同时描述任意多个术语。但是,DCGbody仅限于通过调用非终端和使用终端来描述一个列表

有一种直接的方法可以将DCG转换为不带DCG的常规Prolog代码,或者通过regularProlog解释DCGrules。有关更多信息,请参见ISOdraft示例

例如,让我们仅以以下片段为例:

e( f([op(neg), [Arg]], u1(E), [_|Uc0], Uc1, Bc0, Bc1) ) --> [_], e( f(Arg, E, Uc0, Uc1, Bc0, Bc1) ). e( f([op(ln) , [Arg]], u2(E), [_|Uc0], Uc1, Bc0, Bc1) ) --> [_], e( f(Arg, E, Uc0, Uc1, Bc0, Bc1) ). 在这里,我从常规的Prolog版本开始,引入了DCG符号,并简单地将
Bc0
Bc1
转换为隐式参数!他们不再出现在这里。只有我们再次将其扩展回Prolog,它们才会变得可见,或者至少这是一种实现方法

但是仍然存在两个问题:

首先,如果我们真的想访问这些参数呢?当然,并非所有条款都只是这样贯穿其中。我们还需要在某个地方访问它们。第二,还有一个更基本的问题:我们想谈谈s e( f([op(neg), [Arg]], u1(E), [_|Uc0], Uc1, Bc0, Bc1, [_|Rest0], Rest) ) :- e( f(Arg, E, Uc0, Uc1, Bc0, Bc1, Rest0, Rest) ). e( f([op(ln) , [Arg]], u2(E), [_|Uc0], Uc1, Bc0, Bc1, [_|Rest0], Rest) ) :- e( f(Arg, E, Uc0, Uc1, Bc0, Bc1, Rest0, Rest) ). e( f([op(neg), [Arg]], u1(E), [_|Uc0], Uc1, [_|Rest0], Rest) ) --> e( f(Arg, E, Uc0, Uc1, Rest0, Rest) ). e( f([op(ln) , [Arg]], u2(E), [_|Uc0], Uc1, [_|Rest0], Rest) ) --> e( f(Arg, E, Uc0, Uc1, Rest0, Rest) ). state(S0, S), [S] --> [S0]. e( f([op(neg), [Arg]], u1(E), [_|Uc0], Uc1, [_|Rest0], Rest) ) --> state(Bc0, Bc1), ... (something involving Bc0 and Bc1) ... e( f(Arg, E, Uc0, Uc1, Rest0, Rest) ). ?- phrase(e(Arg1,Arg2,...,Arg_N), [f(B1,B2,...,B_M)], [Result]).