16.3. 同余闭包
同余闭包在“等于”的自反、对称和传递闭包下维护术语的等价类并且相等的参数产生相等的函数结果的规则。
形式上,如果 a = a' 和 b = b',则添加 f a b = f a' b'。
该算法合并等价类,直到达到固定点。
如果发现矛盾,那么可以立即关闭目标。
用共享白板来比喻:
Congruence Closure
使用同余闭包证明该定理:
example {α} (f g : α → α) (x y : α)
(h₁ : x = y) (h₂ : f y = g y) :
f x = g x := α:Sort u_1f:α → αg:α → αx:αy:αh₁:x = yh₂:f y = g y⊢ f x = g x
All goals completed! 🐙
最初,f y、g y、x 和 y 位于不同的等价类中。
同余闭包引擎使用 h₁ 合并 x 和 y,之后等价类为 {x, y}, f y 和 g y。
接下来,h₂ 用于合并 f y 和 g y,之后的类为 {x, y} and {f y, g y}。
这足以证明f x = g x,因为y和x属于同一类。
类似的推理也适用于构造函数:
example (a b c : Nat) (h : a = b) : (a, c) = (b, c) := a:Natb:Natc:Nath:a = b⊢ (a, c) = (b, c)
All goals completed! 🐙
由于对构造函数 Prod.mk 遵循同余,因此只要将 a 和 b 放置在同一类中,元组就变得相等。