支持(多个)子类型/子类化的定理证明者/证明助手

时间:2014-11-11 15:03:14

标签: haskell coq isabelle agda theorem-proving

简而言之,我正在寻找一个定理证明器,它的底层逻辑支持多个子类型/子类化机制。(我尝试使用Isabelle,但它似乎没有为子类型提供一流的支持。see this

我想定义几种类型,其中一些是其他类的子类/子类型。此外,每种类型可能是多种类型的子类型。例如:

Type A
Type B
Type C
Type E
Type F

C is subtype of A
C is also subtype of B
E and F are subtypes of B

PS: 我再次编辑这个问题更具体(因为抱怨主题!):我正在寻找一个定理证明/证明帮助,我可以直接定义上述结构(不是变通方法)正如这里一些值得尊敬的答案所描述的那样)。如果我把类型作为类,那么上面的子类似乎可以轻松用C ++表达!所以我正在寻找一个正式的系统/工具,我可以在那里定义这样的子类型结构,我可以推理出来吗?

非常感谢

3 个答案:

答案 0 :(得分:4)

你包括'isabelle'标签,恰好是根据"Wiki Subtyping",Isabelle提供了一种形式的子类型,“强制性子类型”,尽管如Andreas Lochbihler解释的那样,Isabelle并不真的有像你想要的那样(和其他人想要的)进行子类型化。

然而,你在谈论模糊的一般性,所以我很容易提供一个满足你的5种类型的要求的人为的例子。虽然它是人为的,但并不是没有意义的,正如我在下面解释的那样。

(*The 5 types.*)
  datatype tA = tA_con int rat real
  type_synonym tB = "(nat * int)"
  type_synonym tC = int
  type_synonym tE = rat
  type_synonym tF = real

(*The small amount of code required to automatically coerce from tC to tB.*)
  fun coerce_C_to_B :: "tC => tB" where "coerce_C_to_B i = (0, i)"
  declare [[coercion coerce_C_to_B]]

(*I can use type tC anywhere I can use type tB.*)
  term "(2::tC)::tB"
  value "(2::tC)::tB"

在上面的示例中,可以看出类型tCtEtF自然而且很容易被强制转换为类型tAtB

这种类型的强制在伊莎贝尔中完成了很多。例如,类型nat用于定义intint用于定义rat。因此,nat会自动强制转为int,但int不会rat

Wrap I(你没有使用过规范的HOL):

  • 在上一个问题示例中,您一直在使用typedecl来介绍新类型,而这通常不会反映人们如何定义新类型。
    • 使用typedecl定义的类型几乎总是基础和公理化,例如在Nat.thy中使用ind
    • 见:isabelle.in.tum.de/repos/isabelle/file/8f4a332500e4/src/HOL/Nat.thy#l21
  • 关键字datatype_new是在Isabelle / HOL中定义新类型的主要自动方式之一。
    • datatype_new(和datatype)的部分功能用于定义递归类型,以及它与fun一起使用,例如模式匹配。
    • 与其他证明助理相比,我认为datatype_new的新能力并非微不足道。例如,类型和ZFC集之间的区别特征是ZFC集可以任意嵌套。现在,使用datatype_new,可以定义一种可以任意深度嵌套的可数或有限集。
  • 您可以使用标准类型(如元组,列表和记录)来定义新类型,然后可以将其与强制一起使用,如上例所示。

Wrap II(但是,是的,那会很好):

我可以继续使用上面的列表,但是我将该列表与其他两个关键字分开来定义新类型typedefquotient_type

我将这两者分开是因为,现在,我们进入你的投诉领域,Isabelle / HOL的逻辑不能轻易地,多次定义类型/子类型关系。

我什么都不知道,我现在知道我应该只使用typedef作为最后的手段。它实际上在HOL源代码中使用了很多,但是,然后,开发人员必须做很多工作才能使用它定义的类型易于使用,例如使用fset

Wrap III(然而,在这个不完美的世界中,没有一个是完美的):

您列出了可能拥有最大市场份额的3名助理助理,Coq,Isabelle和Agda。

使用助理,我们定义您的优先级,进行研究,然后选择一个,但它与编程语言类似。我们不会把它们全部搞定。

对我自己来说,数学语法和结构化证明非常重要。伊莎贝尔似乎足够强大,所以我选择它。当然,这不是一个完美的世界。

Wrap IV(Haskell,Isablle和类型类):

事实上,Isabelle确实有一种非常强大的子类形式,“类型类”。

嗯,它功能强大,但它也受到限制,因为在定义类型类时只能使用一个类型变量。

如果你看看Groups.thy,你会看到课后一堂课的介绍,以创建一个类的层次结构。

  • isabelle.in.tum.de/repos/isabelle/file/8f4a332500e4/src/HOL/Groups.thy

您还包含了'haskell'标签。 Isabelle / HOL的函数编程属性及其datatype和类型类有助于将Isabelle / HOL的使用与Haskell的使用联系起来,正如Isabelle代码生成器生成Haskell代码的能力所证明的那样。 / p>

答案 1 :(得分:4)

PVS传统上强调"谓词子类型"很多,但这些系统现在有点过时了,并且落后于其他更活跃的大玩家:Coq,Isabelle / HOL,Agda,其他HOL,ACL2。

您没有明确申请。我认为任何一个大系统都可以应用于这个问题,无论如何。形式化是在给定的逻辑环境中以合适的方式表达您的问题的问题。逻辑不是编程语言,而是具有数学的真正力量。因此,凭借在特定逻辑中的一些经验,您将能够做出一些您一见钟情的伟大而神奇的事物。

选择系统时,特定低级功能的列表并不那么相关。在做出承诺之前,更喜欢您喜欢系统的一般风格和文化。你可以将它与学习外语进行比较。在你花费数月或数年学习之前,你是否收集了语法的特征?我不这么认为。

答案 2 :(得分:2)

有很多方法可以在agda中实现这一目标。

  • 将与一个"类型"相关的功能分组。进入record
  • 的字段
  • 为您想要的类型构建此类record的实例
  • 将该记录传递给需要它们的证明

例如:

  record Monoid (A : Set) : Set where
    constructor monoid
    field
      z   : A
      m+  : A -> A -> A
      xz  : (x : A) -> m+ x z == x
      zx  : (x : A) -> m+ z x == x
      assoc : (x : A) -> (y : A) -> (z : A) -> m+ (m+ x y) z == m+ x (m+ y z)
  open Monoid public

现在list-is-monoid = monoid Nil (++) lemma-append-nil lemma-nil-append lemma-append-assoc实例化(证明)ListMonoid(鉴于Nil是中性元素的证明,以及相关性证明)。