你如何在 Cubical Agda 中使用 Ring 求解器?

How do you use the Ring solver in Cubical Agda?

我开始玩 Cubical Agda。我尝试做的最后一件事是以类似于在经典数学中完成的方式构建整数类型(假设已经定义了自然数的类型)(参见 the construction of integers on wikipedia)。这是

data dInt : Set where
    _⊝_ : ℕ → ℕ → dInt 
    canc : ∀ a b c d → a + d ≡ b + c → a ⊝ b ≡ c ⊝ d 
    trunc : isSet (dInt)

之后,我想定义加法

_++_ : dInt → dInt → dInt 
(x ⊝ z) ++ (u ⊝ v) = (x + u) ⊝ (z + v)
(x ⊝ z) ++ canc a b c d u i = canc (x + a) (z + b) (x + c) (z + d) {!   !} i
...

我现在卡在两个牙套之间了。询问 x + a + (z + d) ≡ z + b + (x + c) 类型的术语。不想亲自证明这一点,我想使用 ring solver made in Cubical Agda。但我永远无法让它工作,甚至尝试将它设置为简单的环等式,如 x + x + x ≡ 3 * x.

我怎样才能让它发挥作用?有没有一个最小的例子可以让它适用于 naturals ?库中有一个文件NatExamples.agda,但它让你不得不以一种令人费解的方式重写你的等式

我已经成功地使用环形求解器解决了完全相同的问题:将 Int 定义为 ℕ ⨯ ℕ 的商。您可以找到完整的文件here,相关部分如下:

  1. 非三次命题等式到路径等式:
open import Cubical.Core.Prelude renaming (_+_ to _+̂_)

open import Relation.Binary.PropositionalEquality renaming (refl to prefl; _≡_ to _=̂_) using ()
fromPropEq : ∀ {ℓ A} {x y : A} → _=̂_ {ℓ} {A} x y → x ≡ y
fromPropEq prefl = refl
  1. 使用环形求解器的例子:
open import Function using (_$_)

import Data.Nat.Solver
open Data.Nat.Solver.+-*-Solver
  using (prove; solve; _:=_; con; var; _:+_; _:*_; :-_; _:-_)

reorder :  ∀ x y a b → (x +̂ a) +̂ (y +̂ b) ≡ (x +̂ y) +̂ (a +̂ b)
reorder x y a b = fromPropEq $ solve 4 (λ x y a b → (x :+ a) :+ (y :+ b) := (x :+ y) :+ (a :+ b)) prefl x y a b

所以在这里,即使环形求解器给了我们 _=̂_ 的证明,我们也可以使用 _=̂_ 的 K 和 _≡_ 的自反性将其转化为路径可以在下游进一步使用的相等性,例如证明 Int 加法是代表性不变的。

您可以在立方库的这个文件中看到自然数求解器应该如何使用:

Cubical/Algebra/NatSolver/Examples.agda

请注意,此求解器与交换环求解器不同,交换环求解器是为证明抽象环中的方程而设计的,这里有解释:

Cubical/Algebra/RingSolver/Examples.agda

不过,如果我没看错你的问题,你要证明的等式需要用到Nat中的其他命题等式。立方体库中的任何求解器都不支持(据我所知,标准库也不支持)。但当然,您可以将求解器用于所有不使用其他等式的步骤。

以防万一你没有发现这一点:here 是使用立方体库的 SetQuotients 的数学风格的整数定义。 SetQuotients 帮助您避免与第三个构造函数相关的工作 trunc。这意味着您基本上只需要证明一些结构定义明确,就像在 'normal' 数学中那样。