简而言之,我正在寻找一个定理证明器,它的底层逻辑支持多个子类型/子类化机制。(我尝试使用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 ++表达!所以我正在寻找一个正式的系统/工具,我可以在那里定义这样的子类型结构,我可以推理出来吗?
非常感谢
答案 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"
在上面的示例中,可以看出类型tC
,tE
和tF
自然而且很容易被强制转换为类型tA
或tB
。
这种类型的强制在伊莎贝尔中完成了很多。例如,类型nat
用于定义int
,int
用于定义rat
。因此,nat
会自动强制转为int
,但int
不会rat
。
typedecl
来介绍新类型,而这通常不会反映人们如何定义新类型。
typedecl
定义的类型几乎总是基础和公理化,例如在Nat.thy中使用ind
。datatype_new
是在Isabelle / HOL中定义新类型的主要自动方式之一。
datatype_new
(和datatype
)的部分功能用于定义递归类型,以及它与fun
一起使用,例如模式匹配。datatype_new
的新能力并非微不足道。例如,类型和ZFC集之间的区别特征是ZFC集可以任意嵌套。现在,使用datatype_new
,可以定义一种可以任意深度嵌套的可数或有限集。我可以继续使用上面的列表,但是我将该列表与其他两个关键字分开来定义新类型typedef
和quotient_type
。
我将这两者分开是因为,现在,我们进入你的投诉领域,Isabelle / HOL的逻辑不能轻易地,多次定义类型/子类型关系。
我什么都不知道,我现在知道我应该只使用typedef
作为最后的手段。它实际上在HOL源代码中使用了很多,但是,然后,开发人员必须做很多工作才能使用它定义的类型易于使用,例如使用fset
您列出了可能拥有最大市场份额的3名助理助理,Coq,Isabelle和Agda。
使用助理,我们定义您的优先级,进行研究,然后选择一个,但它与编程语言类似。我们不会把它们全部搞定。
对我自己来说,数学语法和结构化证明非常重要。伊莎贝尔似乎足够强大,所以我选择它。当然,这不是一个完美的世界。
嗯,它功能强大,但它也受到限制,因为在定义类型类时只能使用一个类型变量。
如果你看看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
实例化(证明)List
是Monoid
(鉴于Nil
是中性元素的证明,以及相关性证明)。