我如何将下一个有理数生成为 2 个整数变量。例如, (1,1) (2,1) (1,2) (1,3) (3,1) .. 我有生成它的算法:
if(n % 2 == d % 2)
{
n++;
if(d > 1) d--;
}
else{
d++;
if(n > 1) n--;
}
问题是如何在Agda
a中构建动态流。我将从 (1,1) 开始,然后生成下一对并将其添加到流中。请任何人帮助。
我如何将下一个有理数生成为 2 个整数变量。例如, (1,1) (2,1) (1,2) (1,3) (3,1) .. 我有生成它的算法:
if(n % 2 == d % 2)
{
n++;
if(d > 1) d--;
}
else{
d++;
if(n > 1) n--;
}
问题是如何在Agda
a中构建动态流。我将从 (1,1) 开始,然后生成下一对并将其添加到流中。请任何人帮助。
就像iterate
在 Haskell 中一样:
open import Relation.Nullary.Decidable
open import Data.Bool using (if_then_else_)
open import Data.Nat
open import Data.Product
open import Data.Stream
next : ℕ × ℕ -> ℕ × ℕ
next (n , m) = if ⌊ n ≟ 1 ⌋ then m + 1 , 1 else pred n , suc m
stream : Stream (ℕ × ℕ)
stream = iterate next (1 , 1)
open import Relation.Binary.PropositionalEquality
open import Data.Vec hiding (take)
test : take 10 stream ≡ (1 , 1) ∷ (2 , 1) ∷ (1 , 2) ∷ (3 , 1) ∷ (2 , 2) ∷ (1 , 3)
∷ (4 , 1) ∷ (3 , 2) ∷ (2 , 3) ∷ (1 , 4) ∷ []
test = refl