句法分析-prolog

句法分析-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|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 --> [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
开头的

让我们一步一步地看一遍

  • 首先,我们有:
    s([a,x,y,z],R):-s([x,y,z],[b|R])。
    这是可行的,Prolog将S2绑定到
    [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]
    匹配,因为它不以
    b
    开头。这就是规则失败的地方——Prolog已经确定字符串的形式不是an.bn
要了解如何使用
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. */