logo

Axioms for the theory of proveit.core_expr_types.lambda_maps

In [1]:
import proveit
# Prepare this notebook for defining the axioms of a theory:
%axioms_notebook # Keep this at the top following 'import proveit'.
from proveit import Function, Lambda, Conditional, Composition
from proveit import i, a, b, c, f, g, m, x, y, z, B, Q, fx, fy, gy, gz
from proveit.core_expr_types import (
    a_1_to_i, b_1_to_i, c_1_to_i, 
    f__a_1_to_i, g__a_1_to_i, f__b_1_to_i, g__c_1_to_i,
    A_1_to_m)
#from proveit.core_expr_types.tuples import f_x
from proveit.logic import Implies, Forall, Equals
from proveit.numbers import NaturalPos
In [2]:
%begin axioms
Defining axioms for theory 'proveit.core_expr_types.lambda_maps'
Subsequent end-of-cell assignments will define axioms
%end_axioms will finalize the definitions

A Lambda map is as a Lambda map does. Thus, Lambda maps are defined to be equal if they preform the same transformation under the pertinent conditions. This is similar to the proveit.logic.equality.substitution axiom except that the substitution is performed within a Lambda map which requires a special rule due to scoping restriction.

In [3]:
lambda_substitution = \
    Forall(i, Forall((f, g), 
                     Implies(Forall(a_1_to_i, 
                                    Equals(f__a_1_to_i, 
                                           g__a_1_to_i)),
                             Equals(Lambda(b_1_to_i, f__b_1_to_i),
                                    Lambda(c_1_to_i, g__c_1_to_i)) \
                                      .with_wrap_after_operator()).with_wrap_after_operator()),
          domain=NaturalPos)
lambda_substitution:

The unary composition of a single map is just that map.

In [4]:
unary_composition = \
    Forall((f, g), Equals(Composition(Lambda(x, fx)),
                          Lambda(y, fy)))
unary_composition:

Define a binary composition.

In [5]:
binary_composition = \
    Forall((f, g), Equals(Composition(Lambda(x, fx), Lambda(y, gy)),
                          Lambda(z, Function(f, gz))))
binary_composition:

Define an n-ary composition.

In [6]:
multi_composition_def = \
    Forall(m, Forall((A_1_to_m, B), 
                     Equals(Composition(A_1_to_m, B), 
                            Composition(Composition(A_1_to_m), B)).with_wrap_after_operator()),
           domain=NaturalPos)
multi_composition_def:
In [7]:
%end axioms
These axioms may now be imported from the theory package: proveit.core_expr_types.lambda_maps