当agda中的两个术语具有相同的正常形式时,我认为这两个术语在定义上是相等的 - 我认为---,命题相等只是定义相等的数据类型表示 - 再次,我猜测 - -;那么,命题上的平等不应该是可判定的吗?也就是说,我们可以编写一个函数类型
似乎是合理的 ∀{A : Set} → (x y : A) → Dec(x ≡ y)
。
我觉得我们不能写这样的函数,因为我们不能在参数上进行模式匹配,但我感觉'它应该是可能的:再次,只需缩小到正常形式并检查语法身份。
任何见解都会有所帮助!
答案 0 :(得分:3)
据说,agda中的两个术语在定义上是相同的 它们都具有相同的正常形式
高达αη-转换。
和命题相等只是定义相等的数据类型表示
命题相等说“在实例化一些自由变量后,这两个术语将在定义上相等”(“some”可以是0或全部)(“instantiate”也可以变化)。
E.g。
double-double : (n : ℕ) -> n + n ≡ 2 * n
显然,n + n
在语法上与2 * n
不等,但对于任何规范n
(0, 1, 2...
),n + n
的结果在语法上等于2 * n
的结果 - 这就是double-double
所说的内容。并且“对于任何规范n
”部分强迫我们通过归纳来证明double-double
(但是,在更复杂的系统中,定义相等性基于超级编译或者有内置证明器,{ {1}}在定义上等于n + n
)。
但有时,诱导假设应如何表现并不明显,例如:当你需要推广一个方程时。正如您所料,“这个任意事物是否可以证明?”没有决策程序。因此命题平等是不可判定的。而且,你既不能证明也不能反驳像
这样的陈述2 * n
没有额外的假设。
但是你真的可以检查语法上的平等:
(λ n -> 1 + n) ≡ (λ n -> n + 1)
它说“如果两个术语在语法上相等,则它们在命题上是相等的,否则我们不知道它们是否在命题上相等”。但是Agda没有这种内置功能。</ p>