Remove ads
sistema formal diseñado para estudiar la inferencia en los lenguajes de primer orden De Wikipedia, la enciclopedia libre
Una lógica de primer orden, también llamada lógica predicativa, lógica de predicados o cálculo de predicados, es un sistema formal diseñado para estudiar la inferencia en los lenguajes de primer orden.[1] Los lenguajes de primer orden son, a su vez, lenguajes formales con cuantificadores que alcanzan solo a variables de individuo, y con predicados y funciones cuyos argumentos son solo constantes o variables de individuo.[2]
La lógica de primer orden tiene un poder expresivo superior al de la lógica proposicional.
Como el desarrollo histórico y las aplicaciones de la lógica de primer orden están muy ligados a la matemática, en lo que sigue se hará una introducción que contemple e ilustre esta relación, tomando ejemplos tanto de la matemática como del lenguaje natural. Primero se introducen cada uno de los conceptos básicos del sistema, y luego se muestra cómo utilizarlos para analizar argumentos.
Un predicado es una expresión lingüística que se puede conectar con una o varias otras expresiones para formar una oración.[3] Por ejemplo, en la oración «Marte es un planeta», la expresión «es un planeta» es un predicado que se conecta con la expresión «Marte» para formar una oración. Y en la oración «Júpiter es más grande que Marte», la expresión «es más grande que» es un predicado que se conecta con dos expresiones, «Júpiter» y «Marte», para formar una oración.
En lógica matemática, cuando un predicado se conecta con una expresión, se dice que expresa una propiedad (como la propiedad de ser un planeta), y cuando se conecta con dos o más expresiones, se dice que expresa una relación (como la relación de ser más grande que). Sin embargo, la lógica de primer orden no hace ningún supuesto sobre si existen o no las propiedades o las relaciones. Solo se ocupa de estudiar el modo en que hablamos y razonamos con expresiones lingüísticas.
En la lógica de primer orden, los predicados son tratados como funciones. Una función es, metafóricamente hablando, una máquina que recibe un conjunto de cosas, las procesa, y devuelve como resultado una única cosa. A las cosas que entran a las funciones se las llama argumentos,[4] y a las cosas que salen, valores o imágenes. Considérese por ejemplo la siguiente función matemática:
Esta función toma números como argumentos y devuelve más números como valores. Por ejemplo, si toma el número 1, devuelve el número 2, y si toma el 5, devuelve el 10. En la lógica de primer orden, se propone tratar a los predicados como funciones que no solo toman números como argumentos, sino expresiones como «Marte», «Mercurio» y otras que se verán más adelante. De este modo, la oración «Marte es un planeta» puede transcribirse, siguiendo la notación propia de las funciones, de la siguiente manera:
O, más abreviadamente:
En la matemática existen además funciones que toman varios argumentos. Por ejemplo:
Esta función, si toma los números 1 y 2, devuelve el número 3, y si toma el -5 y el -3, devuelve el -8. Siguiendo esta idea, la lógica de primer orden trata a los predicados que expresan relaciones, como funciones que toman dos o más argumentos. Por ejemplo, la oración «Caín mató a Abel» se puede formalizar así:
O abreviando:
Este procedimiento se puede extender para tratar con predicados que expresan relaciones entre muchas entidades. Por ejemplo, la oración «Ana está sentada entre Bruno y Carlos» puede formalizarse:
Una constante individual es una expresión lingüística que refiere a una entidad. Por ejemplo «Marte», «Júpiter», «Caín» y «Abel» son constantes de individuo. También lo son las expresiones «1», «2», etc., que refieren a números. Una entidad no tiene que existir para que se pueda hablar acerca de ella, de modo que la lógica de primer orden tampoco hace supuestos acerca de la existencia o no de las entidades a las que refieren sus constantes individuales.
Además de las constantes individuales que hacen referencia a entidades determinadas, la lógica de primer orden cuenta con otras expresiones, las variables, cuya referencia no está determinada. Su función es similar a la de las expresiones del lenguaje natural como «él», «ella», «esto», «eso» y «aquello», cuyo referente varía con el contexto. Las variables generalmente se representan con letras minúsculas cerca del final del alfabeto latino, principalmente la x, y y z. Del mismo modo, en la matemática, la x en la función f(x) = 2x no representa ningún número en particular, sino que es algo así como un espacio vacío donde se pueden insertar distintos números. En conclusión, podemos representar una expresión como «esto es antiguo» con la expresión:
O abreviadamente:
Es evidente, sin embargo, que hasta que no se determine a qué refiere la x, no es posible asignar un valor de verdad a la expresión «esto es antiguo», del mismo modo que hasta que no se determine un número para la x en la función f(x) = 2x, no será posible calcular ningún valor para la función.
Por supuesto, al igual que con las constantes individuales, las variables sirven también para formalizar relaciones. Por ejemplo, la oración «esto es más grande que aquello» se formaliza:
Y también se pueden combinar constantes individuales con variables. Por ejemplo en la oración «ella está sentada entre Bruno y Carlos»:
Considérese ahora la siguiente expresión matemática:
Esta expresión no es ni verdadera ni falsa, y parece que no lo será hasta que no reemplacemos a la x por algún número cualquiera. Sin embargo, también es posible dar un valor de verdad a la expresión si se le antepone un cuantificador. Un cuantificador es un operador sobre un conjunto de individuos, se trata de un recurso expresivo que permite construir proposiciones sobre conjuntos o dicho de otra forma,[5] un cuantificador es una expresión que afirma que una condición se cumple para un cierto número de individuos.[6] En la lógica clásica, los dos cuantificadores más estudiados son el cuantificador universal y el cuantificador existencial.[6] El primero afirma que una condición se cumple para todos los individuos de los que se está hablando,[6] y el segundo que se cumple para al menos uno de los individuos.[6] Por ejemplo, la expresión "para todo x" es un cuantificador universal, que antepuesto a "x < 3", produce:
Esta es una expresión con valor de verdad, en particular, una expresión falsa, pues existen muchos números (muchos x) que son mayores que tres. Anteponiendo en cambio la expresión "para al menos un x", un cuantificador existencial, se obtiene:
La cual resulta ser una expresión verdadera.
Adviértase ahora, sin embargo, que el valor de verdad de las dos expresiones anteriores depende de qué números se esté hablando. Si cuando se afirma "para todo x, x < 3", se está hablando solo de los números negativos, por ejemplo, entonces la afirmación es verdadera. Y si al afirmar "para al menos un x, x < 3" se está hablando solamente de los números 3, 4 y 5, entonces la afirmación es falsa. En lógica, a aquello de lo que se está hablando cuando se usa algún cuantificador, se lo llama el dominio de discurso.[7]
Esta maquinaria se puede adaptar fácilmente para formalizar oraciones con cuantificadores del lenguaje natural. Tómese por caso la afirmación "todos son amigables". Esta oración se puede traducir así:
Y una oración como "alguien está mintiendo" puede traducirse:
También es frecuente traducir esta última oración así:
A continuación se formalizan ambas oraciones, introduciendo a la vez la notación especial para los cuantificadores:
Para todo x, x es amigable. | ∀x A(x) |
Existe al menos un x, tal que x está mintiendo. | ∃x M(x) |
La lógica de primer orden incorpora además las conectivas de la lógica proposicional. Combinando las conectivas con los predicados, constantes, variables y cuantificadores, es posible formalizar oraciones como las siguientes:
Oración | Formalización |
---|---|
Sócrates es sabio y prudente. | Ss ∧ Ps |
Si Sócrates es sabio, entonces también es prudente. | Ss → Ps |
Nadie es sabio y además prudente. | ¬∃x (Sx ∧ Px) |
Todos los sabios son prudentes. | ∀x (Sx → Px) |
Considérese el siguiente argumento clásico:
La tarea de la lógica de primer orden consiste en determinar por qué los argumentos como este resultan válidos. Para eso, el primer paso es traducirlos a un lenguaje más preciso, que pueda ser analizado mediante métodos formales. Según lo visto más arriba, la formalización de este argumento es la siguiente:
A continuación se define un lenguaje formal, Q, y luego se definen axiomas y reglas de inferencia sobre ese lenguaje que dan como resultado el sistema lógico SQ.
El alfabeto del lenguaje formal Q consta de los siguientes símbolos:
A partir de estos símbolos, se definen las siguientes nociones:
Un nombre (o constante individual) es una a seguida de una o más comillas. Por ejemplo, a', a'' y a'''''' son nombres. Para facilitar la lectura, se suelen omitir las comillas y utilizar distintas letras cerca del comienzo del alfabeto latino, con o sin subíndices, para distinguir nombres distintos: a, b, c, d, e, a1, a3, c9, etc.
Una variable (o variable individual) es una x seguida de una o más comillas. Por ejemplo, x', x'' y x'''''' son variables. Para facilitar la lectura, se suelen omitir las comillas y utilizar distintas letras cerca del final del alfabeto latino, con o sin subíndices, para distinguir variables distintas: x, y, z, x1, x3, z9, etc.
Un functor es una f seguida de uno o más asteriscos, y luego de una o más comillas. Por ejemplo, f *', f **'''' y f ****'' son functores. El número de asteriscos indica la aridad del functor. Para facilitar la lectura, se suelen omitir los asteriscos y las comillas y utilizar distintas letras del alfabeto latino cerca de la f, con o sin subíndices, para distinguir functores distintos: f, g, h, f1, f3, h9, etc.
Un predicado es una P seguida de uno o más asteriscos, y luego de una o más comillas. Por ejemplo, P *', P **'''' y P ****'' son predicados. El número de asteriscos indica la aridad del predicado. Para facilitar la lectura, se suelen omitir los asteriscos y las comillas y utilizar distintas letras en mayúscula a lo largo del alfabeto latino para distinguir predicados distintos: P, A, B, C, S, T, etc.
La noción de término se define recursivamente mediante las siguientes cláusulas:
Según esta definición, las siguientes cadenas de caracteres son términos:
Cadena | Simplificación | Posible interpretación |
---|---|---|
a' | a | Aristóteles |
x''''' | y | |
f *'''(a''') | h(c) | El hermano de Caín |
f *''(f *''(f *''(a'))) | f(f(f(b))) | El padre del padre del padre de Beatriz |
Y en cambio, las siguientes cadenas de caracteres no son términos:
Cadena | Error |
---|---|
a | Faltan comillas. |
x*''' | Sobra el asterisco. |
f ' | Faltan asteriscos y argumentos. |
f ** | Faltan comillas y argumentos. |
f *'(f *') | Falta el argumento del functor más anidado. |
f *'(a',a'') | El functor es de aridad 1 pero tiene dos argumentos. |
La noción de fórmula bien formada de Q se define a través de las siguientes cláusulas:
Según esta definición, las siguientes cadenas de caracteres son fórmulas bien formadas:
Cadena | Simplificación | Posible interpretación |
---|---|---|
P *'(a') | Pa | Abel es pastor. |
P **''''(a'',a''') | Aae | Abelardo ama a Eloísa. |
¬P *'(f *'(a')) | ¬P(h(a)) | El hermano de Abel no es pastor. |
(P *'''(a'') → ¬P *'''''(a'')) | Pv → ¬Ev | Si Venus es un planeta, entonces no es una estrella. |
∀x'' P *'''(x'') | ∀x Mx | Todos son mentirosos. |
∀x'' ∃x'''' P **'(x'',x'''') | ∀x ∃y Axy | Todos aman a alguien. |
∃x'' ∀x'''' P **'(x'',x'''') | ∃x ∀y Axy | Alguien ama a todos. |
Y en cambio, las siguientes cadenas de caracteres no son fórmulas bien formadas:
Cadena | Error |
---|---|
P *' | El predicado es de aridad 1 pero no tiene argumentos. |
P ***'(a') | El predicado es de aridad 3 pero tiene un solo argumento. |
P *'(a') → P *'(a''') | Faltan los paréntesis externos. |
(P *'(a')) | Sobran los paréntesis externos. |
∀a' P *'(a') | El cuantificador está seguido de un nombre en vez de una variable. |
Para ciertos predicados muy utilizados, la notación estándar puede tener la forma a R b en vez de R(a,b). Por ejemplo, se escribe 2 > 1 en vez de >(2,1), y 4 = 4 en vez de =(4,4). Análogamente, si f es un functor de aridad 2, a veces se escribe a f b en vez de f(a,b). Por ejemplo, se escribe 1 + 2 en vez de +(1,2).
Las nociones de variable libre y variable ligada se introducen para evitar un posible error en el proceso de substitución. Supongamos por un momento la fórmula . Intuitivamente, esta fórmula dice que para todo x, x es menor o igual que y (es decir, que y es máximo). En esta fórmula, y es una variable libre, o sea que no está bajo el alcance de ningún cuantificador. Si substituimos y por cualquier otro término t, entonces la fórmula pasará a decir que t es máximo. Pero supongamos ahora que substituimos a y por x mismo (a fin de cuentas, x es un término). En ese caso, y pasa a estar ligada por un cuantificador universal, porque la nueva fórmula es: . Pero esta fórmula ya no dice de un término que es máximo, sino algo muy distinto. Para evitar este tipo de desplazamiento de significado, convenimos que al substituir una variable libre por un término cualquiera, hay que evitar que las variables libres en el nuevo término queden ligadas por algún cuantificador. Es decir, que permanezcan libres.
Dicho de una manera más general, si t es un término y es una fórmula que posiblemente contiene a x como una variable libre, entonces es el resultado de substituir todas las apariciones libres de x por t, suponiendo que ninguna variable libre en t se vuelva ligada en este proceso. Si alguna variable libre de t se volviera ligada, entonces para substituir t por x se necesita cambiar los nombres de las variables ligadas de por otros que no coincidan con las variables libres de t.
Hay varias maneras diferentes de introducir la noción de identidad en la lógica de primer orden, pero todas con esencialmente las mismas consecuencias. Esta sección resume las principales:
La lógica de primer orden tiene dos reglas de inferencia. La primera es el modus ponens, heredada de la lógica proposicional. La segunda es la regla de Generalización universal, que es característica de la lógica de primer orden. La misma dice:
O en la notación del cálculo de secuentes:
Es decir: a partir de A es posible concluir que ∀x A.
Nótese que la regla de generalización universal es análoga a la regla de Necesitación de la lógica modal.
Los axiomas considerados aquí son los axiomas lógicos los cuales son parte del cálculo de predicados. Al formalizar teorías de primer orden particulares (como la aritmética de Peano) se agregan axiomas no-lógicos específicos, es decir axiomas que no se consideran verdades de la lógica pero sí verdades de una teoría particular.
Cuando el conjunto de axiomas es infinito, se requiere de un algoritmo que pueda decidir para una fórmula bien formada si es un axioma o no. Más aún, debería existir un algoritmo que pueda decidir si la aplicación de una regla de inferencia es correcta o no.
Es importante notar que el cálculo de predicados puede ser axiomatizado de varias formas diferentes. No existe nada canónico sobre los axiomas y reglas de inferencia aquí dadas, pero cualquier formalización produce los mismos teoremas de la lógica (y permite deducir los mismos teoremas de cualquier conjunto de axiomas no-lógicos).
Los siguientes tres axiomas son heredados de la lógica proposicional y se incorporan a la lógica de primer orden. Sean A, B y C fórmulas bien formadas de Q. Luego, los siguientes son axiomas lógicos:
Los dos axiomas siguientes son característicos de la lógica de primer orden. Sean A y B fórmulas bien formadas de Q con como máximo una variable libre, x. Sea t un término cerrado y A(x/t) el resultado de reemplazar toda aparición de x en A por t. Luego, los siguientes son axiomas lógicos:
Intuitivamente, el cuarto axioma dice que lo que vale para todos vale para cualquiera. Por ejemplo, un caso particular del axioma podría ser: «Si todos son mortales, entonces Abel es mortal»; o también: «Si todos son mortales, entonces el padre de Mateo es mortal» El quinto axioma es análogo al axioma K de la lógica modal, y un caso particular del mismo podría ser: «Si todos los humanos son mortales, entonces, si todos son humanos, todos son mortales.»
Una interpretación es un par <D,I>, donde D es un conjunto no vacío llamado el dominio de discurso e I es una función llamada la función de interpretación definida como sigue:
Luego es posible definir la noción de verdad para una interpretación (para las oraciones de Q):[8]
Para dar las definiciones de verdad para fórmulas con la forma ∀x A o ∃x A, primero son necesarias algunas definiciones preliminares: Sea A(x/a) el resultado de reemplazar toda aparición de x en A por un nombre a (que no haya sido utilizado en la fórmula). Además, si M y M' son interpretaciones y a un nombre, entonces M' es una a-variante de M si y solo si M' es idéntica a M o difiere solo en el elemento del dominio que le asigna al nombre a.[9]
Una fórmula es falsa bajo una interpretación si y solo si no es verdadera bajo esa interpretación.
A partir de esto se pueden definir varias otras nociones semánticas:
Una cuestión fundamental en lógica es estudiar las relaciones que se establecen en los cálculos entre las estructuras sintácticas y sus interpretaciones semánticas que se establecen en los cálculos. Este estudio proporciona una visión de la utilidad del cálculo como herramienta deductiva. Pues bien la disciplina que estudia los cálculos lógicos es la Metalógica y las propiedades importantes que pretende establecer para estos cálculos son Consistencia, Completitud y Decidibilidad .[5]
La lógica de primer orden es uno de los sistemas lógicos con propiedades metalógicas mejor conocidas. A continuación se introducen algunas de las más importantes.
Un cálculo es consistente si toda fórmula que se deriva en el cálculo es una verdad lógica.
Formalmente el teorema de consistencia se expresa de la siguiente forma:
Interpretando: ├ como 'se deduce lógicamente de' y ╞ como 'es consecuencia semántica de'
Si ├ A, entonces ╞ A
O si se considera como consecuencia de un conjunto de fórmulas, Γ:
Si Γ ├ A, entonces Γ ╞ A
El teorema de completitud de Gödel, demostrado por Kurt Gödel en 1929, establece que existen sistemas de primer orden en los que todas las fórmulas lógicamente válidas son demostrables. Esto quiere decir que dado un lenguaje de primer orden Q, es posible seleccionar algunas fórmulas como axiomas, y algunas reglas de inferencia, de modo tal que todas las fórmulas lógicamente válidas (verdaderas bajo cualquier interpretación) sean demostrables a partir de los axiomas y las reglas de inferencia. Un ejemplo de axiomas y reglas de inferencia que permiten demostrar completitud son los que se dieron más arriba en este artículo.
Un sistema es decidible cuando existe al menos un método efectivo (un algoritmo) para decidir si una fórmula cualquiera del lenguaje del sistema es lógicamente válida o no. Por ejemplo, en la lógica proposicional, la evaluación de las fórmulas mediante tablas de verdad es un método efectivo para decidir si una fórmula cualquiera es lógicamente válida (una tautología). En este sentido, la lógica de primer orden es indecidible, siempre y cuando tenga al menos un predicado de aridad 2 o más (distinto de la identidad). Este resultado fue alcanzado de manera independiente por Alonzo Church en 1936 y por Alan Turing en 1937, dando así una respuesta negativa al Entscheidungsproblem planteado por David Hilbert en 1928. Por otra parte, la lógica de primer orden monádica (con o sin identidad) es decidible, como lo demostró Leopold Löwenheim en 1915.
El teorema de Löwenheim-Skolem establece que si una teoría de primer orden numerable tiene un modelo infinito, entonces para cualquier número cardinal K, la teoría tiene un modelo de cardinalidad K.
En este contexto, una teoría de primer orden es simplemente un conjunto de fórmulas en un lenguaje de primer orden. Una teoría es numerable si sus fórmulas pueden ser puestas en correspondencia biunívoca con algún subconjunto (finito o infinito) de los números naturales. Y una teoría tiene un modelo infinito si tiene al menos una interpretación con un dominio infinito que hace verdaderas a todas las fórmulas de la teoría. Lo que el teorema de Löwenheim-Skolem afirma, entonces, es que si una teoría tiene una interpretación con un dominio infinito que hace verdaderas a todas las fórmulas de la teoría, entonces también tiene interpretaciones con dominios de cualquier cardinalidad que hacen verdaderas a todas las fórmulas de la teoría.
Esto significa que las lógicas de primer orden son incapaces de controlar la cardinalidad de sus modelos infinitos: si una teoría tiene un modelo infinito, entonces también tiene modelos infinitos de todas las cardinalidades. Una consecuencia de esto es que por ejemplo, la aritmética de Peano, que es una teoría de primer orden, tendrá como modelo no solo al conjunto de los números naturales (que sería lo deseable), sino también al conjunto de los números reales e infinitos otros conjuntos de mayor cardinalidad.
El teorema de compacidad afirma que un conjunto de fórmulas de primer orden tiene un modelo si y solo si todo subconjunto finito de ese conjunto tiene un modelo. Esto implica que si una fórmula es una consecuencia lógica de un conjunto infinito de axiomas, entonces es una consecuencia lógica de algún subconjunto finito de ellos.
El teorema fue demostrado por primera vez por Kurt Gödel como una consecuencia del teorema de completitud, pero con el tiempo se han encontrado varias demostraciones adicionales. El teorema es una herramienta central en teoría de modelos, ya que provee un método fundamental para construir modelos.
El teorema de Lindström establece que la lógica de primer orden es el sistema lógico más fuerte que cumple con el teorema de compacidad y el teorema descendente de Löwenheim-Skolem. Esto significa que el cumplimiento de esos dos teoremas caracteriza a la lógica de primer orden. Fue demostrado por Per Lindström, quien también definió la clase de los sistemas lógicos abstractos, permitiendo así la comparación entre sistemas.
Dónde ubicar los orígenes de la lógica de primer orden depende de lo que se entienda por lógica de primer orden. Si se entiende cualquier sistema lógico en torno a la cuantificación sobre individuos, entonces la lógica de primer orden es tan antigua como la lógica misma, y sus orígenes se remontan al Órganon de Aristóteles. Aristóteles realizó una gran cantidad de observaciones y contribuciones acerca del comportamiento de los cuantificadores «todos», «algunos», «ningún», etc. Construyó, por ejemplo, el famoso cuadro de oposición de los juicios, y ofreció una influyente clasificación para los distintos juicios con cuantificadores.
Sin embargo, si por lógica de primer orden se entiende un sistema lógico similar al expuesto en este artículo, entonces los orígenes de la lógica de primer orden se deben buscar recién en el siglo XIX, en la obra de Gottlob Frege.[10] En 1879, Frege publicó su Conceptografía (Begriffsschrift), donde presentó el primer sistema de lógica de predicados tal como lo entendemos hoy (aunque con una notación muy diferente a la actual).[10] Luego lo refinaría en un trabajo de 1893 (y reeditado en 1903) titulado Los fundamentos de la aritmética (Grundgesetze der Arithmetik).[10] Sin embargo, la notación de Frege era difícil de entender,[11] y sus revolucionarias contribuciones permanecieron desconocidas por varios años.[12]
Entre 1910 y 1913, Bertrand Russell y Alfred North Whitehead publicaron Principia Mathematica, una monumental obra directamente influida por los trabajos de Frege.[13] Con ella la lógica de predicados en general, y la lógica de primer orden en particular, cobraron una forma más familiar y alcanzaron una mayor audiencia.[13]
Luego de Principia Mathematica comenzó una fértil época de resultados metalógicos para la lógica de primer orden (y otras). En 1915, Leopold Löwenheim demostró la consistencia, completitud semántica y decidibilidad de la lógica de primer orden monádica. En 1928, David Hilbert y Wilhelm Ackermann demostraron la consistencia de la lógica de primer orden. En 1929, Kurt Gödel demostró la completitud semántica de la lógica de primer orden. Y en 1936, Alonzo Church y Alan Turing demostraron, de manera independiente, la indecibilidad de la lógica de primer orden (no monádica).
En 1933, Alfred Tarski abrió otro capítulo en la historia de la lógica de primer orden (y de la lógica en general), con la publicación de sus definiciones de verdad para lenguajes formales. Las mismas permitieron el surgimiento de la teoría de modelos. En su trabajo, Tarski ofreció una definición de verdad para el lenguaje de la lógica de primer orden (entre otros) que todavía se utiliza. Dicha definición permitió refinar las demostraciones de consistencia y completitud semántica para la lógica de primer orden.
En 1934-1935, Gerhard Gentzen publicó Investigaciones sobre la inferencia lógica (Untersuchungen über das logische Schliessen), donde introdujo una alternativa a la construcción axiomática de los sistemas lógicos (incluyendo la lógica de primer orden), conocida como la deducción natural.[14] Gentzen pronto desarrollaría la deducción natural hasta llegar al cálculo de secuentes, y con la demostración del teorema de corte-eliminación (cut-elimination theorem), proveyó una nueva aproximación a la teoría de la demostración.[14]
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.