Agda 如何针对荒谬/不可构造的类型进行模式匹配?

Agda 如何针对荒谬/不可构造的类型进行模式匹配?,agda,Agda,根据我对这两个定义的理解,a̶r̶e̶e̶q̶u̶I̶v̶a̶l̶e̶n̶t̶代表相同的行为: data _<_ : ℕ → ℕ → Set where lt-zero : {n : ℕ} → zero < suc n lt-suc : {m n : ℕ} → m < n → (suc m) < (suc n) lt : ℕ → ℕ → Bool lt _ zero = false lt

根据我对这两个定义的理解,a̶r̶e̶e̶q̶u̶I̶v̶a̶l̶e̶n̶t̶代表相同的行为:

data _<_ : ℕ → ℕ → Set where                       
    lt-zero : {n : ℕ} → zero < suc n
    lt-suc  : {m n : ℕ} → m < n → (suc m) < (suc n)

lt : ℕ → ℕ → Bool
lt  _       zero   = false
lt  zero   (suc n) = true
lt (suc m) (suc n) = m < n

我是否有办法使用
定义
min
和其他类似的函数\up>有办法消除Agda中不可能的模式。使用你对
\u谢谢,我明白你说的话,但我仍然不明白如何使用
@JacobWard我添加了一个关于如何使用
\u谢谢,这很有意义。我之所以得到编辑3中描述的奇怪行为,是因为我没有像你在F中那样明确定义证明,它返回2的原因是因为它只是匹配你定义的第一个案例
minxy(isLT)=x
,其中
x
2
y
1
。它的定义不明确,所以你可以用它做任何事情。
min : ℕ → ℕ → ℕ
min x y where lt x y
... | true  = x
... | false = y
data _<?_ (n m : ℕ) : Set where
    isLT  : n < m → n <? m
    notLT : m ≤ n → n <? m

min : (x y : ℕ) → {p : x <? y} → ℕ
min x y (isLT _)  = x
min x y (notLT _) = y
le-trans : ∀ {m n k} → m < n → n < k → m < k
le-trans {k = k} lt-zero b = {!!}
le-trans (lt-suc a) (lt-suc b) = lt-suc (le-trans a b)

Goal: 0 < k
b  : suc .n < k
le-trans : ∀ {m n k} → m < n → n < k → m < k
le-trans {k = zero} lt-zero b = {!!}
le-trans {k = suc k} lt-zero b = {!!}
le-trans (lt-suc a) (lt-suc b) = lt-suc (le-trans a b)
le-trans : ∀ {m n k} → m < n → n < k → m < k
le-trans {k = zero} lt-zero ()
le-trans {k = suc k} lt-zero b = lt-zero
le-trans (lt-suc a) (lt-suc b) = lt-suc (le-trans a b)
data _≥_ : ℕ → ℕ → Set where
  get-z : ∀ {n} → n ≥ zero
  get-s : ∀ {m n} → m ≥ n → (suc m) ≥ (suc n)

data _<?_ (n m : ℕ) : Set where
  y-< : n < m → n <? m
  n-< : n ≥ m → n <? m

f<? : (m n : ℕ) → m <? n
f<? zero zero = n-< get-z
f<? zero (suc n) = y-< lt-zero
f<? (suc m) zero = n-< get-z
f<? (suc m) (suc n) with f<? m n
f<? (suc m) (suc n) | y-< x = y-< (lt-suc x)
f<? (suc m) (suc n) | n-< x = n-< (get-s x)

min : ℕ → ℕ → ℕ
min x y with f<? x y
min x y | y-< _ = x
min x y | n-< _ = y