【问题标题】:Converting Coq to Idris将 Coq 转换为 Idris
【发布时间】:2014-05-02 20:56:49
【问题描述】:

对于将 Coq 源代码转换为 Idris 有哪些有用的指导原则(例如,它们的类型系统有多相似以及如何翻译证明)?据我所知,Idris 的内置战术库很小但可扩展,所以我想通过一些额外的工作应该可以做到这一点。

【问题讨论】:

  • 我希望能够通过 Idris 做“软件基础”。这似乎是学习它的好方法。 6 点赞和 4 颗星。有人愿意提供反馈吗?很多新手都想知道。
  • 这可能不相关,但我猜你想要一种语言来做证明和编程。你也可以直接使用 Coq 进行编程,使用(相当新的)Coq.io 库。这个库向 Coq 添加了 IO 和并发原语,并使用了一些技术来验证它们。 完全免责声明:我是 Coq.io 的主要作者

标签: coq idris


【解决方案1】:

我最近翻译了Software Foundations 的一部分,并做了{P|N|Z}Arith 的部分移植,我在此过程中做了一些观察:

目前并不真正推荐使用 Idris 策略(在他们的 Pruvloj/Elab.Reflection 形式中),这个工具有点脆弱,当出现问题时很难调试。最好使用所谓的“Agda 风格”,尽可能依赖模式匹配。以下是更简单的 Coq 策略的一些粗略等价物:

  • intros - 仅提及 LHS 上的变量
  • reflexivity - Refl
  • apply- 直接调用函数
  • simpl - 简化由 Idris 自动完成
  • unfold - 也会自动为您完成
  • symmetry - sym
  • congruence/f_equal - cong
  • split - 在 LHS 中拆分
  • rewrite - rewrite ... in
  • rewrite <- - rewrite sym $ ... in
  • rewrite in - 要在您拥有的内容中重写作为参数,您可以使用 replace {P=\x=>...} equation term 构造。遗憾的是,Idris 大部分时间都无法推断出P,所以这变得有点笨重。另一种选择是将类型提取到引理中并使用rewrites,但这并不总是有效(例如,当replace 使大部分术语消失时)
  • destruct - 如果在单个变量上,尝试在 LHS 中拆分,否则使用 with 构造
  • induction - 在 LHS 中拆分并在 rewrite 中或直接使用递归调用。确保递归中的至少一个参数在结构上更小,否则您将完全失败并且无法将结果用作引理。对于更复杂的表达式,您还可以尝试 SizeAccessible from Prelude.WellFounded
  • trivial - 通常相当于在 LHS 中尽可能多地拆分并使用 Refls 解决
  • assert - where 下的引理
  • exists - 依赖对 (x ** prf)
  • case - case .. ofwith。但是要小心case - 不要在以后想要证明的任何事情中使用它,否则你会卡在rewrite 上(请参阅issue #4001)。一种解决方法是制作顶级(目前您不能在where/with 下引用引理,请参阅issue #3991)模式匹配助手。
  • revert - 通过制作 lambda 并随后将其应用于所述变量来“取消引入”变量
  • inversion - 手动定义和使用关于构造函数的琐碎引理:

    -- injectivity, used same as `cong`/`sym`
    FooInj : Foo a = Foo b -> a = b
    FooInj Refl = Refl
    
    -- disjointness, this sits in scope and is invoked when using `uninhabited`/`absurd`
    Uninhabited (Foo = Bar) where   
      uninhabited Refl impossible   
    

【讨论】:

  • 这很好,感谢您的努力和详细的回答。就此而言,您是否会碰巧知道是否要进一步开发 Pruviloj 或类似的东西?
  • 可能不是它的创建者大卫·克里斯蒂安森(David Christiansen),我认为他现在主要从事 Racket 的工作。仍然欢迎贡献,我个人为 Pruviloj 添加了一些策略 :) 从长远来看,Edwin Brady 一直在努力重写 Idris 本身的 Idris 核心,其中可能还包括对 elaborator 的重写.
  • 对这个好答案的一堆 cmets:(1)intros 不仅仅是添加一些参数,如果使用所谓的intros-patterns(这些主要是参数+ 解构 + 重写); (2) reflexivity 是一个相当复杂的策略,它有几个后备,可以使用 setoids 和 one-constructor 数据类型; (3) apply 也做了一些额外的事情; (4) Coq 的congruence 策略比来自 Idris 的cong 引理强大得多。 congruence 是具有未解释符号的地面等式决策程序。
  • 哇,软件基础重写看起来棒极了!我真希望我在学习 Idris 时能早点找到它,但它仍然对我很有帮助!非常感谢!
猜你喜欢
  • 2014-03-05
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2018-05-30
  • 2019-02-13
  • 1970-01-01
相关资源
最近更新 更多