我正在尝试编写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)
等的函数......
我做错了什么?我该如何解决这个问题?任何帮助表示赞赏。谢谢!