<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\setcounter{secnumdepth}{0}
\setcounter{tocdepth}{0}

\usepackage{multicol}

\usepackage{babel}
\makeatother

\begin{document}
\title{Forth erzeugt automatisch Hexadoku\discretionary{â€“}{}{â€“}RÃ¤tsel\discretionary{â€“}{}{â€“}Vorgaben}
\author{Fred Behringer}
\maketitle

\newcommand{\Def}[1]{\emph{#1}}
\newcommand{\Code}[1]{{\ttfamily #1}}
\newcommand{\qed}{\hfill$\circ$}
\newcommand{\ssp}{\discretionary{}{}{}\,}
\newcommand{\emphb}[1]{\emph{#1}}

\begin{abstract}
%Zusammenfassung
Bei Sudoku (Vorstufe zu Hexadoku) werden Ã¼blicherweise etwa 30 Elemente vorgegeben. Diese kÃ¶nnen nicht beliebig gewÃ¤hlt werden. Sie mÃ¼ssen \emph{zulÃ¤ssig} sein, d.h., aus einer \emph{zulÃ¤ssigen} Gesamtmatrix stammen. Es soll eine Analyse darÃ¼ber versucht werden, wie man es (mit Hilfe von Forth) schafft, praktisch beliebig viele voneinander verschiedene zulÃ¤ssige 
Hexadoku--RÃ¤tsel zu erzeugen. \emph{Erzeugen}, als Vorgabeschema, \emphb{nicht} unbedingt schon \emphb{lÃ¶sen!} Allerdings soll auch Ã¼ber das (schnelle) LÃ¶sen gesprochen werden, und zwar bei einer extrem spÃ¤rlich verteilten geringen Anzahl von vorgegebenen Elementen.
\end{abstract}


\begin{multicols}{2}

\section{Bedienungsschnellanleitung}

Dinge, die in dieser Schnellanleitung noch unklar bleiben, werden, so hoffe ich, aus dem eigentlichen Textteil dieses Artikels heraus klarer (man fange am besten mit {\bf Einleitung und Ziel} an, zu lesen). Die Eingabe \Code{hexa} \key{ret} liefert (auf dem Bildschirm) beliebig viele (vom Programm \emph{zufÃ¤llig} ausgewÃ¤hlte) Hexadoku--Vorgaben, pro Knopfdruck (\key{ret}) je eine. Die vorherige Eingabe \Code{loes? on} \key{ret} liefert, solange sie nicht durch \Code{loes? off} \key{ret} umgestellt wurde, neben der Vorgabematrix jeweils auch immer die zugehÃ¶rige zulÃ¤ssige Matrix (die \emph{LÃ¶sung}). Voreingestellt ist \Code{loes? on}. 

Ausgangspunkt im Hauptprogramm \Code{hexa} ist die \emph{kanonische Matrix} (siehe unten). Schon beim ersten Weiterschreiten (nach eingeleitetem \Code{hexa} \key{ret}) ist das Tableau (das Feld \Code{matrix}) vÃ¶llig undurchsichtig geworden. Von der ursprÃ¼nglich durch \Code{kanon} systematisch aufgebauten zulÃ¤ssigen \Code{matrix} ist nichts erkennbar Systematisches mehr Ã¼brig geblieben. Das Weiterschreiten (von \emph{zulÃ¤ssiger} \Code{matrix} zu \emph{zulÃ¤ssiger} \Code{matrix}) geschieht Ã¼ber einen beliebigen Tastendruck (unter Aussparung der Returntaste). Den Erzeugungsprozess zum Aufbau von zulÃ¤ssigen Matrizen verlassen kann man mit der Returntaste oder mit \key{q} oder mit \key{Q}. \key{q} oder \key{Q} ist als Hommage an MinForth (siehe weiter unten unter {\bf Forth--Programme}) gedacht.

Kein Autor ist gegen Denk-- oder Programmierfehler gefeit: Es kÃ¶nnten beim Benutzer nach vielen Schritten im \Code{hexa}--Prozess Zweifel an der immer noch vorliegenden ZulÃ¤ssigkeit von \Code{matrix} aufkommen. Man breche den Prozess Ã¼ber die Returntaste ab und prÃ¼fe die gerade erreichte \Code{matrix} Ã¼ber \Code{mok?} \key{ret}. NatÃ¼rlich liegt hier ein Teufelskreis vor: FÃ¼r diese PrÃ¼fung muss man sich auf das PrÃ¼fprogramm \Code{mok?} verlassen kÃ¶nnen. Das lÃ¤sst sich aber durch eine einmalige strenge logische Ãœberlegung ein fÃ¼r alle Mal erledigen.

Das Hauptprogramm \Code{hexa} liefert (zumeist jedenfalls) eine reproduzierbare Serie von Ergebnissen. Das ist nicht weiter schlimm, da man ja den Prozess \Code{hexa} und den damit verbundenen Pseudozufallsprozess beliebig weit forttreiben kann, bevor man an eine Ãœbernahme der Ergebnisse (der gelieferten RÃ¤tselvorgaben) denkt. Man kann aber auch das Programm \Code{hexa} umformulieren und es von der (an sich beliebig eingebbaren) Anfangszahl fÃ¼r den Pseudozufallsprozess (im Programm habe ich 2000 gewÃ¤hlt) abhÃ¤ngig werden lassen. (Man beachte auch das unter {\bf Forth--Programme} Ã¼ber MinForth Gesagte.)

Voreingestellter Wert fÃ¼r die Abfragevariable \Code{kanon?} ist \Code{kanon? on} . Stellt man auf \Code{kanon? off} um und leitet erst dann den Erzeugungsprozess per \Code{hexa} ein, so wird man sich wundern: Schon die erste Matrix ist dann im Allgemeinen nicht zulÃ¤ssig (mit mok? nachprÃ¼fen!). Zum ordnungsgemÃ¤ÃŸen Start braucht der Erzeugungsprozess die Einstellung \Code{kanon? on} . Es wird dann mit der (zulÃ¤ssigen) kanonischen Matrix begonnen und alle nachfolgenden Matrizen sind ebenfalls zulÃ¤ssig. Bricht man den Erzeugungsprozess dann aber irgendwann durch DrÃ¼cken der Returntaste ab und gibt wieder \Code{hexa} \key{ret} ein, so wird wieder mit der kanonischen Matrix gestartet. Will man das (was durchaus wÃ¼nschenswert sein kann) verhindern, so kann man den Erzeugungsprozess Ã¼ber die Returntaste kurz unterbrechen und dann \Code{kanon? off} \key{ret} eingeben. Wenn man daraufhin wieder \Code{hexa} \key{ret} eingibt, so fÃ¤hrt der Erzeugungsprozess mit der bis dato bereits erreichten (zulÃ¤ssigen) Matrix fort.

An Bildschirm--AnzeigemÃ¶glichkeiten aus dem Stand heraus (auÃŸerhalb eines eingeleiteten \Code{hexa}) stehen zur VerfÃ¼gung: \Code{.m} fÃ¼r die momentane Matrix (RÃ¤tsellÃ¶sung), \Code{.v} fÃ¼r die zugehÃ¶rige Vorgabematrix (zu stellendes RÃ¤tsel) und \Code{.m\&amp;v} fÃ¼r beides zusammen. Mit \Code{cpy-m} kann man die Matrix auf den Platz fÃ¼r die Vorgabematrix kopieren, mit \Code{xch-m} tauscht man Matrix und Vorgabematrix gegeneinander aus.

Wegen einer praktischen Inbetriebnahme unter verschiedenen Forth--Systemen sehe man weiter unten im Abschnitt {\bf Forth--Programme} nach.

\section{Einleitung und Ziel}

Magische Quadrate ($n{\times} n$--Matrizen) faszinieren den Betrachter seit Menschengedenken. Nicht immer ist es die Summe der (aus natÃ¼rlichen Zahlen bestehenden) Elemente, die Ã¼ber Zeilen, Spalten und Diagonalen hinweg konstant bleiben soll. Verlangt man, dass in einer $9{\times} 9$--Matrix jede Ziffer von 1 bis 9 in jeder Zeile, in jeder Spalte und in jeder $3{\times} 3$--Teilmatrix genau einmal auftritt, dann hat man es mit einer Sudoku--Matrix zu tun. 

Sudokus (su = Ziffer, doku = einmal) sind seit einigen Jahren erst in Amerika, dann in Japan (daher der Name) und jetzt auch bei uns in Deutschland beliebt geworden. Ein neuer Volkssport, sozusagen: Eine gewisse Anzahl von Elementen (meist um die 30 herum) werden vorgegeben, der Rest muss \emph{erraten} werden. Sudoku--RÃ¤tselsammlungen (mit durchschnittlich 200 RÃ¤tseln und auf den letzten Seiten angegebenen LÃ¶sungen) wurden zuhauf fÃ¼nfeuroweise auf den Markt geworfen.

Die Zeitschrift Elektor (und in Holland deren Mutterblatt Elektuur) hat ihre Leser mit dem Begriff \emph{Hexadoku} begeistert: Eine $16{\times} 16$--Matrix, die in sechzehn $4{\times} 4$--Teilmatrizen aufgeteilt ist. (\emph{Aufteilung} heiÃŸt Ãœberdeckung mit $4{\times} 4$--Teilmatrizen, die mit den Elementen der Gesamtmatrix auskommt.) Vorgegeben ist eine gewisse Anzahl von Elementen, der Rest soll \emph{erraten} (irgendwie gefunden) werden. In jeder Zeile, in jeder Spalte und in jedem Teilquadrat soll jede Hexadezimalziffer von 0 bis F genau einmal vorkommen (hier also auch die \emphb{0,} bei \emphb{Sudoku} fÃ¤ngt es \emphb{erst bei 1} an.)

Martin Bitter hat sofort erkannt, dass Sudoku (besser: Hexadoku) ein willkommenes Mittel sein kann, den lernschwachen unter den SchÃ¼lern seiner Integrativen Schule spielerisch das logische Denken beizubringen. Er hat im
 VD--Heft 1/2006 ein Forth--Programm zur LÃ¶sungshilfe verÃ¶ffentlicht. 

(Aus Amerika hÃ¶rt man von \emph{unserem Reporter} Henry Vinerts, dass John Rible, erwÃ¤hnt in comp.lang.forth, auf einem kÃ¼rzlichen SVFIG--Treffen Ã¼ber ein vollstÃ¤ndiges LÃ¶sungsverfahren in Forth vorgetragen hat. John Rible stÃ¼tzt seine LÃ¶sung auf einen Rekursive--Backtracking--Algorithmus von Robert  Spykerman, den John um einen Brute--Force--Backtracking--Solver ergÃ¤nzt hat. Bernd Paysan hat in einer persÃ¶nlichen Mitteilung an das Redaktions--Team der VD sofort nach Bekanntwerden von Martins Anstrengungen angedeutet, wie ein vollstÃ¤ndiges LÃ¶sungsverfahren aussehen kann. Fred Behringer hat das Hexadoku--RÃ¤tsel aus dem Elektor--Heft 2/2006 mit Bleistift, Papier und Radiergummi gelÃ¶st und damit den Elektor--Hauptpreis, das E--Blocks--Starter--Kit--Professional, gewonnen.)

In den Sudoku--BÃ¼chern werden die \emph{RÃ¤tsel} mit \emphb{wenig}er \emphb{Vorgaben} als \emphb{schwer} bezeichnet, die mit \emphb{mehr Vorgaben} als \emphb{leicht}er. \emphb{Das kann man, so behaupte ich, so generell nicht sagen.} Die kleinste Anzahl von Vorgaben ist 0. Das mÃ¼sste dann also ein schweres RÃ¤tsel sein. \emphb{Null} liefert aber ein \emphb{ganz ganz leicht}es Spiel. Ich gebe dafÃ¼r gleich anschlieÃŸend eine \emph{LÃ¶sung} an (\emphb{eine} LÃ¶sung --- mit der Eindeutigkeitsfrage mÃ¼sste man sich noch gesondert befassen), die ich als Ausgangspunkt fÃ¼r weitere Ãœberlegungen nehmen und als \emph{kanonisch} bezeichnen mÃ¶chte. Matrizen mit einem \emphb{einzigen} vorgegebenen Element, das sieht man schnell ein, lassen sich \emphb{ebenfalls ganz einfach} behandeln. Zwei vorgegebene Elemente bereiten keine Schwierigkeit. Vier vorgegebene Elemente, das wird man sich mit dem weiter unten Gesagten ebenfalls leicht Ã¼berlegen kÃ¶nnen, liefern verhÃ¤ltnismÃ¤ÃŸig schnell eine LÃ¶sung, wenn sie sich gleichmÃ¤ÃŸig auf vier waagerecht angeordnete, vier senkrecht angeordnete oder vier diagonal angeordnete Teilmatrizen verteilen. Ein bisschen Ãœberlegung braucht man dazu allerdings schon.

Dass Vorgaben nicht willkÃ¼rlich gemacht werden kÃ¶nnen, ist klar: Zweimal die 1 in ein und derselben Zeile oder in ein und derselben Spalte wÃ¤re ja beispielsweise schon eine unzulÃ¤ssige Vorgabe.


\begin{description}
\item[Frage 1:] Wenige Vorgaben sind leicht, viele Vorgaben sind ebenfalls leicht. Gibt es eine mittlere Vorgabenbelegung, die einer schwersten Schwierigkeitsstufe zugeordnet werden kann?
\end{description}

Ich erwÃ¤hne diese Frage nur, weil sie mit der kanonischen Belegung eng zusammenhÃ¤ngt. Auch will ich mir Ã¼ber vollstÃ¤ndige, computerÃ¼bertragbare LÃ¶sungsverfahren (Algorithmen) keine Gedanken machen. Die Eindeutigkeitsfrage (Bedingungen an die Vorgaben, welche eine eindeutige LÃ¶sung garantieren) wÃ¤re ebenfalls interessant. Was mich hier interessiert aber ist die folgende


\begin{description}
\item[Frage 2:] Wie kann man automatisch eine (im praktischen Sinne) beliebige Anzahl von verschiedenen Hexadoku--RÃ¤tseln erzeugen?
\end{description}

(Martin mÃ¶chte sich ja schlieÃŸlich nicht jede Woche ein neues 
Hexadoku--RÃ¤tselbuch, so es solche Ã¼berhaupt je geben wird, kaufen mÃ¼ssen. Dass man nach erfolgreicher Beantwortung der obigen Frage den Computer dazu befÃ¤higen kÃ¶nnte, automatisch, ohne Zutun des Menschen, BÃ¼cher (Hexadoku--RÃ¤tselbÃ¼cher) zu schreiben und auf den Markt zu werfen, ist ein interessanter und sicher diskutierwÃ¼rdiger Nebeneffekt. Haben wir damit die KI--Frage gelÃ¶st (der Computer als BÃ¼cherschreiber) und eine erfolgversprechende KI--Begriffsbestimmung gefunden?)




\begin{figure*}
\begin{center}
\begin{small}
\renewcommand{\arraystretch}{1.5}
\begin{tabular}{|c|c|c|c||c|c|c|c||c|c|c|c||c|c|c|c|}
\hline
0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F\\
\hline
4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3\\
\hline
8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7\\
\hline
C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B\\
\hline
\hline
1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0\\
\hline
5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4\\
\hline
9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8\\
\hline
D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C\\
\hline
\hline
2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1\\
\hline
6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5\\
\hline
A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9\\
\hline
E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D\\
\hline
\hline
3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2\\
\hline
7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6\\
\hline
B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A\\
\hline
F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E\\
\hline
\end{tabular}
\end{small}
\caption{\label{kanonischeMatrix}Die kanonische Matrix}
\end{center}
\end{figure*}



\section{Definitionen und Bezeichnungen}

\Def{Matrix} sei eine abkÃ¼rzende Bezeichnung fÃ¼r eine $16{\times} 16$--Matrix mit den Hexadezimalziffern 0 bis F als \Def{Elementen}. Zeilen-- und SpaltenzÃ¤hlungen \emphb{beginnen bei 0!} Matrizen seien aufgeteilt in $4{\times} 4$--Teilmatrizen. Jede solche Teilmatrix heiÃŸe \Def{Viererquadrat}. Die Viererquadrate einer Matrix seien \emph{blockzeilenweise} mit 0 bis F durchnummeriert: Das Viererquadrat 9 ist von links gesehen das zweite (\emph{LÃ¤ngsstreifen} 1), von oben gesehen das dritte (\emph{Querstreifen} 2) Quadrat. Auch die ZÃ¤hlung der Viererquadrate \emphb{beginnt bei 0!} Von \Def{Reihe} sprechen wir, wenn wir uns nicht genau festlegen wollen, ob wir Zeile oder Spalte meinen. Eine waagerechte Anordnung von vier Viererquadraten mÃ¶ge \Def{Querstreifen} heiÃŸen. Eine senkrechte Anordnung von vier Viererquadraten heiÃŸe \Def{LÃ¤ngsstreifen}. Soll es offen bleiben, ob Quer-- oder LÃ¤ngsstreifen gemeint ist, sprechen wir einfach von \Def{Streifen}.

Eine \Def{zulÃ¤ssige Matrix} ist eine Matrix (im obigen Sinne), bei welcher in jeder Zeile, in jeder Spalte und in jedem Viererquadrat jede der \Def{Hex}(adezimal)\Def{ziffern} von 0 bis F genau einmal vorkommt. Elemente, die (noch) nicht bekannt sind, bezeichnen wir mit dem \Def{Leerzeichen} (Space). (Space tritt als Platzhalter, als variables Element, als Variable auf.) Ein \Def{zulÃ¤ssiger Streifen} ist ein Streifen einer zulÃ¤ssigen Matrix. Eine \Def{Vorbelegung} ist eine willkÃ¼rliche Auswahl von Elementen einer Matrix, deren restliche Elemente mit Space (20h) gekennzeichnet sind. \Def{Eine zulÃ¤ssige Vorbelegung} ist eine Vorbelegung, die aus (mindestens) einer zulÃ¤ssigen Matrix durch Weglassung von Elementen (Belegung mit Space) hervorgeht.

Eine \Def{Transformation} ist (hier) eine (eineindeutige, also bijektive) Umordnung der Elemente einer Matrix. Eine \Def{zulÃ¤ssige Transformation} ist eine Transformation, die eine zulÃ¤ssige Matrix in eine zulÃ¤ssige Matrix Ã¼berfÃ¼hrt.

In der vorliegenden Arbeit geht es um zulÃ¤ssige Transformationen, die sich aus beliebig zusammengewÃ¼rfelten zulÃ¤ssigen Transformationen zusammensetzen.


\section{Feststellungen}

Die meisten der jetzt folgenden Feststellungen sind leicht einzusehen und benÃ¶tigen keinen Beweis. Bei anderen reicht eine kurze ErlÃ¤uterung oder ein Beispiel. Die Feststellungen lassen sich in zwei Klassen einteilen, allgemeine Feststellungen (die fÃ¼r beliebige Belegungen gelten) und solche, die sich (wie bei \emph{kanonischen} Matrizen, siehe unten) auf eine bestimmte, festverankerte Belegung beziehen. Letztere kÃ¶nnen selbstverstÃ¤ndlich mit Auge und Gehirn (mit Bleistift und Papier) auf Richtigkeit Ã¼berprÃ¼ft werden: Das Auge braucht \emph{nur} 256 Elemente zu Ã¼berfliegen. Aber gerade weil die ÃœberprÃ¼fung der sehr anspruchslosen Regeln in den durchaus Ã¼berschaubaren Matrizen so einfach ist, lÃ¤sst sich das auch \emph{per Knopfdruck} Ã¼beraus leicht erledigen. 

{%\bf
Ich gebe weiter unten ein Forth--Programm an, welches nicht nur die zufallsmÃ¤ÃŸige Erzeugung von Hexadokus erledigt, sondern auch die ÃœberprÃ¼fung auf ZulÃ¤ssigkeit (einer irgendwie per Hand geÃ¤nderten zulÃ¤ssigen Matrix).}


\begin{description}
\item[Feststellung 1:] In einer zulÃ¤ssigen Vorbelegung ist in jeder Zeile und in jeder Spalte keine der auftretenden Ziffern mehr als einmal vertreten.

\item[Feststellung 2:] Eine zulÃ¤ssige Matrix bleibt zulÃ¤ssig, wenn in einem Querstreifen zwei Zeilen vertauscht werden.

\item[Feststellung 3:] Eine zulÃ¤ssige Matrix bleibt zulÃ¤ssig, wenn in einem LÃ¤ngsstreifen zwei Spalten vertauscht werden.

\item[Feststellung 4:] Eine zulÃ¤ssige Matrix bleibt zulÃ¤ssig, wenn in ihr zwei Querstreifen vertauscht werden.

\item[Feststellung 5:] Eine zulÃ¤ssige Matrix bleibt zulÃ¤ssig, wenn in ihr zwei LÃ¤ngsstreifen vertauscht werden.
\end{description}

Vertauscht man generell in einer Matrix $M$ deren Zeilen und Spalten, dann erhÃ¤lt man bekanntlich die zu $M$ \Def{transponierte} Matrix $M^T$. 


\begin{description}
\item[Feststellung 6:] Bekanntlich ist $M^{TT} = M$.

\item[Feststellung 7:] Ist $M$ eine Matrix im obigen Sinne und $V$ das
Viererquadrat $n$ mit den (zeilenweise zu lesenden) Elementen
0,\ssp 1,\ssp 2,\ssp 3,\ssp 4,\ssp 5,\ssp 6,\ssp 7,\ssp 8,\ssp 9,\ssp A,\ssp B,\ssp C,\ssp D,\ssp E,\ssp F, dann ist das Viererquadrat $m$ mit
den Elementen 0,\ssp 4,\ssp 8,\ssp C,\ssp 1,\ssp 5,\ssp 9,\ssp D,\ssp 2,\ssp 6,\ssp A,\ssp E,\ssp 3,\ssp 7,\ssp B,\ssp F von $M^T$ die
Transponierte $V^T$ von $V$.

\item[Beweis:] Betrachtung der in Ã¼blicher Weise doppeltindizierten Elemente von $M$ und AuszÃ¤hlung der Indizes: Vertauschung von Zeilen und Spalten in der Gesamtmatrix $M$ lÃ¤uft auf eine Vertauschung von Zeilen und Spalten auch in den Viererquadraten hinaus.  \qed

\item[Feststellung 8:] Die Transponierte einer zulÃ¤ssigen Matrix ist eine zulÃ¤ssige Matrix.

\item[Beweis:] Mit den Zeilen/Spalten einer zulÃ¤ssigen Matrix erfÃ¼llen auch die Spalten/Zeilen ihrer Transponierten die Kriterien der ZulÃ¤ssigkeit. Alles Weitere folgt aus Feststellung 7.  \qed
\end{description}




\section{Generierverfahren}


\begin{description}
\item[Feststellung 9:] Die Matrix (im obigen Sinne) in Abbildung \ref{kanonischeMatrix} (Seite \pageref{kanonischeMatrix}) ist eine zulÃ¤ssige Matrix. Wir wollen sie wegen ihres einfachen Aufbaus die \Def{kanonische Matrix} nennen.

\item[Beweis:] Einfach durchprobieren, Zeile fÃ¼r Zeile, Spalte fÃ¼r Spalte, Viererquadrat fÃ¼r Viererquadrat!  \qed
\end{description}

Diese Matrix baut sich wie folgt auf: Die (Hex--)Ziffern der ersten Zeile (Zeile 0) in natÃ¼rlicher Reihenfolge hinschreiben. Eine Kopie der so gebildeten ersten Zeile in die zweite Zeile (Zeile 1) schreiben und diese dann um 4 Spalten nach links rotieren (was links herausfÃ¤llt, rechts anfÃ¼gen). Eine Kopie der so gebildeten zweiten Zeile (Zeile 1) in die dritte Zeile (Zeile 2) schreiben und diese wieder um 4 Spalten nach links rotieren lassen. Und schlieÃŸlich die dritte Zeile (Zeile 2) in die vierte Zeile (Zeile 3) kopieren und die vierte Zeile (Zeile 3) um vier Spalten nach links rotieren. Damit ist der erste Querstreifen (Querstreifen 0) der aufzubauenden kanonischen Matrix gebildet.

In die fÃ¼nfte Zeile (Zeile 4) schreibe man eine Kopie der ersten Zeile (Zeile 0) und rotiere sie um 1 nach links (um 1, nicht um 4!). Dann folgerichtig weiter mit der sechsten, siebten und achten Zeile (jeweils die vorhergehende kopieren und um 4 Spalten nach links rotieren lassen). Bei der neunten Zeile (Zeile 8) wiederum die fÃ¼nfte (nicht die erste!) nehmen und um 1 Spalte nach links rotieren. Und so weiter und so fort.


\begin{description}
\item[Feststellung 10:] Aus der kanonischen Matrix aus Feststellung 9 erhÃ¤lt man wieder eine Art kanonischer Matrix (einfach aufgebaut und zulÃ¤ssig), wenn man in Feststellung 9 das Wort links durch das Wort rechts ersetzt. Ich will die zulÃ¤ssige Matrix aus Feststellung 9 daher auch \Def{linkskanonisch} und die, um die es in der vorliegenden Feststellung 10 geht, \Def{rechtskanonisch} nennen.

\item[Beweis:] Hinschreiben und ZulÃ¤ssigkeit nachprÃ¼fen!  \qed

\item[Feststellung 11:]  Aus einer zulÃ¤ssigen Matrix erhÃ¤lt man wieder eine zulÃ¤ssige Matrix, wenn man die Zeilen oder/und die Spalten in umgekehrter Reihenfolge hinschreibt.

\item[Beweis:] Feststellungen 2 bis 5. \emph{Spalten in umgekehrter Reihenfolge hinschreiben} ist dasselbe wie \emph{Ã¤uÃŸerste Spalten miteinander vertauschen, dann zweitÃ¤uÃŸerste} usw. Entsprechend fÃ¼r Zeilen.  \qed

\item[Bezeichnung:] Geht man von der kanonischen Matrix aus und schreibt die Zeilen (Spalten) wie in Feststellung 11 invertiert hin, dann wollen wir die resultierende Matrix die \Def{zeileninvertierte} (\Def{spalteninvertierte}) \Def{kanonische Matrix} nennen.
\end{description}

\section{Randomisierung}


\begin{description}
\item[Anzahl der Vorgaben:] Bei Sudoku sind etwa 30 Vorgabe--Elemente Ã¼blich. Die Zeitschrift \emph{Elektor} hat in ihren Ausgaben vom Januar, Februar, MÃ¤rz und April 120, 122, 119, 111 Elemente vorgegeben. 128 Elemente beispielsweise scheint also eine brauchbare Zahl von Vorgaben zu sein. 128 ist genau die HÃ¤lfte von 256, der Gesamtzahl an Matrixelementen. Das legt fÃ¼r die Randomisierung eine Zufallsverteilung von \emph{gerade} und \emph{ungerade} nahe.

\item[Einsparung eines echten Zufalls:] Man weiÃŸ, wie (Pseudo)zufallszahlen zu konstruieren sind, die den bekannten statistischen Verfahren zur ÃœberprÃ¼fung auf Gleichverteilung standhalten. Hier ist das aber sicher nicht nÃ¶tig: Ob gleichverteilt oder nicht, interessiert uns herzlich wenig, Hauptsache, die LÃ¶sung (\emphb{eine} LÃ¶sung) lÃ¤sst sich nicht schon aus der Struktur der Vorgabeelemente heraus sofort erraten. Naheliegend ist also die Vorgabe einer Zahl (\emph{Seed}\/), ab der im Programmspeicher die aufeinanderfolgenden Bytes abgefragt und mit 1 geANDet werden. Bei Ergebnis 0 wird das gerade an der Reihe befindliche der parallel dazu laufenden Matrixelemente \emph{gelÃ¶scht} (mit Space belegt), bei 1 bleibt es stehen.

Das gibt eine ungefÃ¤hre Vorgabebelegung mit 50\% aller Elemente, also mit etwa 128d Elementen. In gewisser Bandbreite kann man das noch experimentell durch geeignete Wahl der Pseudozufalls--Seed--Zahl (im Programm habe ich willkÃ¼rlich 2000 gewÃ¤hlt) variieren (es kann ja ganze Strecken im RAM geben, die mit geraden Bytes, z.B. 0, belegt sind). MÃ¶glichkeiten, die vorgegebene Anzahl von Elementen zu reduzieren, bestehen darin, dass man \Code{AUSWAHL} (siehe Programm) auf eine schon getroffene Auswahl anwendet, und das vielleicht sogar mehrfach. Man experimentiere! Die Reduzierungsrate lÃ¤sst sich schwer vorhersagen. Experimente haben jedoch gezeigt, dass schon nach etwa 10 solcher wiederholten \Code{AUSWAHL}en praktisch kein Belegungselement mehr Ã¼brig ist. (Man beachte aber auch das unter {\bf Forth--Programme} Ã¼ber MinForth Gesagte!)
\end{description}

\section{LÃ¶severfahren bei kleiner Zahl von Vorgaben}

Ich will nur auf ein paar LÃ¶sungs-- und PrÃ¼fverfahren eingehen, die bei 30 (Sudoku) oder 128 (Hexadoku) vorgegebenen Elementen der entsprechenden \Code{MATRIX} nicht mehr anwendbar oder, da nur in AusnahmefÃ¤llen auftretend, nicht mehr so wichtig sind. Generelle LÃ¶sungsverfahren, so interessant sie sein mÃ¶gen, sollen hier nicht angegangen werden.


\begin{description}
\item[Feststellung 12:] Wird in einer Matrix (im obigen Sinne) ein (und nur ein) Element vorgegeben, dann lÃ¤sst dieses sich (zumindest wie folgt) zu einer zulÃ¤ssigen Matrix ergÃ¤nzen: 
O.B.d.A. mÃ¶ge das vorgegebene Element den Wert 7 haben und im Viererquadrat $m$ liegen.
Man betrachte die kanonische Matrix.\\
Vielleicht stimmen Zeile und Spalte des vorgegebenen Elementes genau mit jenem Element im Viererquadrat $m$ Ã¼berein, das den Wert 7 hat. Wenn nicht, dann:\\
Es muss im Viererquadrat $m$ genau ein Element mit dem Wert 7 geben. Es mÃ¶ge in Zeile $i$ und Spalte $j$ liegen.\\
Man vertausche die Zeile des vorgebenen Elementes mit Zeile $i$ und die Spalte mit Spalte $j$. 
Dann ist nach Feststellung 2 und 3 alles erledigt.  \qed

\item[Feststellung 13:] Die LÃ¶sung von Feststellung 12 ist alles andere als eindeutig, da ja schon die rechtskanonische, die zeileninvertierte kanonische, die spalteninvertierte kanonische Matrix und schlieÃŸlich die Transponierte aller genannten Matrizen offensichtlich unterschiedliche LÃ¶sungen liefern.

\item[Feststellung 14:] Hat man bis zu vier vorgegebene Elemente, die sich gleichmÃ¤ÃŸig so verteilen, dass in den zugehÃ¶rigen LÃ¤ngs-- und Querstreifen kein weiteres Vorgabeelement liegt (beispielsweise bei Diagonalanordnung), dann gelangt man zu (mindestens) einer LÃ¶sung, wenn man in Bezug auf jedes Vorgabeelement so wie in Feststellung 12 vorgeht.

\item[Beweis:] Offensichtlich. Kein Streifenpaar beeinflusst ein anderes Streifenpaar.  \qed
\end{description}

Ist man im unten stehenden Programm mit der Anzahl der Vorbelegungselemente (die man beispielsweise Ã¼ber \Code{VORGABE} erhalten hat) zufrieden, nicht aber mit deren Verteilung (weil sie sich beispielsweise alle in einer Ecke der \Code{MATRIX} zusammenballen), dann kommt man eventuell mit folgender Feststellung weiter.


\begin{description}
\item[Feststellung 15:] Eine zulÃ¤ssige Vorbelegung liefert wieder eine zulÃ¤ssige Vorbelegung, wenn man auf sie eine zulÃ¤ssige Transformation (siehe {\bf Definitionen und Bezeichnungen}) anwendet. 

\item[Beweis:] Offensichtlich. Die zulÃ¤ssige Transformation entstammt einer zulÃ¤ssigen Matrix (durch Weglassung von Elementen hervorgerufen). Der Begriff der zulÃ¤ssigen Transformation bezieht sich an sich auf eine zulÃ¤ssige Matrix, ist aber ansonsten eine (wiederholbare) Matrixoperation. Man betrachte statt der zulÃ¤ssigen Vorbelegung (welche Leerelemente enthÃ¤lt, genauer, enthalten kann) die (genauer, eine) zugehÃ¶rige zulÃ¤ssige Matrix, wende die zulÃ¤ssige Transformation auf ebendiese zulÃ¤ssige Matrix an und ersetze die zuvor irgendwie gekennzeichneten ursprÃ¼nglichen Leerelemente wieder durch Leerelemente.  \qed

\item[Feststellung 16:] Nimmt man eine der Hexzahlen $0,4,8$ oder C und addiert sie modulo 10h zu sÃ¤mtlichen Elementen einer zulÃ¤ssigen Matrix, so erhÃ¤lt man wieder eine zulÃ¤ssige Matrix. 

\item[Beweis:] Addition modulo 10h einer der genannten Konstanten zu den Hexzahlen 0\dots F fÃ¼hrt aus eben diesem Bereich nicht hinaus. (Eine solche Konstantenaddition ist umkehrbar eindeutig.) In jeder Zeile, in jeder Spalte und in jedem Viererquadrat ist eine solche Addition gleichbedeutend mit einer Umordnung der betreffenden Elemente. Die ZulÃ¤ssigkeitsbedingungen bleiben also insgesamt erhalten. \qed

\item[Bemerkung 1 zu 16:] Man kann in Feststellung 16 beliebige durch 4 teilbare nichtnegative (Hex--)Zahlen nehmen: 8 + 14 = C mod 10h etc. (Auch negative Hexzahlen tun der Ãœberlegung keinen Abbruch: Beweis!)

\item[Bemerkung 2 zu 16:] Zu jeder zulÃ¤ssigen Vorbelegung erhÃ¤lt man unmittelbar drei weitere zulÃ¤ssige Vorbelegungen mit exakt gleichen Vorgabepositionen: Addition modulo 10h von $4,8$ oder C zu sÃ¤mtlichen Elementen.

\item[Feststellung 17:] Bei der Addition modulo 10h von 4 zu sÃ¤mtlichen Elementen der \emphb{kanonischen} Matrix lÃ¤uft das Ergebnis auf eine Linksrotation (siehe Programmteil) sÃ¤mtlicher Zeilen um 4 Spalten hinaus. Das gilt auch, wenn man 4 durch andere durch 4 teilbare Zahlen ersetzt. Insbesondere lÃ¤uft eine Addition modulo 10h um C Spalten auf eine Rechtsrotation um 4 Spalten hinaus.

\item[Beweis:] Anhand der unten stehenden Forth--Programme leicht nachweisbar.  \qed
\end{description}


\begin{figure*}
\begin{center}
\begin{small}
\renewcommand{\arraystretch}{1.5}
\begin{tabular}{|c|c|c|c||c|c|c|c||c|c|c|c||c|c|c|c|}
\hline
0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp; ~ &amp; ~ \\
\hline
4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp; &amp; \\
\hline
8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp; &amp; \\
\hline
C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp; &amp; \\
\hline
\hline
1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp; &amp; \\
\hline
5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp; &amp; \\
\hline
9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp; &amp; \\
\hline
D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp; &amp; \\
\hline
\hline
2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp; &amp; \\
\hline
6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp; &amp; \\
\hline
A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp; &amp; \\
\hline
E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp; &amp; \\
\hline
\hline
3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp; &amp; \\
\hline
7&amp;8&amp;9&amp;A&amp;B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp; &amp; \\
\hline
B&amp;C&amp;D&amp;E&amp;F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp; &amp; \\
\hline
F&amp;0&amp;1&amp;2&amp;3&amp;4&amp;5&amp;6&amp;7&amp;8&amp;9&amp;A&amp;B&amp;C&amp; &amp; \\
\hline
\end{tabular}
\end{small}
\caption{\label{modifizierteMatrix}Die letzten beiden Spalten der kanonischen Matrix werden gelÃ¶scht.}
\end{center}
\end{figure*}


\section{Eindeutigkeit und AusschlieÃŸung}

Bei den in der Zeitschrift Elektor bisher zum \emph{Raten} verÃ¶ffentlichten Hexadokus handelt es sich ganz offensichtlich um Probleme mit \emphb{eindeutigen} LÃ¶sungen, auch wenn das nicht gesagt wird. Wir haben aber schon gesehen, dass eine gefundene Hexadoku--LÃ¶sung bei \emphb{wenigen Vorgaben alles andere als eindeutig} zu sein braucht. In den Sudoku--BÃ¼chern wird als (unter anderen) mÃ¶gliches LÃ¶sungsverfahren das \emphb{AusschlieÃŸungsprinzip} empfohlen. Wo es geht, ist es prima und macht SpaÃŸ: Angenommen, in einem Viererquadrat fehlen noch zwei Elemente, 0 und 7. Man setze die 0 im Geiste versuchsweise in das eine der in Frage kommenden beiden KÃ¤stchen. Ein schneller Blick mÃ¶ge uns zeigen, dass sowohl in der zugehÃ¶rigen Zeile wie auch in der zugehÃ¶rigen Spalte schon eine 0 vorkommt. Also bleibt fÃ¼r das betreffende KÃ¤stchen nur die 7 --- und fÃ¼r die 0 gibt es anschlieÃŸend nur noch eine einzige verbleibende MÃ¶glichkeit. VoilÃ&nbsp;!

Wenn es aber immer so einfach wÃ¤re, wÃ¤re das HexadokulÃ¶sen einfach wirklich zu einfach. Die Erfahrung zeigt, dass man auf mittlerer LÃ¶sungsstrecke meist mehr als nur eine einzige noch verbleibende MÃ¶glichkeit in Betracht ziehen muss. Und aus diesen MÃ¶glichkeitenkombinationen ist dann durch logische Ãœberlegung eine einzige RestmÃ¶glichkeit herauszufiltern. Das gilt fÃ¼r \emphb{eindeutig gegebene AufgabenlÃ¶sungen.} Was aber, wenn es mehr als nur eine LÃ¶sung gibt? Die Matrix in Abbildung \ref{modifizierteMatrix}, die sich aus der kanonischen Matrix durch Weglassen der letzten beiden Spalten ergibt, stellt eine durchaus zulÃ¤ssige Vorgabematrix dar, eine Vorgabematrix mit 224 aus 256 Elementebelegungen.  So etwas kÃ¶nnte man im Endstadium eines LÃ¶sungsprozesses vorfinden. Und der Rest wÃ¤re nach allem, was man hÃ¶rt, einfach.

\emphb{Wirklich einfach?} Es ist klar, dass es zwei mÃ¶gliche LÃ¶sungen gibt, die eine der beiden Spalten zuerst und dann die andere, oder umgekehrt. Im Beispiel aus Abbildung \ref{modifizierteMatrix} kann man den Rest erraten: Zeile fÃ¼r Zeile erst das kleinere Element, dann das grÃ¶ÃŸere, oder umgekehrt. Was aber, wenn man eine Ã¤hnlich bis auf zwei Spalten vollbesetzte Vorgabematrix nimmt, die nicht direkt aus der kanonischen Matrix stammt, sondern aus einer zuvor gehÃ¶rig durchgerÃ¼ttelten kanonischen Matrix? Man mÃ¼sste im schlimmsten Fall 2 hoch 16 Kombinationen durchprobieren, in jeder Zeile ein Elementepaar, so oder so herum. NatÃ¼rlich fÃ¤llt immer dann eine MÃ¶glichkeiten--Zweierpotenz weg, wenn man beim Durchprobieren in ein und derselben Spalte auf eine schon vorhandene Ziffer stÃ¶ÃŸt. Und ebenso natÃ¼rlich braucht man nacheinander jeweils nur immer ein Viererquadrat des betreffenden LÃ¤ngsstreifens zu betrachten. Aber das tut der Ãœberlegung (mit der sehr groÃŸen Zahl von KombinationsmÃ¶glichkeiten) keinen Abbruch. Und was, wenn man (zur Verwirrung des Betrachters) ganz am Anfang erst die letzten beiden Spalten der kanonischen Matrix lÃ¶scht (wie im Beispiel in Abbildung \ref{modifizierteMatrix}) und dann die Matrix unter Zuhilfenahme von Feststellung 1 bis 14 \emph{durchrÃ¼ttelt?} 


Das Wissen um die eventuell vorliegende LÃ¶sungseindeutigkeit (ob oder ob nicht) wÃ¤re (wie man hier sieht) auch aus praktischen GrÃ¼nden ein erstrebenswertes Ziel. (Es gibt nichts Praktischeres als eine gute Theorie!)


\begin{description}
\item[Aufgabe 1:] LÃ¶sungsexistenz (ZulÃ¤ssigkeit) vorausgesetzt, gebe man hinreichende oder/und notwendige Kriterien fÃ¼r die Eindeutigkeit der angestrebten LÃ¶sung an.

\item[Aufgabe 2:] Man lasse die gefundenen Kriterien in ein Forth--LÃ¶seprogramm einflieÃŸen.
\end{description}


\section{Forth--Programme}

Entwickelt habe ich das gesamte Programm in Turbo--Forth von Marc Petremann (16 Bit) unter DOS 6.2. Die LauffÃ¤higkeit getestet habe ich auÃŸerdem auch im Subroutine--Threaded--DPMI--Forth von Rick van Norman (32 Bit, ANS) und in ZF von Tom Zimmer (16 Bit). Das System von Rick van Norman ist ein volles ANS--System. Ich habe in meinem Programm darauf geachtet, dass keine nicht--ANS--konforme Bestandteile verwendet werden. Den fÃ¼r das System von Rick van Norman benÃ¶tigten DPMI--DOS--Extender erreicht man am besten, indem man mein Programm in der DOS--Umgebung von Windows aufruft. Auf LauffÃ¤higkeit getestet habe ich mein Programm in der genannten Umgebung unter Windows 3.11, Windows 95, Windows 98 und Windows ME. Ich habe darauf geachtet, keines derjenigen ANS--Forth--Worte zu verwenden, die in ZF oder Turbo--Forth nicht akzeptiert werden. Andererseits habe ich keine Worte aus ZF oder Turbo--Forth verwendet, die nicht in ANS enthalten sind. Zur Sicherheit habe ich einige Worte (Beispiele \Code{ON} und \Code{OFF}), auf die Gefahr hin, doppeltgemoppelt zu haben, noch einmal definiert.

Insbesondere habe ich mich bei der Ausgabe von \Code{MATRIX} auf den Bildschirm beschrÃ¤nkt. Die Ausgabe in eine Datei oder auf den Drucker wird der geneigte Leser (die geneigte Leserin) mit den Mitteln des von ihm (ihr) vorgezogenen Forth--Systems selbst ergÃ¤nzen. Entsprechendes gilt fÃ¼r die Eingaben (hier nur direkt Ã¼ber die Tastatur).

In Turbo--Forth und in dem Forth--System von Rick van Norman lÃ¤dt man mein Programm per \Code{include hexadoku.fth} ins (schon aufgerufene) Forth--System, in ZF per \Code{fload hexadoku.fth} . (NatÃ¼rlich muss dabei das Programm als DOS--Datei unter dem Namen \Code{hexadoku.fth} vorliegen (bei anderer Namensgebung entsprechend anders aufzurufen) und im gleichen Verzeichnis liegen wie das aufrufende Forth--System. Eine Unterscheidung zwischen GroÃŸ-- und Kleinschreibung ist in keinem der genannten drei Forth--Systeme nÃ¶tig.) Mein Programm lÃ¤uft bestens auch im jeweils abgesicherten Modus und auch, wenn (wie mir unbeabsichtigt passierte) nur der amerikanische Tastaturtreiber eingeschaltet ist (Forth ist sehr genÃ¼gsam!).

Von Anfang an wollte ich die LauffÃ¤higkeit des Programms \Code{hexadoku.fth} auch unter dem unterprogramm--gefÃ¤delten ANS--Forth--System \emphb{MinForth} von Andreas Kochenburger testen, das ganz normal schon unter DOS (bei mir 6.2) lÃ¤uft. Es gelang zunÃ¤chst nicht herauszufinden, wie \emphb{Include}--Dateien einzuladen sind. SchlieÃŸlich fÃ¼hrte mich ein genaueres Betrachten der von \Code{words} \key{ret} ausgegebenen Liste darauf, dass \Code{fload hexadoku.fth} \key{ret} das erledigt. \Code{fload} scheint kein ANS--Wort zu sein, jedenfalls wird es im bekannten ANS--Forth--Buch von Conklin und Rather nicht genannt. Aber auch schon im ANS--Forth--Dokument X3J14 dpANS--6 --- June 30, 1993 ist es nicht verzeichnet. Man lernt nie aus! Also: Mein Programm lÃ¤uft auch unter MinForth. 

MinForth akzeptiert zwar erwartungsgemÃ¤ÃŸ auch \Code{key}, liefert aber dabei fÃ¼r die Returntaste keinen RÃ¼ckgabewert (0Dh) auf dem Stack. Mit \Code{ekey} wÃ¤re es in MinForth gegangen, hÃ¤tte aber in Turbo--Forth und ZF gestÃ¶rt. Um das Programm im allerletzten Moment ohne Fehlergefahr abzuÃ¤ndern, habe ich mich damit beholfen, dass ich nicht nur die Returntaste fÃ¼r den Aussprung aus \Code{hexa} bereitstellte, sondern auch \key{q} und \key{Q}. Eine weitere Schwierigkeit bei MinForth ist die durch \Code{vorgabe} erzeugte Anzahl der vorgegebenen Elemente. Sie betrÃ¤gt bei MinForth zwischen 40 und 50. Das ist offenbar zu wenig. Statt 2000 mÃ¼sste wohl in \Code{hexa} eine geschickt gewÃ¤hlte andere Zahl verwendet werden. Ich Ã¼berlasse das dem/der Leser/in.

Das zeitraubende (time--consuming) PrÃ¼fprogramm \Code{mok?} lÃ¤sst sich in MinForth (auch in der DOS--Box von Windows ME) wirklich sehr viel Zeit. Am schnellsten (praktisch sofort) geht es im System von Rick van Norman (von mir getestet in der Vollbild--DOS--Box von Windows ME). 
\end{multicols}

\begin{quote}
\begin{small}
\listinginput[1]{1}{2006-02/Hexadoku-Fred.f}
\end{small}
\end{quote}

\end{document}
</pre></body></html>