Un circuit booléen peut être utilisé pour reconnaître un langage formel, c'est-à-dire décider si un mot appartient ou non à un langage particulier. Les caractéristiques des circuits qui reconnaissent un langage permettent de définir (ou redéfinir) des classes de complexité.
Un circuit booléen est un graphe orienté acyclique (DAG) fini connexe dont les feuilles sont les entrées et l'unique racine est la sortie. Les sommets sont les portes, généralement des portes ET, OU et NON[1]. On peut évaluer la valeur de sortie récursivement à partir des feuilles : pour une porte "ET" par exemple, si les entrées sont positives, la sortie sera positive, sinon la sortie est négative.
Une formule de la logique propositionnelle est un cas particulier de circuit booléen qui est un arbre.
On peut aussi modéliser des circuits par des programmes straight-line[2] : ce sont des programmes sans conditionnelles et sans boucles. Par exemple, le circuit booléen de l'illustration est équivalent au programme straight-line suivant, en appelant x1 et x2 les entrées, et en introduisant les variables y1, y2, y3 pour les trois portes logiques :
y1 := x1 ou x2
y2 := non x2
y3 := y1 et y2
Famille de circuits et non-uniformité
Les circuits classiques décident des langages codés en binaire : le premier bit du mot est la première entrée, etc. Le mot est accepté si et seulement si la sortie du circuit est vrai.
Comme un circuit ne permet de reconnaître que des mots de mêmes tailles, on parle généralement de famille de circuits , où reconnaît les mots du langage de taille . Un modèle comme celui-ci, où il y a un circuit différent pour chaque taille de l'entrée, est dit « non uniforme ».
Les circuits booléens, à l'instar d'autres modèles de calcul comme les machines de Turing, permettent de définir des classes de complexité. Une classe de complexité regroupe des problèmes algorithmiques selon l'utilisation de ressources (temps, mémoire, etc.) qu'il faut pour les décider. Les classes présentées ici, qui reposent sur les circuits, définissent des classes de complexité où les ressources sont :
la taille du circuit, i.e. le nombre de portes logique et d'entrées qu'il y a dans un circuit (par exemple, le circuit en illustration est de taille 5 (2 entrées + 3 portes logiques) ;
la profondeur du circuit
Voici des exemples de classes de complexité que l'on peut définir avec des circuits.
La classe P/poly est la classe des langages pouvant être reconnu par des circuits de tailles polynomiales.
La classe AC0, la classe des langages pouvant être reconnu par des circuits de tailles polynomiales et de profondeur constante (avec degré entrant non borné)
La hiérarchie NC, des langages pouvant être reconnu par des circuits de tailles polynomiales et de profondeur polylogarithmique (avec degré entrant borné)
La hiérarchie AC, la classe des langages pouvant être reconnu par des circuits de tailles polynomiales et de profondeur polylogarithmique (avec degré entrant non borné)
La hiérarchie TC, la classe des langages pouvant être reconnu par des circuits avec des portes ET, OU, MAJORITE, de tailles polynomiales et de profondeur polylogarithmique (avec degré entrant non borné)
Taille des circuits
Bornes supérieures
Lupanov, en 1952, démontre que toute fonction booléenne sur n variables admet un circuit de taille (1 + o(1))2n/n[3].
Bornes inférieures
Shanon, en 1949, démontre que pour tout n > 1, il existe une fonction booléenne à n variables qui n'admet pas de circuit de taille 2n/(10n)[4]. Un autre intérêt des circuits booléens est leur simplicité (en comparaison aux machines de Turing) qui permet de prouver certaines bornes inférieures du type : les circuits reconnaissant tel langage doivent être de taille au moins . Ce genre de borne permet de différencier certaines classes. Cependant, trouver de bonnes bornes inférieures pour les circuits est considéré comme difficile, et dans certains cas, on peut prouver que les techniques classiques ne peuvent pas fonctionner, c'est le cas des preuves naturelles pour le problème P=NP[5]. Une borne inférieure connue est que la fonction parité n'appartient pas à AC0.