Existential
寫兩個關於 existential quantifier 的簡單 functions。
attachLength : {A : Set} -> List A -> ∃ (\n -> List A ⋮ hasLength n)
attachLength [] = ∃-I 0 (sub [] len-base)
attachLength (x :: xs) with attachLength xs
... | ∃-I n (sub xs sublenpf) =
∃-I (suc n) (sub (x :: xs) (len-step sublenpf))
in-flatcat' : {A : Set} {m : Nat} ->
Braun A m -> List A -> ∃ (\n -> List A ⋮ hasLength (m + n))
in-flatcat' b xs with attachLength xs
... | ∃-I n xs&lenpf = ∃-I n (in-flatcat b xs&lenpf)
其實這兩個 functions 的 type 都沒保證什麼,例如 attachLength 的 type 應該要類似這種東西
attachLength : {A : Set} -> (xs : List A) ->
∃ (\n -> List A ⋮ hasLength n /\ equalTo xs)
才比較有意義(同時也帶來很大的 overhead XD)。(equalTo 要另外定義。)
--
今天真的就到這裡 XD。
為了不要虎頭蛇尾,還是把 attachLength 寫完 XD。
equalTo : {A : Set} -> (xs : List A) -> (ys : List A) -> Set
equalTo xs ys = ys ≡ xs
_∧_ : {A : Set} -> (A -> Set) -> (A -> Set) -> A -> Set
_∧_ P Q a = P a /\ Q a
attachLength : {A : Set} -> (xs : List A) ->
∃ (\n -> List A ⋮ (hasLength n ∧ equalTo xs))
attachLength [] = ∃-I 0 (sub [] (/\-I len-base refl))
attachLength (x :: xs) with attachLength xs
... | ∃-I n (sub xs (/\-I sublenpf eqpf)) =
∃-I (suc n) (sub (x :: xs)
(/\-I (len-step sublenpf) (cong (\xs -> x :: xs) eqpf)))
在 Agda interpreter 底下的執行結果:
Main> :typeOf attachLength
(xs : List _401) ->
∃ (\n -> List _401 ⋮ (hasLength n ∧ equalTo xs))
Main> attachLength (7 :: 3 :: 5 :: 1 :: 8 :: 6 :: 4 :: 2 :: [])
∃-I 8
(sub (7 :: 3 :: 5 :: 1 :: 8 :: 6 :: 4 :: 2 :: [])
(/\-I
(len-step
(len-step
(len-step
(len-step (len-step (len-step (len-step (len-step len-base))))))))
refl))
因為我用 _≡_ 證明兩個 lists 相等,所以最後的 proof term 只有 refl,沒有什麼 overhead。(equalTo xs 的重點在於 function definition 裡面的 type conversion。)
--
其實也應該研究一下那些 operator precedence 的數字到底怎麼定?XD
Labels: Agda, Programming


如果眼花,應該會看到很多表情符號 XDXD
<< 回到主頁