想治疗II型类和子类型,如集合和子集(Trying to Treat Type Classes an

2019-09-01 02:51发布

这个问题关系到我的以前的SO问题类型的类 。 我问这个问题,以建立未来约语言环境的问题。 我不认为类型类会为我想要做的工作,但如何类型类的工作给了我什么,我想出来的语言环境的想法。

下面,当我用大括号标记{0,0}这并不代表正常的HOL括号,和0代表空集。

有些文件,如果你希望他们

  • A_i130424a.thy - ASCII友好THY。
  • i130424a.thy -非ASCII友好THY。
  • i130424a_DOC.pdf - PDF显示行数。
  • MFZ_DOC.pdf -主要项目,这是关系到。
  • GitHub的文件夹,这个问题和MFZ GitHub的文件夹中。

预问题的谈话

我描述了我在做什么在THY(其中包括我在底部),然后我基本上问,“有什么我可以在这里做解决这个问题,这样我可以使用类型类?”

作为连接上述SO问题,我想扎入Groups.thy semigroup_add 。 我要做的就是创建我的类型的子类型sT使用typedef ,然后我尽量抬起我的一些基本功能常量和运营商进入新的类型,比如我的工会运营商geU ,我的空集emS ,我的无序对集合paS和我的会员谓语inP

这不工作,因为我试图把新型就像一个子集。 具体地讲,我的新类型应该代表该组{ {0,0} }其意图是琐碎半群的一部分,与只有一个元件的半群。

的问题是,二元集合公理指出,如果设置x存在,则设置(paS xx)存在,并且,如果设置的联合公理状态x存在,则设置(geU x)存在。 所以,当我试图举起我的工会运营商到我的新类型,证明方神奇地知道我需要证明(geU{0,0} = {0,0})这是不正确的,但只有一个元素{0,0}在我的新类型,所以它必须是这样的。

我能解决这个问题? 在我的脑海里,我比较集和亚群的类型和子类型,在那里我知道他们是不一样的。 叫我的主要类型, sT和我的亚型subT 。 我需要的是我所有的运营商已经与类型定义sT ,类型,如sT => sT ,类型工作subTsubT被视为类型sT 。 新的运营商和常量已使用类型定义subT ,如类型的函数subT => subT ,这会在一定程度制定出样东西都奇迹般地应该有这些东西的工作。

发帖提问谈话

在这里,我想指出什么是按行号在THY发生。 该行号将在PDF和GitHub的网站上显示出来。

在线21至71有四个部分,其中我结合相关的常数,符号,和一个公理。

  1. 键入sT ,会员谓词inP/PIn ,和平等公理(21至33)。
  2. 空集emS/SEm和空集公理(37至45)。
  3. 二元集合常数paS/SPa和二元集合公理(49至58)。
  4. 联盟不断geU/UGe和工会公理(62〜71)。

在管线75起是我创建一个新的类型与typedef ,然后实例作为类型的类semigroup_add

有没有问题,直到我试图举起我的二元集合功能{.x,y.} ,线108,和我的工会函数(geU x)线114。

下面伊萨尔命令,我表明,在告诉我,我需要证明,某些集等于输出{0,0}不能被证明的事实。

这里是ASCII友好的来源,在那里我已经删除了链接到上面的THY一些意见和行:

theory A_i130424a
imports Complex_Main 
begin  

--"AXIOM (sT type, inP predicate, and the equality axiom)"
typedecl sT ("sT")

consts PIn :: "sT => sT => bool"

notation
  PIn  ("in'_P") and
  PIn  (infix "inP" 51) and
  PIn  (infix "inP" 51)

axiomatization where
  Ax_x: "(! x. x inP r <-> x inP s) <-> (r = s)"
--"[END]"



--"AXIOM (emS and the empty set axiom)"
consts SEm :: "sT" ("emS")

notation (input)
  SEm ("emS")

axiomatization where
  Ax_em [simp]: "(x niP emS)"
--"[END]"



--"AXIOM (paS and the axiom of unordered pairs)"
consts SPa :: "sT => sT => sT"

notation
  SPa ("paS") and
  SPa ("({.(_),(_).})")

axiomatization  where
  Ax_pa [simp]: "(x inP {.r,s.}) <-> (x = r | x = s)"
--"[END]"



--"AXIOM (geU and the axiom of unions)"
consts UGe :: "sT => sT"

notation
  UGe ("geU") and
  UGe ("geU")

axiomatization where
  Ax_un: "x inP geU r = (? u. x inP u & u inP r)"
--"[END]"



--"EXAMPLE (A typedef type cannot be treated as a set of type sT)"
typedef tdLift = "{x::sT. x = {.emS,emS.}}"
  by(simp)

setup_lifting type_definition_tdLift

instantiation tdLift :: semigroup_add
begin
  lift_definition plus_tdLift:: "tdLift => tdLift => tdLift"
    is "% x y. {.emS,emS.}" by(simp)
  instance
  proof
    fix n m q :: tdLift
    show "(n + m) + q = n + (m + q)"
    by(transfer,simp)
  qed
end

theorem
  "((n::tdLift) + m) + q = n + (m + q)"
  by(transfer,simp)

class tdClass =
  fixes emSc :: "'a"                 ("emSk")
  fixes inPc :: "'a => 'a => bool"   (infix "∈k" 51)
  fixes paSc :: "'a => 'a => 'a"     ("({.(_),(_).}k)")
  fixes geUc :: "'a => 'a"           ("⋃k")

instantiation tdLift :: tdClass
begin
  lift_definition inPc_tdLift:: "tdLift => tdLift => bool"
    is "% x y. x inP y" 
    by(simp)
  lift_definition paSc_tdLift:: "tdLift => tdLift => tdLift"
    is "% x y. {.x,y.}"
    --"OUTPUT: 1. (!! (sT1 sT2). ([|(sT1 = emS); (sT2 = emS)|] ==> ({.sT1,sT2.} = emS)))"
    apply(auto)
    --"OUTPUT: 1. ({.emS.} = emS)"
    oops
  lift_definition geUc_tdLift:: "tdLift => tdLift"
    is "% x. geU x"
    --"OUTPUT: 1. (!! sT. ((sT = {.emS,emS.}) ==> ((geU  sT) = {.emS,emS.})))"
    apply(auto)
    --"OUTPUT: 1. ((geU  {.emS,emS.}) = {.emS,emS.})"
    oops  
  lift_definition emSc_tdLift:: "tdLift"
    is "emS" 
    --"OUTPUT: 
       exception THM 1 raised (line 333 of drule.ML):
       RSN: no unifiers
       (?t = ?t) [name HOL.refl]
       ((emS = {.emS,emS.}) ==> (Lifting.invariant (% x. (x = {.emS,emS.})) emS emS))"
    oops
  instance ..
end
--"[END]"


end

Answer 1:

我部分地回答我的问题,其中的原因部分是指这个,当我问一个关于伊萨尔亚型的问题。 通过外表来看,我的问题和答案在这里有关亚型。

至于我是否可以修复与我描述的类型类的问题,我不知道。

(更新:我使用类型类的可能的解决方案将是思想的结合,溶液中的强制类型转换的一部分,在回答解释我的SO问题: 什么是伊莎贝尔/ HOL亚型什么伊萨尔命令产生亚型? ?

如果使用Groups.thy的语言环境是去我的方式,那么相应的类型类的语言环境可能也行。 我可以实例化一个类,如semigroup_add ,使用lift_definition定义plus运营商,甚至举起我的操作符,返回一个bool入式。 不能被提升到新的类型的运营商都在新型反正背景下,其中的强制类型转换能发挥作用,使他们的意义之类的套工会有点无厘头。 魔鬼在细节 。)

用什么,我说我想出来的类型和子类型,我想通了,我得到的是一个形式typedef ,形式存在的功能RepAbs ,我一直在一点点。

如描述ISAR-ref.pdf PG。 242 ,

对于typedef的T = A中的新引入的类型T是伴随着一对态射的,以它涉及到表示设定在旧型。 默认情况下,从类型来设置注入称为众议员T及其逆(绝对)T ...

下面,我用RepAbs在一个小例子来证明我能与我的主要类型, sT ,与新的I型定义typedef ,其类型为tsA

我不认为类型类是根本的重要性。 还有我探讨两个主要的东西,

  1. 我是否能扎入Groups.thy的语言环境,
  2. 这里说的更一般有关使用类型的限制的我的半群,组等等二进制运营商的域和共域

例如,在Groups.thy,有

locale semigroup =
  fixes f :: "'a => 'a => 'a" (infixl "*" 70)
  assumes assoc [ac_simps]: "a * b * c = a * (b * c)"

如果我不使用子类型,我想我必须做这样的事情,其中inP是我的\<in> (我刚开始使用的语言环境):

locale sgA =
  fixes G :: sT
  fixes f :: "sT => sT => sT" (infixl "*" 70)
  assumes closed:
    "(a inP G) & (b inP G) --> (a * b) inP G"
  assumes assoc:
    "(a inP G) & (b inP G) & (c inP G) --> (a * b) * c = a * (b * c)"

在能够使用部分答案Groups.semigroup可能是使用的RepAbs ; 我用类型的操作者tsA => tsA => tsA上型tsA ,但是当类型的元素tsA需要被视为类型的元素sT ,然后我使用Rep他们来映射他们键入sT

我有没有想过出这一切还是不够实验知道什么工作最好的,但我给了这部分的回答,试图更多地解释什么,我在我的脑海。 有可能是有人用一些好的信息添加其他那里。

亚型方法可能不是所有上攻,如最后两个如下所示theorem在示例代码命令。 影响的左手边是必要的,因为我没有利用的类型,类似于电源closedassoc上述locale sgA 。 然而,尽管如此,这对我没有任何问题simp规则,反之,正在使用的定理RepAbs都要求metis的证据,它可能需要很多丑陋的开销,把事情的工作更顺畅。

下面我包括文件A_iSemigroup_xp.thy 。 这是一个ASCII版本iSemigroup_xp.thy 。 这些都需要进口MFZ.thy ,在这3个文件在这个GitHub的文件夹中 。

theory A_iSemigroup_xp
imports MFZ
begin
--"[END]"

--"EXAMPLE (Possible subtype for a trivial semigroup)"
typedef tsA = "{x::sT. x = emS}"
  by(simp)

theorem "(Rep_tsA x) inP {.Rep_tsA x.}"
  by(metis 
    SSi_exists)

theorem "! x::tsA. x = (Abs_tsA emS)"
  by(metis (lifting, full_types) 
    Abs_tsA_cases 
    mem_Collect_eq)

theorem "! x. x inP {.emS.} --> x = emS"
  by(simp)

theorem "! x. x inP {.z inP {.emS.} ¦ z = emS.} --> x = emS"
  by(simp)
--"[END]"

--"ISAR (Theory end)"
end


文章来源: Trying to Treat Type Classes and Sub-types Like Sets and Subsets