首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在agda的决策能力框架内工作

在agda的决策能力框架内工作
EN

Stack Overflow用户
提问于 2020-04-14 21:40:13
回答 1查看 73关注 0票数 2

我在使用字符串可判断性时遇到了问题。首先,我搞不懂为什么在Agda中使用可判断性如此困难,而在Coq中它看起来像黄油一样顺利。当我试图证明这个关于字符串的简单定理时,Agda展开了这个混乱的定义,除非你确切地知道你想要做什么,否则几乎不可能使用它。如何通过模式匹配来处理字符串的可判断性,使定义保持得体?

我正在使用Stump的keep函数,而不是Agda的inspect。

代码语言:javascript
复制
keep : ∀{ℓ}{A : Set ℓ} → (x : A) → Σ A (λ y → x ≡ y)
keep x = ( x , refl )

--first roadblock
eqbStringrefl' : forall (b : String) →  true ≡ (b == b)
eqbStringrefl' b with keep (b ≟ b)
eqbStringrefl' b | (.true Relation.Nullary.because Relation.Nullary.ofʸ refl) , snd = {!!}
eqbStringrefl' b | (.false Relation.Nullary.because Relation.Nullary.ofⁿ ¬p) , snd = {!!}

以下是Agda的输出:

代码语言:javascript
复制
-- Goal: true ≡
--       Relation.Nullary.Decidable.Core.isYes
--       (Relation.Nullary.Decidable.Core.map′
--        (λ x →
--           Agda.Builtin.String.Properties.primStringToListInjective b b
--           (Data.List.Relation.Binary.Pointwise.Pointwise-≡⇒≡
--            (Data.List.Relation.Binary.Pointwise.map
--             (λ {z} {z = z₁} →
--                Agda.Builtin.Char.Properties.primCharToNatInjective z z₁)
--             x)))
--        (λ x →
--           Data.List.Relation.Binary.Pointwise.map
--           (cong Agda.Builtin.Char.primCharToNat)
--           (Data.List.Relation.Binary.Pointwise.≡⇒Pointwise-≡
--            (cong Data.String.toList x)))
--        (Data.List.Relation.Binary.Pointwise.decidable
--         (λ x y →
--            Relation.Nullary.Decidable.Core.map′
--            (Data.Nat.Properties.≡ᵇ⇒≡ (Agda.Builtin.Char.primCharToNat x)
--             (Agda.Builtin.Char.primCharToNat y))
--            (Data.Nat.Properties.≡⇒≡ᵇ (Agda.Builtin.Char.primCharToNat x)
--             (Agda.Builtin.Char.primCharToNat y))
--            (Data.Bool.Properties.T?
--             (Agda.Builtin.Char.primCharToNat x Data.Nat.≡ᵇ
--              Agda.Builtin.Char.primCharToNat y)))
--         (Data.String.toList b) (Data.String.toList b)))
-- ————————————————————————————————————————————————————————————
-- snd : Relation.Nullary.Decidable.Core.map′
--       (λ x →
--          Agda.Builtin.String.Properties.primStringToListInjective b b
--          (Data.List.Relation.Binary.Pointwise.Pointwise-≡⇒≡
--           (Data.List.Relation.Binary.Pointwise.map
--            (λ {z} {z = z₁} →
--               Agda.Builtin.Char.Properties.primCharToNatInjective z z₁)
--            x)))
--       (λ x →
--          Data.List.Relation.Binary.Pointwise.map
--          (cong Agda.Builtin.Char.primCharToNat)
--          (Data.List.Relation.Binary.Pointwise.≡⇒Pointwise-≡
--           (cong Data.String.toList x)))
--       (Data.List.Relation.Binary.Pointwise.decidable
--        (λ x y →
--           Relation.Nullary.Decidable.Core.map′
--           (Data.Nat.Properties.≡ᵇ⇒≡ (Agda.Builtin.Char.primCharToNat x)
--            (Agda.Builtin.Char.primCharToNat y))
--           (Data.Nat.Properties.≡⇒≡ᵇ (Agda.Builtin.Char.primCharToNat x)
--            (Agda.Builtin.Char.primCharToNat y))
--           (Data.Bool.Properties.T?
--            (Agda.Builtin.Char.primCharToNat x Data.Nat.≡ᵇ
--             Agda.Builtin.Char.primCharToNat y)))
--        (Data.String.toList b) (Data.String.toList b))
--       ≡ Relation.Nullary.yes refl
-- b   : String

如果我现在应用重写,目标是简化的,但我们在假设列表中仍然有混乱。当我尝试ctrl-a时,我得到了以下错误,尽管目标看起来是不可预测的:

代码语言:javascript
复制
Goal: true ≡ true
Not implemented: The Agda synthesizer (Agsy) does not support
copatterns yet

尽管如此,我仍然能够像snd术语那样进行下去,然后应用基本规则来得出最终的证明。

代码语言:javascript
复制
eqbStringrefl'' : forall (b : String) →  true ≡ (b == b)
eqbStringrefl'' b with keep (b ≟ b)
eqbStringrefl'' b | (.true Relation.Nullary.because Relation.Nullary.ofʸ refl) , snd rewrite snd = {!!}
eqbStringrefl'' b | (.false Relation.Nullary.because Relation.Nullary.ofⁿ ¬p) , snd = {!!}
-- eqbStringrefl'' b | (.true Relation.Nullary.because Relation.Nullary.ofʸ refl) , snd rewrite snd = refl
-- eqbStringrefl'' b | (.false Relation.Nullary.because Relation.Nullary.ofⁿ ¬p) , snd = ⊥-elim (¬p refl)

最后一行是完整的证明。任何建议都会很有帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-20 19:36:32

通过导入定义了可判断性概念的Relation.Nullary,您将获得对yes and no patterns的访问权限,并且Agda将很高兴地将(.true Relation.Nullary.because Relation.Nullary.ofʸ refl)重新命名为yes refl,将另一个(.true Relation.Nullary.because Relation.Nullary.ofʸ refl)重新命名为no ¬p

关于目标的类型,它来自这样一个事实,即字符串的相等是通过字符列表上的逐点相等来获得的,而字符的相等是通过其底层表示为数字的相等来获得的。它是冗长的,但这给了我们一个Agda认可的安全和相当有效的定义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61209121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档