【问题标题】:How can I convince Agda that my function has a certain value?如何让 Agda 相信我的函数具有一定的价值?
【发布时间】:2018-12-09 19:00:33
【问题描述】:

我习惯于在数学中编写人工证明,但我对编写 Agda 非常陌生。下面是一个玩具示例,我不知道如何用 Agda 证明。

非正式地,我想写一个函数 f,它接受一个自然数 x 和一对自然数。如果对中的第一个元素等于 x,则返回对中的第二个元素。否则,返回 0。

这是我对自然数相等的定义:

data N : Set where
  zero : N
  s : N → N

data _≡_ {X : Set} : X → X → Set where
  refl : (x : X) → (x ≡ x)

data _≢_ : N → N → Set where
  <   : {n : N} → (zero ≢ (s n))
  >   : {n : N} → ((s n) ≢ zero)
  rec : {n m : N} → (n ≢ m) → ((s n) ≢ (s m))

data _=?_ (n m : N) : Set where
  true  : (n ≡ m) → (n =? m)
  false : (n ≢ m) → (n =? m)

equal? : (n m : N) → (n =? m)
equal? zero zero = true (refl zero)
equal? zero (s _) = false <
equal? (s _) zero = false >
equal? (s n) (s m) with (equal? n m)
... | (true (refl a)) = (true (refl (s a)))
... | (false p) = (false (rec p))

这里是函数。

data Npair : Set where
  pair : (n m : N) → Npair

f : N → Npair → N
f a (pair b c) with equal? a b
... | (true (refl _)) = c
... | (false _) = zero

我无法证明

lemma : (x y : N) → (y ≡ (f x (pair x y)))

因为当我尝试在定义中引入 refl 构造函数时,它会抱怨

y != f x (pair x y) | equal? x x of type N

为了证明这个引理,我必须改变什么?

【问题讨论】:

    标签: types proof agda dependent-type


    【解决方案1】:

    lemma 中,您需要在equal? x x 上进行模式匹配,因为f 也与之匹配,并且在进行相同匹配之前,您无法推断f 的输出。但是,equal? x x 有两种情况:

    lemma : (x y : N) → (y ≡ (f x (pair x y)))
    lemma x y with equal? x x 
    ... | true (refl _) = refl _
    ... | false _       = ?
    

    其中,第二种情况是不可能的。要排除它,你需要证明∀ n → equal? n n ≡ true (refl _)

    equal?-true : ∀ n → equal? n n ≡ true (refl _)
    equal?-true zero = refl _
    equal?-true (s n) with equal? n n | equal?-true n
    ... | true (refl _) | q = refl _
    ... | false x       | ()
    
    lemma : (x y : N) → (y ≡ (f x (pair x y)))
    lemma x y with equal? x x | equal?-true x
    ... | true (refl _) | _ = refl _
    ... | false _       | ()
    

    但是,如果将不等式定义为相等的否定,则无需做额外的工作,因为x ≢ x 立即暗示

    data ⊥ : Set where
    
    ⊥-elim : ⊥ → {A : Set} → A
    ⊥-elim ()
    
    _≢_ = λ {A : Set}(x y : A) → x ≡ y → ⊥
    
    data _=?_ (n m : N) : Set where
      true  : (n ≡ m) → (n =? m)
      false : (n ≢ m) → (n =? m)
    
    equal? : ∀ n m → n =? m
    equal? zero zero   = true (refl zero)
    equal? zero (s m)  = false (λ ())
    equal? (s n) zero  = false (λ ())
    equal? (s n) (s m) with equal? n m
    ... | true  (refl _) = true (refl _)
    ... | false p        = false λ {(refl _) → p (refl n)}
    
    data Npair : Set where
      pair : (n m : N) → Npair
    
    f : N → Npair → N
    f a (pair b c) with equal? a b
    ... | (true (refl _)) = c
    ... | (false _)       = zero
    
    lemma : (x y : N) → (y ≡ (f x (pair x y)))
    lemma x y with equal? x x
    ... | true (refl .x) = refl y
    ... | false p        = ⊥-elim (p (refl _))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-13
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 2019-06-08
      相关资源
      最近更新 更多