在agda

时间:2018-01-18 05:01:52

标签: overloading agda dependent-type

我正在尝试编写f : (X + Y) -> (Z + T)形式的函数,其中X, Y, Z, T是类型,+是sum类型的伪符号。 f的返回类型将由上下文确定,例如,在伪agda

postulate x : X

t : T
t = f x -- OK, since (f : X -> T) definition is used

很容易做出这样的事情(再次在伪agda中,我试图简洁明了):

fromX : X -> X + Y
toT : Z x T -> T

t2 : T
t2 = toT (f (fromX x))

但这对我想要完成的事情来说太吵了。我试过滥用实例查找。这是我想要工作的最小代码,但没有输入check:

module Agda2 where
  infix 21 _·_
  infix 19 _≡_

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

  sym : ∀ {n} {S : Set n} {x y : S} → x ≡ y → y ≡ x
  sym refl = refl

  euc : ∀ {n} {S : Set n} {x y z : S} → (x ≡ y) → (x ≡ z) → (y ≡ z)
  euc refl refl = refl

  postulate A : Set

  postulate _·_ : A → A → A

  postulate associative : ∀ {a b c} → (a · b) · c ≡ a · (b · c)

  data _∈_+_ (A : Set) : Set → Set → Set where
    instance
      sum-type₁ : ∀ {B : Set} → A ∈ A + B
      sum-type₂ : ∀ {B : Set} → A ∈ B + A

  assoc : ∀ {E1 E2 : Set} {a b c d : A}
    {{_ : E1 ∈ ((a · b) · c ≡ d) + (a · (b · c) ≡ d)}}
    {{_ : E2 ∈ ((a · b) · c ≡ d) + (a · (b · c) ≡ d)}}
    → E1 → E2
  assoc {{sum-type₁}} {{sum-type₂}} eq = euc associative eq
  assoc {{sum-type₂}} {{sum-type₁}} eq = euc (sym associative) eq  
  assoc {{sum-type₂}} {{sum-type₂}} eq = eq
  assoc {{sum-type₁}} {{sum-type₁}} eq = eq

  tt : ∀ {a b c d} → (a · b) · c ≡ d → (a · (b · c) ≡ d)
  tt eq = assoc eq

此代码的问题是Agda无法推断a, b, c, d(我猜,但我不确定)。我通过这样做来解决这个问题:

  -- Everything is the same upto this point

  data _,_,_,_ (a b c d : A) : Set where
    v4 : a , b , c , d

  assoc : ∀ {E1 E2 : Set} {a b c d : A}
    {{_ : E1 ∈ ((a · b) · c ≡ d) + (a · (b · c) ≡ d)}}
    {{_ : E2 ∈ ((a · b) · c ≡ d) + (a · (b · c) ≡ d)}}
    → (a , b , c , d) → E1 → E2
  assoc {{sum-type₁}} {{sum-type₂}} _ eq = euc associative eq
  assoc {{sum-type₂}} {{sum-type₁}} _ eq = euc (sym associative) eq  
  assoc {{sum-type₂}} {{sum-type₂}} _ eq = eq
  assoc {{sum-type₁}} {{sum-type₁}} _ eq = eq

  tt : ∀ {a b c d} → (a , b , c , d) → (a · b) · c ≡ d → (a · (b · c) ≡ d)
  tt p eq = assoc p eq

这很有效,因为现在agda明确地将a, b, c, d作为参数(再次,这是我所理解的,但我对agda内部结构并不了解)。但不幸的是,这是不切实际的,因为现在每个定理都需要额外的参数,以便类型检查器可以推断出正确的类型。

为什么我要这样做?我想要完成什么?我正在尝试编写一个通用的assoc函数,这样我就不必拥有像assoc那样的几十个assocl, assoc2, assoc' ...函数来进行关联式相等推理。我想要一个可以证明a(bc)=ab(c)ab(c)=a(bc)等的函数......

我做错了什么?我该如何解决这个问题?任何帮助表示赞赏。谢谢!

0 个答案:

没有答案