Ir al contenido principal

Función proposicional y cuantificadores...

En entradas anteriores vimos una introducción a lo que es la lógica proposicional y explicamos otros conceptos  útiles.

Resumiendo, habíamos definido una proposición como una frase que tenía una característica especial: tiene un valor de verdad (verdadero o falso, sí o no, correcto o incorrecto, etc.). Como es de imaginar, no todas las frases son proposiciones y dentro de ésas que no lo son encontramos las cuasi-proposiciones.

Estas cuasi-proposiciones son frases que enunciadas de la manera en que lo están no son proposiciones, pero que si las cuantificamos o ejemplificamos pueden transformarse en tales.

Un claro ejemplo son expresiones matemáticas u otras que usamos en programación donde hay variables, donde la expresión en sí no es una proposición pero sí lo es al asignarle un valor.

Por ejemplo: 

  • X >= 5   No es una proposición ya que X puede ser cualquier valor.
  • 7 >= 5   Ahora asignándole un valor cualquiera a X (7 en este caso) podemos decir su valor de verdad y, por lo tanto, pasa a ser una proposición.
*NOTA: En estas expresiones, al igual que nos explicaban en la escuela primaria, tenemos un sujeto y un predicado. En el ejemplo X>=5 , X es el sujeto y el resto de la expresión el predicado.
  
Función proposicional: Es toda expresión que contiene una o más variables que al ser sustituidas por elementos del universo en que estamos trabajando, forman una proposición. 

Esta función no es una proposición en sí, por lo que no tiene valor de verdad, pero si asignamos un valor a su variable independiente (particularizamos para cierto X), la expresión que obtenemos sí lo tiene.

Escribiremos esta función de la forma P(x) donde P es nuestra función proposicional, x nuestro sujeto y luego tendremos nuestra cuasi-proposición.

Por ejemplo: P(x): x>=5 , donde si particularizamos para un cierto x, P(x) da lugar a una proposición.

Cuantificadores

A través de cuantificadores, también podemos conseguir una proposición en base a una función proposicional, generalizando para un conjunto de valores del universo en el que estamos trabajando.



Cuantificador universal: Lo denotamos con el símbolo ∀ y se lee "para todo". Este cuantificador indica que para todos los elementos del universo en cuestión se verifica nuestra función proposicional.

A través de este cuantificador también podemos expresar que para "ninguno" de los elementos del universo se verifica.

  •  ∀x ∈ R, P(x)   (Para todo x perteneciente a R se verifica P(x))

Cuantificador existencial: Lo denotamos con el símbolo ∃ y se lee "existe". Este cuantificador indica que existe aunque sea un elemento x perteneciente al universo que verifica nuestra función proposicional.
  • ∃ x ∈ R: P(x)  (Existe x perteneciente a R que verifica P(x))
Negación de expresiones con cuantificadores:

Para negar expresiones con cuantificadores negamos el cuantificador (la negación de ∀  es ∃ y la de ∃ es )y luego la función proposicional.

Por lo que la negación del cuantificador universal es la afirmación del cuantificador existencial respecto de la proposición negada y viceversa.

Es decir:

  • La negación de ∀x, P(x)  es ∃ x : ¬(P(x))
  • Mientras que la de ∃ x : P(x) es ∀x, ¬(P(x))


Comentarios

Publicar un comentario

Entradas populares de este blog

C: Conversiones de tipo (casting) en C...

El casting o simplemente cast  nos permite hacer una conversión explícita de un tipo de dato a otro, a criterio del programador siempre y cuando estos tipos sean compatibles. Este cast se realiza a través de un operador de conversión de tipos (type casting operator) y es un recurso a tener en cuenta ya que hay situaciones en que nos puede resultar de gran utilidad. Hacer uso de un cast es tan sencillo como poner (tipo de dato)  delante de la expresión o variable a convertir. Veamos un ejemplo: Declaramos una variable de tipo int con un identificador tan creativo como "a" y le realizamos diferentes cast a a para mostrarlo como si fuera un float, un double y un char en un printf. Lo que obtendríamos en pantalla sería lo siguiente: Donde tenemos el valor de nuestro a, a convertido en float y double (mostrándolo con 3 cifras decimales) y a convertido en char. Si vemos este último caso, al hacer la conversión de "a" a char toma a como el código ascii de

C: Ejemplos: Congruencia de Zeller (nivel básico) ...

La Congruencia de Zeller es un algoritmo que se atribuye al matemático alemán Julius Christian Johannes Zeller que vivió en el siglo XIX. Este algoritmo nos permite determinar el día de la semana que le corresponde a una fecha determinada del calendario Gregoriano. La fórmula que nosotros usaremos (con algunas modificaciones respecto de la original para poder usarla en  informática) es la siguiente: Donde h es el día de la semana (entre 0 y 6), J es año/100 (la centuria) y K es año mod 100 (el año de la centuria). Y hay que tener en cuenta que los meses de enero y febrero cuentan como el mes 13 y 14 del año anterior. Ahora que tenemos la fórmula, programemos el algoritmo en C mediante el uso de una función: Analicemos el código paso a paso: Tenemos en cuenta el caso de enero y febrero: Dijimos que estos meses corresponden a los meses 13 y 14 del año anterior por lo que los asignamos como corresponde (mes + 12 , que dará 13 para enero y 14 para febrero) y le rest

Algoritmos: Resolución de problemas y refinamientos en pseudocódigo...

En otras entradas, vimos las partes que debe tener nuestro algoritmo en pseudocódigo y las estructuras que utilizaremos para resolverlo. Ahora llega el turno de implementar todo en conjunto para dar origen a nuestra creación. Pero ¿cómo resolvemos un problema así? Para hacerlo, utilizaremos lo que llamamos refinamientos sucesivos. Este concepto consiste en dividir el problema en subproblemas más pequeños y a estos, a su vez, en otros más pequeños; y así sucesivamente hasta que la solución de los últimos sea trivial, sencillo de resolver. Luego usaremos todas las soluciones obtenidas para armar la solución de nuestro problema mayor. Este principio, tiene base en parte de la técnica divide and conquer (dependiendo de la traducción: "divide y vencerás") que es una de las muchas técnicas de resolución de algoritmos existentes. Como vemos, al dividir el problema en otros más pequeños y más fáciles de resolver, podemos pasar de un problema complicado a uno cuya solución es much