section \<open>Permutations as abstract type\<close>
theory Perm imports
Transposition begin
text\<open>
This theory introduces basics about permutations, i.e. almost
everywhere fix bijections. But it isby no means complete.
Grieviously missing are cycles since these would require more
elaboration, e.g. the concept of distinct lists equivalent
under rotation, which maybe would also deserve its own theory.
But see theory\<open>src/HOL/ex/Perm_Fragments.thy\<close> for
fragments on that. \<close>
subsection \<open>Abstract type of permutations\<close>
typedef'a perm = "{f :: 'a \<Rightarrow> 'a. bij f \<and> finite {a. f a \<noteq> a}}" morphisms"apply" Perm proof show"id \ ?perm" by simp qed
lemma perm_eqI: assumes"\a. f \$\ a = g \$\ a" shows"f = g" using assms by transfer (simp add: fun_eq_iff)
lemma perm_eq_iff: "f = g \ (\a. f \$\ a = g \$\ a)" by (auto intro: perm_eqI)
lemma apply_inj: "f \$\ a = f \$\ b \ a = b" by (rule inj_eq) (rule bij_is_inj, simp)
lift_definition affected :: "'a perm \ 'a set" is"\f. {a. f a \ a}" .
lemma in_affected: "a \ affected f \ f \$\ a \ a" by transfer simp
lemma finite_affected [simp]: "finite (affected f)" by transfer simp
lemma apply_affected [simp]: "f \$\ a \ affected f \ a \ affected f" proof transfer fix f :: "'a \ 'a" and a :: 'a assume"bij f \ finite {b. f b \ b}" thenhave"bij f"by simp interpret bijection f by standard (rule \<open>bij f\<close>) have"f a \ {a. f a = a} \ a \ {a. f a = a}" (is "?P \ ?Q") by auto thenshow"f a \ {a. f a \ a} \ a \ {a. f a \ a}" by simp qed
lemma card_affected_not_one: "card (affected f) \ 1" proof interpret bijection "apply f" by standard (rule bij_apply) assume"card (affected f) = 1" thenobtain a where *: "affected f = {a}" by (rule card_1_singletonE) thenhave **: "f \$\ a \ a" by (simp flip: in_affected) with * have"f \$\ a \ affected f" by simp thenhave"f \$\ (f \$\ a) = f \$\ a" by (simp add: in_affected) thenhave"inv (apply f) (f \$\ (f \$\ a)) = inv (apply f) (f \$\ a)" by simp with ** show False by simp qed
subsection \<open>Identity, composition and inversion\<close>
instantiation Perm.perm :: (type) "{monoid_mult, inverse}" begin
lift_definition one_perm :: "'a perm" is id by simp
lemma apply_one [simp]: "apply 1 = id" by (fact one_perm.rep_eq)
lemma affected_one [simp]: "affected 1 = {}" by transfer simp
lemma affected_empty_iff [simp]: "affected f = {} \ f = 1" by transfer auto
lift_definition times_perm :: "'a perm \ 'a perm \ 'a perm" is comp proof fix f g :: "'a \ 'a" assume"bij f \ finite {a. f a \ a}" "bij g \finite {a. g a \ a}" thenhave"finite ({a. f a \ a} \ {a. g a \ a})" by simp moreoverhave"{a. (f \ g) a \ a} \ {a. f a \ a} \ {a. g a \ a}" by auto ultimatelyshow"finite {a. (f \ g) a \ a}" by (auto intro: finite_subset) qed (auto intro: bij_comp)
lemma apply_times: "apply (f * g) = apply f \ apply g" by (fact times_perm.rep_eq)
lemma apply_sequence: "f \$\ (g \$\ a) = apply (f * g) a" by (simp add: apply_times)
lemma affected_times [simp]: "affected (f * g) \ affected f \ affected g" by transfer auto
lift_definition inverse_perm :: "'a perm \ 'a perm" is inv proof transfer fix f :: "'a \ 'a" and a assume"bij f \ finite {b. f b \ b}" thenhave"bij f"and fin: "finite {b. f b \ b}" by auto interpret bijection f by standard (rule \<open>bij f\<close>) from fin show"bij (inv f) \ finite {a. inv f a \ a}" by (simp add: bij_inv) qed
instance by standard (transfer; simp add: comp_assoc)+
lemma affected_inverse [simp]: "affected (inverse f) = affected f" proof transfer fix f :: "'a \ 'a" and a assume"bij f \ finite {b. f b \ b}" thenhave"bij f"by simp interpret bijection f by standard (rule \<open>bij f\<close>) show"{a. inv f a \ a} = {a. f a \ a}" by simp qed
global_interpretation perm: group times "1::'a perm" inverse proof fix f :: "'a perm" show"1 * f = f" by transfer simp show"inverse f * f = 1" proof transfer fix f :: "'a \ 'a" and a assume"bij f \ finite {b. f b \ b}" thenhave"bij f"by simp interpret bijection f by standard (rule \<open>bij f\<close>) show"inv f \ f = id" by simp qed qed
declare perm.inverse_distrib_swap [simp]
lemma perm_mult_commute: assumes"affected f \ affected g = {}" shows"g * f = f * g" proof (rule perm_eqI) fix a from assms have *: "a \ affected f \ a \ affected g" "a \ affected g \ a \ affected f" for a by auto
consider "a \ affected f \ a \ affected g \<and> f \<langle>$\<rangle> a \<in> affected f"
| "a \ affected f \ a \ affected g \<and> f \<langle>$\<rangle> a \<notin> affected f"
| "a \ affected f \ a \ affected g" using assms by auto thenshow"(g * f) \$\ a = (f * g) \$\ a" proof cases case 1 with * have"f \$\ a \ affected g" by auto with 1 show ?thesis by (simp add: in_affected apply_times) next case 2 with * have"g \$\ a \ affected f" by auto with 2 show ?thesis by (simp add: in_affected apply_times) next case 3 thenshow ?thesis by (simp add: in_affected apply_times) qed qed
lemma apply_power: "apply (f ^ n) = apply f ^^ n" by (induct n) (simp_all add: apply_times)
lemma perm_power_inverse: "inverse f ^ n = inverse ((f :: 'a perm) ^ n)" proof (induct n) case 0 thenshow ?caseby simp next case (Suc n) thenshow ?case unfolding power_Suc2 [of f] by simp qed
subsection \<open>Orbit and order of elements\<close>
definition orbit :: "'a perm \ 'a \ 'a set" where "orbit f a = range (\n. (f ^ n) \$\ a)"
lemma in_orbitI: assumes"(f ^ n) \$\ a = b" shows"b \ orbit f a" using assms by (auto simp add: orbit_def)
lemma apply_power_self_in_orbit [simp]: "(f ^ n) \$\ a \ orbit f a" by (rule in_orbitI) rule
lemma in_orbit_self [simp]: "a \ orbit f a" using apply_power_self_in_orbit [of _ 0] by simp
lemma apply_self_in_orbit [simp]: "f \$\ a \ orbit f a" using apply_power_self_in_orbit [of _ 1] by simp
lemma orbit_not_empty [simp]: "orbit f a \ {}" using in_orbit_self [of a f] by blast
lemma not_in_affected_iff_orbit_eq_singleton: "a \ affected f \ orbit f a = {a}" (is "?P \ ?Q") proof assume ?P thenhave"f \$\ a = a" by (simp add: in_affected) thenhave"(f ^ n) \$\ a = a" for n by (induct n) (simp_all add: apply_times) thenshow ?Q by (auto simp add: orbit_def) next assume ?Q thenshow ?P by (auto simp add: orbit_def in_affected dest: range_eq_singletonD [of _ _ 1]) qed
definition order :: "'a perm \ 'a \ nat" where "order f = card \ orbit f"
lemma orbit_subset_eq_affected: assumes"a \ affected f" shows"orbit f a \ affected f" proof (rule ccontr) assume"\ orbit f a \ affected f" thenobtain b where"b \ orbit f a" and "b \ affected f" by auto thenhave"b \ range (\n. (f ^ n) \$\ a)" by (simp add: orbit_def) thenobtain n where"b = (f ^ n) \$\ a" by blast with\<open>b \<notin> affected f\<close> have"(f ^ n) \$\ a \ affected f" by simp thenhave"f \$\ a \ affected f" by (induct n) (simp_all add: apply_times) with assms show False by simp qed
lemma finite_orbit [simp]: "finite (orbit f a)" proof (cases "a \ affected f") case False thenshow ?thesis by (simp add: not_in_affected_iff_orbit_eq_singleton) next case True thenhave"orbit f a \ affected f" by (rule orbit_subset_eq_affected) thenshow ?thesis using finite_affected by (rule finite_subset) qed
lemma orbit_1 [simp]: "orbit 1 a = {a}" by (auto simp add: orbit_def)
lemma order_1 [simp]: "order 1 a = 1" unfolding order_def by simp
lemma card_orbit_eq [simp]: "card (orbit f a) = order f a" by (simp add: order_def)
lemma order_greater_zero [simp]: "order f a > 0" by (simp only: card_gt_0_iff order_def comp_def) simp
lemma order_eq_one_iff: "order f a = Suc 0 \ a \ affected f" (is "?P \ ?Q") proof assume ?P thenhave"card (orbit f a) = 1" by simp thenobtain b where"orbit f a = {b}" by (rule card_1_singletonE) with in_orbit_self [of a f] have"b = a"by simp with\<open>orbit f a = {b}\<close> show ?Q by (simp add: not_in_affected_iff_orbit_eq_singleton) next assume ?Q thenhave"orbit f a = {a}" by (simp add: not_in_affected_iff_orbit_eq_singleton) thenhave"card (orbit f a) = 1" by simp thenshow ?P by simp qed
lemma order_greater_eq_two_iff: "order f a \ 2 \ a \ affected f" using order_eq_one_iff [of f a] apply (auto simp add: neq_iff) using order_greater_zero [of f a] apply simp done
lemma order_less_eq_affected: assumes"f \ 1" shows"order f a \ card (affected f)" proof (cases "a \ affected f") from assms have"affected f \ {}" by simp thenobtain B b where"affected f = insert b B" by blast with finite_affected [of f] have"card (affected f) \ 1" by (simp add: card.insert_remove) case False thenhave"order f a = 1" by (simp add: order_eq_one_iff) with\<open>card (affected f) \<ge> 1\<close> show ?thesis by simp next case True have"card (orbit f a) \ card (affected f)" by (rule card_mono) (simp_all add: True orbit_subset_eq_affected card_mono) thenshow ?thesis by simp qed
lemma affected_order_greater_eq_two: assumes"a \ affected f" shows"order f a \ 2" proof (rule ccontr) assume"\ 2 \ order f a" thenhave"order f a < 2" by (simp add: not_le) with order_greater_zero [of f a] have"order f a = 1" by arith with assms show False by (simp add: order_eq_one_iff) qed
lemma order_witness_unfold: assumes"n > 0"and"(f ^ n) \$\ a = a" shows"order f a = card ((\m. (f ^ m) \$\ a) ` {0.. proof - have"orbit f a = (\m. (f ^ m) \$\ a) ` {0.. proof (rule set_eqI, rule) fix b assume"b \ orbit f a" thenobtain m where"(f ^ m) \$\ a = b" by (auto simp add: orbit_def) thenhave"b = (f ^ (m mod n + n * (m div n))) \$\ a" by simp alsohave"\ = (f ^ (m mod n)) \$\ ((f ^ (n * (m div n))) \$\ a)" by (simp only: power_add apply_times) simp alsohave"(f ^ (n * q)) \$\ a = a" for q by (induct q)
(simp_all add: power_add apply_times assms) finallyhave"b = (f ^ (m mod n)) \$\ a" . moreoverfrom\<open>n > 0\<close> have"m mod n < n" by simp ultimatelyshow"b \ ?B" by auto next fix b assume"b \ ?B" thenobtain m where"(f ^ m) \$\ a = b" by blast thenshow"b \ orbit f a" by (rule in_orbitI) qed thenhave"card (orbit f a) = card ?B" by (simp only:) thenshow ?thesis by simp qed
lemma inj_on_apply_range: "inj_on (\m. (f ^ m) \$\ a) {.. proof - have"inj_on (\m. (f ^ m) \$\ a) {.. if"n \ order f a" for n using that proof (induct n) case 0 thenshow ?caseby simp next case (Suc n) thenhave prem: "n < order f a" by simp with Suc.hyps have hyp: "inj_on (\m. (f ^ m) \$\ a) {.. by simp have"(f ^ n) \$\ a \ (\m. (f ^ m) \$\ a) ` {.. proof assume"(f ^ n) \$\ a \ (\m. (f ^ m) \$\ a) ` {.. thenobtain m where *: "(f ^ m) \$\ a = (f ^ n) \$\ a" and "m < n" by auto interpret bijection "apply (f ^ m)" by standard simp from\<open>m < n\<close> have "n = m + (n - m)" and nm: "0 < n - m""n - m \ n" by arith+ with * have"(f ^ m) \$\ a = (f ^ (m + (n - m))) \$\ a" by simp thenhave"(f ^ m) \$\ a = (f ^ m) \$\ ((f ^ (n - m)) \$\ a)" by (simp add: power_add apply_times) thenhave"(f ^ (n - m)) \$\ a = a" by simp with\<open>n - m > 0\<close> have"order f a = card ((\m. (f ^ m) \$\ a) ` {0.. by (rule order_witness_unfold) alsohave"card ((\m. (f ^ m) \$\ a) ` {0.. card {0.. by (rule card_image_le) simp finallyhave"order f a \ n - m" by simp with prem show False by simp qed with hyp show ?case by (simp add: lessThan_Suc) qed thenshow ?thesis by simp qed
lemma orbit_unfold_image: "orbit f a = (\n. (f ^ n) \$\ a) ` {.. proof (rule sym, rule card_subset_eq) show"finite (orbit f a)" by simp show"?A \ orbit f a" by (auto simp add: orbit_def) from inj_on_apply_range [of f a] have"card ?A = order f a" by (auto simp add: card_image) thenshow"card ?A = card (orbit f a)" by simp qed
lemma in_orbitE: assumes"b \ orbit f a" obtains n where"b = (f ^ n) \$\ a" and "n < order f a" using assms unfolding orbit_unfold_image by blast
lemma apply_power_order [simp]: "(f ^ order f a) \$\ a = a" proof - have"(f ^ order f a) \$\ a \ orbit f a" by simp thenobtain n where
*: "(f ^ order f a) \$\ a = (f ^ n) \$\ a" and"n < order f a" by (rule in_orbitE) show ?thesis proof (cases n) case 0 with * show ?thesis by simp next case (Suc m) from order_greater_zero [of f a] have"Suc (order f a - 1) = order f a" by arith from Suc \<open>n < order f a\<close> have"m < order f a" by simp with Suc * have"(inverse f) \$\ ((f ^ Suc (order f a - 1)) \$\ a) =
(inverse f) \<langle>$\<rangle> ((f ^ Suc m) \<langle>$\<rangle> a)" by simp thenhave"(f ^ (order f a - 1)) \$\ a =
(f ^ m) \<langle>$\<rangle> a" by (simp only: power_Suc apply_times)
(simp add: apply_sequence mult.assoc [symmetric]) with inj_on_apply_range have"order f a - 1 = m" by (rule inj_onD)
(simp_all add: \<open>m < order f a\<close>) with Suc have"n = order f a" by auto with\<open>n < order f a\<close> show ?thesis by simp qed qed
lemma apply_power_left_mult_order [simp]: "(f ^ (n * order f a)) \$\ a = a" by (induct n) (simp_all add: power_add apply_times)
lemma apply_power_right_mult_order [simp]: "(f ^ (order f a * n)) \$\ a = a" by (simp add: ac_simps)
lemma apply_power_mod_order_eq [simp]: "(f ^ (n mod order f a)) \$\ a = (f ^ n) \$\ a" proof - have"(f ^ n) \$\ a = (f ^ (n mod order f a + order f a * (n div order f a))) \$\ a" by simp alsohave"\ = (f ^ (n mod order f a) * f ^ (order f a * (n div order f a))) \$\ a" by (simp flip: power_add) finallyshow ?thesis by (simp add: apply_times) qed
lemma apply_power_eq_iff: "(f ^ m) \$\ a = (f ^ n) \$\ a \ m mod order f a = n mod order f a" (is "?P \ ?Q") proof assume ?Q thenhave"(f ^ (m mod order f a)) \$\ a = (f ^ (n mod order f a)) \$\ a" by simp thenshow ?P by simp next assume ?P thenhave"(f ^ (m mod order f a)) \$\ a = (f ^ (n mod order f a)) \$\ a" by simp with inj_on_apply_range show ?Q by (rule inj_onD) simp_all qed
lemma apply_inverse_eq_apply_power_order_minus_one: "(inverse f) \$\ a = (f ^ (order f a - 1)) \$\ a" proof (cases "order f a") case 0 with order_greater_zero [of f a] show ?thesis by simp next case (Suc n) moreoverhave"(f ^ order f a) \$\ a = a" by simp thenhave *: "(inverse f) \$\ ((f ^ order f a) \$\ a) = (inverse f) \$\ a" by simp ultimatelyshow ?thesis by (simp add: apply_sequence mult.assoc [symmetric]) qed
lemma apply_inverse_self_in_orbit [simp]: "(inverse f) \$\ a \ orbit f a" using apply_inverse_eq_apply_power_order_minus_one [symmetric] by (rule in_orbitI)
lemma apply_inverse_power_eq: "(inverse (f ^ n)) \$\ a = (f ^ (order f a - n mod order f a)) \$\ a" proof (induct n) case 0 thenshow ?caseby simp next case (Suc n)
define m where"m = order f a - n mod order f a - 1" moreoverhave"order f a - n mod order f a > 0" by simp ultimatelyhave *: "order f a - n mod order f a = Suc m" by arith moreoverfrom * have m2: "order f a - Suc n mod order f a = (if m = 0 then order f a else m)" by (auto simp add: mod_Suc) ultimatelyshow ?case using Suc by (simp_all add: apply_times power_Suc2 [of _ n] power_Suc [of _ m] del: power_Suc)
(simp add: apply_sequence mult.assoc [symmetric]) qed
lemma apply_power_eq_self_iff: "(f ^ n) \$\ a = a \ order f a dvd n" using apply_power_eq_iff [of f n a 0] by (simp add: mod_eq_0_iff_dvd)
lemma orbit_equiv: assumes"b \ orbit f a" shows"orbit f b = orbit f a" (is"?B = ?A") proof from assms obtain n where"n < order f a"and b: "b = (f ^ n) \$\ a" by (rule in_orbitE) thenshow"?B \ ?A" by (auto simp add: apply_sequence power_add [symmetric] intro: in_orbitI elim!: in_orbitE) from b have"(inverse (f ^ n)) \$\ b = (inverse (f ^ n)) \$\ ((f ^ n) \$\ a)" by simp thenhave a: "a = (inverse (f ^ n)) \$\ b" by (simp add: apply_sequence) thenshow"?A \ ?B" apply (auto simp add: apply_sequence power_add [symmetric] intro: in_orbitI elim!: in_orbitE) unfolding apply_times comp_def apply_inverse_power_eq unfolding apply_sequence power_add [symmetric] apply (rule in_orbitI) apply rule done qed
lemma orbit_apply [simp]: "orbit f (f \$\ a) = orbit f a" by (rule orbit_equiv) simp
lemma order_apply [simp]: "order f (f \$\ a) = order f a" by (simp only: order_def comp_def orbit_apply)
lemma orbit_apply_inverse [simp]: "orbit f (inverse f \$\ a) = orbit f a" by (rule orbit_equiv) simp
lemma order_apply_inverse [simp]: "order f (inverse f \$\ a) = order f a" by (simp only: order_def comp_def orbit_apply_inverse)
lemma orbit_apply_power [simp]: "orbit f ((f ^ n) \$\ a) = orbit f a" by (rule orbit_equiv) simp
lemma order_apply_power [simp]: "order f ((f ^ n) \$\ a) = order f a" by (simp only: order_def comp_def orbit_apply_power)
lemma orbit_inverse [simp]: "orbit (inverse f) = orbit f" proof (rule ext, rule set_eqI, rule) fix b a assume"b \ orbit f a" thenobtain n where b: "b = (f ^ n) \$\ a" "n < order f a" by (rule in_orbitE) thenhave"b = apply (inverse (inverse f) ^ n) a" by simp thenhave"b = apply (inverse (inverse f ^ n)) a" by (simp add: perm_power_inverse) thenhave"b = apply (inverse f ^ (n * (order (inverse f ^ n) a - 1))) a" by (simp add: apply_inverse_eq_apply_power_order_minus_one power_mult) thenshow"b \ orbit (inverse f) a" by simp next fix b a assume"b \ orbit (inverse f) a" thenshow"b \ orbit f a" by (rule in_orbitE)
(simp add: apply_inverse_eq_apply_power_order_minus_one
perm_power_inverse power_mult [symmetric]) qed
lemma order_inverse [simp]: "order (inverse f) = order f" by (simp add: order_def)
lemma orbit_disjoint: assumes"orbit f a \ orbit f b" shows"orbit f a \ orbit f b = {}" proof (rule ccontr) assume"orbit f a \ orbit f b \ {}" thenobtain c where"c \ orbit f a \ orbit f b" by blast thenhave"c \ orbit f a" and "c \ orbit f b" by auto thenobtain m n where"c = (f ^ m) \$\ a" and"c = apply (f ^ n) b"by (blast elim!: in_orbitE) thenhave"(f ^ m) \$\ a = apply (f ^ n) b" by simp thenhave"apply (inverse f ^ m) ((f ^ m) \$\ a) = apply (inverse f ^ m) (apply (f ^ n) b)" by simp thenhave *: "apply (inverse f ^ m * f ^ n) b = a" by (simp add: apply_sequence perm_power_inverse) have"a \ orbit f b" proof (cases n m rule: linorder_cases) case equal with * show ?thesis by (simp add: perm_power_inverse) next case less moreover define q where"q = m - n" ultimatelyhave"m = q + n"by arith with * have"apply (inverse f ^ q) b = a" by (simp add: power_add mult.assoc perm_power_inverse) thenhave"a \ orbit (inverse f) b" by (rule in_orbitI) thenshow ?thesis by simp next case greater moreover define q where"q = n - m" ultimatelyhave"n = m + q"by arith with * have"apply (f ^ q) b = a" by (simp add: power_add mult.assoc [symmetric] perm_power_inverse) thenshow ?thesis by (rule in_orbitI) qed with assms show False by (auto dest: orbit_equiv) qed
subsection \<open>Swaps\<close>
lift_definition swap :: "'a \ 'a \ 'a perm" (\\_ \ _\\) is"\a b. transpose a b" proof fix a b :: 'a have"{c. transpose a b c \ c} \ {a, b}" by (auto simp add: transpose_def) thenshow"finite {c. transpose a b c \ c}" by (rule finite_subset) simp qed simp
lemma apply_swap_simp [simp]: "\a \ b\ \$\ a = b" "\a \ b\ \$\ b = a" by (transfer; simp)+
lemma apply_swap_same [simp]: "c \ a \ c \ b \ \a \ b\ \$\ c = c" by transfer simp
lemma apply_swap_eq_iff [simp]: "\a \ b\ \$\ c = a \ c = b" "\a \ b\ \$\ c = b \ c = a" by (transfer; auto simp add: transpose_def)+
lemma swap_1 [simp]: "\a \ a\ = 1" by transfer simp
lemma swap_sym: "\b \ a\ = \a \ b\" by (transfer; auto simp add: transpose_def)+
lemma swap_self [simp]: "\a \ b\ * \a \ b\ = 1" by transfer simp
lemma affected_swap: "a \ b \ affected \a \ b\ = {a, b}" by transfer (auto simp add: transpose_def)
lemma inverse_swap [simp]: "inverse \a \ b\ = \a \ b\" by transfer (auto intro: inv_equality)
subsection \<open>Permutations specified by cycles\<close>
fun cycle :: "'a list \ 'a perm" (\\_\\) where "\[]\ = 1"
| "\[a]\ = 1"
| "\a # b # as\ = \a # as\ * \a\b\"
text\<open>
We do not continue andrestrict ourselves tosyntaxfrom here.
See also introductory note. \<close>
subsection \<open>Syntax\<close>
bundle permutation_syntax begin notation swap (\<open>\<langle>_ \<leftrightarrow> _\<rangle>\<close>) notation cycle (\<open>\<langle>_\<rangle>\<close>) notation"apply" (infixl\<open>\<langle>$\<rangle>\<close> 999) end
unbundle no permutation_syntax
end
¤ Dauer der Verarbeitung: 0.16 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.