我想 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)"
如果没有更好的方法,这可以正常工作。缺点是我必须实例化int
,class
命令需要时间来实现自己。
这个更新是为Makarius澄清我想要的是什么,解释我想要它的目的,并给出一个我熟悉的用于创建符号,缩写和同义词的命令列表,但命令我无法为了我想要的东西而工作。
我猜“同义词”本来是一个更好的词,但我选择了“缩写”,因为它描述了我想要的东西,它能够为类型类创建一个更短的名称,比如重命名{{1}到linordered_semidom
。虽然Isar losdC
具有abbreviation
的一些属性,但它也只定义了语法。所以,因为“abbreviate”描述了我想要的东西,而definition
只是定义了语法,所以我选择了“缩写”而不是“同义词”或“别名”。
“Alias”会描述我想要的东西。关于句子“如果你只是想在编辑器中保存输入,你可以在那里使用一些缩写”,这里是我尝试重命名abbreviation
的命令,但我无法得到它们为我工作:
linordered_idom
type_notation
type_synonym
notation
abbreviation
而不是解释我尝试过的东西,并试着记住我尝试过的东西,我只是列出它们。我对“类”进行了搜索,只找到了Isar命令syntax
和class
。我想也许locale命令可能适用,但我没有找到任何东西。
我想要的很简单,就像classes
如何用来定义类型的同义词一样。
我一般希望缩短类型类名称,例如type_synonym
,因为最终,我计划广泛使用代数类型类。
然而,还有第二个原因,那就是将linordered_idom
之类的内容重命名为三种类型的命名方案的一部分。
对于任何代数类型类,例如linordered_semidom
,我可以使用该类型类以及linordered_semidom
来创建我称之为数字系统的类,例如{{1} }用于定义quotient_type
。
使用nat
作为模板,我使用int
执行此操作,然后将其实例化为Int.thy
,这是我现在有时间去的。
此外,使用linordered_semidom
,对于任何具有comm_ring_1
和typedef
(以及其他诸如zero
)依赖关系的代数类型类,我可以定义一个类型大于或等于零的所有元素的大小,以及大于零的所有元素的另一个元素。我为one
执行了此操作,但后来我发现我确实需要使用ord
路径来获取模型linordered_idom
的内容。
这是一个很长的解释。最后,我将开始使用众多代数类型类,并且从一个类型类中,我将再获得两个类。如果我为20个类型执行此操作,并且也使用它们,那么长的描述性名称不起作用,重命名类型类将帮助我知道什么类型的类一起。
这是quotient_type
的方案,我不知道这将如何实现,直到我能够尝试一切:
rat
是基类。我将其重命名为linordered_semidom
。这三种类型的数字大于或等于零。linordered_semidom
是使用losdC
从losdQ
定义的。它给出了负数,以及强制losdC
强加给quotient_type
的能力。losdC
是使用losdQ
定义的,是大于零的数字。我需要一致的命名方案,以保持一致:losd1
,typedef
和losdC
。
我还没有完全工作和思考(我甚至没有接近),但类似地,这与代数类型实现losdQ
,{{1}之间的基本关系有关。 }和losd1
,其中nat
最终会发挥作用。此外,它是关于从这些类型中获取非负面或正面成员的类型,如果这些类型不是默认的。
int
使用rat
,real
使用nat
。
int
用于int
,默认情况下会得到非负整数,即rat
。
nat
用于int
,我们没有得到nat
的非负成员,我们得到分数。 (同样,我在谈论一种非负面和正面,而不是一组非负面和正面。)
因此,如果我使用int
和rat
定义分数,那么我必须使用rat
两次来获得这些分数的非负和正成员,这意味着我将有4种类型可以跟踪,linordered_idom
,quotient_type
,typedef
和liodC
。
如果有一个简单的解决方案来重命名类型类,那么我就不必要地说了大约600个单词。
答案 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_alias
,Sign.type_alias
,Sign.const_alias
才会出现异常情况,以解决旧版库的问题。