equal.bend

bend-mathlib@0.7.5.0 · 63 lines · 0 definitions

1# bend-mathlib/equal.bend: equality lemmas (congruence, substitution, chains).
2import Base
3
4# Applying a two-argument function to equal arguments gives equal results.
5law cong2:
6  for -A: Type
7  for -B: Type
8  for -C: Type
9  for -f: A -> B -> C
10  for -a1: A
11  for -a2: A
12  for -b1: B
13  for -b2: B
14  for ea: {a1 == a2 : A}
15  for eb: {b1 == b2 : B}
16  {f(a1, b1) == f(a2, b2) : C}
17
18def cong2(A, B, C, f, a1, a2, b1, b2, ea, eb):
19  %ea : {f(a1, b1) == f(_, b2) : C}
20  %eb : {f(a1, b1) == f(a1, _) : C}
21  {==}
22
23# If a equals b, any property of a is also a property of b.
24law subst:
25  for -A: Type
26  for -P: A -> Type
27  for -a: A
28  for -b: A
29  for e: {a == b : A}
30  for p: P(a)
31  P(b)
32
33def subst(A, P, a, b, e, p):
34  %e : P(_)
35  p
36
37# Equality chains through three steps: a = b, b = c and c = d give a = d.
38law trans3:
39  for -A: Type
40  for -a: A
41  for -b: A
42  for -c: A
43  for -d: A
44  for ab: {a == b : A}
45  for bc: {b == c : A}
46  for cd: {c == d : A}
47  {a == d : A}
48
49def trans3(A, a, b, c, d, ab, bc, cd):
50  %cd : {a == _ : A}
51  %bc : {a == _ : A}
52  ab
53
54# Equal naturals have equal successors.
55law cong_succ:
56  for -a: Nat
57  for -b: Nat
58  for e: {a == b : Nat}
59  {1n+a == 1n+b : Nat}
60
61def cong_succ(a, b, e):
62  %e : {1n+a == 1n+_ : Nat}
63  {==}