句法分析-prolog
我有一个明确的从句语法:S→ a S b|603 这也是按照以下规则编写的:句法分析-prolog,prolog,dcg,Prolog,Dcg,我有一个明确的从句语法:S→ a S b|603 这也是按照以下规则编写的:s-->[a]、s[b]。和s-->[]。 这被翻译成序言如下: s --> [a], s, [b]. became s([a|S2],R) :- s(S2,[b|R]). s --> []. became s(S,S). 有人能告诉我S2的值是多少吗?S2从何而来?看起来这是一个程序,用于确定列表的形式是否为。X。bn,其中a表示a的n迭代,类似地,bn表示n的b迭代 s
s-->[a]、s[b]。
和s-->[]。
这被翻译成序言如下:
s --> [a], s, [b]. became s([a|S2],R) :- s(S2,[b|R]).
s --> []. became s(S,S).
有人能告诉我S2的值是多少吗?S2从何而来?看起来这是一个程序,用于确定列表的形式是否为。X。bn,其中a表示
a
的n
迭代,类似地,bn表示n
的b
迭代
s --> [a], s, [b]. becomes s([a|S2],R) :- s(S2,[b|R]).
s --> []. becomes s(S,S).
这里的S2
是列表的中间部分,是一个自由变量,列表的一部分可以绑定到该变量
给它命名S2
完全是随意的。它也可以被称为S
。
唯一不应该调用的是R
,因为它已经用于该语句中的另一个变量
重要的是与之相关的东西——列表的尾部。如果在以a
开头的任何列表上尝试此谓词,则S2
将绑定到尾部
举几个例子来说明这一点:如果输入是
[a,a,b,b]
,则S2
的值将是[a,b,b]
如果输入是
[a]
,S2的值将是空列表[]
如果输入是
[a,x,y,z]
,则S2
的值将是[x,y,z]
如果输入是
[b,c,d,e]
,那么它将不匹配,S2
将不会绑定到任何东西;相反,谓词将失败
请注意,[a,x,y,z]
实际上与谓词匹配,尽管它的形式不是an。X。bn.该规则只查看第一项
a
,并注意到该项匹配。所以它导出了s([x,y,z],[b | R])
。然后,它将尝试继续验证输入。只有在后面的派生步骤中,它才会注意到[x,y,z]
不是以a
开头的
让我们一步一步地看一遍
- 首先,我们有:
这是可行的,Prolog将S2绑定到s([a,x,y,z],R):-s([x,y,z],[b|R])。
[x,y,z]
- 然后它得到
,但它不能将其与s([x,y,z],R)
匹配,因为它不是以s([a | S2])
开头的,所以这次规则失败a
- 现在它尝试下一条规则:
。它填写:s(s,s)
这样,它就返回到它以前的调用,并尝试将s([x,y,z],[x,y,z])。
匹配到它以前的规则s([x,y,z],[x,y,z])
s([x,y,z],[b|R])
- 它不能将右侧的
与[x,y,z]
匹配,因为它不以[b | R]
开头。这就是规则失败的地方——Prolog已经确定字符串的形式不是an.bn李>b
R
,让我们看一个匹配列表的跟踪
此时,右侧被实例化为[b,b]
Prolog在上一步中有
s([a,b,b],[b | R])
,现在它可以通过设置R=[b]
来实现这一点
然后它进一步展开递归,填充规则右侧的值,并将这些值应用到左侧。最终,它返回到开始的位置,并具有值
s([a,a,b,b],[a,a,b,b])
这是列表的末尾…你能提供更多的上下文吗?左边的规则是什么,可能是上下文相关的语法?它们是定冠词语法。最初是:S→ 然后它变成:S-->[a],S[b]。s-->[]我冒昧地将这些内容编辑到你的问题中。如果您不同意我的编辑,可以将其回滚。要回滚编辑,请单击“已编辑…以前”链接。这将带您进入修订历史记录,如果需要,您可以在其中回滚到早期版本。不过,我相信这些编辑使问题更适合堆栈溢出。感谢您的帮助S.L.Barth,没关系。我只是想理解这个“S2”可能包含的内容。它是否包含“a”或“b”或空列表“[]”?
s([a,a,b,b],R):-s([a,b,b],[b|R]). /* We haven't got a value for R yet. */
s([a,b,b],R):-s([b,b],[b|R]). /* We haven't got a value for R yet. */
s([b,b],[b,b]). /* Stop condition for the recursion. */