gpt4 book ai didi

agda - 为什么函数组合和应用程序在 Agda 中有依赖实现?

转载 作者:行者123 更新时间:2023-12-04 01:47:38 28 4
gpt4 key购买 nike

为什么函数组合 () 和应用程序 ($) 有可用的实现 https://github.com/agda/agda-stdlib/blob/master/src/Function.agda#L74-L76 ?为方便起见复制在这里:

_∘_ : ∀ {a b c}
{A : Set a} {B : A → Set b} {C : {x : A} → B x → Set c} →
(∀ {x} (y : B x) → C y) → (g : (x : A) → B x) →
((x : A) → C (g x))
f ∘ g = λ x → f (g x)

_∘'_ : ∀ {a b c} {A : Set a} {B : Set b} {C : Set c} →
(B → C) → (A → B) → (A → C)
f ∘' g = λ x → f (g x)

_$_ : ∀ {a b} {A : Set a} {B : A → Set b} →
((x : A) → B x) → ((x : A) → B x)
f $ x = f x

_$'_ : ∀ {a b} {A : Set a} {B : Set b} →
(A → B) → (A → B)
f $' x = f x

我最初认为这背后的基本原理是 $ 能够处理 $' 无法处理的高阶类型。例如,考虑 A=Nat,B=List,f 是 ::,其中 B 依赖于 A。但经过大量测试后,我无法想出一个例子来证明$' 的实现是不够的。 $ 可以处理哪些 $' 无法处理的场景? (同样, 处理哪些场景 ∘' 不处理?

open import Agda.Builtin.Nat public
open import Agda.Primitive public

--data List {a} (A : Set a) : Set a where
-- [] : List A
-- _∷_ : (x : A) (xs : List A) → List A

data Vec {a} (A : Set a) : Nat → Set a where
[] : Vec A zero
_∷_ : ∀ {n} (x : A) (xs : Vec A n) → Vec A (suc n)

tail : ∀ {a n} {A : Set a} → Vec A (suc n) → Vec A n
tail (x ∷ s) = s

_$_ : ∀ {a b} {A : Set a} {B : A → Set b} →
((x : A) → B x) → ((x : A) → B x)
f $ x = f x

_$'_ : ∀ {a b} {A : Set a} {B : Set b} →
(A → B) → (A → B)
f $' x = f x

_∘_ : ∀ {a b c}
{A : Set a} {B : A → Set b} {C : {x : A} → B x → Set c} →
(∀ {x} (y : B x) → C y) → (g : (x : A) → B x) →
((x : A) → C (g x))
f ∘ g = λ x → f (g x)

_∘'_ : ∀ {a b c} {A : Set a} {B : Set b} {C : Set c} →
(B → C) → (A → B) → (A → C)
f ∘' g = λ x → f (g x)

Vecc : ∀ {a} → Nat → (A : Set a) → (Set a)
Vecc x y = Vec y x

data Pair {a b} (A : Set a) (B : A → Set b) : Set (a ⊔ b) where
_,_ : (x : A) → (y : B x) → Pair A B

-- Dependent Pair attempt
--fst : ∀ {a b} {A : Set a} {B : A → Set b} → Pair A B → A
--fst (a , b) = a
--
--f : Pair Nat $' Vec Nat
--f = _,_ zero $' []
--
--g : Pair (Pair Nat $' Vec Nat) $' λ x → Nat
--g = _,_ (_,_ zero $' []) $' zero

-- Some other attempt
--f : ∀ {a n} {A : Set a} → Vec A ((suc ∘' suc) n) → Vec A n
--f {a} = tail {a} ∘' tail {a}

-- Vec attempt
--f : ∀ {a} (A : Set a) → (Set a)
--f {a} = Vecc {a} (suc zero) ∘' Vecc {a} (suc zero)
--
--h = f Nat
--
--x : h
--x = (zero ∷ []) ∷ []

-- List attempt
--f : ∀ {a} (A : Set a) → (Set a)
--f {a} = List {a} ∘' List {a}
--
--g : ∀ {a} (A : Set a) → (Set a)
--g {a} = List {a} ∘ List {a}
--
--h = f Nat
--i = g Nat
--
--x : h
--x = (zero ∷ []) ∷ []

最佳答案

∘′$′ 不适用于依赖函数。您只是没有尝试使用依赖函数进行任何测试。对于 f $ x 示例,f 必须依赖,对于 f ∘ g,两个函数中的任何一个都必须依赖。示例:

open import Data.Nat
open import Data.Vec
open import Function
open import Relation.Binary.PropositionalEquality

replicate' : {A : Set} → A → (n : ℕ) → Vec A n
replicate' a n = replicate a

refl' : {A : Set}(a : A) → a ≡ a
refl' a = refl

-- fail1 : Vec ℕ 10
-- fail1 = replicate' 10 $′ 10

ok1 : Vec ℕ 10
ok1 = replicate' 10 $ 10

-- fail2 : ∀ n → replicate' 10 n ≡ replicate' 10 n
-- fail2 = refl' ∘′ replicate' 10

ok2 : ∀ n → replicate' 10 n ≡ replicate' 10 n
ok2 = refl' ∘ replicate' 10

关于agda - 为什么函数组合和应用程序在 Agda 中有依赖实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54613263/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com