我正在玩observational type theory。
以下是π
的相等 - 类型(π
是小写Π
,即π A B
是(x : A) -> B x
的代码)与强制相互定义:
π A₁ B₁ ≃ π A₂ B₂ = σ (A₂ ≃ A₁) λ P -> π _ λ x -> B₁ (coerce P x) ≃ B₂ x
和相应定义的函数相等(σ
是小写Σ
):
_≅_ {A = π A₁ B₁} {π A₂ B₂} f₁ f₂ = σ (A₂ ≃ A₁) λ P -> π _ λ x -> f₁ (coerce P x) ≅ f₂ x
因此,而不是"相等的函数将相等的输入映射到相等的输出"我们有"相等的函数映射定义相等的输入到相等的输出"。
在此设置中coherence
coerce : ∀ {α β} {A : Univ α} {B : Univ β} -> ⟦ A ≃ B ⟧ᵀ -> ⟦ A ⟧ᵀ -> ⟦ B ⟧ᵀ
coherence : ∀ {α β} {A : Univ α} {B : Univ β}
-> (P : ⟦ A ≃ B ⟧ᵀ) -> (x : ⟦ A ⟧ᵀ) -> ⟦ x ≅ coerce P x ⟧ᵀ
(Univ 0
为Prop
,Univ (suc α)
为Type α
)
是可证明的。我唯一需要假设的是
postulate ≃-refl : ∀ {α} -> (A : Univ α) -> ⟦ A ≃ A ⟧ᵀ
但我们可以调整平等来处理A ≃ A
作为特例(我认为trustMe
需要朋友_≟_ : ∀ {α} {A : Set α} (x y : A) -> Maybe (x ≡ y)
)。
我们仍需要假设某些内容来定义subst
和其他内容。
我错过了什么吗?我们是否会失去任何不相干性?在函数相等的定义中提到类型相等似乎是可疑的。通过限制相等函数的输入在定义上相等,我们是否会损失很多?强烈规范化coherence
还是有什么好处,或者它不重要,因为它在计算上无关紧要?
The code(我完全忽略了积极性,终止和累积性问题)。
答案 0 :(得分:5)
首先,感谢您询问观察类型理论。其次,你在这里所做的确实似乎是在一起,即使它有不同的地方,Thorsten Altenkirch,Wouter Swierstra和我把它们放在我们的故事版本中。第三,对于连贯性是可推导的并且反身性是唯一的假设并不令人惊讶(至少对我而言)。这也是我们的OTT的真实情况,Wouter在我们撰写该论文时回答了Agda 1中的证据。证明不相关和生命的短暂意味着我没有将他的证据移植到Agda 2。
如果您错过了任何内容,那就是潜伏在您的评论中
我们仍需要假设某些内容来定义
df = pandas.DataFrame(dict(a=[1, 2, 3, 4, 5, 6], b=[6, 7, 8, 9, 0, 0]), index=pandas.MultiIndex.from_product([[1, 2], [3, 4, 5]])) print(df.groupby(level=0, group_keys=False).apply(lambda x: x.sum(axis=1))) 1 3 7 4 9 5 11 2 3 13 4 5 5 6 dtype: int64
和其他内容。
如果您有一些subst
,一些P : X -> Set
和一些a, b : X
,您希望在q : a = b
中获得一项功能。 "相等的函数将相等的输入取为相等的输出"通过P a -> P b
,我们可以推导出refl P : P = P
,q
。你的"相等的函数将给定的输入转换为相等的输出"公式不允许您P a = P b
弥补从q
到a
的差距。
存在b
和refl
,"两个相等的输入"相当于"在两个地方使用的一个输入"。在我看来,您已将工作转移到了获得subst
所需的任何其他内容。根据您对subst
的定义是多么懒惰(以及 &#39>你如何获得证据无关性),您只需要一个假设。
使用您的特定配方,您甚至可以获得同类值相等。如果你用强制而不是方程来修复类型间隙,你可能会省去一些麻烦(并且可能在函数相等的情况下摆脱域类型上的那个等式)。当然,在这种情况下,你需要考虑如何取代连贯性陈述。
我们非常努力地将强制排除在平等的定义之外,保留某种对称性,并保持类型方程式超出价值方程式,主要是为了不必一次考虑。有趣的是,至少某些部分的建筑可能会变得更容易,因为它是一种东西,它的强制性和#34;取代"两个平等的事物"。