Nominal/Test.thy
changeset 1466 d18defacda25
parent 1465 4de35639fef0
child 1471 7fe643ad19e4
equal deleted inserted replaced
1465:4de35639fef0 1466:d18defacda25
    72 apply(simp only: alpha_gen)
    72 apply(simp only: alpha_gen)
    73 apply(simp only: supp_eqvt[symmetric])
    73 apply(simp only: supp_eqvt[symmetric])
    74 apply(simp only: eqvts)
    74 apply(simp only: eqvts)
    75 apply(simp only: supp_Abs)
    75 apply(simp only: supp_Abs)
    76 (* LET case *)
    76 (* LET case *)
    77 defer
       
    78 (* BP case *)
       
    79 apply(simp only: supp_def)
       
    80 apply(simp only: lam_bp_perm)
       
    81 apply(simp only: lam_bp_inject)
       
    82 apply(simp only: de_Morgan_conj)
       
    83 apply(simp only: Collect_disj_eq)
       
    84 apply(simp only: infinite_Un)
       
    85 apply(simp only: Collect_disj_eq)
       
    86 apply(simp only: supp_def[symmetric])
       
    87 apply(simp only: supp_at_base)
       
    88 apply(simp)
       
    89 (* LET case *)
       
    90 apply(rule_tac t="supp (LET bp_raw lam_raw)" and s="supp (Abs (bi bp_raw) lam_raw) \<union> fv_bi bp_raw" in subst)
    77 apply(rule_tac t="supp (LET bp_raw lam_raw)" and s="supp (Abs (bi bp_raw) lam_raw) \<union> fv_bi bp_raw" in subst)
    91 apply(simp (no_asm) only: supp_def)
    78 apply(simp (no_asm) only: supp_def)
    92 apply(simp only: lam_bp_perm)
    79 apply(simp only: lam_bp_perm)
    93 apply(simp only: permute_ABS)
    80 apply(simp only: permute_ABS)
    94 apply(simp only: lam_bp_inject)
    81 apply(simp only: lam_bp_inject)
   103 apply(simp only: supp_eqvt[symmetric])
    90 apply(simp only: supp_eqvt[symmetric])
   104 apply(simp only: eqvts)
    91 apply(simp only: eqvts)
   105 apply(blast)
    92 apply(blast)
   106 apply(simp add: supp_Abs)
    93 apply(simp add: supp_Abs)
   107 apply(blast)
    94 apply(blast)
       
    95 (* BP case *)
       
    96 apply(simp only: supp_def)
       
    97 apply(simp only: lam_bp_perm)
       
    98 apply(simp only: lam_bp_inject)
       
    99 apply(simp only: de_Morgan_conj)
       
   100 apply(simp only: Collect_disj_eq)
       
   101 apply(simp only: infinite_Un)
       
   102 apply(simp only: Collect_disj_eq)
       
   103 apply(simp only: supp_def[symmetric])
       
   104 apply(simp only: supp_at_base)
       
   105 apply(simp)
   108 done
   106 done
   109 
   107 
   110 thm lam_bp_fv[simplified supp_fv(1)[symmetric] supp_fv(2)[THEN conjunct1, symmetric]]
   108 thm lam_bp_fv[simplified supp_fv(1)[symmetric] supp_fv(2)[THEN conjunct1, symmetric]]
   111 
   109 
   112 ML {* val _ = recursive := true *}
   110 ML {* val _ = recursive := true *}
   496 
   494 
   497 nominal_datatype exp =
   495 nominal_datatype exp =
   498   VarP "name"
   496   VarP "name"
   499 | AppP "exp" "exp"
   497 | AppP "exp" "exp"
   500 | LamP x::"name" e::"exp" bind x in e
   498 | LamP x::"name" e::"exp" bind x in e
   501 | LetP x::"name" p::"pat3" e1::"exp" e2::"exp" bind x in e2, bind "bp' p" in e1
   499 | LetP x::"name" p::"pat3" e1::"exp" e2::"exp" bind x in e2, bind "bp'' p" in e1
   502 and pat3 =
   500 and pat3 =
   503   PVar "name"
   501   PVar "name"
   504 | PUnit
   502 | PUnit
   505 | PPair "pat3" "pat3"
   503 | PPair "pat3" "pat3"
   506 binder
   504 binder
   507   bp' :: "pat3 \<Rightarrow> atom set"
   505   bp'' :: "pat3 \<Rightarrow> atom set"
   508 where
   506 where
   509   "bp' (PVar x) = {atom x}"
   507   "bp'' (PVar x) = {atom x}"
   510 | "bp' (PUnit) = {}"
   508 | "bp'' (PUnit) = {}"
   511 | "bp' (PPair p1 p2) = bp' p1 \<union> bp' p2"
   509 | "bp'' (PPair p1 p2) = bp'' p1 \<union> bp'' p2"
   512 
   510 
   513 thm exp_pat3_fv
   511 thm exp_pat3_fv
   514 thm exp_pat3_inject
   512 thm exp_pat3_inject
   515 thm exp_pat3_bn
   513 thm exp_pat3_bn
   516 thm exp_pat3_perm
   514 thm exp_pat3_perm
   541 thm exp6_pat6_distinct
   539 thm exp6_pat6_distinct
   542 
   540 
   543 (* THE REST ARE NOT SUPPOSED TO WORK YET *)
   541 (* THE REST ARE NOT SUPPOSED TO WORK YET *)
   544 
   542 
   545 (* example 7 from Peter Sewell's bestiary *)
   543 (* example 7 from Peter Sewell's bestiary *)
       
   544 (* dest_Const raised
   546 nominal_datatype exp7 =
   545 nominal_datatype exp7 =
   547   EVar name
   546   EVar' name
   548 | EUnit
   547 | EUnit'
   549 | EPair exp7 exp7
   548 | EPair' exp7 exp7
   550 | ELetRec l::lrbs e::exp7 bind "b7s l" in e, bind "b7s l" in l
   549 | ELetRec' l::lrbs e::exp7 bind "b7s l" in e, bind "b7s l" in l
   551 and lrb =
   550 and lrb =
   552   Assign name exp7
   551   Assign' name exp7
   553 and lrbs =
   552 and lrbs =
   554   Single lrb
   553   Single' lrb
   555 | More lrb lrbs
   554 | More' lrb lrbs
   556 binder
   555 binder
   557   b7 :: "lrb \<Rightarrow> atom set" and
   556   b7 :: "lrb \<Rightarrow> atom set" and
   558   b7s :: "lrbs \<Rightarrow> atom set"
   557   b7s :: "lrbs \<Rightarrow> atom set"
   559 where
   558 where
   560   "b7 (Assign x e) = {atom x}"
   559   "b7 (Assign x e) = {atom x}"
   561 | "b7s (Single a) = b7 a"
   560 | "b7s (Single a) = b7 a"
   562 | "b7s (More a as) = (b7 a) \<union> (b7s as)"
   561 | "b7s (More a as) = (b7 a) \<union> (b7s as)"
   563 thm alpha_exp7_raw_alpha_lrb_raw_alpha_lrbs_raw.intros
   562 thm alpha_exp7_raw_alpha_lrb_raw_alpha_lrbs_raw.intros
       
   563 *)
   564 
   564 
   565 (* example 8 from Peter Sewell's bestiary *)
   565 (* example 8 from Peter Sewell's bestiary *)
       
   566 (*
       
   567 *** fv_bn: recursive argument, but wrong datatype.
       
   568 *** At command "nominal_datatype".
   566 nominal_datatype exp8 =
   569 nominal_datatype exp8 =
   567   EVar name
   570   EVar' name
   568 | EUnit
   571 | EUnit'
   569 | EPair exp8 exp8
   572 | EPair' exp8 exp8
   570 | ELetRec l::lrbs8 e::exp8 bind "b_lrbs8 l" in e, bind "b_lrbs8 l" in l
   573 | ELetRec' l::lrbs8 e::exp8 bind "b_lrbs8 l" in e, bind "b_lrbs8 l" in l
   571 and fnclause =
   574 and fnclause =
   572   K x::name p::pat8 e::exp8 bind "b_pat p" in e
   575   K' x::name p::pat8 e::exp8 bind "b_pat p" in e
   573 and fnclauses =
   576 and fnclauses =
   574   S fnclause
   577   S' fnclause
   575 | ORs fnclause fnclauses
   578 | ORs' fnclause fnclauses
   576 and lrb8 =
   579 and lrb8 =
   577   Clause fnclauses
   580   Clause' fnclauses
   578 and lrbs8 =
   581 and lrbs8 =
   579   Single lrb8
   582   Single' lrb8
   580 | More lrb8 lrbs8
   583 | More' lrb8 lrbs8
   581 and pat8 =
   584 and pat8 =
   582   PVar name
   585   PVar'' name
   583 | PUnit
   586 | PUnit''
   584 | PPair pat8 pat8
   587 | PPair'' pat8 pat8
   585 binder
   588 binder
   586   b_lrbs8 :: "lrbs8 \<Rightarrow> atom set" and
   589   b_lrbs8 :: "lrbs8 \<Rightarrow> atom set" and
   587   b_pat :: "pat8 \<Rightarrow> atom set" and
   590   b_pat :: "pat8 \<Rightarrow> atom set" and
   588   b_fnclauses :: "fnclauses \<Rightarrow> atom set" and
   591   b_fnclauses :: "fnclauses \<Rightarrow> atom set" and
   589   b_fnclause :: "fnclause \<Rightarrow> atom set" and
   592   b_fnclause :: "fnclause \<Rightarrow> atom set" and
   590   b_lrb8 :: "lrb8 \<Rightarrow> atom set"
   593   b_lrb8 :: "lrb8 \<Rightarrow> atom set"
   591 where
   594 where
   592   "b_lrbs8 (Single l) = b_lrb8 l"
   595   "b_lrbs8 (Single' l) = b_lrb8 l"
   593 | "b_lrbs8 (More l ls) = b_lrb8 l \<union> b_lrbs8 ls"
   596 | "b_lrbs8 (More' l ls) = b_lrb8 l \<union> b_lrbs8 ls"
   594 | "b_pat (PVar x) = {atom x}"
   597 | "b_pat (PVar'' x) = {atom x}"
   595 | "b_pat (PUnit) = {}"
   598 | "b_pat (PUnit'') = {}"
   596 | "b_pat (PPair p1 p2) = b_pat p1 \<union> b_pat p2"
   599 | "b_pat (PPair'' p1 p2) = b_pat p1 \<union> b_pat p2"
   597 | "b_fnclauses (S fc) = (b_fnclause fc)"
   600 | "b_fnclauses (S' fc) = (b_fnclause fc)"
   598 | "b_fnclauses (ORs fc fcs) = (b_fnclause fc) \<union> (b_fnclauses fcs)"
   601 | "b_fnclauses (ORs' fc fcs) = (b_fnclause fc) \<union> (b_fnclauses fcs)"
   599 | "b_lrb8 (Clause fcs) = (b_fnclauses fcs)"
   602 | "b_lrb8 (Clause' fcs) = (b_fnclauses fcs)"
   600 | "b_fnclause (K x pat exp8) = {atom x}"
   603 | "b_fnclause (K' x pat exp8) = {atom x}"
   601 thm alpha_exp8_raw_alpha_fnclause_raw_alpha_fnclauses_raw_alpha_lrb8_raw_alpha_lrbs8_raw_alpha_pat8_raw.intros
   604 thm alpha_exp8_raw_alpha_fnclause_raw_alpha_fnclauses_raw_alpha_lrb8_raw_alpha_lrbs8_raw_alpha_pat8_raw.intros
   602 
   605 *)
   603 (* example 4 from Terms.thy *)
   606 (* example 4 from Terms.thy *)
   604 (* fv_eqvt does not work, we need to repaire defined permute functions
   607 (* fv_eqvt does not work, we need to repaire defined permute functions
   605    defined fv and defined alpha... *)
   608    defined fv and defined alpha... *)
       
   609 (* lists-datastructure does not work yet
   606 nominal_datatype trm4 =
   610 nominal_datatype trm4 =
   607   Vr4 "name"
   611   Vr4 "name"
   608 | Ap4 "trm4" "trm4 list"
   612 | Ap4 "trm4" "trm4 list"
   609 | Lm4 x::"name" t::"trm4"  bind x in t
   613 | Lm4 x::"name" t::"trm4"  bind x in t
   610 
   614 
   611 thm alpha_trm4_raw_alpha_trm4_raw_list.intros[no_vars]
   615 thm alpha_trm4_raw_alpha_trm4_raw_list.intros[no_vars]
   612 thm fv_trm4_raw_fv_trm4_raw_list.simps[no_vars]
   616 thm fv_trm4_raw_fv_trm4_raw_list.simps[no_vars]
   613 
   617 *)
   614 (* core haskell *)
   618 (* core haskell *)
   615 atom_decl var
   619 atom_decl var
   616 atom_decl tvar
   620 atom_decl tvar
   617 
   621 
   618 (* there are types, coercion types and regular types *)
   622 (* there are types, coercion types and regular types *)
       
   623 (* list-data-structure
   619 nominal_datatype tkind =
   624 nominal_datatype tkind =
   620   KStar
   625   KStar
   621 | KFun "tkind" "tkind"
   626 | KFun "tkind" "tkind"
   622 and ckind =
   627 and ckind =
   623   CKEq "ty" "ty"
   628   CKEq "ty" "ty"
   641 | CSim "co"
   646 | CSim "co"
   642 | CRightc "co"
   647 | CRightc "co"
   643 | CLeftc "co"
   648 | CLeftc "co"
   644 | CCoe "co" "co"
   649 | CCoe "co" "co"
   645 
   650 
   646 
       
   647 typedecl ty --"hack since ty is not yet defined"
       
   648 typedecl kind
       
   649 
       
   650 instance ty and kind:: pt
       
   651 sorry
       
   652 
       
   653 abbreviation
   651 abbreviation
   654   "atoms A \<equiv> atom ` A"
   652   "atoms A \<equiv> atom ` A"
   655 
   653 
   656 nominal_datatype trm =
   654 nominal_datatype trm =
   657   Var "var"
   655   Var "var"
   669   K "string" "(tvar \<times> kind) list" "(var \<times> ty) list"
   667   K "string" "(tvar \<times> kind) list" "(var \<times> ty) list"
   670 binder
   668 binder
   671  bv :: "pat \<Rightarrow> atom set"
   669  bv :: "pat \<Rightarrow> atom set"
   672 where
   670 where
   673  "bv (K s ts vs) = (atoms (set (map fst ts))) \<union> (atoms (set (map fst vs)))"
   671  "bv (K s ts vs) = (atoms (set (map fst ts))) \<union> (atoms (set (map fst vs)))"
   674 
   672 *)
   675 (*
       
   676 compat (K s ts vs) pi (K s' ts' vs') ==
       
   677   s = s' &
       
   678 
       
   679 *)
       
   680 
       
   681 
       
   682 
   673 
   683 text {* weirdo example from Peter Sewell's bestiary *}
   674 text {* weirdo example from Peter Sewell's bestiary *}
   684 
   675 
   685 nominal_datatype weird =
   676 nominal_datatype weird =
   686   WBind x::"name" y::"name" p1::"weird" p2::"weird" p3::"weird"
   677   WBind x::"name" y::"name" p1::"weird" p2::"weird" p3::"weird"
   693 thm fv_weird_raw.simps[no_vars]
   684 thm fv_weird_raw.simps[no_vars]
   694 
   685 
   695 (* example 6 from Terms.thy *)
   686 (* example 6 from Terms.thy *)
   696 
   687 
   697 (* BV is not respectful, needs to fail*)
   688 (* BV is not respectful, needs to fail*)
       
   689 (*
   698 nominal_datatype trm6 =
   690 nominal_datatype trm6 =
   699   Vr6 "name"
   691   Vr6 "name"
   700 | Lm6 x::"name" t::"trm6"         bind x in t
   692 | Lm6 x::"name" t::"trm6"         bind x in t
   701 | Lt6 left::"trm6" right::"trm6"  bind "bv6 left" in right
   693 | Lt6 left::"trm6" right::"trm6"  bind "bv6 left" in right
   702 binder
   694 binder
   703   bv6
   695   bv6
   704 where
   696 where
   705   "bv6 (Vr6 n) = {}"
   697   "bv6 (Vr6 n) = {}"
   706 | "bv6 (Lm6 n t) = {atom n} \<union> bv6 t"
   698 | "bv6 (Lm6 n t) = {atom n} \<union> bv6 t"
   707 | "bv6 (Lt6 l r) = bv6 l \<union> bv6 r"
   699 | "bv6 (Lt6 l r) = bv6 l \<union> bv6 r"
       
   700 *)
       
   701 
   708 (* example 7 from Terms.thy *)
   702 (* example 7 from Terms.thy *)
   709 
       
   710 (* BV is not respectful, needs to fail*)
   703 (* BV is not respectful, needs to fail*)
       
   704 (*
   711 nominal_datatype trm7 =
   705 nominal_datatype trm7 =
   712   Vr7 "name"
   706   Vr7 "name"
   713 | Lm7 l::"name" r::"trm7"   bind l in r
   707 | Lm7 l::"name" r::"trm7"   bind l in r
   714 | Lt7 l::"trm7" r::"trm7"   bind "bv7 l" in r
   708 | Lt7 l::"trm7" r::"trm7"   bind "bv7 l" in r
   715 binder
   709 binder
   716   bv7
   710   bv7
   717 where
   711 where
   718   "bv7 (Vr7 n) = {atom n}"
   712   "bv7 (Vr7 n) = {atom n}"
   719 | "bv7 (Lm7 n t) = bv7 t - {atom n}"
   713 | "bv7 (Lm7 n t) = bv7 t - {atom n}"
   720 | "bv7 (Lt7 l r) = bv7 l \<union> bv7 r"
   714 | "bv7 (Lt7 l r) = bv7 l \<union> bv7 r"
       
   715 *)
   721 
   716 
   722 (* example 8 from Terms.thy *)
   717 (* example 8 from Terms.thy *)
   723 
   718 
   724 (* Binding in a term under a bn, needs to fail *)
   719 (* Binding in a term under a bn, needs to fail *)
       
   720 (*
   725 nominal_datatype foo8 =
   721 nominal_datatype foo8 =
   726   Foo0 "name"
   722   Foo0 "name"
   727 | Foo1 b::"bar8" f::"foo8" bind "bv8 b" in f --"check fo error if this is called foo"
   723 | Foo1 b::"bar8" f::"foo8" bind "bv8 b" in f --"check fo error if this is called foo"
   728 and bar8 =
   724 and bar8 =
   729   Bar0 "name"
   725   Bar0 "name"
   731 binder
   727 binder
   732   bv8
   728   bv8
   733 where
   729 where
   734   "bv8 (Bar0 x) = {}"
   730   "bv8 (Bar0 x) = {}"
   735 | "bv8 (Bar1 v x b) = {atom v}"
   731 | "bv8 (Bar1 v x b) = {atom v}"
   736 
   732 *)
   737 (* example 9 from Terms.thy *)
   733 (* example 9 from Terms.thy *)
   738 
   734 
   739 (* BV is not respectful, needs to fail*)
   735 (* BV is not respectful, needs to fail*)
       
   736 (*
   740 nominal_datatype lam9 =
   737 nominal_datatype lam9 =
   741   Var9 "name"
   738   Var9 "name"
   742 | Lam9 n::"name" l::"lam9" bind n in l
   739 | Lam9 n::"name" l::"lam9" bind n in l
   743 and bla9 =
   740 and bla9 =
   744   Bla9 f::"lam9" s::"lam9" bind "bv9 f" in s
   741   Bla9 f::"lam9" s::"lam9" bind "bv9 f" in s
   745 binder
   742 binder
   746   bv9
   743   bv9
   747 where
   744 where
   748   "bv9 (Var9 x) = {}"
   745   "bv9 (Var9 x) = {}"
   749 | "bv9 (Lam9 x b) = {atom x}"
   746 | "bv9 (Lam9 x b) = {atom x}"
   750 
   747 *)
   751 
   748 
   752 (* Type schemes with separate datatypes *)
   749 (* Type schemes with separate datatypes *)
   753 nominal_datatype t =
   750 nominal_datatype T =
   754   Var "name"
   751   TVar "name"
   755 | Fun "t" "t"
   752 | TFun "T" "T"
   756 
   753 
   757 nominal_datatype tyS =
   754 (* PROBLEM: 
   758   All xs::"name list" ty::"t_raw" bind xs in ty
   755 *** exception Datatype raised 
   759 
   756 *** (line 218 of "/usr/local/src/Isabelle_16-Mar-2010/src/HOL/Tools/Datatype/datatype_aux.ML")
   760 
   757 *** At command "nominal_datatype".
   761 
   758 nominal_datatype TyS =
       
   759   TAll xs::"name list" ty::"T" bind xs in ty
       
   760 *)
   762 
   761 
   763 (* example 9 from Peter Sewell's bestiary *)
   762 (* example 9 from Peter Sewell's bestiary *)
   764 (* run out of steam at the moment *)
   763 (* run out of steam at the moment *)
   765 
   764 
   766 end
   765 end