Introducción a los Algoritmos
Inducción y Cálculo de Predicados

Inducción

La inducción un método para demostrar la validez de propiedades sobre estructuras de datos recursivas, como listas o árboles, utilizando un caso base y un paso inductivo.

La idea que rige este principio consiste en demostrar dos cosas:

  • Por un lado verificar que la propiedad se satisface para los elementos “más chicos” del dominio (por ejemplo, la lista [][]).

  • Por otro lado demostrar para un elemento arbitrario del dominio (por ejemplo, la lista (x    xs)(x\;▹\;xs)) que si suponemos que la propiedad es cierta para todos los elementos más chicos que él (por ejemplo xsxs), entonces la propiedad también es satisfecha por ese elemento.

Dado que todo elemento de un dominio inductivo puede ser “construido” a partir de elementos más simples, este procedimiento demuestra que la propiedad es satisfecha por todos los elementos del dominio, y por lo tanto es válida.

Ejercicios resueltos - Inducción en funciones

Considerando las siguientes funciones, probar las siguientes propiedades por inducción.

sumatoria:[Int]Intsumatoria.[]  =˙  0sumatoria.(x    xs)  =˙  x+sumatoria.xs\begin{equation*} \begin{aligned} &sumatoria : [Int] \rightarrow Int \\ &sumatoria.[ ] \; \dot{=} \; 0 \\ &sumatoria.(x \;▹ \;xs) \; \dot{=} \; x + sumatoria.xs \end{aligned} \end{equation*} sumar1:[Int][Int]sumar1.[]  =˙  []sumar1.(x    xs)  =˙  (x+1)    sumar1.xs\begin{equation*} \begin{aligned} &sumar1 : [Int] \rightarrow [Int] \\ &sumar1.[ ] \; \dot{=} \; [ ] \\ &sumar1.(x \;▹ \;xs) \; \dot{=} \; (x + 1) \;▹ \;sumar1.xs \end{aligned} \end{equation*} length:[a]Intlength.[]  =˙  0length.(x    xs)  =˙  1+length.xs\begin{equation*} \begin{aligned} &length : [a] \rightarrow Int \\ &length.[ ] \; \dot{=} \; 0 \\ &length.(x \;▹ \;xs) \; \dot{=} \; 1 + length.xs \end{aligned} \end{equation*}

1.

length.xs0length.xs \geq 0

Definimos el caso base (xs=[]xs = [ ]):

length.[]0\underline{length.[ ]} \geq 0

{ Caso base de lengthlength }

00\underline{0 \geq 0}

{ Aritmética }

TrueTrue

Definimos el paso inductivo (xs=(x    xs)xs = (x \;▹ \;xs)):

length.(x    xs)0\underline{length.(x \;▹ \;xs)} \geq 0

{ Definición de lengthlength }

1+length.xs0\underline{1 + length.xs \geq 0 }

{ Aritmética }

TrueTrue

2.

sumatoria.(sumar1.xs)=sumatoria.xs+length.xssumatoria.(sumar1.xs) = sumatoria.xs + length.xs

Definimos el caso base (xs=[]xs = [ ]):

sumatoria.(sumar1.[])=sumatoria.[]+length.[]\underline{sumatoria.(sumar1.[ ])} = \underline{sumatoria.[ ]} + \underline{length.[ ]}

{ Caso base de sumar1,length,sumatoriasumar1, length, sumatoria }

sumatoria.[]=0+0\underline{sumatoria.[ ]} = \underline{0 + 0}

{ Caso base de sumatoriasumatoria, Aritmética }

0=0\underline{0 = 0}

{ Aritmética }

TrueTrue

Definimos el paso inductivo (xs=(x    xs)xs = (x \;▹ \;xs)):

sumatoria.(sumar1.(x    xs))=sumatoria.(x    xs)+length.(x    xs)sumatoria.(\underline{sumar1.(x \;▹ \;xs)}) = \underline{sumatoria.(x \;▹ \;xs)} + \underline{length.(x \;▹ \;xs)}

{ Definición de sumar1,length,sumatoriasumar1, length, sumatoria }

sumatoria.((x+1)    sumar1.xs)=x+sumatoria.xs+1+length.xs\underline{sumatoria.((x + 1) \;▹ \;sumar1.xs)} = x + sumatoria.xs + 1 + length.xs

{ Definición de sumatoriasumatoria }

(x+1)+sumatoria.(sumar1.xs)=x+sumatoria.xs+1+length.xs(x + 1) + \underline{sumatoria.(sumar1.xs)} = x + sumatoria.xs + 1 + length.xs

{ Hipótesis Inductiva }

(x+1)+(sumatoria.xs+length.xs)=x+sumatoria.xs+1+length.xs\underline{(x + 1) + (sumatoria.xs + length.xs) = x + sumatoria.xs + 1 + length.xs}

{ Asociatividad de ++, reflexividad de == }

TrueTrue

Considerando las siguientes funciones, probar las siguientes propiedades por inducción.

sacaUnos:[Int][Int]sacaUnos.[]  =˙  []sacaUnos.(x    xs)  =˙  (x=1sacaUnos.xs  x1x    sacaUnos.xs)\begin{equation*} \begin{aligned} &sacaUnos : [Int] \rightarrow [Int] \\ &sacaUnos.[ ] \; \dot{=} \; [ ] \\ &sacaUnos.(x \;▹ \;xs) \; \dot{=} \; ( \\ &x = 1 → sacaUnos.xs \\ &□ \; x \neq 1 → x \;▹ \;sacaUnos.xs \\ &) \end{aligned} \end{equation*} productoria:[Int]Intproductoria.[]  =˙  1productoria.(x    xs)  =˙  xproductoria.xs\begin{equation*} \begin{aligned} &productoria : [Int] \rightarrow Int \\ &productoria.[ ] \; \dot{=} \; 1 \\ &productoria.(x \;▹ \;xs) \; \dot{=} \; x * productoria.xs \end{aligned} \end{equation*}

3.

productoria.(sacaUnos.xs)=productoria.xsproductoria.(sacaUnos.xs) = productoria.xs

Definimos el caso base (xs=[]xs = [ ]):

productoria.(sacaUnos.[])=productoria.[]productoria.(\underline{sacaUnos.[ ]}) = \underline{productoria.[ ]}

{ Caso base de sacaUnos,productoriasacaUnos, productoria }

productoria.[]=1\underline{productoria.[]} = 1

{ Caso base de productoriaproductoria }

1=1\underline{1 = 1}

{ Reflexividad de == }

TrueTrue

Definimos el paso inductivo (xs=(x    xs)xs = (x \;▹ \;xs)):

productoria.(sacaUnos.(x    xs))=productoria.(x    xs)productoria.(sacaUnos.(x \;▹ \;xs)) = productoria.(x \;▹ \;xs)

Caso 1: x=1x = 1

productoria.(sacaUnos.(x    xs))=productoria.(x    xs)productoria.(\underline{sacaUnos.(x \;▹ \;xs)}) = \underline{productoria.(x \;▹ \;xs)}

{ Definición de sacaUnos,productoriasacaUnos, productoria }

productoria.(sacaUnos.xs)=1productoria.xs\underline{productoria.(sacaUnos.xs)} = \underline{1 * productoria.xs}

{ Hipótesis Inductiva, Aritmética }

productoria.xs=productoria.xs\underline{productoria.xs = productoria.xs}

{ Reflexividad de == }

TrueTrue

Caso 2: x1x \neq 1

productoria.(sacaUnos.(x    xs))=productoria.(x    xs)productoria.(\underline{sacaUnos.(x \;▹ \;xs)}) = \underline{productoria.(x \;▹ \;xs)}

{ Definición de sacaUnos,productoriasacaUnos, productoria }

productoria.(x    sacaUnos.xs)=xproductoria.xs\underline{productoria.(x \;▹ \;sacaUnos.xs)} = \underline{x * productoria.xs}

{ Definición de productoriaproductoria }

xproductoria.(sacaUnos.xs)=xproductoria.xs\underline{x * productoria.(sacaUnos.xs)} = x * productoria.xs

{ Hipótesis Inductiva}

xproductoria.xs=xproductoria.xs\underline{x * productoria.xs = x * productoria.xs}

{ Reflexividad de == }

TrueTrue

Al ser verdadera para ambos casos, la propiedad es válida.

Cálculo de Predicados

El cálculo de predicados es una técnica permite demostrar propiedades sobre estructuras de datos recursivas, como listas o árboles, utilizando reglas de inferencia y cuantificadores.

Semántica de Lógica de Predicados

La lógica de cuantificadores extiende la lógica proposicional incorporando dos operadores de cuantificación y el uso de predicados:

  • El cuantificador universal permite expresar que una fórmula se satisface para todo valor posible del universo.

Por ejemplo, si tenemos el predicado mult3.xmult3.x (devuelve TrueTrue si xx es múltiplo de 33 y FalseFalse en caso contrario) el predicado “todo xx es múltiplo de 33” se puede expresar formalmente como: x::mult3.x⟨∀x : : mult3.x⟩.

  • El cuantificador existencial expresa que la propiedad es satisfecha por al menos un valor posible del universo.

Por ejemplo, la expresión   x::mult3.x  \bigl \langle \; ∃x : : mult3.x \; \bigr \rangle significa “existe un xx que es múltiplo de 33”.

Para restringir o hacer explícito el universo al que nos referimos se utilizan otros predicados que diferenciamos como rango. Por ejemplo, si queremos restringir el universo a aquellos elementos que cumplen con una determinada propiedad R.xR.x lo denotamos de la siguiente manera:

  x:R.x:T.x  \bigl \langle \; ∀x : R.x : T.x \; \bigr \rangle   x:R.x:T.x  \bigl \langle \; ∃x : R.x : T.x \; \bigr \rangle

Si decimos que “todos los hombres son mortales” lo podemos expresar formalmente como:

  x:hombre.x:mortal.x  \bigl \langle \; ∀x : hombre.x : mortal.x \; \bigr \rangle

Si nuestro rango es verdadero para todos los elementos, podemos omitirlo y escribir simplemente:

  x::T.x  \bigl \langle \; ∀x :: T.x \; \bigr \rangle   x::T.x  \bigl \langle \; ∃x :: T.x \; \bigr \rangle

Tanto los corchetes   \bigl \langle \; \bigr \rangle como el par de “dos puntos” (::) sirven para delimitar las distintas partes de las expresiones cuantificadas. Por tal motivo, las agrupan como paéntesis y esto debería ayudar a evitar confusiones de asociatividad y precedencia.

Utilizaremos los cuantificadores en esta asignatura es para expresar propiedades sobre listas. En general, nos interesa referirnos a los elementos de la lista por lo que definiremos el predicado xxsx ∈_ℓ xs como “xx está en la lista xsxs”. Este predicado se puede definir recursivamente en Haskell como la función pert:

pert :: Eq a => a -> [a] -> Bool
pert e [] = False
pert e (x:xs) = e==x || (pert e xs)
 
-- pert 3 [1,2,3,4,5] 
-- True

Por ejemplo, si queremos decir que “todos los elementos de la lista xsxs son múltiplos de 33” lo podemos expresar utilizando el cuantificador universal y el predicado que ya definimos:

  x:xxs:mult3.x  \bigl \langle \; ∀x : x ∈_ℓ xs : mult3.x \; \bigr \rangle

Ejercicios resueltos - Semántica de Lógica de Predicados

Dada una lista de figuras xsxs las siguientes propiedades, expresar formalmente y en Haskell utilizando los cuantificadores y los predicados y funciones ya definidas:

1.

Todas las figuras de xsxs son rojas.

  x:xxs:roja.x  \bigl \langle \; ∀x : x ∈_ℓ xs : roja.x \; \bigr \rangle
propA :: [Figura] -> Bool
 
propA [] = True
propA (x : xs) = roja x && propA xs
 
-- propA [Circulo Rojo 3, Cuadrado Azul 4, Triangulo Rojo 5]
-- False

2.

Todas las figuras de xsxs son de tamaño menor a 55.

  x:xxs:taman~o.x<5  \bigl \langle \; ∀x : x ∈_ℓ xs : tamaño.x < 5 \; \bigr \rangle
propB :: [Figura] -> Bool
 
propB [] = True
propB (x : xs) = tamaño x < 5 && propB xs
 
-- propB [Circulo Rojo 3, Cuadrado Azul 4, Triangulo Rojo 5]
-- True

3.

Todos los triángulos de xsxs son rojos.

  x:xxs:triangulo.xroja.x  \bigl \langle \; ∀x : x ∈_ℓ xs : triangulo.x ∧ roja.x \; \bigr \rangle
propC :: [Figura] -> Bool
 
propC [] = True
propC (x : xs) = (triangulo x && roja x) && propC xs
 
-- propC [Circulo Rojo 3, Cuadrado Azul 4, Triangulo Rojo 5]
-- False

4.

Existe un cuadrado verde en xsxs.

  x:xxs:cuadrado.xverde.x  \bigl \langle \; ∃x : x ∈_ℓ xs : cuadrado.x ∧ verde.x \; \bigr \rangle
propD :: [Figura] -> Bool
 
propD [] = False
propD (x : xs) = (cuadrado x && verde x) || propD xs
 
-- propD [Circulo Rojo 3, Cuadrado Azul 4, Triangulo Rojo 5]
-- False

5.

Todos los círculos de xsxs son azules y de tamaño menor a 1010.

  x:xxs:circulo.xazul.xtaman~o.x<10  \bigl \langle \; ∀x : x ∈_ℓ xs : circulo.x ∧ azul.x ∧ tamaño.x < 10 \; \bigr \rangle
propE :: [Figura] -> Bool
 
propE [] = True
propE (x : xs) = (circulo x && azul x && tamaño x < 10) && propE xs
 
-- propE [Circulo Rojo 3, Cuadrado Azul 4, Triangulo Rojo 5]
-- False

6.

Ningún triángulo de xsxs es azul.

  x:xxs:triangulo.x¬azul.x  \bigl \langle \; ∀x : x ∈_ℓ xs : triangulo.x ∧ ¬ azul.x \; \bigr \rangle
propF :: [Figura] -> Bool
 
propF [] = True
propF (x : xs) = not (triangulo x && azul x) && propF xs
 
-- propF [Circulo Rojo 3, Cuadrado Azul 4, Triangulo Rojo 5]
-- True

7.

En xsxs no hay círculos amarillos ni verdes.

  x:xxs:¬amarillo.x¬verde.x  \bigl \langle \; ∀x : x ∈_ℓ xs : ¬ amarillo.x ∧ ¬ verde.x \; \bigr \rangle
propG :: [Figura] -> Bool
 
propG [] = True
propG (x : xs) = not (amarillo x) && not (verde x) && propG xs
 
-- propG [Circulo Rojo 3, Cuadrado Azul 4, Triangulo Rojo 5]
-- True

8.

En xsxs no hay números pares.

  x:xxs:¬par.x  \bigl \langle \; ∀x : x ∈_ℓ xs : ¬ par.x \; \bigr \rangle
propH :: [Int] -> Bool
 
propH [] = True
propH (x : xs) = not (par x) && propH xs
 
-- propH [1,3,5,7,9]
-- True

9.

En xsxs todos los números son 0.

  x:xxs:x=0  \bigl \langle \; ∀x : x ∈_ℓ xs : x = 0 \; \bigr \rangle
propI :: [Int] -> Bool
 
propI [] = True
propI (x : xs) = x == 0 && propI xs
 
-- propI [0,0,0,0,0]
-- True

Axiomas y Teoremas de Lógica de Predicados

Podemos utilizar los axiomas y teoremas de la lógica de predicados (junto a los de lógica proposicional) para demostrar propiedades sobre listas.

Axiomas:

A1 Intercambio entre rango y término:   x:R.x:T.x    x::R.xT.x  \bigl \langle \; ∀x : R.x : T.x \; \bigr \rangle ≡ \bigl \langle \; ∀x : : R.x ⇒ T.x \; \bigr \rangle

A2 Regla del Término del :   x::T.x    x::U.x    x::T.xU.x  \bigl \langle \; ∀x : : T.x \; \bigr \rangle \land \bigl \langle \; ∀x : : U.x \; \bigr \rangle ≡ \bigl \langle \; ∀x : : T.x \land U.x \; \bigr \rangle

A3 Distributividad de \lor con \forall: Z  x::T.x    x::ZT.x  Z \lor \bigl \langle \; ∀x :: T.x \; \bigr \rangle ≡ \bigl \langle \; ∀x :: Z \lor T.x \; \bigr \rangle

A4 Rango unitario de :   x:x=A:T.x    T.A\bigl \langle \; ∀x : x = A : T.x \; \bigr \rangle ≡ \; T.A

Donde AA representa una constante del universo.

A5 Definición de :   x:R.x:T.x  ¬  x:R.x:¬T.x  \bigl \langle \; ∃x : R.x : T.x \; \bigr \rangle ≡ \neg \bigl \langle \; ∀x : R.x : \neg T.x \; \bigr \rangle

A6 Intercambio de cuantificadores del \forall:   x::  y::T.x.y      y::  x::T.x.y    \bigl \langle \; ∀x :: \bigl \langle \; ∀y :: T.x.y \; \bigr \rangle \; \bigr \rangle ≡ \bigl \langle \; ∀y :: \bigl \langle \; ∀x :: T.x.y \; \bigr \rangle \; \bigr \rangle


Teoremas básicos del :

T1 Partición de rango del :   x:R.xS.x:T.x    x:R.x:T.x    x:S.x:T.x  \bigl \langle \; ∀x : R.x \lor S.x : T.x \; \bigr \rangle ≡ \bigl \langle \; ∀x : R.x : T.x \; \bigr \rangle \land \bigl \langle \; ∀x : S.x : T.x \; \bigr \rangle

T2 Instanciación del :

  x::T.x    T.A\bigl \langle \; ∀x :: T.x \; \bigr \rangle ⇒ \; T.A

  x::T.x    x::T.x    T.A\bigl \langle \; ∀x :: T.x \; \bigr \rangle \equiv \bigl \langle \; ∀x :: T.x \; \bigr \rangle \land \; T.A

Donde AA representa una constante del universo.

T3 Cambio de variable en el :

  x:R.x:T.x    y:R.y:T.y  \bigl \langle \; ∀x : R.x : T.x \; \bigr \rangle ≡ \bigl \langle \; ∀y : R.y : T.y \; \bigr \rangle

(Si xx no ocurre libre en T.yT.y ni yy en T.xT.x)

T4 Regla del término constante de :

  x::C  C\bigl \langle \; ∀x :: C \; \bigr \rangle ≡ C

Donde CC es constante.

T5 Rango vacío del :

  x:False:T.x  False\bigl \langle \; ∀x : False : T.x \; \bigr \rangle ≡ False


Teoremas básicos del :

T6 Intercambio entre rango y término del :   x:R.x:T.x    x::R.xT.x  \bigl \langle \; ∃x : R.x : T.x \; \bigr \rangle ≡ \bigl \langle \; ∃x : : R.x \land T.x \; \bigr \rangle

T7 Regla del término del :   x::T.x    x::S.x    x::T.xS.x  \bigl \langle \; ∃x : : T.x \; \bigr \rangle \lor \bigl \langle \; ∃x : : S.x \; \bigr \rangle ≡ \bigl \langle \; ∃x : : T.x \lor S.x \; \bigr \rangle

T8 Distributividad de \land con : Z  x::T.x    x::ZT.x  Z \land \bigl \langle \; ∃x :: T.x \; \bigr \rangle ≡ \bigl \langle \; ∃x :: Z \land T.x \; \bigr \rangle

T9 Rango unitario del :   x:x=A:T.x  T.A\bigl \langle \; ∃x : x = A : T.x \; \bigr \rangle ≡ T.A

Donde AA representa una constante del universo.

T10 Partición de rango de :   x:R.xS.x:T.x    x:R.x:T.x    x:S.x:T.x  \bigl \langle \; ∃x : R.x \lor S.x : T.x \; \bigr \rangle ≡ \bigl \langle \; ∃x : R.x : T.x \; \bigr \rangle \lor \bigl \langle \; ∃x : S.x : T.x \; \bigr \rangle

T11 Testigo:

t.A  x::T.x  t.A ⇒ \bigl \langle \; ∃x :: T.x \; \bigr \rangle

  x::T.x  t.A  x::T.x  \bigl \langle \; ∃x :: T.x \; \bigr \rangle \equiv t.A \lor \bigl \langle \; ∃x :: T.x \; \bigr \rangle

Donde AA representa una constante del universo.

T12 Cambio de variable en el :   x:R.x:T.x    y:R.y:T.y  \bigl \langle \; ∃x : R.x : T.x \; \bigr \rangle ≡ \bigl \langle \; ∃y : R.y : T.y \; \bigr \rangle

(Si xx no ocurre libre en T.yT.y ni yy en T.xT.x)

T13 Regla del término constante de :   x::C  C\bigl \langle \; ∃x :: C \; \bigr \rangle ≡ C

Donde CC es constante

T14 Rango vacío del :   x:False:T.x  False\bigl \langle \; ∃x : False : T.x \; \bigr \rangle ≡ False

T15 Intercambio de cuantificadores del :   x::  y::T.x.y      y::  x::T.x.y    \bigl \langle \; ∃x :: \bigl \langle \; ∃y :: T.x.y \; \bigr \rangle \; \bigr \rangle ≡ \bigl \langle \; ∃y :: \bigl \langle \; ∃x :: T.x.y \; \bigr \rangle \; \bigr \rangle


Ejercicios resueltos - Demostraciones con Axiomas y Teoremas

Mediante los axiomas y teoremas anteriormente presentados, demostrar las siguientes propiedades:

1.

Intercambio entre rango y término :   x:R.x:T.x    x::R.xT.x  \bigl \langle \; ∃x : R.x : T.x \; \bigr \rangle ≡ \bigl \langle \; ∃x : : R.x ∧ T.x \; \bigr \rangle.

  x:R.x:T.x    x::R.xT.x  \underline{\bigl \langle \; ∃x : R.x : T.x \; \bigr \rangle} ≡ \bigl \langle \; ∃x : : R.x ∧ T.x \; \bigr \rangle

{ Definición de }

¬  x:R.x:¬T.x    x::R.xT.x  ¬ \bigl \langle \; ∀x : R.x : ¬T.x \; \bigr \rangle ≡ \underline{\bigl \langle \; ∃x : : R.x ∧ T.x \; \bigr \rangle}

{ Definición de , x:=x,R.x:=True,T.x:=R.xT.xx:=x, R.x:= True, T.x := R.x ∧ T.x }

¬  x:R.x:¬T.x  ¬  x:True:¬(R.xT.x)  \underline{¬ \bigl \langle \; ∀x : R.x : ¬T.x \; \bigr \rangle ≡ ¬ \bigl \langle \; ∀x : True : ¬(R.x ∧ T.x) \; \bigr \rangle}

{ Intercambio de rango y término de ,x:=x,R.x:=R.x,T.x:=¬T.x∀, x:=x , R.x:=R.x, T.x:=¬T.x }

¬  x::R.x¬T.x  ¬  x::¬(R.xT.x)  \underline{¬ \bigl \langle \; ∀x :: R.x ⇒ ¬T.x \; \bigr \rangle} ≡ ¬ \bigl \langle \; ∀x :: ¬(R.x ∧ T.x) \; \bigr \rangle

{ Definición de }

¬  x::¬(R.xT.x)  ¬  x::¬(R.xT.x)  \underline{¬ \bigl \langle \; ∀x :: ¬(R.x ∧ T.x) \; \bigr \rangle ≡ ¬ \bigl \langle \; ∀x :: ¬(R.x ∧ T.x) \; \bigr \rangle}

{ Reflexividad de }

TrueTrue

2.

Regla del Término del (bis):   x:R.x:T.x    x:R.x:U.x    x:R.x:T.xU.x  .\bigl \langle \; ∀x : R.x : T.x \; \bigr \rangle ∧ \bigl \langle \; ∀x : R.x : U.x \; \bigr \rangle ≡ \bigl \langle \; ∀x : R.x : T.x ∧ U.x \; \bigr \rangle.

  x:R.x:T.x    x:R.x:U.x    x:R.x:T.xU.x  \underline{\bigl \langle \; ∀x : R.x : T.x \; \bigr \rangle ∧ \bigl \langle \; ∀x : R.x : U.x \; \bigr \rangle ≡ \bigl \langle \; ∀x : R.x : T.x ∧ U.x \; \bigr \rangle}

{Intercambio de rango y término del para ,   x:R.x:T.x    x::R.xT.x  \bigl \langle \; ∀x : R.x : T.x \; \bigr \rangle ≡ \bigl \langle \; ∀x :: R.x ⇒ T.x \; \bigr \rangle }

  x::R.xT.x    x::R.xU.x    x::R.xT.xU.x  \underline{\bigl \langle \; ∀x :: R.x ⇒ T.x \; \bigr \rangle ∧ \bigl \langle \; ∀x :: R.x ⇒ U.x \; \bigr \rangle} ≡ \bigl \langle \; ∀x :: R.x ⇒ T.x ∧ U.x \; \bigr \rangle

{Regla de termino de }

  x::(R.xT.x)(R.xU.x)    x::R.xT.xU.x  \bigl \langle \; ∀x :: \underline{(R.x ⇒ T.x) ∧ (R.x ⇒ U.x)} \; \bigr \rangle ≡ \bigl \langle \; ∀x :: R.x ⇒ T.x ∧ U.x \; \bigr \rangle

{Distributividad de con , P(QR)(PQ)(PR)P ⇒ ( Q ∧ R ) ≡ (P ⇒ Q ) ∧ ( P ⇒ R ) }

  x::R.xT.xU.x    x::R.xT.xU.x  \underline{\bigl \langle \; ∀x :: R.x ⇒ T.x ∧ U.x \; \bigr \rangle ≡ \bigl \langle \; ∀x :: R.x ⇒ T.x ∧ U.x \; \bigr \rangle}

{Relfex. de la }

TrueTrue

3.

Rango unitario:   x:x=A:T.x    T.A\bigl \langle \; ∃x : x = A : T.x \; \bigr \rangle ≡ \; T.A, donde AA representa una constante del universo

  x:x=A:T.x    T.A\underline{\bigl \langle \; ∃x : x = A : T.x \; \bigr \rangle} ≡ \; T.A

{Definición de : ¬  x:R.x:¬T.x  ¬ \bigl \langle \; ∀x : R.x : ¬T.x \; \bigr \rangle}

¬  x:x=A:¬T.x    T.A¬ \bigl \langle \; ∀x : \underline{x = A : ¬T.x} \; \bigr \rangle ≡ \; T.A

{Intercambio de rango y término de :   x:R.x:T.x    x::R.xT.x  \bigl \langle \; ∀x : R.x : T.x \; \bigr \rangle ≡ \bigl \langle \; ∀x :: R.x ⇒ T.x \; \bigr \rangle}

¬  x::x=A¬T.x    T.A¬ \bigl \langle \; \underline{∀x :: x = A ⇒ ¬T.x} \; \bigr \rangle ≡ \; T.A

{Rango unitario de :   x::R.xT.x    t.A \bigl \langle \; ∀x :: R.x ⇒ T.x \; \bigr \rangle ≡ \; t.A}

¬¬T.AT.A\underline{¬¬T.A} ≡ T.A

{Doble negación ¬¬PP¬¬P ≡ P}

T.AT.AT.A ≡ T.A

{Reflexividad de la equivalencia}

TrueTrue

Verificación de Programas

La verificación de programas nos permite demostrar si una función cumple con su descripción formal (especificación) utilizando técnicas de inducción y cálculo de predicados.

Por ejemplo, en base a la siguiente función:

soloCeros:[Num]BoolsoloCeros.[]  =˙  TruesoloCeros.(x    xs)  =˙  x=0soloCeros.xs\begin{equation*} \begin{aligned} &soloCeros : [Num] \rightarrow Bool \\ &soloCeros.[ ] \; \dot{=} \; True \\ &soloCeros.(x \;▹ \;xs) \; \dot{=} \; x = 0 \land soloCeros.xs \end{aligned} \end{equation*}

Y teniendo en cuenta la siguiente propiedad:

x[]=Falsex∈_ℓ [] = False

Podemos demostrar la siguiente fórmula por inducción:

soloCeros.xs  x:xxs:x=0  soloCeros.xs ≡ \bigl \langle \; ∀x : x ∈_ℓ xs : x = 0 \; \bigr \rangle

Definimos el caso base (xs=[]xs = [ ]):

soloCeros.[]  x:x[]:x=0  \underline{soloCeros.[ ]} ≡ \bigl \langle \; ∀x : x ∈_ℓ [ ] : x = 0 \; \bigr \rangle

{ Caso base de soloCerossoloCeros }

True  x:x[]:x=0  \underline{True ≡ \bigl \langle \; ∀x : x ∈_ℓ [ ] : x = 0 \; \bigr \rangle}

{ Elemento Neutro de , Propiedad de lista vacía }

True  x:False  True ≡ \underline{\bigl \langle \; ∀x : False \; \bigr \rangle}

{ Rango Vacío }

TrueTrueTrue ≡ True

{ Reflexividad de }

TrueTrue

Definimos el paso inductivo (xs=(x    xs)xs = (x \;▹ \;xs)):

soloCeros.(x    xs)  x:x(x    xs):x=0  \underline{soloCeros.(x \;▹ \;xs)} ≡ \bigl \langle \; ∀x : x ∈_ℓ (x \;▹ \;xs) : x = 0 \; \bigr \rangle

{ Definición de soloCerossoloCeros }

x=0soloCeros.xs  x:x(x    xs):x=0  x = 0 \land soloCeros.xs ≡ \bigl \langle \; \underline{∀x : x ∈_ℓ (x \;▹ \;xs) : x = 0} \; \bigr \rangle

{ Cambio de variable en el }

x=0soloCeros.xs  y:y=xyxs:y=0  x = 0 \land soloCeros.xs ≡ \bigl \langle \; \underline{∀y : y = x \lor y ∈_ℓ xs : y = 0} \; \bigr \rangle

{ Rango Unitario, Cambio de variable en el }

x=0soloCeros.xsx=0  x:xxs:x=0  x = 0 \land soloCeros.xs ≡ x = 0 \land \underline{\bigl \langle \; ∀x : x ∈_ℓ xs : x = 0 \; \bigr \rangle}

{ Hipótesis Inductiva }

x=0soloCeros.xsx=0soloCeros.xs\underline{x = 0 \land soloCeros.xs ≡ x = 0 \land soloCeros.xs}

{ Reflexividad de }

TrueTrue