我是agda的菜鸟,正在阅读http://www.cse.chalmers.se/~ulfn/papers/afp08/tutorial.pdf。我的浅薄知识在某种程度上发现点图案不是很必要。例如,
data Image_∋_ {A B : Set}(f : A → B) : B → Set where
im : (x : A) → Image f ∋ f x
inv : {A B : Set}(f : A → B)(y : B) → Image f ∋ y → A
inv f .(f x) (im x) = x
我发现inv
可以定义为
inv : {A B : Set}(f : A → B)(y : B) → Image f ∋ y → A
inv _ _ (im x) = x
因为从类型来看,我们已经知道y
是某些f
的{{1}}图片,所以它不会出错。
另一个例子是
x
考虑data _==_ {A : Set}(x : A) : A → Set where
refl : x == x
data _≠_ : ℕ → ℕ → Set where
z≠s : {n : ℕ} → zero ≠ suc n
s≠z : {n : ℕ} → suc n ≠ zero
s≠s : {n m : ℕ} → n ≠ m → suc n ≠ suc m
data Equal? (n m : ℕ) : Set where
eq : n == m → Equal? n m
neq : n ≠ m → Equal? n m
equal? : (n m : ℕ) → Equal? n m
equal? zero zero = eq refl
equal? zero (suc _) = neq z≠s
equal? (suc _) zero = neq s≠z
equal? (suc n') (suc m') with equal? n' m'
... | eq refl = eq refl
... | neq n'≠m' = neq (s≠s n'≠m')
函数,第二行在文章中写为equal?
。同样,带有构造的(suc n') (suc .n') | eq refl = eq refl
提供了一个证据,因为这两个值是相同的,那么为什么我要用点图案来编写它们呢?
我对coq更熟悉,而且我不知道coq中的类似内容。我在这里错过了什么吗?
答案 0 :(得分:1)
在Coq中你明确地写出了模式匹配,而基于Agda的基于方程的方法迫使类型检查器重建一个应该与你所写的内容相对应的案例树。
虚线模式有助于类型检查器看到给定的模式不是匹配的产物,而是通过匹配其他一个参数的强制(例如:{{1}上的匹配将强制Vec Bool n
的值,或者如你所观察到的那样,在等式证明上匹配会强制某些变量相同。)
他们并不总是必要的,事实上,正如你在the CHANGELOG for version 2.5.3中看到的那样,有些已经慢慢变成了可选项:
点图案。
如果模式完全由构造函数或文字组成,则现在可以跳过不可访问模式前面的点。例如: