📜  L = {0i1j2k | 的 NPDA i==j 或 j==k ; i , j , k >= 1}

📅  最后修改于: 2021-09-27 22:33:06             🧑  作者: Mango

先决条件——下推自动机,下推自动机被最终状态接受
语言 L = {0 i 1 j 2 k | i==j 或 j==k ; i , j , k >= 1} 告诉每个字符串’0′, ‘1’ 和 ‘2’ 都有一定数量的 0,然后是一定数量的 1,然后是一定数量的 2。条件是这 3 个符号中的每一个的计数应至少为 1。此语言的两个重要条件是 0 的计数应等于 1 的计数或 1 的计数应等于 2 的计数。假设该字符串以“$”结尾。

例子:

Input: 0 0 0 1 1 1 2 2 2 2 2  
        Here 0's = 3, 1's  = 3 so i = j, 2's = 5 
Output: Accepted 
          
Input: 0 0 1 1 1 2 2 2
        Here 0's = 2, 1's = 3, 2's = 3 so j = k
Output: Accepted

Input : 0 0 1 1 1 2 2 2 2
        Here 0's = 2, 1's = 3, 2's = 4 
Output: Not accepted 

有2种解决方法。第一个用于 i==j,第二个用于 j==k。这些是:

i == j 的步骤:

  1. 在堆栈中输入全 0
  2. 当我们得到 1 作为输入时,从堆栈中弹出一个 0 并转到下一个状态。
  3. 如果输入为 1,则从堆栈中弹出 0。
  4. 如果堆栈变空(即,对应于 1 的每个 0 都已弹出,因此 i = j)并且输入为 2,则忽略它并转到下一个状态。
  5. 如果输入是 2 则忽略它。如果输入完成并收到 $ 则转到最终状态。

j == k 的步骤:

  1. 在堆栈中输入全 0
  2. 当我们得到 1 作为输入时,将其压入堆栈并转到下一个状态。
  3. 如果输入为 1,则将其压入堆栈。
  4. 如果输入为 2,则从堆栈中弹出 1 并转到下一个状态。
  5. 如果输入为 2,则从堆栈中弹出 1。如果输入完成并收到 $ 则从堆栈中弹出一个 0。
  6. 从堆栈中弹出所有剩余的 0。如果堆栈变空,则转到最终状态。