Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
>> TODO - the concrete variable representation currently used in the generated code no longer suffices for these dependent-record type environments - either add distinctness conditions to the syntax, generating predicates is_distinct_t etc, or write them in the typing rules (for labels in record types, exprs and pats, and termvars in pats) ideally also: - implement context rules, so that the explicit reduction context rules can be replaced by a single one. << metavar typevar, X ::= {{ isa string }} {{ coq nat }} {{ coq-equality }} {{ hol string }} {{ lex Alphanum }} {{ tex \mathit{[[typevar]]} }} {{ com type variable }} {{ isavar ''[[typevar]]'' }} {{ holvar "[[typevar]]" }} {{ texvar \mathrm{[[typevar]]} }} {{ ocamlvar "[[typevar]]" }} metavar termvar, x ::= {{ isa string }} {{ coq nat }} {{ hol string }} {{ coq-equality }} {{ lex alphanum }} {{ tex \mathit{[[termvar]]} }} {{ com term variable }} {{ isavar ''[[termvar]]'' }} {{ holvar "[[termvar]]" }} {{ texvar \mathrm{[[termvar]]} }} {{ ocamlvar "[[termvar]]" }} metavar label, l, k ::= {{ isa string }} {{ coq nat }} {{ hol string }} {{ lex alphanum }} {{ tex \mathit{[[label]]} }} {{ com field label }} {{ isavar ''[[label]]'' }} {{ holvar "[[label]]" }} {{ ocamlvar "[[label]]" }} indexvar index, i, j, n, m ::= {{ isa nat }} {{ coq nat }} {{ hol num }} {{ lex numeral }} {{ com indices }} grammar T {{ hol Typ }}, S, U :: 'T_' ::= {{ com type }} | X :: :: Var {{ com type variable }} | Top :: :: Top {{ com maximum type }} | T -> T' :: :: Fun {{ com type of functions }} | Forall X <: T . T' :: :: Forall (+ bind X in T' +) {{ com universal type }} {{ tex [[Forall]] [[X]] \mathord{[[<:]]} [[T]]. \, [[T']] }} | { l1 : T1 , .. , ln : Tn } :: :: Rec {{ com record }} %R | { } :: :: Rec_empty {{ com empty record }} %R | { Trb } :: :: Rec_ne {{ com nonempty record }} % {{ com record type }} | ( T ) :: M :: paren {{ ich [[T]] }} | [ X |-> T ] T' :: M :: sub {{ ich (Tsubst_T [[T]] [[X]] [[T']]) }} %R Trb :: 'Trb_' ::= %R | l : T :: :: rb1 %R | l : T , Trb :: :: rb2 t :: 't_' ::= {{ com term }} | x :: :: Var {{ com variable }} | \ x : T . t :: :: Lam (+ bind x in t +) {{ com abstraction }} {{ tex \lambda [[x]] \mathord{[[:]]} [[T]]. \, [[t]] }} | t t' :: :: App {{ com application }} | \ X <: T . t :: :: TLam (+ bind X in t +) {{ com type abstraction}} {{ tex \Lambda [[X]] \mathord{[[<:]]} [[T]]. \, [[t]] }} | t [ T ] :: :: TApp {{ com type application}} | { l1 = t1 , .. , ln = tn } :: :: Rec {{ com record }} | t . l :: :: Proj {{ com projection }} | let p = t in t' :: :: Let (+ bind b(p) in t' +){{ com pattern binding}} | ( t ) :: M :: paren {{ ich [[t]] }} | [ x |-> t ] t' :: M :: tsub {{ ich ( tsubst_t [[t]] [[x]] [[t']] ) }} | [ X |-> T ] t :: M :: Tsub {{ ich ( Tsubst_t [[T]] [[X]] [[t]] ) }} % | E [ t ] :: M :: ctx | s t :: M :: tsubs {{ ich ( m_t_subst_t [[s]] [[t]] ) }} p :: 'P_' ::= {{ com pattern }} | x : T :: :: Var (+ b = x +) {{ com variable pattern }} | { l1 = p1 , .. , ln = pn } :: :: Rec (+ b = b(p1 .. pn) +) {{ com record pattern }} v :: 'v_' ::= {{ com values }} | \ x : T . t :: :: Lam (+ bind x in t +) {{ com abstraction }} | \ X <: T . t :: :: TLam (+ bind X in t +) {{ com type abstraction }} {{ tex \Lambda [[X]] [[<:]] [[T]]. \, [[t]] }} | { l1 = v1 , .. , ln = vn } :: :: Rec {{ com record }} % {{ com record }} % E :: E_ ::= % | __ :: :: hole % | E t :: :: app_fun % | v E :: :: app_arg % | E [ T ] :: :: type_fun %r | E . l :: :: projection %r% | { l1 = v1 , .. , lm = vm , l = E , l1' = t1' , .. , ln' = tn' } :: :: record %r | let p = E in t2 :: :: let_binding G {{ tex \Gamma }}, D {{ tex \Delta }} :: 'G_' ::= {{ com type environment }} | empty :: :: empty | G , X <: T :: :: type | G , x : T :: :: term %r | G , G' :: M :: comma {{ ich TODO }} | G1 , .. , Gn :: M :: dots {{ ich (flatten_G [[G1..Gn]]) }} s {{ tex \sigma }} :: 'S_' ::= {{ com multiple term substitution }} {{ isa (termvar*t) list }} {{ hol (termvar#t) list }} {{ coq list (termvar*t) }} | [ x |-> t ] :: :: singleton {{ ih [ ([[x]],[[t]]) ] }} {{ coq (cons ([[x]],[[t]]) nil) }} | s1 , .. , sn :: :: list {{ isa List.concat [[s1..sn]] }} {{ hol (FLAT [[s1..sn]]) }} {{ coq (List.flat_map (fun x => x) [[s1..sn]]) }} terminals :: terminals_ ::= | \ :: :: lambda {{ tex \lambda }} | -> :: :: arrow {{ tex \rightarrow }} | => :: :: Arrow {{ tex \Rightarrow }} % | __ :: :: hole {{ tex \_ }} | |- :: :: turnstile {{ tex \vdash }} | --> :: :: red {{ tex \longrightarrow }} | Forall :: :: forall {{ tex \forall }} | <: :: :: subtype {{ tex <: }} | |-> :: :: mapsto {{ tex \mapsto }} | /\ :: :: wedge {{ tex \wedge }} | \/ :: :: vee {{ tex \vee }} | = :: :: eq {{ tex \!\! = \!\! }} formula :: formula_ ::= | judgement :: :: judgement % | G = G' :: :: Geq {{ ich [[G]] = [[G']] }} | x = x' :: :: xeq {{ ich [[x]] = [[x']] }} | X = X' :: :: Xeq {{ ich [[X]] = [[X']] }} | ( formula ) :: :: paren {{ ich ( [[formula]] ) }} | not formula :: :: not {{ isa Not( [[formula]] ) }} {{ coq not( [[formula]] ) }} {{ hol ~( [[formula]] ) }} {{ tex \neg [[ formula]] }} % | x isin dom ( G ) :: :: xin {{ isa ? T. ([[x]],T,[[G]]):tin }} % {{ tex [[x]] \in [[dom]]([[G]]) }} % | X isin dom ( G ) :: :: Xin {{ isa ? T. ([[X]],T,[[G]]):Tin }} % {{ tex [[X]] \in [[dom]]([[G]]) }} | forall i isin 1 -- m . formula :: :: forall {{ tex \forall [[i]] \in 1 .. [[m]] . [[formula]] }} {{ isa ![[i]] . ((1::nat)<=[[i]] & [[i]]<=[[m]]) ==> [[formula]] }} {{ hol ![[i]] . (1<=[[i]] /\ [[i]]<=[[m]]) ==> [[formula]] }} {{ coq (forall [[i]], (1<=[[i]] /\ [[i]] <= m) -> [[formula]]) }} | exists i isin 1 -- m . formula :: :: exists {{ tex \exists [[i]] \in 1 .. [[m]]. [[formula]] }} {{ isa ?[[i]]. ((1::nat)<=[[i]] & i<=[[m]]) ==> [[formula]] }} {{ hol ?[[i]] . (1<=[[i]] /\ [[i]]<=[[m]]) ==> [[formula]] }} {{ coq exists [[i]], (1<=[[i]] /\ [[i]] <= [[m]]) -> [[formula]] }} | formula /\ formula' :: :: and {{ isa ([[formula]] & [[formula']]) }} {{ hol ([[formula]] /\ [[formula']]) }} {{ coq ([[formula]] /\ [[formula']]) }} | l = l' :: :: leq {{ ich ([[l]]=[[l']]) }} % would be nice to write the above as {{ isa ?[[T]]. [[X<:T isin G]] }} %formulalist :: formulalist_ ::= | formula1 .. formulan :: :: dots subrules v <:: t % E _:: t :: t substitutions single t x :: tsubst single T X :: Tsubst multiple t x :: m_t_subst multiple T X :: m_T_subst freevars T X :: ftv t x :: fv embed {{ isa consts append_G :: "G => G => G" primrec "append_G [[G]] [[empty]] = [[G]]" "append_G [[G]] [[G',X<:T]] = (let [[G'']] = append_G [[G]] [[G']] in [[G'',X<:T]])" "append_G [[G]] [[G',x:T]] = (let [[G'']] = append_G [[G]] [[G']] in [[G'',x:T]])" consts flatten_G :: "G list => G" primrec "flatten_G [] = [[empty]]" "flatten_G (Cons [[G]] Gs) = append_G [[G]] (flatten_G Gs)" }} {{ hol val _ = Define ` (append_G [[G]] [[empty]] = [[G]]) /\ (append_G [[G]] [[G',X<:T]] = (let [[G'']] = append_G [[G]] [[G']] in [[G'',X<:T]])) /\ (append_G [[G]] [[G',x:T]] = (let [[G'']] = append_G [[G]] [[G']] in [[G'',x:T]]))`; val _ = Define ` (flatten_G NIL = [[empty]]) /\ (flatten_G (CONS [[G]] Gs) = append_G [[G]] (flatten_G Gs))`; }} {{ coq Fixpoint append_G (g1 g2 : G) {struct g2} : G := match g2 with | G_empty => g1 | G_type gh tv t => G_type (append_G g1 gh) tv t | G_term gh v t => G_term (append_G g1 gh) v t end. Fixpoint flatten_G (gl:list_G) : G := match gl with | Nil_list_G => G_empty | Cons_list_G g gs => append_G g (flatten_G gs) end. }} defns Judgement_in :: '' ::= % defn % x isin dom ( G ) :: :: xinG :: xinG_ {{ tex [[x]] \in [[dom]]([[G]])}} by % % x:T isin G % ---------------- :: 1 % x isin dom(G) % % % defn % X isin dom ( G ) :: :: XinG :: XinG_ {{ tex [[X]] \in [[dom]]([[G]]) }} by % % X<:U isin G % ---------------- :: 1 % X isin dom(G) defn x isin dom ( G ) :: :: xinG :: xinG_ {{ tex [[x]] \in [[dom]]([[G]])}} by -------------- :: 1 x isin dom(G,x:T) x isin dom(G) ---------------- :: 2 x isin dom(G,X'<:U') x isin dom(G) --------------- :: 3 x isin dom(G,x':T') defn X isin dom ( G ) :: :: XinG :: XinG_ {{ tex [[X]] \in [[dom]]([[G]]) }} by ------------- :: 1 X isin dom(G,X<:U) X isin dom(G) --------------- :: 2 X isin dom(G,X'<:U') X isin dom(G) -------------- :: 3 X isin dom(G,x':T') defn x : T isin G :: :: tin :: tin_ {{ tex [[x]] [[:]] [[T]] \in [[G]] }} by ---------------- :: 1 x:T isin G,x:T x:T isin G ------------------ :: 2 x:T isin G,X'<:U' x:T isin G ----------------- :: 3 x:T isin G,x':T' defn X <: U isin G :: :: Tin :: Tin_ {{ tex [[X]] [[<:]] [[U]] \in [[G]] }} by ---------------- :: 1 X<:U isin G,X<:U X<:U isin G ------------------ :: 2 X<:U isin G,X'<:U' X<:U isin G ----------------- :: 3 X<:U isin G,x':T' defns Jtype :: '' ::= defn G |- ok :: :: Gok :: Gok_ {{ com type environment [[G]] is well-formed }} by ----------- :: 1 empty |- ok G |- T not(x isin dom(G)) ------------------ :: 2 G,x:T |- ok G |- T not(X isin dom(G)) ------------------- :: 3 G,X<:T |- ok defn G |- T :: :: GT :: GT_ {{ com type [[T]] is well-formed in type environment [[G]] }} by G |- ok X<:U isin G -------------- :: Var G |- X G |- ok -------------- :: Top G |- Top G |- T G |- T' -------------- :: Fun G |- T->T' G,X<:T |- T' ------------------ :: Forall G |- Forall X<:T.T' G |- T1 .. G |- Tn % and distinctness, if not in the syntax --------------------- :: Rcd G |- {l1:T1,..,ln:Tn} defn G |- S <: T :: :: SA :: SA_ {{ com [[S]] is a subtype of [[T]] }} by G |- ok ---------- :: Top G |- S <: Top G |- ok ---------- :: Refl_TVar G |- X <: X %G = G1, X<:U , G2 X<:U isin G G |- U <: T ------------- :: Trans_TVar G |- X <: T G |- T1<:S1 G |- S2<:T2 ---------------------- :: Arrow G |- S1->S2 <: T1->T2 G |- T1<:S1 G,X<:T1 |- S2<:T2 --------------------------------------- :: All G |- Forall X<:S1.S2 <: Forall X<:T1.T2 forall i isin 1 -- m. exists j isin 1 -- n. (ki=lj /\ G |- Si<:Tj) --------------------------------------------------------------------------- :: Rcd G |- {k1:S1 , .. , km:Sm} <: {l1:T1,..,ln:Tn} defn G |- t : T :: :: Ty :: Ty_ {{ com term [[t]] has type [[T]] }} by G |- ok x:T isin G -------------- :: Var G |- x:T G,x:T1 |- t2:T2 ----------------------- :: Abs G |- \x:T1.t2 : T1->T2 G|- t1:T11->T12 G|- t2:T11 -------------------- :: App G|- t1 t2 : T12 G,X<:T1 |- t2:T2 -------------------------------- :: TAbs G|- \X<:T1.t2 : Forall X<:T1.T2 G|- t1 : Forall X<:T11.T12 G|- T2 <: T11 --------------------------- :: TApp G|- t1[T2] : [X|->T2]T12 G|- t1:T1 |- p:T1=>D G,D |- t2:T2 ------------------------ :: Let G|- let p=t1 in t2 : T2 G|-t1:T1 .. G|-tn:Tn % and distinctness, if not in the syntax ------------------------------------- :: Rcd G|- {l1=t1,..,ln=tn}:{l1:T1,..,ln:Tn} G|- t:{l1:T1,..,ln:Tn} ----------------------- :: Proj G|- t.lj : Tj G|- t:S G|- S<:T --------- :: Sub G|- t:T defn |- p : T => D :: :: Pat :: Pat_ {{ com pattern [[p]] matches type [[T]] giving bindings [[D]] }} by ------------------ :: Var |- x:T : T => empty,x:T |- p1:T1=>D1 .. |- pn:Tn=>Dn % and distinctness, if not in the syntax ------------------------------------------------ :: Rcd |- {l1=p1,..,ln=pn}:{l1:T1,..,ln:Tn} => D1,..,Dn defns Jop :: '' ::= defn t1 --> t2 :: :: reduce :: reduce_ {{ com [[t1]] reduces to [[t2]] }} by ----------------------------------------- :: AppAbs (\x:T11.t12) v2 --> :t_tsub: [x|->v2]t12 ----------------------------------- :: TappTabs (\X<:T11.t12) [T2] --> [X|->T2]t12 match(p,v1)=s ------------------------- :: LetV let p=v1 in t2 --> s t2 --------------------------- :: ProjRcd {l'1=v1,..,l'n=vn}.l'j --> vj %t1 --> t1' %------------------- :: Ctx %E[t1] --> E[t1'] t1 --> t1' ---------------- :: Ctx_app_fun t1 t --> t1' t t1 --> t1' ---------------- :: Ctx_app_arg v t1 --> v t1' t1 --> t1' ---------------- :: Ctx_type_fun t1[T] --> t1'[T] t --> t' -------------- :: Ctx_record {l1=v1,..,lm=vm,l=t,l1'=t1',..,ln'=tn'} --> {l1=v1,..,lm=vm,l=t',l1'=t1',..,ln'=tn'} t1 --> t1' ---------------------------------- :: Ctx_let_binding let p=t1 in t2 --> let p=t1' in t2 defn match ( p , v ) = s :: :: M :: M_ by ----------------------- :: Var match(x:T,v) = [x|->v] forall i isin 1 -- m. exists j isin 1 -- n. (li=kj /\ match(pi,vj)=si) ---------------------------------------------------------------------- :: Rcd match({l1=p1,..,lm=pm},{k1=v1,..,kn=vn}) = s1,..,sm