如何为类型类名创建同义词?

时间:2014-02-19 05:32:56

标签: isabelle

我想 abbreviate 为类型类名创建一个同义词。以下是我现在正在做的事情:

class fooC = linordered_idom
instance int :: fooC 
  proof qed

definition foof :: "'a::fooC ⇒ 'a" where
  "foof x = x"

term "foof (x::int)"
value "foof (x::int)"

如果没有更好的方法,这可以正常工作。缺点是我必须实例化intclass命令需要时间来实现自己。

更新140314

这个更新是为Makarius澄清我想要的是什么,解释我想要它的目的,并给出一个我熟悉的用于创建符号,缩写和同义词的命令列表,但命令我无法为了我想要的东西而工作。

我最初选择“缩写”而不是“同义词”

我猜“同义词”本来是一个更好的词,但我选​​择了“缩写”,因为它描述了我想要的东西,它能够为类型类创建一个更短的名称,比如重命名{{1}到linordered_semidom。虽然Isar losdC具有abbreviation的一些属性,但它也只定义了语法。所以,因为“abbreviate”描述了我想要的东西,而definition只是定义了语法,所以我选择了“缩写”而不是“同义词”或“别名”。

同义词/别名,Isar命令我无法为此工作

“Alias”会描述我想要的东西。关于句子“如果你只是想在编辑器中保存输入,你可以在那里使用一些缩写”,这里是我尝试重命名abbreviation的命令,但我无法得到它们为我工作:

  • linordered_idom
  • type_notation
  • type_synonym
  • notation
  • abbreviation

而不是解释我尝试过的东西,并试着记住我尝试过的东西,我只是列出它们。我对“类”进行了搜索,只找到了Isar命令syntaxclass。我想也许locale命令可能适用,但我没有找到任何东西。

我想要的很简单,就像classes如何用来定义类型的同义词一样。

目的

我一般希望缩短类型类名称,例如type_synonym,因为最终,我计划广泛使用代数类型类。

然而,还有第二个原因,那就是将linordered_idom之类的内容重命名为三种类型的命名方案的一部分。

对于任何代数类型类,例如linordered_semidom,我可以使用该类型类以及linordered_semidom来创建我称之为数字系统的类,例如{{1} }用于定义quotient_type

使用nat作为模板,我使用int执行此操作,然后将其实例化为Int.thy,这是我现在有时间去的。

此外,使用linordered_semidom,对于任何具有comm_ring_1typedef(以及其他诸如zero)依赖关系的代数类型类,我可以定义一个类型大于或等于零的所有元素的大小,以及大于零的所有元素的另一个元素。我为one执行了此操作,但后来我发现我确实需要使用ord路径来获取模型linordered_idom的内容。

这是一个很长的解释。最后,我将开始使用众多代数类型类,并且从一个类型类中,我将再获得两个类。如果我为20个类型执行此操作,并且也使用它们,那么长的描述性名称不起作用,重命名类型类将帮助我知道什么类型的类一起。

这是quotient_type的方案,我不知道这将如何实现,直到我能够尝试一切:

  1. rat是基类。我将其重命名为linordered_semidom。这三种类型的数字大于或等于零。
  2. linordered_semidom是使用losdClosdQ定义的。它给出了负数,以及强制losdC强加给quotient_type的能力。
  3. losdC是使用losdQ定义的,是大于零的数字。
  4. 我需要一致的命名方案,以保持一致:losd1typedeflosdC

    最后,最终甚至是4种类型而不是3种

    我还没有完全工作和思考(我甚至没有接近),但类似地,这与代数类型实现losdQ,{{1}之间的基本关系有关。 }和losd1,其中nat最终会发挥作用。此外,它是关于从这些类型中获取非负面或正面成员的类型,如果这些类型不是默认的。

    int使用ratreal使用nat

    int用于int,默认情况下会得到非负整数,即rat

    nat用于int,我们没有得到nat的非负成员,我们得到分数。 (同样,我在谈论一种非负面和正面,而不是一组非负面和正面。)

    因此,如果我使用intrat定义分数,那么我必须使用rat两次来获得这些分数的非负和正成员,这意味着我将有4种类型可以跟踪,linordered_idomquotient_typetypedefliodC

    如果有一个简单的解决方案来重命名类型类,那么我就不必要地说了大约600个单词。

1 个答案:

答案 0 :(得分:1)

定义不是缩写,它引入了一个逻辑相等的单独术语。这适用于术语常数。

类型类在语义上是类型的谓词,因此连接到某个谓词(术语常量),但实际上很少访问它。 那么“缩写类型类”究竟意味着什么呢?

例如,您可能希望操纵类名空间以获取它的别名,这在原则上是可行的。但目的是什么?

如果您只想在编辑器中保存输入,可以在那里使用一些缩写。

在正式系统中,另一种可能性是在名称空间中引入真正的别名。 Isabelle为此提供了一些设施,这些设施没有太多广告,因为如果名称变化太大,存在隐藏图书馆并阻止其他人理解它们的真正危险。

这是它的工作原理,在理论来源中使用一些友好的Isabelle / ML:

class foobar = ord + fixes foobar :: 'a

setup {* Sign.class_alias @{binding f} @{class foobar} *}

typ "'a::f"

instantiation nat :: f
begin
definition foobar_nat :: nat where "foobar_nat = 0"
instance ..
end

请注意,Sign.class_alias仅指狭义上的类型类名称空间。 class同时有很多东西:locale,const(prodicate),类型类。您可以在以下示例中看到这一点,其中该类用作本地定义和定理的“目标”:

definition (in foobar) "fuzz = foobar"
theorem (in foobar) "fuzz = foobar" by (simp add: fuzz_def)

从技术上讲,上面使用的语言环境名称空间也可以支持别名,但是没有这样做。只有基本Sign.class_aliasSign.type_aliasSign.const_alias才会出现异常情况,以解决旧版库的问题。