我在學習Agda by tutorial,現在我正在閱讀有關從屬對。使用依賴對在Agda中的問題
所以,這是代碼的片段:
data Σ (A : Set) (B : A → Set) : Set where
_,_ : (a : A) → (b : B a) → Σ A B
infixr 4 _,_
Σprojₗ : {A : Set}{B : A → Set} → Σ A B → A
Σprojₗ (a , b) = a
data _∈_ {A : Set}(x : A) : List A → Set where
first : {xs : List A} → x ∈ x ∷ xs
later : {y : A}{xs : List A} → x ∈ xs → x ∈ y ∷ xs
infix 4 _∈_
_!_ : ∀{A : Set} → List A → ℕ → Maybe A
[] ! _ = nothing
x ∷ xs ! zero = just x
x ∷ xs ! (suc n) = xs ! n
infix 5 _!_
lookup : ∀ {A}{x : A}(xs : List A) → x ∈ xs → Σ ℕ (λ n → xs ! n ≡ just x)
_,_
被依賴的對,Σprojₗ
返回對第一部分,_∈_
的構造函數成員的關係,lst ! i
返回just $(i-th element)
如果list
的長度大於或等於我,nothing
- 否則。我想寫一個lookup
函數,其中包含列表xs
,證明成員資格x ∈ xs
,並且返回自然數n
的自然數和函數的相關對返回列表的第n個元素爲just x
的證明(或不可行)。現在函數看起來像
lookup : ∀ {A}{x : A}(xs : List A) → x ∈ xs → Σ ℕ (λ n → xs ! n ≣ just x)
lookup {A} {x} .(x ∷ xs) (inHead {xs}) = 0 , refl
lookup .(y ∷ xs) (inTail {y} {xs} proof) = (1 + Σprojₗ (lookup xs proof)) , ?
我想,我應該寫一些功能像Σprojᵣ
用於填充孔(它應該返回對第二元素,簽名A → Set
功能),但我不知道怎麼寫。這是typechecked唯一的變化是
Σprojᵣ : {A : Set}{B : A → Set} → Σ A B → (A → Set)
Σprojᵣ {A} {B} (a , b) = B
,但我沒有管理如何完成lookup
功能與此有關。我如何解決這個練習?
感謝您的詳細解答! 不幸的是,我沒有時間去使用依賴類型,所以在function_的_signature中使用'proj 1 pair'解決方案是非常不明顯的。 –
@YaroslavSkudarnov:是的,如果你不習慣它,這很奇怪。我添加了一些關於如何使'lookup'看起來更好的一些信息。 – Vitus