equal.bend source
equal.bend on the hub · documented module
# bend-mathlib/equal.bend: equality lemmas (congruence, substitution, chains).import Base# Applying a two-argument function to equal arguments gives equal results.law cong2: for -A: Type for -B: Type for -C: Type for -f: A -> B -> C for -a1: A for -a2: A for -b1: B for -b2: B for ea: {a1 == a2 : A} for eb: {b1 == b2 : B} {f(a1, b1) == f(a2, b2) : C}def cong2(A, B, C, f, a1, a2, b1, b2, ea, eb): %ea : {f(a1, b1) == f(_, b2) : C} %eb : {f(a1, b1) == f(a1, _) : C} {==}# If a equals b, any property of a is also a property of b.law subst: for -A: Type for -P: A -> Type for -a: A for -b: A for e: {a == b : A} for p: P(a) P(b)def subst(A, P, a, b, e, p): %e : P(_) p# Equality chains through three steps: a = b, b = c and c = d give a = d.law trans3: for -A: Type for -a: A for -b: A for -c: A for -d: A for ab: {a == b : A} for bc: {b == c : A} for cd: {c == d : A} {a == d : A}def trans3(A, a, b, c, d, ab, bc, cd): %cd : {a == _ : A} %bc : {a == _ : A} ab# Equal naturals have equal successors.law cong_succ: for -a: Nat for -b: Nat for e: {a == b : Nat} {1n+a == 1n+b : Nat}def cong_succ(a, b, e): %e : {1n+a == 1n+_ : Nat} {==}