立方体 agda 中针对特定计算行为的路径与等价关系
Paths vs Equivalences in cubical agda for specific computational behavior
我正在 Cubical agda 工作,并试图为以后的证明建立一些通用的实用程序。其中之一是对于任何类型 A
它是 'same' 作为类型 Σ A (\_ -> Top)
其中 Top
是具有一个元素的类型。问题是如何从实用程序库中最好地公开此 'sameness'。我可以将它公开为等价、路径或同构,也可能是多个。
我最初将其公开为一条路径:top-path : Path A (Σ A (\_ -> Top))
,它是使用来自底层 top-equiv : A ≃ Σ A (\_ -> Top)
的胶水类型构建的。但是当试图在以后的证明中使用它时,我发现沿着这条路径的传输并没有像我预期的那样计算。我的期望是它由 fst
组成,但在实践中我发现它有时会留下 transp
和 prim^unglue
条款。如果我为 A 使用特定的具体类型,或者如果我使用等价的类似构造,情况就不是这样了。
示例:
-- Working
compute-top-path-Bool : (a : Bool) -> fst (transport (top-path Bool) a) == a
compute-top-path-Bool a = refl
compute-top-equiv-Any : (a : Bool) -> fst (transport-equiv (top-equiv Bool) a) == a
compute-top-equiv-Any a = refl
-- Broken
compute-top-path-Any : (a : A) -> fst (transport (top-path A) a) == a
compute-top-path-Any a = refl
--
-- Checking test (/Users/endobson/tmp/agda/test.agda).
-- /Users/endobson/tmp/agda/test.agda:104,26-30
-- transp (λ i → A) i0 (fst (prim^unglue a)) != a of type A
-- when checking that the expression refl has type
-- fst (transport (top-path A) a) == a
--
独立复制:https://gist.github.com/endobson/62605cfc15a92b9111391b459d03b548,我使用的是 Agda 版本 2.6.1.3。
因此我的问题是这个问题的最佳解决方案是什么?我是否以某种方式以过于复杂的方式构建我的路径,如果我以不同的方式构建它们,那么计算行为会更好吗?还是直接从我的实用程序库中公开等效项?我发现暴露等价性 'inelegant' 似乎路径应该能够做到这一点,但如果已知它们是针对此特定用例的更好工具,我并不反对这样做。
在 agda/cubical
库中,我们倾向于将等价文件(或 iso)与路径一起导出,因为您提到的问题。
这些额外 transp
调用的原因是 Glue
的传输必须在可能实际需要它们的一般情况下工作。
fst (prim^unglue a)
如果你要求正常形式,应该减少。
我正在 Cubical agda 工作,并试图为以后的证明建立一些通用的实用程序。其中之一是对于任何类型 A
它是 'same' 作为类型 Σ A (\_ -> Top)
其中 Top
是具有一个元素的类型。问题是如何从实用程序库中最好地公开此 'sameness'。我可以将它公开为等价、路径或同构,也可能是多个。
我最初将其公开为一条路径:top-path : Path A (Σ A (\_ -> Top))
,它是使用来自底层 top-equiv : A ≃ Σ A (\_ -> Top)
的胶水类型构建的。但是当试图在以后的证明中使用它时,我发现沿着这条路径的传输并没有像我预期的那样计算。我的期望是它由 fst
组成,但在实践中我发现它有时会留下 transp
和 prim^unglue
条款。如果我为 A 使用特定的具体类型,或者如果我使用等价的类似构造,情况就不是这样了。
示例:
-- Working
compute-top-path-Bool : (a : Bool) -> fst (transport (top-path Bool) a) == a
compute-top-path-Bool a = refl
compute-top-equiv-Any : (a : Bool) -> fst (transport-equiv (top-equiv Bool) a) == a
compute-top-equiv-Any a = refl
-- Broken
compute-top-path-Any : (a : A) -> fst (transport (top-path A) a) == a
compute-top-path-Any a = refl
--
-- Checking test (/Users/endobson/tmp/agda/test.agda).
-- /Users/endobson/tmp/agda/test.agda:104,26-30
-- transp (λ i → A) i0 (fst (prim^unglue a)) != a of type A
-- when checking that the expression refl has type
-- fst (transport (top-path A) a) == a
--
独立复制:https://gist.github.com/endobson/62605cfc15a92b9111391b459d03b548,我使用的是 Agda 版本 2.6.1.3。
因此我的问题是这个问题的最佳解决方案是什么?我是否以某种方式以过于复杂的方式构建我的路径,如果我以不同的方式构建它们,那么计算行为会更好吗?还是直接从我的实用程序库中公开等效项?我发现暴露等价性 'inelegant' 似乎路径应该能够做到这一点,但如果已知它们是针对此特定用例的更好工具,我并不反对这样做。
在 agda/cubical
库中,我们倾向于将等价文件(或 iso)与路径一起导出,因为您提到的问题。
这些额外 transp
调用的原因是 Glue
的传输必须在可能实际需要它们的一般情况下工作。
fst (prim^unglue a)
如果你要求正常形式,应该减少。