非不确定性与确定性有何不同?


13

我试图理解“确定性上下文无关语法”等表达中的“确定性”是什么意思。(在该字段中还有更多确定性的“事物”)。除了最详尽的解释之外,我将不胜感激一个例子!如果可能的话。

我困惑的主要根源在于无法分辨语法的这种性质与(非)歧义有何不同。

我最想找到的意思是D. Knuth 论文《语言从左到右的翻译》中的这句话:

Ginsburg和Greibach(1965)定义了确定性语言的概念。我们在第五节中表明,这些正是存在LR(k)语法的语言

一旦到达Section V,它就变成循环了,因为那里说LR(k)解析器可以解析的是确定性语言...


下面是一个示例,可以帮助我理解“歧义”的含义,请看一下:

onewartwoearewe

可以将其解析为- one war two ear eweo new art woe are we-如果语法允许(例如,它列出了我刚刚列出的所有单词)。

我需要做些什么才能使示例语言具有不确定性?(例如,我可以o从语法中删除单词,以使语法不模糊)。

以上语言是确定性的吗?

PS。这个例子来自《哥德尔,埃舍尔,巴赫:永恒的金辫子》一书。


假设我们为示例语言定义了语法,如下所示:

S -> A 'we' | A 'ewe'
A -> B | BA
B -> 'o' | 'new' | 'art' | 'woe' | 'are' | 'one' | 'war' | 'two' | 'ear'

通过关于必须解析整个字符串的争论,这种语法是否会使语言具有不确定性?


let explode s =
  let rec exp i l =
    if i < 0 then l else exp (i - 1) (s.[i] :: l) in
  exp (String.length s - 1) [];;

let rec woe_parser s =
  match s with
  | 'w' :: 'e' :: [] -> true
  | 'e' :: 'w' :: 'e' :: [] -> true
  | 'o' :: x -> woe_parser x
  | 'n' :: 'e' :: 'w' :: x -> woe_parser x
  | 'a' :: 'r' :: 't' :: x -> woe_parser x
  | 'w' :: 'o' :: 'e' :: x -> woe_parser x
  | 'a' :: 'r' :: 'e' :: x -> woe_parser x
  (* this line will trigger an error, because it creates 
     ambiguous grammar *)
  | 'o' :: 'n' :: 'e' :: x -> woe_parser x
  | 'w' :: 'a' :: 'r' :: x -> woe_parser x
  | 't' :: 'w' :: 'o' :: x -> woe_parser x
  | 'e' :: 'a' :: 'r' :: x -> woe_parser x
  | _ -> false;;

woe_parser (explode "onewartwoearewe");;
- : bool = true

| Label   | Pattern      |
|---------+--------------|
| rule-01 | S -> A 'we'  |
| rule-02 | S -> A 'ewe' |
| rule-03 | A -> B       |
| rule-04 | A -> BA      |
| rule-05 | B -> 'o'     |
| rule-06 | B -> 'new'   |
| rule-07 | B -> 'art'   |
| rule-08 | B -> 'woe'   |
| rule-09 | B -> 'are'   |
| rule-10 | B -> 'one'   |
| rule-11 | B -> 'war'   |
| rule-12 | B -> 'two'   |
| rule-13 | B -> 'ear'   |
#+TBLFM: @2$1..@>$1='(format "rule-%02d" (1- @#));L

Generating =onewartwoearewe=

First way to generate:

| Input             | Rule    | Product           |
|-------------------+---------+-------------------|
| ''                | rule-01 | A'we'             |
| A'we'             | rule-04 | BA'we'            |
| BA'we'            | rule-05 | 'o'A'we'          |
| 'o'A'we'          | rule-04 | 'o'BA'we'         |
| 'o'BA'we'         | rule-06 | 'onew'A'we'       |
| 'onew'A'we'       | rule-04 | 'onew'BA'we'      |
| 'onew'BA'we'      | rule-07 | 'onewart'A'we'    |
| 'onewart'A'we'    | rule-04 | 'onewart'BA'we'   |
| 'onewart'BA'we'   | rule-08 | 'onewartwoe'A'we' |
| 'onewartwoe'A'we' | rule-03 | 'onewartwoe'B'we' |
| 'onewartwoe'B'we' | rule-09 | 'onewartwoearewe' |
|-------------------+---------+-------------------|
|                   |         | 'onewartwoearewe' |

Second way to generate:

| Input             | Rule    | Product           |
|-------------------+---------+-------------------|
| ''                | rule-02 | A'ewe'            |
| A'ewe'            | rule-04 | BA'ewe'           |
| BA'ewe'           | rule-10 | 'one'A'ewe'       |
| 'one'A'ewe'       | rule-04 | 'one'BA'ewe'      |
| 'one'BA'ewe'      | rule-11 | 'onewar'A'ewe'    |
| 'onewar'A'ewe'    | rule-04 | 'onewar'BA'ewe'   |
| 'onewar'BA'ewe'   | rule-12 | 'onewartwo'A'ewe' |
| 'onewartwo'A'ewe' | rule-03 | 'onewartwo'B'ewe' |
| 'onewartwo'B'ewe' | rule-13 | 'onewartwoearewe' |
|-------------------+---------+-------------------|
|                   |         | 'onewartwoearewe' |

1
-1,因为现在的问题毫无意义。首先,字符串不是语言。字符串不是歧义,明确,确定性或不确定性;他们只是字符串。您提供的语法不会生成示例字符串。我没有检查所有180个派生词是否存在重复项,但是从理论上讲,这是您要做的全部工作,以查看语法是否模棱两可。可悲的是,该语言不能天生就具有歧义性,因为该语言是有限的,规则的,因此被DPDA接受,因而具有确定性。
Patrick87 2013年

@ Patrick87是吗?它在哪里说字符串语言?此字符串是一个示例产品,请确保可以使用给定的语法生成该字符串。是什么让您另想呢?所讨论的字符串就是这种情况,其中两个不同的规则应用程序序列产生相同的字符串,因此语法是模棱两可的,但是如果删除某些规则(例如B -> 'o',,则它将不再是模棱两可的……
wvxvw

首先,您能否使用语法提供示例字符串的推导?根据您自己的问题:“上述语言是否具有确定性?” 您永远不会命名一种语言,而只是一种由无限的语法生成的字符串,尽管不是您所提议的那种。
Patrick87 2013年

你能用英文写吗?例如,“开始于S。通过应用该规则S := ...,我们得到...……”
Patrick87 2013年

@ Patrick87我添加了逐步生成过程,并且我意识到自己在语法上犯了一个错误,已修复。
wvxvw

Answers:


9

PDA是确定性的,因此,对于自动机的每个可到达的配置,DPDA最多有一个转换(即,最多可能有一个新配置)。如果您的PDA可以达到某些配置,并且可能进行两个或更多个唯一的转换,则您没有DPDA。

例:

Q={q0,q1}Σ=Γ={a,b}A=q0δ

q    e    s    q'   s'
--   --   --   --   --
q0   a    Z0   q1   aZ0
q0   a    Z0   q2   bZ0
...

这些是不确定的PDA,因为可以达到初始配置-- q_0, Z0,并且如果输入符号为,则有两个有效的过渡远离它a。只要此PDA开始尝试处理以开头的字符串a,就可以选择。选择意味着不确定性。

请考虑以下过渡表:

q    e    s    q'   s'
--   --   --   --   --
q0   a    Z0   q1   aZ0
q0   a    Z0   q2   bZ0
q1   a    a    q0   aa
q1   a    b    q0   ab
q1   a    b    q2   aa
q2   b    a    q0   ba
q2   b    b    q0   bb
q2   b    a    q1   bb

您可能会想说这种PDA是不确定的;毕竟,例如,有两个有效的转换远离配置q1, b(a+b)*。但是,由于通过自动机的任何路径都无法达到此配置,因此不算在内。唯一可到达配置的一个子集q_0, (a+b)*Z0q1, a(a+b)*Z0q2, b(a+b)*Z0,并为每个这些配置的,至多一个过渡被限定。

CFL是确定性的,前提是它是某些DPDA的语言。

如果每个字符串根据CFG最多具有一个有效派生,则CFG是明确的。否则,语法是不明确的。如果您有CFG,并且可以为某个字符串生成两个不同的派生树,则您的语法会模棱两可。

CFL本质上是模棱两可的,因为它不是任何明确CFG的语言。

请注意以下几点:

  • 确定性CFL必须是某些DPDA的语言。
  • 每个CFL都是无数个不确定PDA的语言。
  • 固有的歧义CFL不是任何歧义CFG的语言。
  • 每个CFL都是无数个模糊CFG的语言。
  • 固有的歧义CFL无法确定。
  • 不确定的CFL可能固有也可能不是模棱两可的。

1
Wiki表示PDA并不是确定性的(可能有确定性版本,也可能是不确定性),但是您也可以省略句子的第一部分,它实际上并没有助您所说的内容:/但是,这又一次定义了确定性语言作为确定性事物的输入语言,这种事物之所以称为确定性语言是因为它接受确定性语言-就像说“草是绿色的,因为绿色是草的颜色”。的确如此,但无济于事:(请,例子会更有价值!
wvxvw

@wvxvw:您没有正确阅读此内容。它说:“只有当每个状态/符号/堆栈三元组只有一个下一个状态时,PDA才是确定性的。” 该定义中没有关于自动机接受哪种语言的信息。
徘徊逻辑

2
@wvxvw确定性PDA或DPDA的定义,我绝不会以任何形式,形式或形式给出,而是依赖于确定性上下文无关语言的定义。我仅根据自动机的属性来定义DPDA。然后,我根据DPDA的定义来定义确定性CFL。请根据这些以及Wandering Logic的评论重新阅读答案,并尝试看看这是否有意义。我将努力提供一些简短的例子。
Patrick87年

q1,b(a+b)q2,b(a+b)Q={q0,...q2}当前角色?另外,我的解释正确吗?x+-一个或多个x(x)*-零或多个x
wvxvw

@wvxvw配置引用堆栈的当前状态和当前内容。x+通常指“一个或多个;xx*通常指“零个或多个x;我可以xx*代替使用x+,因为它们是相同的。
Patrick87 2013年

7

以下是示例(来自Wikipedia):

S0S0|1S1|ε

当且仅当存在至少一个接受该语言的确定性下推自动机时,上下文无关语言才是确定性语言。(可能还有很多接受该语言的非确定性下推自动机,并且仍将是一种确定性语言。)本质上,确定性下推自动机是指根据当前状态确定性地进行机器转换的机器,输入符号和堆栈的当前最顶符号确定性此处表示任何状态/输入符号/最上层堆栈符号的状态转换不超过一个。如果某个状态/输入符号/最上面的堆栈符号三元组具有两个或多个下一个状态,则自动机是不确定的。(您需要“猜测”要进行的过渡,以确定自动机是否接受。)

Knuth证明的是,每个LR(k)语法都有一个确定性下推自动机,每个确定性下推自动机都有LR(k)语法。因此,LR(k)语法和确定性下推自动机可以处理同一组语言。但是,具有确定性下推自动机并接受它们的语言集(根据定义)是确定性语言。该论点不是循环的。

因此,确定性语言意味着存在明确的语法。而且,我们显示了没有确定性下推自动机的明确语法(因此,它是接受不确定性语言的明确语法。)

{anbmcmdn|n,m>0}{anbncmdm|n,m>0}{anbnccdn|n>0}


您能否详细说明一下,为什么在确定中位数之前必须先查看整个字符串,从而使该语言不确定?我读到了什么是“确定性”的另一种解释,并且在那里说:“如果在解析时不需要回溯,则该语言是确定性的”。我认为无需回溯以解析该语言...
wvxvw

1
考虑输入字符串“ 10011001”。下推式自动机不知道字符串到底要等多久。当您到达第二个0时,您需要做出选择:这是4个字符的字符串“ 1001”,还是更长的字符串,看起来像“ 100 ???? 001”?当您到达第五个字符时,您仍然不知道:这是8个字符的字符串“ 10011001”还是更长的字符串,看起来像“ 10011 ???? 11001”?
徘徊逻辑

1
“解析整个字符串”不是定义的不确定性。我只是想补充一些直觉。@ Patrick87和我都给了您确定性的真正定义:每个状态最多有一个下一个状态。如果一种语言没有明确的语法,则它必须是不确定的。我不做更多工作就无法回答您的示例:您已经展示了一个模棱两可的语法,但这并不重要,如果您想证明该语言本质上是模棱两可的,则需要证明没有明确的语法。
徘徊逻辑

1
@wvxvw如果您正在寻找计算过程,可能很不幸……根据en.wikipedia.org/wiki/List_of_undecidable_problems的说法,CFG是否模棱两可尚不确定,更不用说它的语言本来就模棱两可; CFG是否生成所有字符串也是不确定的。鉴于此,我严重怀疑CFG的语言是否是确定性的CFL是可以确定的,效率要低得多。
Patrick87 2013年

1
@wvxvw如果您碰巧如此幸运,那么您正在处理的是我们所说的快乐案例,即不是使该问题无法解决的案例之一。您可以定义适用于很多快乐情况的试探法,而不会在其他情况下使劲,但它们将不适用于所有快乐情况。如果他们这样做了,那么您将有一个问题的决策者,这在我们的前提下是不可能的。
Patrick87 2013年

5

确定性上下文无关语言是某些确定性下推自动机所接受的语言(无上下文语言是某些不确定性下推自动机所接受的语言)。因此,它是语言的属性,而不是语法的属性。相反,歧义是语法的属性,而固有歧义是语言的属性(如果语言的每个上下文无关语法都是模棱两可的,则上下文无关的语言固有地模棱两可)。

这两个定义之间存在联系:确定性的上下文无关语言永远不会固有地模棱两可,如对此问题的回答所示。


抱歉,这不是很有帮助。我实际上是从DPDA开始的,但是它从来没有解释为什么它被称为确定性。这个定义很容易在Wikipedia / Googling上找到。但是“确定性”一词描述了语法/语言/解析器的什么属性?换句话说,为了使它被称为确定性语法应该在语法中发生什么?
wvxvw

对不起,如果我评论太多。造成这种混乱的原因是,我无法从某种语言(例如某种语言)中判断出它是否具有确定性,并且不知道从哪里开始识别该语言的“确定性”。确定性语言然后以使其不确定性的方式进行更改的语言示例将非常有帮助。
wvxvw

1
LR(k)

1
抱歉,仍然没有帮助。我理解您在说什么,但这无助于我识别一种确定性语言,并把它与非确定性语言区分开。举一个例子:如果一种语言的生产规则产生了括号均衡的问题,我立即知道FSM无法对其进行解析。(因为这将需要堆栈)。但是,当您仅提及另一种形式主义时,它只会递归,这并没有帮助我理解该语言应与另一种语言有何不同。
wvxvw

换句话说(如您在前面的评论中所提到的),您需要具有相同“排序”的确定性和非确定性上下文无关语言的示例。也许您应该问一个有针对性的问题。
Yuval Filmus

1

{a,b}{w(a+b)w=wR}SaSa|bSb|a|b|ϵababab


1

定义

  1. 一个确定下推受体(DPDA)是一个下推自动机,从来没有在它的移动选择。
  2. DPDA和NPDA不相等。
  3. CFG非确定性当且仅当有至少两个产生与他们的右侧相同终端的前缀。
  4. CFG暧昧当且仅当存在一些瓦特∈L(G),其具有至少两个不同的推导的树木。因此,它具有对应于两个不同派生树的两个或更多个最左或最右派生。
  5. 一个CFG明确的当且仅当串有至多根据CFG一个有效的推导。否则,语法是不明确的。
  6. 一个CFL固有的歧义当且仅当它不是语言的任何明确的CFG。它不能有任何DPDA。
    如果产生CFL语法是不明确的,那么CFL被称为固有暧昧。因此,这不是任何明确的CFG 的语言。

事实

  1. 每个CFL都是无数个不确定PDA 的语言。
  2. 每个CFL都是无数个模糊CFG 的语言。
  3. 一些 DPDA 接受的CFL 并不是天生就模棱两可的。(至少有一个明确的CFG。)
  4. NDPDA接受的CFL可能是固有的,也可能不是固有的,因为它可能存在某些 DPDA(或明确的CFG)。
  5. 由于歧义CFG生成的CFL可能固有存在歧义,也可能不是固有模棱两可,因为它可能存在某些歧义CFG(或DPDA)。
  6. 至少一个明确的CFG 生成的CFL 并不是天生就模棱两可的。(有一些DPDA。)
  7. 非确定性语法可能不明确,也可能不明确。

回答您的问题(确定性和模棱两可之间的关系)

  1. (无)歧义主要适用于语法(此处为CFG)。(非)确定性适用于语法和自动机(此处为PDA)。

    如果您需要逻辑上的差异,则可以查看事实部分的最后四个要点,因为它们试图将歧义性和确定性联系在一起。在这里,我再次重复它们:

  2. 一些确定性 PDA所接受的CFL 并不是天生就模棱两可的。(至少有一个明确的CFG。)

  3. 由于确定性 PDA 可能存在某些DPDA(或明确的 CFG),因此不确定性 PDA所接受的CFL 可能固有或不固有
  4. 由于歧义 CFG 生成的CFL 可能固有存在歧义,也可能不是固有模棱两可,因为它可能存在某些歧义CFG(或确定性 PDA)。
  5. 至少一个明确的 CFG 生成的CFL 并不是天生就模棱两可的。(有一些DPDA。)
  6. 非确定性语法可以是或可以不是不明确的

PS:

  1. 接受的答案使用诸如“ CFL是确定性”,“确定性CFL”,“ CFL无法确定性”,“非确定性CFL”之类的行。我认为形容词“确定性”和“模棱两可”不适用于CFL,但不适用于PDA和CFG。点。(实际上,我实际上是从该答案中复制粘贴了一些行。)但是我仍然觉得应该更正确。因此,我试图在这里将内容更清楚地分为两个部分,即定义和事实(我可能将其冗长而冗长)。我想我应该已经编辑了原始答案,但随后将涉及删除使用以上线条的许多点。而且我不知道这是否会使它进行任何有效的编辑,因为它涉及完全重写。
  2. 注意,我用粗体斜体字表示了定量的词,以突出不同定义和事实之间的比较差异。定义术语仅以粗体显示
  3. 我已经提出了几点要点,所以我需要在这里有知识的人对每个点的正确性进行确认。

PS 1是错误的:确定性/歧义性CFL有一个标准定义,即,将它们定义为所有 CFG都是确定性/歧义性的CFL。
reinierpost

才意识到事实7是错误的。倒数第二个列表中的点6也相同并且是错误的。
玛哈

实际上,确定性在解析过程中的任何时候都没有歧义性,因此它比歧义性要严格得多(即,即使解析完成后,歧义性也是如此)。
reinierpost
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.