我想知道是否有一种系统的方法来解释Coq定义为agda程序。我正在翻译部分编程基础,无法让tUpdate函数在下面工作。为什么这个失败。对coq代码进行注释。
--Definition total_map (A : Type) := string -> A.
totalMap : Set → Set
totalMap A = String → A
-- Definition t_empty {A : Type} (v : A) : total_map A :=
-- (fun _ => v).
tEmpty : {A : Set} (v : A) → totalMap A
t
我正在尝试使用Agda stdlib来证明Agda中数据类型的可判定等价性。我有以下代码,但我不确定该用什么来填充这个漏洞。这个目标看起来很有意义,但实际上构建它是具有挑战性的。 在Agda中这是可能的吗?有没有关于如何解决这个问题的想法? open import Data.String as String hiding (_≟_)
open import Relation.Nullary
open import Relation.Binary
open import Relation.Binary.PropositionalEquality
module Problem1 where
我想证明take函数在Agda中的Vec函数的一个几乎微不足道的性质。
open import Data.Vec
open import Data.Nat
open import Relation.Binary.PropositionalEquality
take-idempotent : ∀ n (xs : Vec ℕ n) → take n (take n xs) ≡ take n xs
take-idempotent n xs = ?
我的问题源于这样一个事实:take的类型索引由自然数的加法组成。Agda向上述代码输出以下消息。
n != n + _n_9 of type ℕ
whe
我有这些定义(不相关的定义被删除)
open import Agda.Builtin.Nat renaming (Nat to ℕ)
infix 3 _>0
data _>0 : ℕ → Set where
intro : ∀ n → suc n >0
infix 4 _*>0_
_*>0_ : ∀ {a b} → a >0 → b >0 → a * b >0
intro n *>0 intro m = intro (m + n * suc m)
infix 5 _÷_⟨_⟩
data ℚ : Set where
_÷_⟨_⟩
Wadler的论文"Theorems for Free!“中的”自由定理“关于某些值的方程式仅基于它们的类型导出。所以,举例来说,
f : {A : Set} → List A → List A
自动满足
f . map g = map g . f
那么,我是否可以获得以下类型的Agda术语:
(f : {A : Set} → List A → List A) {B C : Set} (g : B → C) (xs : List B)
→ f (map g xs) ≡ map g (f xs)
或者如果是这样/如果不是,我可以做一些更通用/不那么通用的事情吗?
我知道的存在,但我不
在Agda中,似乎不可能显示∀ {A : Set} (f : ⊥ → A) → f ≡ λ ()。
然而,看似相似的术语∀ {A : Set} (f : ⊤ → A) → f ≡ λ _ → f tt可以被refl证明。以后可以用来证明⊤的一种可扩展性。
ext⊤ : ∀ {A : Set} (f g : ⊤ → A) (H : ∀ x → f x ≡ g x) → f ≡ g
认为,解释可能是考虑了不同的类型理论模型。是否有可能有任何直觉,为什么一个被接受,而不是另一个?f ≡ λ ()不应该是某种形式的eta法吗?
我试图证明整数上的可分性。首先,我试图证明可分性是反映的。
∣-refl : ∀{n} → n ∣ n
因为我定义了基于减法的可分性.
data _∣_ : ℤ → ℤ → Set where
0∣d : ∀{d} → zero ∣ d
n-d∣d : ∀{n d} → (n - d) ∣ d → n ∣ d
如果我使用...it的话,n-n=0看起来很容易
∣-refl {n} with n-n≡0 n
... | refl = n-d∣d 0∣d
但Agda拒绝在参考书上进行模式匹配。即使没有其他正常形式的n-n=0 n。我用另一种功能证明了这一点。我只需要利用n-n=0这个事实
我有两个密切相关的问题:
首先,如何在Agda中对Haskell的Arrow类进行建模/表示?
class Arrow a where
arr :: (b -> c) -> a b c
(>>>) :: a b c -> a c d -> a b d
first :: a b c -> a (b,d) (c,d)
second :: a b c -> a (d,b) (d,c)
(***) :: a b c -> a b' c' -> a (b,b&
我试图证明一个矛盾,但我遇到了一个问题,试图向Agda证明由<>-wt-inv返回的sigma域类型与前面的证明中所看到的相同。我希望uniq型的证据能帮到我,但我不能把它们合在一起。
我希望下面代码中的评论能够给出足够的上下文。
-- given a type for (f ⟨⟩), we can derive that f is a function type
-- and we can prove that the context yields σ
⟨⟩-wt-inv : ∀ {n m f τ} {K : Ktx n m} → K ⊢ (f ⟨⟩) ∶ τ →
我刚从Agda开始。作为锻炼,我试着证明身体的均匀性。
even : ℕ → Bool
even 0 = true
even 1 = false
even (suc (suc x)) = even x
x : even 12 ≡ true
x = refl
但是使用_≡_断言真相似乎是一种非常糟糕的方式。做同样的事情最好的方法是什么?
我有一个将自然数映射到其对应的Agda宇宙级别的函数。 level : Nat -> Level
level zero = lzero
level (suc l) = lsuc (level l)
Setn : (l : Nat) -> Set (level (suc l))
Setn l = Set (level l) 我在定义归纳数据类型时以如下方式使用此函数: data U l : Setn l where
...
Lift : {l' : Nat} -> {l' <= l} -> U l' -> U l 在这里,A
Emacs (来自)和Agda (通过自制软件)都可以优雅地安装。但是,在运行agda-mode setup之后启动Emacs时,我收到以下错误:
Warning (initialization): An error occurred while loading ‘/Users/user/.emacs’:
File is missing: Cannot open load file, No such file or directory, /Users/user/zsh:1: command not found: agda-mode
Emacs的终端版本可以正确加载Agda模式,我尝试了 -l
下面的代码是用来描述C/C++类枚举,这些枚举可以占用4个字节,尽管它们应该包含的只是几个不同的选项。
open import Prelude.Bool
open import Prelude.Nat
open import Agda.Builtin.Nat
open import Agda.Builtin.Equality
open import Numeric.Nat.Pow renaming (_^′_ to _^_)
data Enum : Set where
makeEnum : (size : Nat) → (variants : Nat) →
.
我有以下几点: open import Agda.Builtin.Equality
open import Agda.Builtin.Nat renaming (Nat to ℕ)
open import Agda.Builtin.Sigma
open import Agda.Primitive
_×_ : {n m : Level} (A : Set n) (B : Set m) → Set (n ⊔ m)
X × Y = Σ X (λ _ → Y)
ℕ² : Set
ℕ² = ℕ × ℕ
canonical : ℕ² → ℕ²
canonical (x , 0) = (x , 0
在立体Agda中,我如何证明两件事是不平等的?(v2.6.1,立体式回购版acabbd9)
具体来说,下面是作为更高归纳类型的整数:
{-# OPTIONS --safe --warning=error --cubical --without-K #-}
open import Cubical.Core.Everything
open import Cubical.Foundations.Prelude
module Integers where
data False : Set where
data ℕ : Set where
zero : ℕ
succ : ℕ → ℕ
{
我已经开始玩立体Agda了。我做的最后一件事是以一种类似于古典数学中所做的方式来构建整数的类型(假设自然数的类型已经定义)(参见)。这是
data dInt : Set where
_⊝_ : ℕ → ℕ → dInt
canc : ∀ a b c d → a + d ≡ b + c → a ⊝ b ≡ c ⊝ d
trunc : isSet (dInt)
做完之后,我想定义加法。
_++_ : dInt → dInt → dInt
(x ⊝ z) ++ (u ⊝ v) = (x + u) ⊝ (z + v)
(x ⊝ z) ++ canc a b c d u i
如果我想使用提供碰撞名称的包,该怎么办?
module Halp where
open import Data.String
open import Data.Char
open import Data.Bool
foo : String -> String -> String
foo a b with a == b
... | true = "foo"
... | false = "bar"
通向
Ambiguous name _==_. It could refer to any one of
Dat
是否有可能定义一个简单的相等语法概念(类似于GHC可能自动派生为Haskell 98类型的Eq实例),而不显式地证明每个数据构造函数是内射的,或者执行类似的操作,例如定义每个构造函数的回缩和使用cong?
换句话说,是否有可能更直接地利用数据构造函数的内射性,而不是每个构造函数引入一个辅助函数?
下面以自然数为例。
module Eq where
open import Function
open import Relation.Binary
open import Relation.Binary.PropositionalEquality
open import R
例如,在Agda中表示STLC可以作为:
data Type : Set where
* : Type
_⇒_ : (S T : Type) → Type
data Context : Set where
ε : Context
_,_ : (Γ : Context) (S : Type) → Context
data _∋_ : Context → Type → Set where
here : ∀ {Γ S} → (Γ , S) ∋ S
there : ∀ {Γ S T} (i : Γ ∋ S) → (Γ , T) ∋ S
data Term : Context → Typ