使用下面的Agda代码,我在A₂中得到了一个关于B定义的错误:
module Whatever where
module A₁ where
data B : Set where
module A₂ where
open A₁ renaming (B to B₁)
data B : Set where
错误消息为:
Duplicate definition of module B. Previous definition of datatype
module B at /home/cactus/prog/agda/modules.agda:4,8-9
when scope che
问题
我有一个简单的共归纳记录和类型的单字段。Unit给了我们一个简单的类型来玩。
open import Data.Maybe
open import Data.Sum
data Unit : Set where
unit : Unit
record Stream : Set where
coinductive
field
step : Unit ⊎ Stream
open Stream
作品
valid通过终止检查程序:
valid : Maybe Unit → Stream
step (valid x) = inj₂ (valid x)
断点
但是,假设我想要消
我试图遵循McBride的的代码,并且无法理解为什么Agda (我使用的是Agda 2.4.2.2)给出了以下错误消息:
实例搜索只能在检查表达式t是否具有.T类型时用于查找命名类型中的元素。
用于函数_:-_。代码给出如下
data Zero : Set where
record One : Set where
constructor <>
data Two : Set where tt ff : Two
So : Two -> Set
So tt = One
So ff = Zero
record <<_>> (P : Set)
我想知道是否有一种系统的方法来解释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函数应该查找一个列表,循环索引溢出:
module Test where
open import Prelude.Nat
open import Prelude.List
roundIndex : {A : Set} -> Nat -> A -> List A -> A
roundIndex n x xs = go n xs where
go : {A : Set} -> Nat -> List A -> A
go (suc n) (x ∷ xs) = go n xs
go (suc n) [] = go n
我正在写一篇论文,试图用Agda实现他们的Haskell代码。他们希望通过这样的方式来制定停顿问题:让bot成为一个程序,这样对于任何数据类型a
bot :: a
bot = bot
他们继续定义
data S = T
所以停机问题是这样说的:
定义的函数diverges : S → S
diverges(T)= bot
diverges(bot)= T
是不可计算的,因此在我们的语言中是不可定义的
我尝试在Agda中实现它,如下所示:
data S : Set where
⊤ : S
⊥ : _
⊥ = ⊥
diverges : S → S
diverges ⊤ = ⊥
diverg
我使用以下代码创建了一个emacs文件trial_agda.agda:
module trial_agda where
data : Set where
zero :
suc : →
data _even : → Set where
ZERO : zero even
STEP : ∀ x → x even → suc (suc x) even
_+_ : → →
(zero + n) = n
(suc n) + n′ = suc (n + n′)
在中,作者写道:
现在我们将在Agda中证明四是偶数。在emacs缓冲区中键入以下内容,然后键入C
-- \
下列Agda代码:
module test where
open import Data.Float
import Relation.Binary.PropositionalEquality as Eq
open Eq using (_≡_)
open Eq.≡-Reasoning using (begin_; _≡⟨⟩_; step-≡; _∎)
postulate
distrib : {m a b : Float} → m * (a + b) ≡ (m * a) + (m * b)
dbg : (m a b : Float) → m * (a + b) ≡ (m * a) +
我正在编码并证明Agda中编译器的代码生成部分的正确性。我很难说服Agda相信我的一些功能终止了。我使用的高级语言有while循环,所以很明显,对于任何给定的程序,都不能保证终止。 正因为如此,我使用了一个"fuel“变量,它只是一个自然数,在执行每个表达式时都会减1,从而限制了程序可以运行的步数。 我很满意,这保证了终止,但Agda不是那么容易被说服的。 data Stateᴴᴸ : Set where
stateᴴᴸ : Store → (fuel : ℕ) → Stateᴴᴸ
{-# TERMINATING #-}
storeᴴᴸ' : IExp → St
我试图证明整数上的可分性。首先,我试图证明可分性是反映的。
∣-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这个事实
假设我已经为所有e显示了2 ^ e ≢ 0 module Question where
open import Data.Nat
open import Data.Nat.DivMod
open import Relation.Binary.PropositionalEquality
postulate 2^e≢0 : (e : ℕ) → 2 ^ e ≢ 0 我现在希望类型检查器在下面这样的情况下使用这些知识: postulate lemma : (m e : ℕ) → m / 2 ^ e ≤ m 在这里,类型检查器使用_≢0_6 : Relation.Nullary.Decidable
我是Agda的新手,我试图定义一个类型为prod的常量Z → (Z → ((Z → Set) → Set)):Z → (Z → ((Z → Set) → Set))
现在,我编写了以下Agda代码:
data Prod (X : Set) : ℕ → X where
prod : ℕ → (ℕ → ((ℕ → X) → X))
当我键入它时,agda会生成以下错误消息:
X != Set (_33 X_) of type Set
when checking the definition of Prod
任何帮助都是非常感谢的。
我对类型理论和依赖类型编程非常陌生,最近正在尝试Agda的各种功能。下面是我编写的记录类型C的一个非常简单的示例,它包含多个组件记录和一些我们可以用来证明东西的约束条件。
open import Relation.Binary.PropositionalEquality
module Sample (α : Set) where
record A (type : α) : Set where
record B : Set where
field
type : α
record C : Set where
field
b₁ : B
如果需要的话,必须在Coq中以公理方式添加UIP (以及类似于公理K的等价物):
uip : ∀ A (x y: A) (p q: x = y), p = q
这是令人惊讶的,因为从等式的定义来看,这是显而易见的,它只有一个构造函数。(当然,这取决于对Coq中归纳定义包含其类型的所有元素的解释)。
当你试图证明UIP时,你会被困在反身子大小写上:
uip_refl : ∀ A (x: A) (h: x = x), h = eq_refl x
我们可能希望下面这个术语是一个恰当的证明术语:
fun A (x: A) (h: x = x) =>
match h as h0 in (_ =
为什么自定义单位类型不允许我们证明这个基本的左单位定律?我看到我的实现和标准库之间的唯一区别是使用了Record和Data归纳类型。我不明白为什么Data不允许我证明这个基本的左恒等引理,这应该是绝对正确的。这与Record的自动eta继承有关吗?如果是,为什么会这样?有没有可能在没有内置(例如Record)单元类型的情况下证明这一点?一般来说,这是Data的限制,还是可以在agda模数记录中做所有的事情? data _≡_ {A : Set} : A → A → Set where
refl : (a : A) → a ≡ a
--from builtin
lunitm : (f :
我是从“Agda的残酷介绍”上学到的。
假设我们想在偶数上用二除法。我们可以这样做:
div : (n : N) -> even n -> N
div zero p = zero
div (succ (succ n)) p= succ (div n p)
div (succ zero) ()
N是自然数,甚至是下面的“命题”
even : N -> Set
even zero = \top
even (succ zero) = \bot
even (succ (succ n)) = even n
data \bot : Set where
record \top : Set
我们必须将这个haskell数据类型转换为agda代码:
data TRUE
data FALSE
data BoolProp :: * -> * where
PTrue :: BoolProp TRUE
PFalse :: BoolProp FALSE
PAnd :: BoolProp a -> BoolProp b -> BoolProp (a `AND` b)
POr :: BoolProp a -> BoolProp b -> BoolProp (a `OR` b)
PNot :: BoolProp a -> BoolProp (NOT a)
到目前
除了在文件系统上使用Agda (通过EMACS、终端等),是否可以直接从Haskell中将其用作库?例如:
-- UsingAgda.hs
import Agda
-- Prints the type of a term on some Agda code
main :: IO ()
main = typeOf "true" agdaCode where
agdaCode :: String
agdaCode = unlines
["module Hello where "
," &
以下代码在Haskell中完全正确:
dh :: Int -> Int -> (Int, Int)
dh d q = (2^d, q^d)
a = dh 2 (fst b)
b = dh 3 (fst a)
Agda中类似的代码无法编译(终止检查失败):
infixl 9 _^_
_^_ : ℕ → ℕ → ℕ
x ^ zero = 1
x ^ suc n = x * (x ^ n)
dh : ℕ -> ℕ -> ℕ × ℕ
dh d q = 2 ^ d , q ^ d
mutual
a = dh 2 (proj₁ b)
b = dh 3 (proj₁ a)
大多数与Agda的交互都是用EMACS完成的,但是有没有办法以编程的方式完成呢?也就是说,是否可以通过命令行或某些API完成所有操作?主要目标是构建一个瘦包装器,以便我们可以从另一种语言(例如:
var Agda = require("agda");
var code = `
data Bool: Set where
true: Bool
false: Bool
not : Bool -> Bool
not true = false
not false = true
val : Bool
在Windows上的Agda 2.5.1.1中,在加载了下面的代码(它对应于教程)之后,code类型检查确实为[]表达式找到了List₁ _A_2 _B_3类型,但是对于任何更结构化的表达式,比如true ∷ [],只返回下划线和数字,比如_5,没有合理的类型。知道原因是什么吗?
本教程以前的练习效果很好。
module Sets.Parametric where
open import Sets.Enumerated using (Bool; true; false; ⊤; tt)
data List₁ (A B : Set) : Set
data List₂ (A B : Se
众所周知,您可以很容易地从两个元组构建n元组。
record Twople (A B : Set) : Set where
constructor _,_
field
fst : A
snd : B
n-ple : List Set -> Set
n-ple = foldr Twople Unit
(Agda语法,但它将在Idris中工作,并且可以在Haskell,Scala.)
同样,您也可以从二进制和构建n进制和类型.
data Either (A B : Set) : Set where
left : A -> Either A B
righ
我有一些代码在Haskell中工作,我想把它转换成Agda。
这是Haskell代码
main = do
putStrLn "A string"
putStrLn "second string"
输出结果是
A string
second string
我试着把它转换成Agda:
open import Common.IO
main = do
putStrLn "A string"
putStrLn "second string"
但我只是得到了错误消息
'_>>_ needs to be i
在agda文档中,我读到,当“除了目标之外的一些元变量无法被解决时,代码将被突出显示为黄色”。
我试图在一个有点堕落的案例中理解这一点。
如果我定义了一个常规产品类型,那么一个愚蠢的程序就能正常工作。
data _==_ {l}{X : Set l}(x : X) : X -> Set where
refl : x == x
data prod (A B : Set) : Set where
_,,_ : A → B → prod A B
fst' : {A B : Set} → prod A B → A
fst' (x ,, x₁) = x
stupid
我试着学习agda并使用。我粘贴两个多递归集的代码。
module MoreSets where
data List₁ (A B : Set) : Set
data List₂ (A B : Set) : Set
data List₁ (A B : Set) where
[] : List₁ A B
_∷_ : A → List₂ A B → List₁ A B
data List₂ (A B : Set) where
_∷_ : B → List₁ A B → List₂ A B
并得到错误
MoreSets.agda:6,12-23
U