如何"与"关键字在agda中有效吗?以及下面的代码?

时间:2015-05-08 07:57:50

标签: agda

我无法清楚地理解它。我试着学习"用"关键字,但我也怀疑。请帮忙 !!!

我想了解"与"并使用此代码。

something-even : ∀ n → Even n ⊎ Even (suc n)
something-even zero = inj₁ zero
something-even (suc n) with something-even n
... | inj₁ x = inj₂ (suc-suc x)
... | inj₂ y = inj₁ y
(this states that either n is even or its successor is even). In fact, thm0 can be implemented without using recursion!

thm0 : ∀ x → ∃ λ y → Even y × x less-than y
thm0 n with something-even n
... | inj₁ x = suc (suc n) , suc-suc x , suc ref
... | inj₂ y = suc n , y , ref

1 个答案:

答案 0 :(得分:3)

如果您熟悉Haskell,您会注意到在Agda中没有if - 语句而没有case

with对表达式结果进行模式匹配。例如,with something-even n评估something-even n,然后使用... | inj₁ x... | inj₂ y对以下行进行模式匹配。这些匹配表达式,以查看它的值是使用inj₁还是inj₂构造函数构造的,以便它们包含的值可以在右侧表达式中使用:suc (suc n) , suc-suc x , suc ref使用由x确定的inj₁ xsuc n , y , ref使用y确定的inj₂ y

实际的构造函数名称来自的定义 - 请参阅something-even联接类型Even nEven (suc n)的类型。因此,x中的inj₁ x对应于给定Even n的{​​{1}}类型的值,而n中的y对应于类型{的值inj₂ y {1}} Even (suc n)