Diseñe un autómata finito determinista (DFA) para aceptar el lenguaje L =
Para crear DFA para el lenguaje, L = { a^nb^m ; n+m=par } usa las matemáticas elementales, que dicen
: par + par = par e impar + impar = par
Ejemplos:
Input: a a b b // n = 2, m = 2, 2 + 2 = 4 (even) Output: ACCEPTED Input: a a a b b b b // n = 3, m = 4, 3 + 4 = 7 (odd) Output: NOT ACCEPTED Input: a a a b b b // n = 3, m = 3, 3 + 3 = 6 (even) Output: ACCEPTED
Enfoques:
hay 2 casos que dan como resultado la aceptación de la string:
- Si tanto n como m son pares entonces su suma será par
- Si tanto n como m son impares, su suma será par
Descripción:
Dado DFA tiene 2 partes. La primera parte consta de los estados 0, 1, 5 y 6, que es tanto para n como para m impar. La segunda parte consta de los estados 2, 3 y 4, tanto para n como para m, es par.
Diagrama de transición de estado de DFA:
Veamos el código de la demostración:
C++
// C++ program to implement DFA that accepts // all strings which follow the language // L = { a^n b^m ; n+m=even } #include <bits/stdc++.h> using namespace std; // dfa tells the number associated // with the present state int dfa = 0; // This function is for // the starting state (zeroth) of DFA void start(char c) { if (c == 'a') dfa = 1; else if (c == 'b') dfa = 2; // -1 is used to check for any invalid symbol else dfa = -1; } // This function is for the first state of DFA void state1(char c) { if (c == 'a') dfa = 0; else if (c == 'b') dfa = 5; else dfa = -1; } // This function is for the second state of DFA void state2(char c) { if (c == 'b') dfa = 3; else dfa = -1; } // This function is for the third state of DFA void state3(char c) { if (c == 'b') dfa = 4; else dfa = -1; } // This function is for the fourth state of DFA void state4(char c) { if (c == 'b') dfa = 3; else dfa = -1; } // This function is for the fifth state of DFA void state5(char c) { if (c == 'b') dfa = 6; else dfa = -1; } // This function is for the sixth state of DFA void state6(char c) { if (c == 'b') dfa = 5; else dfa = -1; } int isAccepted(char str[]) { // Store length of string int i, len = strlen(str); for (i = 0; i < len; i++) { if (dfa == 0) start(str[i]); else if (dfa == 1) state1(str[i]); else if (dfa == 2) state2(str[i]); else if (dfa == 3) state3(str[i]); else if (dfa == 4) state4(str[i]); else if (dfa == 5) state5(str[i]); else if (dfa == 6) state6(str[i]); else return 0; } if (dfa == 3 || dfa == 5) return 1; else return 0; } // Driver code int main() { char str[] = "aaabbb"; if (isAccepted(str)) cout << "\nACCEPTED\n"; else cout << "NOT ACCEPTED\n"; return 0; } // This code is contributed by SHUBHAMSINGH10
C
// C program to implement DFA that accepts // all strings which follow the language // L = { a^n b^m ; n+m=even } #include <stdio.h> #include <string.h> // dfa tells the number associated // with the present state int dfa = 0; // This function is for // the starting state (zeroth) of DFA void start(char c) { if (c == 'a') dfa = 1; else if (c == 'b') dfa = 2; // -1 is used to check for any invalid symbol else dfa = -1; } // This function is for the first state of DFA void state1(char c) { if (c == 'a') dfa = 0; else if (c == 'b') dfa = 5; else dfa = -1; } // This function is for the second state of DFA void state2(char c) { if (c == 'b') dfa = 3; else dfa = -1; } // This function is for the third state of DFA void state3(char c) { if (c == 'b') dfa = 4; else dfa = -1; } // This function is for the fourth state of DFA void state4(char c) { if (c == 'b') dfa = 3; else dfa = -1; } // This function is for the fifth state of DFA void state5(char c) { if (c == 'b') dfa = 6; else dfa = -1; } // This function is for the sixth state of DFA void state6(char c) { if (c == 'b') dfa = 5; else dfa = -1; } int isAccepted(char str[]) { // store length of string int i, len = strlen(str); for (i = 0; i < len; i++) { if (dfa == 0) start(str[i]); else if (dfa == 1) state1(str[i]); else if (dfa == 2) state2(str[i]); else if (dfa == 3) state3(str[i]); else if (dfa == 4) state4(str[i]); else if (dfa == 5) state5(str[i]); else if (dfa == 6) state6(str[i]); else return 0; } if (dfa == 3 || dfa == 5) return 1; else return 0; } // driver code int main() { char str[] = "aaabbb"; if (isAccepted(str)) printf("\nACCEPTED\n"); else printf("NOT ACCEPTED\n"); return 0; }
Java
// Java program to implement DFA that accepts // all strings which follow the language // L = { a^n b^m ; n+m=even } class GFG { // dfa tells the number associated // with the present state. static int dfa = 0; // This function is for // the starting state (Q0)of DFA static void start(char c) { if (c == 'a') { dfa = 1; } else if (c == 'b') { dfa = 2; } // -1 is used to check for any invalid symbol else { dfa = -1; } } // This function is for // the first state (Q1) of DFA static void state1(char c) { if (c == 'a') { dfa = 0; } else if (c == 'b') { dfa = 5; } else { dfa = -1; } } // This function is for the // second state (Q2) of DFA static void state2(char c) { if (c == 'b') { dfa = 3; } else { dfa = -1; } } // This function is for the // third state (Q3)of DFA static void state3(char c) { if (c == 'b') { dfa = 4; } else { dfa = -1; } } // This function is for the // fourth state (Q4) of DFA static void state4(char c) { if (c == 'b') { dfa = 3; } else { dfa = -1; } } // This function is for the // fifth state (Q5) of DFA static void state5(char c) { if (c == 'b') { dfa = 6; } else { dfa = -1; } } // This function is for the // sixth state (Q6) of DFA static void state6(char c) { if (c == 'b') { dfa = 5; } else { dfa = -1; } } static int isAccepted(char str[]) { // store length of string int i, len = str.length; for (i = 0; i < len; i++) { if (dfa == 0) start(str[i]); else if (dfa == 1) state1(str[i]); else if (dfa == 2) state2(str[i]); else if (dfa == 3) state3(str[i]); else if (dfa == 4) state4(str[i]); else if (dfa == 5) state5(str[i]); else if (dfa == 6) state6(str[i]); else return 0; } if (dfa == 3 || dfa == 5) return 1; else return 0; } // Driver code public static void main(String[] args) { char str[] = "aaabbb".toCharArray(); if (isAccepted(str) == 1) System.out.println("ACCEPTED"); else System.out.println("NOT ACCEPTED"); } }
Python3
# Python3 program to implement DFA that accepts # all strings which follow the language # L = a ^ n b ^ m n + m = even # This function is for the dfa = starting # dfa = state (zeroth) of DFA def start(c): if (c == 'a'): dfa = 1 elif (c == 'b'): dfa = 2 # -1 is used to check for any # invalid symbol else: dfa = -1 return dfa # This function is for the first # dfa = state of DFA def state1(c): if (c == 'a'): dfa = 0 elif (c == 'b'): dfa = 5 else: dfa = -1 return dfa # This function is for the second # dfa = state of DFA def state2(c): if (c == 'b'): dfa = 3 else: dfa = -1 return dfa # This function is for the third # dfa = state of DFA def state3(c): if (c == 'b'): dfa = 4 else: dfa = -1 return dfa # This function is for the fourth # dfa = state of DFA def state4(c): if (c == 'b'): dfa = 3 else: dfa = -1 return dfa # This function is for the fifth # dfa = state of DFA def state5(c): if (c == 'b'): dfa = 6 else: dfa = -1 return dfa # This function is for the sixth # dfa = state of DFA def state6(c): if (c == 'b'): dfa = 5 else: dfa = -1 return dfa def isAccepted(String): # store length of Stringing l = len(String) # dfa tells the number associated # with the present dfa = state dfa = 0 for i in range(l): if (dfa == 0): dfa = start(String[i]) elif (dfa == 1): dfa = state1(String[i]) elif (dfa == 2) : dfa = state2(String[i]) elif (dfa == 3) : dfa = state3(String[i]) elif (dfa == 4) : dfa = state4(String[i]) elif (dfa == 5) : dfa = state5(String[i]) elif (dfa == 6): dfa = state6(String[i]) else: return 0 if(dfa == 3 or dfa == 5) : return 1 else: return 0 # Driver code if __name__ == "__main__" : String = "aaabbb" if (isAccepted(String)) : print("ACCEPTED") else: print("NOT ACCEPTED") # This code is contributed by # Shubham Singh(SHUBHAMSINGH10)
C#
// C# program to implement DFA that accepts // all strings which follow the language // L = { a^n b^m ; n+m=even } using System; class GFG { // dfa tells the number associated // with the present state. static int dfa = 0; // This function is for // the starting state (Q0)of DFA static void start(char c) { if (c == 'a') { dfa = 1; } else if (c == 'b') { dfa = 2; } // -1 is used to check for any invalid symbol else { dfa = -1; } } // This function is for // the first state (Q1) of DFA static void state1(char c) { if (c == 'a') { dfa = 0; } else if (c == 'b') { dfa = 5; } else { dfa = -1; } } // This function is for the // second state (Q2) of DFA static void state2(char c) { if (c == 'b') { dfa = 3; } else { dfa = -1; } } // This function is for the // third state (Q3)of DFA static void state3(char c) { if (c == 'b') { dfa = 4; } else { dfa = -1; } } // This function is for the // fourth state (Q4) of DFA static void state4(char c) { if (c == 'b') { dfa = 3; } else { dfa = -1; } } // This function is for the // fifth state (Q5) of DFA static void state5(char c) { if (c == 'b') { dfa = 6; } else { dfa = -1; } } // This function is for the // sixth state (Q6) of DFA static void state6(char c) { if (c == 'b') { dfa = 5; } else { dfa = -1; } } static int isAccepted(char []str) { // store length of string int i, len = str.Length; for (i = 0; i < len; i++) { if (dfa == 0) start(str[i]); else if (dfa == 1) state1(str[i]); else if (dfa == 2) state2(str[i]); else if (dfa == 3) state3(str[i]); else if (dfa == 4) state4(str[i]); else if (dfa == 5) state5(str[i]); else if (dfa == 6) state6(str[i]); else return 0; } if (dfa == 3 || dfa == 5) return 1; else return 0; } // Driver code public static void Main(String[] args) { char []str = "aaabbb".ToCharArray(); if (isAccepted(str) == 1) Console.WriteLine("ACCEPTED"); else Console.WriteLine("NOT ACCEPTED"); } } /* This code contributed by PrinciRaj1992 */
PHP
<?php // PHP program to implement DFA that accepts // all strings which follow the language // L = { a^n b^m ; n+m=even } // This function is for the // starting state (zeroth) of DFA function start($c, &$dfa) { if ($c == 'a') $dfa = 1; elseif ($c == 'b') $dfa = 2; // -1 is used to check for any // invalid symbol else $dfa = -1; } // This function is for the first // state of DFA function state1($c, &$dfa) { if ($c == 'a') $dfa = 0; elseif ($c == 'b') $dfa = 5; else $dfa = -1; } // This function is for the second // state of DFA function state2($c, &$dfa) { if ($c == 'b') $dfa = 3; else $dfa = -1; } // This function is for the third // state of DFA function state3($c, &$dfa) { if ($c == 'b') $dfa = 4; else $dfa = -1; } // This function is for the fourth // state of DFA function state4($c, &$dfa) { if ($c == 'b') $dfa = 3; else $dfa = -1; } // This function is for the fifth // state of DFA function state5($c, &$dfa) { if ($c == 'b') $dfa = 6; else $dfa = -1; } // This function is for the sixth // state of DFA function state6($c, &$dfa) { if ($c == 'b') $dfa = 5; else $dfa = -1; } function isAccepted($str, &$dfa) { // store length of string $i = 0; $len = sizeof($str); for ($i = 0; $i < $len; $i++) { if ($dfa == 0) start($str[$i], $dfa); elseif ($dfa == 1) state1($str[$i], $dfa); elseif ($dfa == 2) state2($str[$i], $dfa); elseif ($dfa == 3) state3($str[$i], $dfa); elseif ($dfa == 4) state4($str[$i], $dfa); elseif ($dfa == 5) state5($str[$i], $dfa); elseif ($dfa == 6) state6($str[$i], $dfa); else return 0; } if($dfa == 3 || $dfa == 5) return 1; else return 0; } // Driver code // dfa tells the number associated // with the present state $dfa = 0; $str = array("a", "a", "a", "b", "b", "b"); if (isAccepted($str, $dfa) != 0) echo "ACCEPTED"; else echo "NOT ACCEPTED"; // This code is contributed by // Adesh kumar Singh(adeshsingh1) ?>
Javascript
<script> // Javascript program to implement DFA that accepts // all strings which follow the language // L = { a^n b^m ; n+m=even } // dfa tells the number associated // with the present state var dfa = 0; // This function is for // the starting state (zeroth) of DFA function start(c) { if (c == 'a') dfa = 1; else if (c == 'b') dfa = 2; // -1 is used to check for any invalid symbol else dfa = -1; } // This function is for the first state of DFA function state1(c) { if (c == 'a') dfa = 0; else if (c == 'b') dfa = 5; else dfa = -1; } // This function is for the second state of DFA function state2(c) { if (c == 'b') dfa = 3; else dfa = -1; } // This function is for the third state of DFA function state3(c) { if (c == 'b') dfa = 4; else dfa = -1; } // This function is for the fourth state of DFA function state4(c) { if (c == 'b') dfa = 3; else dfa = -1; } // This function is for the fifth state of DFA function state5(c) { if (c == 'b') dfa = 6; else dfa = -1; } // This function is for the sixth state of DFA function state6(c) { if (c == 'b') dfa = 5; else dfa = -1; } function isAccepted(str) { // Store length of string var i, len = (str.length); for (i = 0; i < len; i++) { if (dfa == 0) start(str[i]); else if (dfa == 1) state1(str[i]); else if (dfa == 2) state2(str[i]); else if (dfa == 3) state3(str[i]); else if (dfa == 4) state4(str[i]); else if (dfa == 5) state5(str[i]); else if (dfa == 6) state6(str[i]); else return 0; } if (dfa == 3 || dfa == 5) return 1; else return 0; } // Driver code var str = "aaabbb"; if (isAccepted(str)) document.write( "ACCEPTED"); else document.write( "NOT ACCEPTED"); </script>
Producción:
ACCEPTED
Hay un DFA mínimo para el mismo problema.
Publicación traducida automáticamente
Artículo escrito por RishabhMalik y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA