Nominal/Perm.thy
author Christian Urban <urbanc@in.tum.de>
Mon, 24 May 2010 20:02:37 +0100
changeset 2296 45a69c9cc4cc
parent 2288 3b83960f9544
child 2297 9ca7b249760e
permissions -rw-r--r--
alpha works now
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1159
3c6bee89d826 Ported Stefan's permutation code, still needs some localizing.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     1
theory Perm
2288
3b83960f9544 new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
Christian Urban <urbanc@in.tum.de>
parents: 2163
diff changeset
     2
imports 
3b83960f9544 new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
Christian Urban <urbanc@in.tum.de>
parents: 2163
diff changeset
     3
  "../Nominal-General/Nominal2_Base"
2296
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
     4
  "../Nominal-General/Nominal2_Atoms" 
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
     5
  "Nominal2_FSet"
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
     6
uses ("nominal_dt_rawperm.ML")
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
     7
     ("nominal_dt_rawfuns.ML")
1159
3c6bee89d826 Ported Stefan's permutation code, still needs some localizing.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     8
begin
3c6bee89d826 Ported Stefan's permutation code, still needs some localizing.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     9
2296
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    10
use "nominal_dt_rawperm.ML"
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    11
use "nominal_dt_rawfuns.ML"
2035
3622cae9b10e to my best knowledge the number of datatypes is equal to the length of the dt_descr; so we can save one argument in define_raw_perm
Christian Urban <urbanc@in.tum.de>
parents: 1971
diff changeset
    12
2296
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    13
ML {*
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    14
open Nominal_Dt_RawPerm
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    15
open Nominal_Dt_RawFuns
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    16
*}
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    17
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    18
ML {*
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    19
fun is_atom ctxt ty =
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    20
  Sign.of_sort (ProofContext.theory_of ctxt) (ty, @{sort at_base})
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    21
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    22
fun is_atom_set ctxt (Type ("fun", [t, @{typ bool}])) = is_atom ctxt t
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    23
  | is_atom_set _ _ = false;
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    24
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    25
fun is_atom_fset ctxt (Type (@{type_name "fset"}, [t])) = is_atom ctxt t
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    26
  | is_atom_fset _ _ = false;
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    27
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    28
fun is_atom_list ctxt (Type (@{type_name "list"}, [t])) = is_atom ctxt t
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    29
  | is_atom_list _ _ = false
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    30
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    31
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    32
(* functions for producing sets, fsets and lists of general atom type
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    33
   out from concrete atom types *)
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    34
fun mk_atom_set t =
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    35
let
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    36
  val ty = fastype_of t;
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    37
  val atom_ty = HOLogic.dest_setT ty --> @{typ "atom"};
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    38
  val img_ty = atom_ty --> ty --> @{typ "atom set"};
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    39
in
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    40
  Const (@{const_name image}, img_ty) $ mk_atom_ty atom_ty t
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    41
end
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    42
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    43
fun mk_atom_fset t =
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    44
let
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    45
  val ty = fastype_of t;
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    46
  val atom_ty = dest_fsetT ty --> @{typ "atom"};
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    47
  val fmap_ty = atom_ty --> ty --> @{typ "atom fset"};
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    48
  val fset_to_set = @{term "fset_to_set :: atom fset => atom set"}
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    49
in
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    50
  fset_to_set $ (Const (@{const_name fmap}, fmap_ty) $ Const (@{const_name atom}, atom_ty) $ t)
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    51
end
45a69c9cc4cc alpha works now
Christian Urban <urbanc@in.tum.de>
parents: 2288
diff changeset
    52
*}
1910
57891245370d tuning of the code
Christian Urban <urbanc@in.tum.de>
parents: 1903
diff changeset
    53
(* permutations for quotient types *)
1899
8e0bfb14f6bf optimised the code of define_raw_perm
Christian Urban <urbanc@in.tum.de>
parents: 1896
diff changeset
    54
2144
e900526e95c4 slight tuning
Christian Urban <urbanc@in.tum.de>
parents: 2143
diff changeset
    55
ML {* Class_Target.prove_instantiation_exit_result *}
e900526e95c4 slight tuning
Christian Urban <urbanc@in.tum.de>
parents: 2143
diff changeset
    56
1253
cff8a67691d2 Define lifted perms.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1249
diff changeset
    57
ML {*
1903
950fd9b8f05e reordered code
Christian Urban <urbanc@in.tum.de>
parents: 1902
diff changeset
    58
fun quotient_lift_consts_export qtys spec ctxt =
950fd9b8f05e reordered code
Christian Urban <urbanc@in.tum.de>
parents: 1902
diff changeset
    59
let
950fd9b8f05e reordered code
Christian Urban <urbanc@in.tum.de>
parents: 1902
diff changeset
    60
  val (result, ctxt') = fold_map (Quotient_Def.quotient_lift_const qtys) spec ctxt;
950fd9b8f05e reordered code
Christian Urban <urbanc@in.tum.de>
parents: 1902
diff changeset
    61
  val (ts_loc, defs_loc) = split_list result;
950fd9b8f05e reordered code
Christian Urban <urbanc@in.tum.de>
parents: 1902
diff changeset
    62
  val morphism = ProofContext.export_morphism ctxt' ctxt;
950fd9b8f05e reordered code
Christian Urban <urbanc@in.tum.de>
parents: 1902
diff changeset
    63
  val ts = map (Morphism.term morphism) ts_loc
950fd9b8f05e reordered code
Christian Urban <urbanc@in.tum.de>
parents: 1902
diff changeset
    64
  val defs = Morphism.fact morphism defs_loc
950fd9b8f05e reordered code
Christian Urban <urbanc@in.tum.de>
parents: 1902
diff changeset
    65
in
950fd9b8f05e reordered code
Christian Urban <urbanc@in.tum.de>
parents: 1902
diff changeset
    66
  (ts, defs, ctxt')
950fd9b8f05e reordered code
Christian Urban <urbanc@in.tum.de>
parents: 1902
diff changeset
    67
end
950fd9b8f05e reordered code
Christian Urban <urbanc@in.tum.de>
parents: 1902
diff changeset
    68
*}
950fd9b8f05e reordered code
Christian Urban <urbanc@in.tum.de>
parents: 1902
diff changeset
    69
950fd9b8f05e reordered code
Christian Urban <urbanc@in.tum.de>
parents: 1902
diff changeset
    70
ML {*
1683
f78c820f67c3 Automatically lift theorems and constants only using the new quotient types. Requires new Isabelle.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1503
diff changeset
    71
fun define_lifted_perms qtys full_tnames name_term_pairs thms thy =
1253
cff8a67691d2 Define lifted perms.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1249
diff changeset
    72
let
cff8a67691d2 Define lifted perms.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1249
diff changeset
    73
  val lthy =
cff8a67691d2 Define lifted perms.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1249
diff changeset
    74
    Theory_Target.instantiation (full_tnames, [], @{sort pt}) thy;
1683
f78c820f67c3 Automatically lift theorems and constants only using the new quotient types. Requires new Isabelle.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1503
diff changeset
    75
  val (_, _, lthy') = quotient_lift_consts_export qtys name_term_pairs lthy;
f78c820f67c3 Automatically lift theorems and constants only using the new quotient types. Requires new Isabelle.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1503
diff changeset
    76
  val lifted_thms = map (Quotient_Tacs.lifted qtys lthy') thms;
1253
cff8a67691d2 Define lifted perms.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1249
diff changeset
    77
  fun tac _ =
cff8a67691d2 Define lifted perms.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1249
diff changeset
    78
    Class.intro_classes_tac [] THEN
cff8a67691d2 Define lifted perms.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1249
diff changeset
    79
    (ALLGOALS (resolve_tac lifted_thms))
cff8a67691d2 Define lifted perms.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1249
diff changeset
    80
  val lthy'' = Class.prove_instantiation_instance tac lthy'
cff8a67691d2 Define lifted perms.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1249
diff changeset
    81
in
cff8a67691d2 Define lifted perms.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1249
diff changeset
    82
  Local_Theory.exit_global lthy''
cff8a67691d2 Define lifted perms.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1249
diff changeset
    83
end
cff8a67691d2 Define lifted perms.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1249
diff changeset
    84
*}
cff8a67691d2 Define lifted perms.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1249
diff changeset
    85
1342
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
    86
ML {*
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
    87
fun neq_to_rel r neq =
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
    88
let
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
    89
  val neq = HOLogic.dest_Trueprop (prop_of neq)
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
    90
  val eq = HOLogic.dest_not neq
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
    91
  val (lhs, rhs) = HOLogic.dest_eq eq
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
    92
  val rel = r $ lhs $ rhs
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
    93
  val nrel = HOLogic.mk_not rel
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
    94
in
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
    95
  HOLogic.mk_Trueprop nrel
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
    96
end
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
    97
*}
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
    98
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
    99
ML {*
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   100
fun neq_to_rel_tac cases distinct =
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   101
  rtac notI THEN' eresolve_tac cases THEN_ALL_NEW asm_full_simp_tac (HOL_ss addsimps distinct)
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   102
*}
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   103
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   104
ML {*
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   105
fun distinct_rel ctxt cases (dists, rel) =
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   106
let
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   107
  val ((_, thms), ctxt') = Variable.import false dists ctxt
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   108
  val terms = map (neq_to_rel rel) thms
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   109
  val nrels = map (fn t => Goal.prove ctxt' [] [] t (fn _ => neq_to_rel_tac cases dists 1)) terms
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   110
in
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   111
  Variable.export ctxt' ctxt nrels
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   112
end
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   113
*}
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   114
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   115
2b98012307f7 Lift distinct.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1277
diff changeset
   116
1899
8e0bfb14f6bf optimised the code of define_raw_perm
Christian Urban <urbanc@in.tum.de>
parents: 1896
diff changeset
   117
(* Test *)
1910
57891245370d tuning of the code
Christian Urban <urbanc@in.tum.de>
parents: 1903
diff changeset
   118
(*
57891245370d tuning of the code
Christian Urban <urbanc@in.tum.de>
parents: 1903
diff changeset
   119
atom_decl name
1159
3c6bee89d826 Ported Stefan's permutation code, still needs some localizing.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   120
1896
996d4411e95e tuned; fleshed out some library functions about permutations; closed Datatype_Aux structure (increases readability)
Christian Urban <urbanc@in.tum.de>
parents: 1871
diff changeset
   121
datatype trm =
996d4411e95e tuned; fleshed out some library functions about permutations; closed Datatype_Aux structure (increases readability)
Christian Urban <urbanc@in.tum.de>
parents: 1871
diff changeset
   122
  Var "name"
1910
57891245370d tuning of the code
Christian Urban <urbanc@in.tum.de>
parents: 1903
diff changeset
   123
| App "trm" "(trm list) list"
1896
996d4411e95e tuned; fleshed out some library functions about permutations; closed Datatype_Aux structure (increases readability)
Christian Urban <urbanc@in.tum.de>
parents: 1871
diff changeset
   124
| Lam "name" "trm"
996d4411e95e tuned; fleshed out some library functions about permutations; closed Datatype_Aux structure (increases readability)
Christian Urban <urbanc@in.tum.de>
parents: 1871
diff changeset
   125
| Let "bp" "trm" "trm"
1170
a7b4160ef463 Wrapped the permutation code.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1164
diff changeset
   126
and bp =
a7b4160ef463 Wrapped the permutation code.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1164
diff changeset
   127
  BUnit
1896
996d4411e95e tuned; fleshed out some library functions about permutations; closed Datatype_Aux structure (increases readability)
Christian Urban <urbanc@in.tum.de>
parents: 1871
diff changeset
   128
| BVar "name"
996d4411e95e tuned; fleshed out some library functions about permutations; closed Datatype_Aux structure (increases readability)
Christian Urban <urbanc@in.tum.de>
parents: 1871
diff changeset
   129
| BPair "bp" "bp"
1159
3c6bee89d826 Ported Stefan's permutation code, still needs some localizing.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   130
1899
8e0bfb14f6bf optimised the code of define_raw_perm
Christian Urban <urbanc@in.tum.de>
parents: 1896
diff changeset
   131
setup {* fn thy =>
8e0bfb14f6bf optimised the code of define_raw_perm
Christian Urban <urbanc@in.tum.de>
parents: 1896
diff changeset
   132
let 
1910
57891245370d tuning of the code
Christian Urban <urbanc@in.tum.de>
parents: 1903
diff changeset
   133
  val info = Datatype.the_info thy "Perm.trm"
1899
8e0bfb14f6bf optimised the code of define_raw_perm
Christian Urban <urbanc@in.tum.de>
parents: 1896
diff changeset
   134
in
1910
57891245370d tuning of the code
Christian Urban <urbanc@in.tum.de>
parents: 1903
diff changeset
   135
  define_raw_perms info 2 thy |> snd
1899
8e0bfb14f6bf optimised the code of define_raw_perm
Christian Urban <urbanc@in.tum.de>
parents: 1896
diff changeset
   136
end
8e0bfb14f6bf optimised the code of define_raw_perm
Christian Urban <urbanc@in.tum.de>
parents: 1896
diff changeset
   137
*}
1170
a7b4160ef463 Wrapped the permutation code.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1164
diff changeset
   138
a7b4160ef463 Wrapped the permutation code.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1164
diff changeset
   139
print_theorems
a7b4160ef463 Wrapped the permutation code.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1164
diff changeset
   140
*)
a7b4160ef463 Wrapped the permutation code.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 1164
diff changeset
   141
1159
3c6bee89d826 Ported Stefan's permutation code, still needs some localizing.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   142
end