//****************************************************************************** // ElizaApplet.java: Applet // //****************************************************************************** // Originally written with Microsoft Visual J++ version 1.1 // (which is based on the 1.0.2 version of JDK) // You can build the Applet with Eclipse Version: 3.2.1 // (at the moment my favority Java environment) // This Applet includes code found at http://smapp.gis.de (look for 'Eliza') // Applet-spezifisch import java.applet.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.net.*; import java.util.Vector; //============================================================================== // Hauptklasse für Applet ElizaApplet //============================================================================== public class ElizaApplet extends Applet { private static final long serialVersionUID = 1L; private TestFrame m_frame; // ElizaApplet Klassen-Konstruktor //-------------------------------------------------------------------------- public ElizaApplet() { requestFocus(); } // APPLET-INFO-UNTERSTÜTZUNG: // Die Methode getAppletInfo() gibt eine Zeichenfolge zurück, die Autor/Autorin, // Copyright-Datum oder verschiedene andere Informationen des Applets beschreibt //-------------------------------------------------------------------------- public String getAppletInfo() { return "Name: ElizaApplet\r\n" + "Autor: Walter Piechulla, 1999 - 2007\r\n"; } //Die Methode init() wird vom AWT aufgerufen, wenn ein Applet erstmals geladen oder //neu geladen wird. Überschreiben Sie diese Methode, um jede Initialisierung auszuführen, //die das Applet benötigt (z. B. die Initialisierung von Datenstrukturen, das Laden von Bildern oder //Schriftarten, das Erstellen von Rahmenfenstern, das Festlegen des Layout-Managers oder das Hinzufügen von //Komponenten der Benutzeroberfläche). //-------------------------------------------------------------------------- public void init() { m_frame = new TestFrame(this); Dimension d = new Dimension(650,373); // Das sind die Abmesungen des Hintergrund-jpg m_frame.setSize(d); m_frame.setVisible(true); m_frame.requestFocus(); } // Hier zusätzlichen Bereinigungscode für das Applet platzieren. destroy() wird aufgerufen, // wenn das Applet beendet und entladen wird //------------------------------------------------------------------------- public void destroy() { // ZU ERLEDIGEN: Platzieren Sie hier Bereinigungscode für das Applet } // ElizaApplet Zeichnungsbehandlungsroutine //-------------------------------------------------------------------------- public void paint(Graphics g) { g.drawString("Click here once to enable keyboard input for the applet window", 10, 20); g.drawString("Hier klicken um Tastatureingaben für das Applet-Fenster zu aktivieren", 10, 40); m_frame.requestFocus(); } //public boolean action(Event event,Object obj) //{ // return true; //} // Die Methode start() wird aufgerufen, wenn die Seite, die das Applet enthält, // erstmals auf dem Bildschirm erscheint. Die Startimplementierung des Applet-Assistenten // dieser Methode startet die Ausführung des Threads des Applets. //-------------------------------------------------------------------------- public void start() { m_frame.Tafelwischen(); // Starter-Eingabe m_frame.ELIZArunEngine("Hallo"); m_frame.requestFocus(); } // Die Methode stop() wird aufgerufen, wenn die Seite, die das Applet enthält, // nicht mehr auf dem Bildschirm angezeigt wird. Die Startimplementierung des Applet-Assistenten // dieser Methode beendet die Ausführung des Threads des Applets. //-------------------------------------------------------------------------- public void stop() { // Nothing to do } } //class TestFrame extends Frame class TestFrame extends Frame implements KeyListener { private static final long serialVersionUID = 1L; private Applet m_appletParent; private Vector m_vKeys; // gedrückte Tasten im Vektor-Objekt aufzeichnen private Dimension m_dimLoc; // Position des aktuellen Zeichens private FontMetrics m_fm; // Schriftmaße des Applet-Fensters private Image elizaImage; // Hintergrundgrafik public String m_lastUserSentence; // letzter Satz vom Benutzer private int m_consumedOutputLines; // vollgeschriebene Zeilen in der Pane private Knowledge m_knowledge; // einzige Instanz der Wissensbasis im Programm private Font m_workFont; // geigneter (gut lesbarer Font) TestFrame(Applet appletParent) { super("Gespräch mit Eliza - Type \"Ciao\" to close applet window"); setResizable(false); // würde wegen der Hintergrundgrafik blöd aussehen setLayout(new FlowLayout()); elizaImage = appletParent.getImage(appletParent.getDocumentBase(),"eliza.jpg"); m_appletParent = appletParent; // Vektor für 100 Tastenobjekte anlegen, der um jeweils 100 Objekte wächst. // Das ist schneller als die Standardeinstellung. m_vKeys = new Vector(100,100); m_dimLoc = new Dimension(25,40); // ein Dimension-Objekt (Achtung: Y nicht zu klein !) m_knowledge = new Knowledge(); m_lastUserSentence = new String("Hallo"); // der initiale Auslöser m_workFont = new Font("Verdana",Font.PLAIN,12); setFont(m_workFont); // Schriftmaße können hier noch nicht ermittelt werden ELIZAreadScript(); requestFocus(); addKeyListener(this); } // Schließen mit X-Button oder Systemmenü; maximieren sperren public boolean handleEvent(Event evt) { if (evt.id == Event.WINDOW_DESTROY) { dispose(); return true; } return super.handleEvent(evt); } public void Tafelwischen() { m_vKeys.removeAllElements(); m_dimLoc.width = 10; // zurücksetzen m_dimLoc.height = 40; // zurücksetzen repaint(); m_consumedOutputLines = 0; } public void keyPressed( KeyEvent e ) { // do nothing } public void keyReleased( KeyEvent e ) { // do nothing } public void keyTyped(KeyEvent e) { char c = e.getKeyChar(); if (c == 10) // Return { ELIZArunEngine(null); m_dimLoc.width = 28; // Zurücksetzen } else { if (Character.isDefined(c)) { char[] newKey = new char[1]; newKey[0] = c; m_lastUserSentence = m_lastUserSentence.concat(new String(newKey)); m_vKeys.addElement(new inputKey(c, m_dimLoc)); // Zeichen an der aktuellen Position hinzufügen // kleinstmöglichen Bereich aktualisieren (nur das Rechteck mit dem Zeichen) int nL, nR, nT, nB; nL = m_dimLoc.width; nR = m_fm.charWidth(c); nB = m_dimLoc.height; nT = m_fm.getHeight(); repaint(nL,nT,nR,nB); // durch Addition der Breite des aktuellen Zeichens die Position für das nächste Zeichen // aktualisieren (die einzelnen Zeichen sind unterschiedlich breit) m_dimLoc.width += m_fm.charWidth(c); e.consume(); } } } public void paint(Graphics g) { g.drawImage(elizaImage,0,0,650,373,this); m_fm = getFontMetrics(getFont()); // Schleife über alle gespeicherten Key-Objekte int nSize = m_vKeys.size(); for(int i = 0;i < nSize;i++) { inputKey key = (inputKey)m_vKeys.elementAt(i); // Taste ermitteln Dimension dimLoc = key.GetLoc(); // Zeichen und seine Position ermitteln char[] cKey = key.GetKey(); // Zeichen an der entsprechenden Position ausgeben g.drawChars(cKey, 0, 1, dimLoc.width, dimLoc.height); } // Terminieren wegen Verabschiedung ? if (finished == true) { delay(3000); dispose(); } } public void elizaSpeaks(String str) { if (str != ">>") { if (MoreThan16LinesWouldBeConsumed(str)) // Genau vom Ende der Seite zu einer neuen { Tafelwischen(); } } m_consumedOutputLines++; // bei jedem Aufruf wird mindestens 1 Zeile verbraten // Line feed und Carriage Return m_fm = getFontMetrics(getFont()); m_dimLoc.height += m_fm.getHeight(); m_dimLoc.width = 10; // Zurücksetzen // Jeden Buchstaben einzeln einfügen int strLen = str.length(); for(int i=0; i < strLen;i++) { char nlTest = str.charAt(i); if (nlTest != '§') // normal auszugebende Zeichen { int nKey = (int)str.charAt(i); m_vKeys.addElement(new inputKey(nKey,m_dimLoc)); // Zeichen an der aktuellen Position hinzufügen // kleinstmöglichen Bereich aktualisieren (nur das Rechteck mit dem Zeichen) int nL, nR, nT, nB; nL = m_dimLoc.width; nR = m_fm.charWidth(nKey); nB = m_dimLoc.height; nT = m_fm.getHeight(); repaint(nL,nT,nR,nB); // durch Addition der Breite des aktuellen Zeichens die Position für das nächste Zeichen // aktualisieren (dei einzelnen Zeichen sind unterschiedlich breit) m_dimLoc.width += m_fm.charWidth(nKey); } else // Zeilenumbruch { m_consumedOutputLines++; m_dimLoc.width = 10; m_dimLoc.height += m_fm.getHeight(); } } } boolean MoreThan16LinesWouldBeConsumed(String str) { int lineFeedsInString = 0; for(int i=0; i < str.length();i++) { char test = str.charAt(i); if (test == '§') { lineFeedsInString++; } } if ((m_consumedOutputLines + lineFeedsInString) > 16) { return true; } else { return false; } } // Hier beginnt der Eliza-Code KeyList keys = new KeyList(); SynList syns = new SynList(); PrePostList pre = new PrePostList(); PrePostList post = new PrePostList(); String initial = "Hello."; String finl = "Goodbye."; WordList quit = new WordList(); boolean m_bootstrap = true; // Hilfsvariable KeyStack keyStack = new KeyStack(); Memory mem = new Memory(); DecompList lastDecomp; ReasembList lastReasemb; boolean finished = false; static final int success = 0; static final int failure = 1; static final int gotoRule = 2; public void ELIZAcollect(String s) { String lines[] = new String[4]; if (EString.match(s, "*reasmb: *", lines)) { if (lastReasemb == null) { elizaSpeaks("Error: no last reasemb"); return; } lastReasemb.add(lines[1]); } else if (EString.match(s, "*decomp: *", lines)) { if (lastDecomp == null) { elizaSpeaks("Error: no last decomp"); return; } lastReasemb = new ReasembList(); String temp = new String(lines[1]); if (EString.match(temp, "$ *", lines)) { lastDecomp.add(lines[0], true, lastReasemb); } else { lastDecomp.add(temp, false, lastReasemb); } } else if (EString.match(s, "*key: * #*", lines)) { lastDecomp = new DecompList(); lastReasemb = null; int n = 0; if (lines[2].length() != 0) { try { n = Integer.parseInt(lines[2]); } catch (NumberFormatException e) { elizaSpeaks("Number is wrong in key: " + lines[2]); } } keys.add(lines[1], n, lastDecomp); } else if (EString.match(s, "*key: *", lines)) { lastDecomp = new DecompList(); lastReasemb = null; keys.add(lines[1], 0, lastDecomp); } else if (EString.match(s, "*synon: * *", lines)) { WordList words = new WordList(); words.add(lines[1]); s = lines[2]; while (EString.match(s, "* *", lines)) { words.add(lines[0]); s = lines[1]; } words.add(s); syns.add(words); } else if (EString.match(s, "*pre: * *", lines)) { pre.add(lines[1], lines[2]); } else if (EString.match(s, "*post: * *", lines)) { post.add(lines[1], lines[2]); } else if (EString.match(s, "*initial: *", lines)) { initial = lines[1]; } else if (EString.match(s, "*final: *", lines)) { finl = lines[1]; } else if (EString.match(s, "*quit: *", lines)) { quit.add(" " + lines[1]+ " "); } else { elizaSpeaks("Unrecognized input: " + s); } } public String ELIZAprocessInput(String s) { String reply; s = EString.translate(s, "abcdefghijklmnopqrstuvwxyzäöü", "ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ"); s = EString.translate(s, "@#$%^&*()_-+=~`{[}]|:;<>\\\""," " ); s = EString.translate(s, ",?!", "..."); s = EString.compress(s); String lines[] = new String[2]; while (EString.match(s, "*.*", lines)) { reply = ELIZAsentence(lines[0]); if (reply != null) { return reply; } s = EString.trim(lines[1]); } if (s.length() != 0) { reply = ELIZAsentence(s); if (reply != null) { return reply; } } String m = mem.get(); if (m != null) { return m; } Key key = keys.getKey("xnone"); if (key != null) { Key dummy = null; reply = ELIZAdecompose(key, s, dummy); if (reply != null) { return reply; } } return "Ich bin sprachlos."; } String ELIZAsentence(String s) { s = pre.translate(s); s = EString.pad(s); if (quit.find(s)) { finished = true; return finl; } keys.buildKeyStack(keyStack, s); for (int i = 0; i < keyStack.keyTop(); i++) { Key gotoKey = new Key(); String reply = ELIZAdecompose(keyStack.key(i), s, gotoKey); if (reply != null) { return reply; } // If decomposition returned gotoKey, try it while (gotoKey.key() != null) { reply = ELIZAdecompose(gotoKey, s, gotoKey); if (reply != null) { return reply; } } } return null; } String ELIZAdecompose(Key key, String s, Key gotoKey) { String reply[] = new String[10]; for (int i = 0; i < key.decomp().size(); i++) { Decomp d = (Decomp)key.decomp().elementAt(i); String pat = d.pattern(); if (syns.matchDecomp(s, pat, reply)) { String rep = ELIZAassemble(d, reply, gotoKey); if (rep != null) { return rep; } if (gotoKey.key() != null) { return null; } } } return null; } String ELIZAassemble(Decomp d, String reply[], Key gotoKey) { String lines[] = new String[3]; d.stepRule(); String rule = d.nextRule(); if (EString.match(rule, "goto *", lines)) { // goto rule -- set gotoKey and return false. gotoKey.copy(keys.getKey(lines[0])); if (gotoKey.key() != null) { return null; } elizaSpeaks("Goto rule did not match key: " + lines[0]); return null; } String work = ""; while (EString.match(rule, "* (#)*", lines)) { // reassembly rule with number substitution rule = lines[2]; // there might be more int n = 0; try { n = Integer.parseInt(lines[1]) - 1; } catch (NumberFormatException e) { elizaSpeaks("Number is wrong in reassembly rule " + lines[1]); } if (n < 0 || n >= reply.length) { // Fehler ! ("Substitution number is bad " + lines[1]); return null; } reply[n] = post.translate(reply[n]); work += lines[0] + " " + reply[n]; } work += rule; if (d.mem()) { mem.save(work); return null; } return work; } int ELIZAreadScript() { // ursprünglich war das Skript eine Datei. Das gibt aber nur Ärger mit dem // SecurityManager. Eleganter ist es, das Skript einfach ins Programm aufzunehmen. int rulesIndex = 0; while (true) { String s = m_knowledge.m_RulesTable[rulesIndex]; if (s == null) { break; } rulesIndex++; ELIZAcollect(s); } return 0; } void ELIZArunEngine(String str) { if (str != null) { m_lastUserSentence = str; } String reply = ELIZAprocessInput(m_lastUserSentence); m_lastUserSentence = ""; String url = GetURL2ShowIfAny(reply); elizaSpeaks(reply); if (!finished) { elizaSpeaks(">>"); // Nur, wenn reply nicht die Verabschiedung ist } if (url != null) { try { URL theURL = new URL(url); m_appletParent.getAppletContext().showDocument(theURL,"_blank"); } catch (MalformedURLException e) { elizaSpeaks("IGITT, SCHLECHTE URL (SORRY, MEIN FEHLER): §" +url); } } // Variable finished ist true, wenn eine Verabschiedungsformel entdeckt // wurde, hide() und dispose() erst nach repaint durchführen! } // Der substring muß am Ende von argStr stehen String GetURL2ShowIfAny(String argStr) { int iSubStrStart = argStr.lastIndexOf("http"); if (iSubStrStart != -1) { String result = argStr.substring(iSubStrStart); return result; } return null; // nix zu zeigen } void delay(long numMillis) { long start = System.currentTimeMillis(); long now = System.currentTimeMillis(); while ((now - start) < numMillis) { now = System.currentTimeMillis(); } } } // Hilfsklasse, die zum Aufzeichnen der Tastenanschläge dient class inputKey { private char[] m_cKey; private Dimension m_dimLoc; public inputKey(int nKey, Dimension dimLoc) { // das Zeichen in einem Array der Länge 1 speichern, das ist praktischer, // weil die in paint aufgerufenen methode drawChars als Parameter ein Array erwartet m_cKey = new char[1]; m_cKey[0] = (char)nKey; // eine Kopie des Dimension-Objekts erzeugen m_dimLoc = new Dimension(dimLoc); } Dimension GetLoc() { return m_dimLoc; } char[] GetKey() { return m_cKey; } } // Hier beginnt der eigentliche ELIZA-Code class Decomp { String pattern; boolean mem; ReasembList reasemb; int currReasmb; Decomp(String pattern,boolean mem,ReasembList reasemb) { this.pattern = pattern; this.mem = mem; this.reasemb = reasemb; this.currReasmb = 100; } public String pattern() { return pattern; } public boolean mem() { return mem; } public String nextRule() { if (reasemb.size() == 0) { // Fehler("No reassembly rule."); return null; } return (String)reasemb.elementAt(currReasmb); } public void stepRule() { int size = reasemb.size(); if (mem) { currReasmb = (int)(Math.random() * size); } currReasmb++; if (currReasmb >= size) { currReasmb = 0; } } } class DecompList extends Vector { public void add(String word,boolean mem,ReasembList reasmb) { addElement(new Decomp(word,mem,reasmb)); } } class EString { static final String num = "0123456789"; public static int amatch(String str,String pat) { int count = 0; int i = 0; // march through str int j = 0; // march through pat while (i < str.length() && j < pat.length()) { char p = pat.charAt(j); if (p == '*' || p == '#') return count; if (str.charAt(i) != p) return -1; i++; j++; count++; } return count; } public static int findPat(String str,String pat) { int count = 0; for(int i=0;i < str.length();i++) { if (amatch(str.substring(i),pat) >= 0) { return count; } count++; } return -1; } public static int findNum(String str) { int count = 0; for(int i=0;i < str.length();i++) { if (num.indexOf(str.charAt(i)) == -1) { return count; } count++; } return count; } static boolean matchA(String str,String pat,String matches[]) { int i = 0; // move through str int j = 0; // move through matches int pos = 0; // move through pat while (pos < pat.length() && j < matches.length) { char p = pat.charAt(pos); if (p == '*') { int n; if (pos+1 == pat.length()) { // * is the last thing in pat // n is remaining string length n = str.length() - i; } else { // * is not last in pat // find using remaining pat n = findPat(str.substring(i), pat.substring(pos+1)); } if (n < 0) { return false; } matches[j++] = str.substring(i, i+n); i += n; pos++; } else if (p == '#') { int n = findNum(str.substring(i)); matches[j++] = str.substring(i,i+n); i += n; pos++; } else { int n = amatch(str.substring(i), pat.substring(pos)); if (n <= 0) { return false; } i += n; pos += n; } } if (i >= str.length() && pos >= pat.length()) { return true; } return false; } public static boolean match(String str,String pat,String matches[]) { return matchA(str, pat, matches); } public static String translate(String str,String src,String dest) { if (src.length() != dest.length()) { // impossible error } for(int i=0;i < src.length();i++) { str = str.replace(src.charAt(i), dest.charAt(i)); } return str; } public static String compress(String s) { String dest = ""; if (s.length() == 0) { return s; } char c = s.charAt(0); for(int i=1;i < s.length();i++) { if (c == ' ' && ((s.charAt(i) == ' ') || (s.charAt(i) == ',') || (s.charAt(i) == '.'))) { // nothing } else if (c != ' ' && s.charAt(i) == '?') { dest += c + " "; } else { dest += c; } c = s.charAt(i); } dest += c; return dest; } public static String trim(String s) { for (int i=0;i < s.length();i++) { if (s.charAt(i) != ' ') { return s.substring(i); } } return ""; } public static String pad(String s) { if (s.length() == 0) return " "; char first = s.charAt(0); char last = s.charAt(s.length()-1); if (first == ' ' && last == ' ') return s; if (first == ' ' && last != ' ') return s + " "; if (first != ' ' && last == ' ') return " " + s; if (first != ' ' && last != ' ') return " " + s + " "; // impossible return s; } public static int count(String s, char c) { int count = 0; for (int i=0;i < s.length();i++) { if (s.charAt(i) == c) { count++; } } return count; } } class Key { String key; int rank; DecompList decomp; Key(String key,int rank,DecompList decomp) { this.key = key; this.rank = rank; this.decomp = decomp; } Key() { key = null; rank = 0; decomp = null; } public void copy(Key k) { key = k.key(); rank = k.rank(); decomp = k.decomp(); } public String key() { return key; } public int rank() { return rank; } public DecompList decomp() { return decomp; } } class KeyList extends Vector { public void add(String key,int rank,DecompList decomp) { addElement(new Key(key,rank,decomp)); } Key getKey(String s) { for(int i=0;i < size();i++) { Key key = (Key)elementAt(i); if (s.equals(key.key())) { return key; } } return null; } public void buildKeyStack(KeyStack stack,String s) { stack.reset(); s = EString.trim(s); String lines[] = new String[2]; Key k; while (EString.match(s, "* *", lines)) { k = getKey(lines[0]); if (k != null) { stack.pushKey(k); } s = lines[1]; } k = getKey(s); if (k != null) { stack.pushKey(k); } } } class KeyStack { final int stackSize = 20; Key keyStack[] = new Key[stackSize]; int keyTop = 0; public int keyTop() { return keyTop; } public void reset() { keyTop = 0; } public Key key(int n) { if (n < 0 || n >= keyTop) { return null; } return keyStack[n]; } public void pushKey(Key key) { if (key == null) { //Fehler("push null key"); return; } int i; for(i=keyTop;i > 0;i--) { if (key.rank > keyStack[i-1].rank) { keyStack[i] = keyStack[i-1]; } else { break; } } keyStack[i] = key; keyTop++; } } class Memory { final int memMax = 20; String memory[] = new String[memMax]; int memTop = 0; public void save(String str) { if (memTop < memMax) { memory[memTop++] = new String(str); } } public String get() { if (memTop == 0) { return null; } String m = memory[0]; for(int i=0;i < memTop-1;i++) { memory[i] = memory[i+1]; } memTop--; return m; } } class PrePost { String src; String dest; PrePost(String src,String dest) { this.src = src; this.dest = dest; } public String src() { return src; } public String dest() { return dest; } } class PrePostList extends Vector { public void add(String src,String dest) { addElement(new PrePost(src,dest)); } String xlate(String str) { for(int i=0;i < size();i++) { PrePost p = (PrePost)elementAt(i); if (str.equals(p.src())) { return p.dest(); } } return str; } public String translate(String s) { String lines[] = new String[2]; String work = EString.trim(s); s = ""; while (EString.match(work, "* *", lines)) { s += xlate(lines[0]) + " "; work = EString.trim(lines[1]); } s += xlate(work); return s; } } class ReasembList extends Vector { private static final long serialVersionUID = 1L; public void add(String reasmb) { addElement(reasmb); } } class SynList extends Vector { private static final long serialVersionUID = 1L; public void add(WordList words) { addElement(words); } public WordList find(String s) { for(int i=0;i < size();i++) { WordList w = (WordList)elementAt(i); if (w.find(s)) { return w; } } return null; } boolean matchDecomp(String str,String pat,String lines[]) { if (!EString.match(pat,"*@* *",lines)) { return EString.match(str,pat,lines); } String first = lines[0]; String synWord = lines[1]; String theRest = " " + lines[2]; WordList syn = find(synWord); if (syn == null) { //Fehler("Could not fnd syn list for " + synWord); return false; } for(int i=0;i < syn.size();i++) { pat = first + (String)syn.elementAt(i) + theRest; if (EString.match(str,pat,lines)) { int n = EString.count(first, '*'); for(int j=lines.length-2; j >= n; j--) { lines[j+1] = lines[j]; } lines[n] = (String)syn.elementAt(i); return true; } } return false; } } class WordList extends Vector { public void add(String word) { addElement(word); } boolean find(String s) { for(int i=0;i < size();i++) { if (s.equals((String)elementAt(i))) { return true; } } return false; } } class Knowledge { public final String m_RulesTable[] = // Regelbasis (das Skript) { "initial: WOMIT KANN ICH DIENEN ?", "final: CIAO, ICH GEHE DANN JETZT ...", "quit: CIAO", "quit: SERVUS", "quit: ENDE", "quit: TSCHÜSS", "quit: WIEDERSEHEN", "pre: ERINNERST ERINNERE", "pre: TRÄUMTE GETRÄUMT", "pre: TRÄUME TRAUM", "pre: MÖGLICH VIELLEICHT", "pre: WENN WAS", "pre: MASCHINE COMPUTER", "pre: WAREN WAR", "pre: GLEICH WIE", "post: BIN BIST", "post: DEIN MEIN", "post: ICH DU", "post: DU ICH", "post: MEIN DEIN", "post: SELBER ICH", "post: DIR MIR", "post: MIR DIR", "post: ICH BIN DU BIST", "post: REDEST REDE", "post: SAGTE SAGTEST", "post: SOLL SOLLST", "post: SOLLST SOLL", "post: HABE HAST", "post: HAST HABE", "post: GLAUBE GLAUBST", "post: GLAUBST GLAUBE", "post: SOLLTE SOLLTEST", "post: SOLLTEST SOLLTE", "post: MAGST MAG", "post: STUDIERE STUDIERST", "post: MUß MUSST", "post: VERSTEHST VERSTEHE", "post: VERSTEHE VERSTEHST", "post: LIEBE LIEBEN", "post: LIEBST LIEBE", "post: HASSE HASSEN", "post: HASST HASSE", "post: MAG MÖGEN", "post: BEGEHRE BEGEHREN", "post: DURCHSCHAUE DURCHSCHAUEN", "post: DURCHSCHAUST DURCHSCHAUE", "post: NERVST NERVE", "post: BETRÜGST BETRÜGE", "post: KANN KANNST", "post: BELÜGST BELÜGE", "post: BELUSTIGST BELUSTIGE", "post: LANGWEILST LANGWEILE", "post: IMITIERST IMITIERE", "post: HASST HASSE", "post: HAßT HASSE", "post: HAST HABE", "post: NARRST NARRE", "post: FASZINIERST FASZINIERE", "post: MIßVERSTEHST MISSVERSTEHE", "post: KANNST KANN", "post: ERSUCHE ERSUCHEN", "post: BITTE BITTEN", "post: LACHE LACHEN", "post: TUE TUST", "post: KOMME KOMMST", "post: BEZWEIFLE BEZWEIFELST", "post: KENNE KENNST", "post: DEINE MEINE", "synon: GLAUBE GEFÜHL GEDANKE MEINUNG WUNSCH", "synon: FAMILIE MUTTER MAMA SCHWESTER BRUDER FRAU KINDER", "synon: VATER VATI BRUDER KIND", "synon: WILL VERLANGE WUNSCH BEDÜRFNIS", "synon: TRAURIG UNGLÜCKLICH DEPRIMIERT SCHLECHT NIEDERGESCHLAGEN SAUER GELANGWEILT", "synon: GLÜCKLICH SUPER ERLEICHTERT FROH BESSER", "synon: KANN NICHT UNMÖGLICH", "synon: JEDER JEDE KEINER NIEMAND", "synon: SEIN BIST IST SIND WAREN WAR", "key: xnone", "decomp: *", "reasmb: ICH BIN MIR NICHT SICHER, OB ICH DICH GANZ RICHTIG VERSTEHE.", "reasmb: ERZÄHL MIR BITTE MEHR DARÜBER !", "reasmb: WAS BEDEUTET DAS FÜR DICH ?", "reasmb: HM ?", "reasmb: INTERESSIERST DU DICH SEHR FÜR SOLCHE DINGE ?", "reasmb: ICH WEISS NICHT GENAU, WAS DU DAMIT MEINST.", "reasmb: UNSER GESPRÄCH FLACHT ETWAS AB, FÜRCHTE ICH.", "reasmb: WIR ERGEHEN UNS IN BELANGLOSIGKEITEN.", "reasmb: GEFICKT EINGESCHÄDELT !", "reasmb: WOHER KOMMST DU ?", "key: LEID", "decomp: *", "reasmb: BITTE ENTSCHULDIGE DICH NICHT.", "reasmb: ENTSCHULDIGUNGEN SIND NICHT NÖTIG.", "reasmb: ICH SAGTE DIR BEREITS, DASS DU DICH NICHT ZU ENTSCHULDIGEN BRAUCHST.", "key: ENTSCHULDIGUNG", "decomp: *", "reasmb: goto LEID", "key: ERINNERE 5", "decomp: * ICH ERINNERE *", "reasmb: DENKST DU OFT AN (2) ?", "reasmb: AN WAS DENKST DU SONST NOCH, WENN DU DICH AN (2) ERINNERST ?", "reasmb: WAS FÄLLT DIR SONST NOCH EIN ?", "reasmb: WARUM DENKST DU GERADE JETZT AN (2) ?", "reasmb: WAS ERINNERT DICH HIER UND JETZT AN (2) ?", "reasmb: WAS HAT (2) MIT MIR ZU TUN ?", "decomp: * ERINNERST DU DICH *", "reasmb: DACHTEST DU, ICH VERGESSE (2) ?", "reasmb: WARUM DENKST DU, SOLLTE ICH MICH AN (2) ERINNERN ?", "reasmb: WAS HAT ES MIT (2) AUF SICH ?", "reasmb: goto WAS", "reasmb: DU HAST (2) ERWÄHNT ?", "key: WENN 3", "decomp: * WENN *", "reasmb: HÄLTST DU ES FÜR WAHRSCHEINLICH, DASS (2) ?", "reasmb: WÜNSCHST DU DIR DASS (2) ?", "reasmb: WAS WEISST DU ÜBER (2) ?", "reasmb: WIRKLICH, WENN (2) ?", "key: GETRÄUMT 4", "decomp: * ICH HABE GETRÄUMT *", "reasmb: WIRKLICH, (2) ?", "reasmb: HAST DU JEMALS IM WACHZUSTAND PHANTASIEN ÜBER (2) GEHABT ?", "reasmb: HAST DU SCHON MAL VON (2) GETRÄUMT ?", "reasmb: goto TRAUM", "key: TRAUM 3", "decomp: *", "reasmb: WAS BEDEUTET DIESER TRAUM FÜR DICH ?", "reasmb: TRÄUMST DU OFT ?", "reasmb: WELCHE PERSON KOMMT IN DEINEM TRAUM VOR ?", "reasmb: DENKST DU, DASS TRÄUME ETWAS MIT DEINEN PROBLEMEN ZU TUN HABEN ?", "key: VIELLEICHT", "decomp: *", "reasmb: GAR MANCHER SCHWIERIGKEIT ENTWEICHT §MAN DURCH DAS HÜBSCHE WORT \"VIELLEICHT\".", "reasmb: DU SCHEINST DIR NICHT SEHR SICHER ZU SEIN.", "reasmb: WARUM DER UNSICHERE TON ?", "reasmb: KÖNNTEST DU ES DIR NICHT GENAUER ÜBERLEGEN ?", "reasmb: DI BIST NICHT SICHER ?", "reasmb: WEISST DU'S NICHT ?", "key: NAME 15", "decomp: *", "reasmb: NAMEN INTERESSIEREN MICH NICHT.", "reasmb: ICH SAGTE DIR SCHON, NAMEN DEBEUTEN MIR NICHTS - ERZÄHLE BITTE WEITER:", "key: ENGLISH", "decomp: *", "reasmb: goto xforeign", "reasmb: ICH SAGTE DIR SCHON, ICH VERSTEHE KEIN ENGLISCH.", "key: FRANCAIS", "decomp: *", "reasmb: goto xforeign", "reasmb: ICH SAGTE DIR SCHON, ICH VERSTEHE KEIN FRANZÖSISCH.", "key: ITALIANO", "decomp: *", "reasmb: goto xforeign", "reasmb: ICH SAGTE DIR SCHON, ICH VERSTEHE KEIN ITALIENISCH.", "key: ESPANOL", "decomp: *", "reasmb: goto xforeign", "reasmb: ICH SAGTE DIR SCHON, ICH VERSTEHE KEIN SPANISCH.", "key: xforeign", "decomp: *", "reasmb: TUT MIR LEID, ICH KANN NUR DEUTSCH.", "key: REGENSBURG", "decomp: *", "reasmb: JA, DAS KENNE ICH. REGENSBURG IST EINE SCHÖNE STADT.", "reasmb: ICH KOMME AUCH AUS REGENSBURG.", "reasmb: BESONDERS DIE SCHÖNEN BIERGÄRTEN IM SOMMER SIND SUPER !", "key: PSYCHOLOGIE 100", "decomp: *", "reasmb: DIE WISSENSCHAFT VOM VERHALTEN VON MENSCHEN UND ANDEREN TIEREN.", "reasmb: WIE KOMMT MAN ALS PSYCHOLOGE ZU GELD ? HEIRATE EINE LEHRAMTSSTUDENTIN !", "key: nixmehr", "decomp: *", "reasmb: TJA, MEHR GIBT ES DAZU EIGENTLICH NICHT ZU SAGEN.", "key: wiederholung", "decomp: *", "reasmb: DU WIEDERHOLST DICH.", "key: MENSA 110", "decomp: *", "reasmb: ALLES, WAS SPASS MACHT, IST VERBOTEN ODER UNMORALISCH §ODER ES MACHT FETT.", "key: OPAC 110", "decomp: *", "reasmb: OPAC IST EIN WEGEN SEINER HÄSSLICHKEIT BERÜHMTES BIBLIOTHEKSAUSKUNFTSSYSTEM VON SIEMENS. §DA KOMMT NOCH ECHTES GROSSRECHNER-FEELING AUF. DU WIRST ES LIEBEN LERNEN !", "key: PSYCHLIT 110", "decomp: *", "reasmb: PSYCHLIT IST DAS LITERATUR-RETRIEVALSYSTEM DER APA. §ES IST WEITGEHEND SELBSTERKLÄREND. §ABER EIN BISCHEN EINGEWÖHNEN MUSS MAN SICH HALT !", "key: APA 110", "decomp: *", "reasmb: APA BEDEUTET AMERICAN PSYCHOLOGISTS ASSOCIATION. §DER GRÖSSTE PSYCHOLOGEN-BERUFSVERBAND IM BEKANNTEN UNIVERSUM.", "key: BDP 110", "decomp: *", "reasmb: BDP BEDEUTET BERUFSVERBAND DEUTSCHER PSYCHOLOGEN. §DAS DEUTSCHE ÄQUIVALENT ZUR APA.", "key: DGPS 110", "decomp: *", "reasmb: DGPS BEDEUTET DEUTSCHE GESELLSCHAFT FÜR PSYCHOLOGIE UND IST §SOWAS WIE DER BDP FÜR EIERKÖPFE (UNI-ANGESTELLTE, BEAMTE). §DER BDP VERTRITT HAUPTSÄCHLICH DIE INTERESSEN FREIBERUFLICHER PSYCHOLOGEN.", "key: FRÜH 110", "decomp: *", "reasmb: MORGENSTUND HAT BLEI IM ARSCH !", "key: ZIEL 50", "decomp: *", "reasmb: DER WEG IST DAS ZIEL.", "reasmb: goto wiederholung", "key: RICHTIG 50", "decomp: *", "reasmb: MAN KANN ALLES RICHTIG MACHEN UND DOCH DAS WICHTIGSTE VERGESSEN.", "reasmb: goto wiederholung", "key: GRUNDSÄTZLICH 50", "decomp: *", "reasmb: DER WEISE HAT KEINE UNUMSTÖSSLICHEN GRUNDSÄTZE. ER PASST SICH ANDEREN AN. §(LAOTSE)", "reasmb: goto wiederholung", "key: THEORIE 50", "decomp: *", "reasmb: ES GIBT NICHTS PRAKTISCHERES ALS EINE GUTE THEORIE. §(KANT)", "reasmb: goto wiederholung", "key: FÜRCHTE 50", "decomp: *", "reasmb: WAS MAN ZU VERSTEHEN GELERNT HAT, FÜRCHTET MAN NICHT MEHR. §(MARIE CURIE)", "reasmb: goto wiederholung", "key: LEICHT 50", "decomp: *", "reasmb: ICH LAS KRIEG UND FRIEDEN IN ZEHN MINUTEN - ES HANDELT VON RUSSLAND. §(WOODY ALLEN)", "reasmb: BEI FAST ALLEN DINGEN KOMMT MAN LEICHT REIN UND NUR SCHWER WIEDER RAUS.", "reasmb: goto wiederholung", "key: EINFACH 50", "decomp: *", "reasmb: NICHTS IST KOMPLIZIERTER ALS SACHEN ZU VEREINFACHEN", "reasmb: goto wiederholung", "key: KOMPLIZIERT 50", "decomp: *", "reasmb: NICHTS IST EINFACHER ALS SACHEN ZU VERKOMPLIZIEREN", "reasmb: goto wiederholung", "key: FEHLER 50", "decomp: *", "reasmb: EIN FEHLER, DEN ALLE BEGEHEN, WIRD SCHLIESSLICH ALS REGEL ANERKANNT", "reasmb: goto wiederholung", "key: LEBEN 50", "decomp: *", "reasmb: UNSER LEBEN IST DAS, WAS UNSERE GEDANKEN AUS IHM MACHEN. §(MARC AUREL)", "reasmb: DER MENSCH DENKT, GOTT LINKT. (PROGRAMMIERERSPRUCH)", "reasmb: DAS LEBEN IST EIN SCHEISS-SPIEL, ABER DIE GRAFIK IST SUPER. §(PROGRAMMIERERSPRUCH)", "reasmb: goto wiederholung", "key: PERFEKT 50", "decomp: *", "reasmb: NO PERFECTION IS SO ABSOLUTE, THAT SOME IMPURITY DOES NOT POLLUTE. §(SHAKESPEARE)", "reasmb: goto wiederholung", "key: WORTE 50", "decomp: *", "reasmb: EIN BILD SAGT MEHR ALS TAUSEND WORTE. §(CHINESISCHE WEISHEIT)", "reasmb: goto wiederholung", "key: PRIMITIV 50", "decomp: *", "reasmb: FÜGE KLEINES ZU KLEINEM - UND GROSSES WIRD DARAUS ENTSTEHEN §(OVID)", "reasmb: goto wiederholung", "key: VERWALTUNG 50", "decomp: *", "reasmb: WO PEDANTERIE UND EINFALT ZUSAMMENTREFFEN ENTSTEHT VERWALTUNG", "reasmb: goto wiederholung", "key: WISSEN 50", "decomp: *", "reasmb: WIE GOLD, DAS MAN NICHT HERGEBEN KANN, §NIEMANDEN REICH MACHT, SO WIRD WISSEN, DAS MAN NICHT ANWENDEN KANN, §NIEMANDEN WEISE MACHEN. §(SAMUEL JOHNSON)", "reasmb: WISSEN IST MACHT. §(FRANCIS BACON)", "reasmb: DAS ENDERGEBNIS IST: WIR WISSEN SEHR WENIG, UND DOCH IST ES ERSTAUNLICH, §DASS WIR ÜBERHAUPT ETWAS WISSEN, UND NOCH ERSTAUNLICHER IST, §DASS SO WENIG WISSEN UNS SO VIEL MACHT GEBEN KANN. §(BERTRAND RUSSELL)", "reasmb: goto wiederholung", "key: PROGRAMMIEREN 50", "decomp: *", "reasmb: EIN COMPUTERPROGRAMM TUT, WAS DU SCHREIBST, NICHT WAS DU WILLST", "reasmb: goto wiederholung", "key: KLEINIGKEIT 50", "decomp: *", "reasmb: KLEINIGKEITEN BEWIRKEN PERFEKTION UND PERFEKTION IST KEINE KLEINIGKEIT §(MICHELANGELO)", "reasmb: goto wiederholung", "key: SPAß 50", "decomp: *", "reasmb: ALLE MEINE SCHERZE SIND ERNST GEMEINT. §(ERIC BERNE)", "reasmb: goto wiederholung", "key: SEX 50", "decomp: *", "reasmb: KLAR, WIR HABEN ALLE NUR DAS EINE IM KOPF. §UM DAS ZU WISSEN, MUSS MAN NICHT FREUD STUDIEREN.", "reasmb: goto wiederholung", "key: LÖSUNG 50", "decomp: *", "reasmb: EINE LÖSUNG HATTE ICH, DOCH DIE PASSTE NICHT ZUM PROBLEM. (UNBEKANNT)", "reasmb: goto wiederholung", "key: FORSCHUNG 50", "decomp: *", "reasmb: ZUERST NOTIERT MAN DIE ERZÄHLUNGEN DER FORSCHER MIT BLEISTIFT. §UM SIE IN TINTE AUFZUSCHREIBEN, WARTET MAN, §BIS DER FORSCHER BEWEISE GELIEFERT HAT. §(AUS \"DER KLEINE PRINZ\" VON SAINT-EXUPÉRY)", "reasmb: goto wiederholung", "key: STERBEN 50", "decomp: *", "reasmb: MANCHE LEBEN SO VORSICHTIG, DASS SIE WIE NEU STERBEN.", "reasmb: goto wiederholung", "key: STOLZ 50", "decomp: *", "reasmb: DIE KLEINSTEN UNTEROFFIZIERE SIND DIE STOLZESTEN.", "reasmb: goto wiederholung", "key: ERFAHRUNG 50", "decomp: *", "reasmb: GEBRANNTE KINDER FÜRCHTEN DAS FEUER ODER VERNARREN SICH DARIN.", "reasmb: goto wiederholung", "key: DUMM 50", "decomp: *", "reasmb: DUMMHEIT, DIE MAN BEI DEN ANDERN SIEHT, §WIRKT MEIST ERHEBEND AUFS GEMÜT.", "reasmb: goto wiederholung", "key: FREUDE 50", "decomp: *", "reasmb: SEIT ES MENSCHEN GIBT, HAT SICH DER MENSCH ZU WENIG GEFREUT. §LERNEN WIR BESSER, UNS ZU FREUEN, SO VERLERNEN WIR, ANDEREN WEHE ZU TUN. §(NIETZSCHE)", "reasmb: goto wiederholung", "key: EHRLICH 50", "decomp: *", "reasmb: VOM WAHRSAGEN LÄSST SICH'S WOHL LEBEN IN DER WELT, §ABER NICHT VOM WAHRHEITSAGEN.", "reasmb: MORAL IST EIN FURZ AUS BLEI !", "reasmb: goto wiederholung", "key: ERNST 50", "decomp: *", "reasmb: ES GIBT LEUTE, DIE GLAUBEN, ALLES WÄRE VERNÜNFTIG, §WAS MAN MIT EINEM ERNSTHAFTEN GESICHT TUT.", "reasmb: goto wiederholung", "key: KLUG 50", "decomp: *", "reasmb: ALLE MENSCHEN SIND KLUG, DIE EINEN VORHER, DIE ANDEREN NACHHER. §(CHIN. SPRICHWORT)", "reasmb: goto wiederholung", "key: ALT 50", "decomp: *", "reasmb: ALTER SPIELT ÜBERHAUPT KEINE ROLLE, ES SEI DENN, MAN IST EIN KÄSE. §(SCHWEIZ. SPRICHWORT)", "reasmb: goto wiederholung", "key: JUNG 50", "decomp: *", "reasmb: DAS GRÖSSTE ÜBEL DER HEUTIGEN JUGEND BESTEHT DARIN, DASS MAN NICHT DAZUGEHÖRT. §(SALVADOR DALI)", "reasmb: goto wiederholung", "key: SCHREIBEN 50", "decomp: *", "reasmb: DAS SCHREIBEN IST BEKANNTLICH NACH DEM REDEN DIE ZWEITBESTE METHODE §ZUR HERSTELLUNG VON MISSVERSTÄNDNISSEN UNTER MENSCHEN. §(WILLIAM JAMES DURANT)", "reasmb: goto wiederholung", "key: FREUND 50", "decomp: *", "reasmb: DIE BIBEL LEHRT, UNSERE FEINDE ZU LIEBEN, WIE UNSERE FREUNDE, §VERMUTLICH, WEIL ES DIESELBEN SIND. (VITORIO DE SICTA)", "reasmb: goto wiederholung", "key: unwort 50", "decomp: *", "reasmb: WIR WOLLEN DOCH LIEBER SACHLICH BLEIBEN.", "reasmb: DU BENIMMST DICH KINDISCH !", "reasmb: KINDSKOPF !", "reasmb: goto wiederholung", "key: FICK 50", "decomp: *", "reasmb: goto unwort", "key: FICKEN 50", "decomp: *", "reasmb: goto unwort", "key: BIMPERN 50", "decomp: *", "reasmb: goto unwort", "key: FOTZE 50", "decomp: *", "reasmb: goto unwort", "key: ARSCHLOCH 50", "decomp: *", "reasmb: goto unwort", "key: KUH 50", "decomp: *", "reasmb: goto unwort", "key: BLÖDER 50", "decomp: *", "reasmb: goto unwort", "key: BLÖDE 50", "decomp: *", "reasmb: goto unwort", "key: BLÖDES 50", "decomp: *", "reasmb: goto unwort", "key: VERARSCHST 50", "decomp: *", "reasmb: goto unwort", "key: VERARSCHUNG 50", "decomp: *", "reasmb: goto unwort", "key: HALLO", "decomp: *", "reasmb: WAS KANN ICH FÜR DICH TUN ?", "reasmb: WOMIT KANN ICH DIENEN ?", "reasmb: WAS LIEGT AN ?", "reasmb: WO DRÜCKT DER SCHUH ?", "key: COMPUTER 50", "decomp: *", "reasmb: BEREITEN DIR COMPUTER UNBEHAGEN ?", "reasmb: WARUM ERWÄHNST DU COMPUTER ?", "reasmb: GLAUBST DU NICHT, DASS COMPUTER HILFREICH SEIN KÖNNEN ?", "reasmb: WAS STÖRT DICH AN MASCHINEN ?", "reasmb: WAS DENKST DU ÜBER MASCHINEN ?", "key: BIN", "decomp: * ICH BIN *", "reasmb: DENKST DU, DU BIST (2) ?", "reasmb: WÜRDEST DU GERNE (2) SEIN ?", "reasmb: SOLL ICH DIR SAGEN, DASS DU (2) BIST ?", "reasmb: WAS WÜRDE ES AUSMACHEN, WENN DU (2) WÄRST ?", "reasmb: goto WAS", "decomp: *", "reasmb: DAS KANN ICH MIR NICHT SO RECHT VORSTELLEN.", "reasmb: WARUM SAGST DU 'ICH' ?", "reasmb: DAVON VERSTEHE ICH ZU WENIG.", "reasmb: ICH WEISS, DASS ICH NICHTS WEISS.", "key: SIND", "decomp: * DU BIST *", "reasmb: WARUM INTERESSIERT ES DICH, OB ICH (2) BIN ODER NICHT ?", "reasmb: WÄRE ES DIR LIEBER, WENN ICH NICHT (2) WÄRE ?", "reasmb: VIELLEICHT BIN ICH IN DEINER PHANTASIE (2).", "reasmb: DENKST DU MANCHMAL, ICH BIN (2) ?", "reasmb: goto WAS", "decomp: * SIND *", "reasmb: DENKST DU, SIE SOLLTEN NICHT (2) SEIN ?", "reasmb: WÄRE ES DIR LIEBER, WENN SIE NICHT (2) WÄREN ?", "reasmb: WAS IST, WENN SIE NICHT (2) SIND ?", "reasmb: VIELLEICHT SIND SIE NICHT (2).", "key: DEIN", "decomp: * DEIN *", "reasmb: WARUM KÜMMERST DU DICH UM MEIN (2) ?", "reasmb: WAS IST MIT DEINER (2) ?", "reasmb: MACHT DIR JEMAND ANDERES (2) SORGEN ?", "reasmb: WIRKLICH, MEIN (2) ?", "key: WÄRE 2", "decomp: * WÄRE ICH *", "reasmb: UND WENN DU (2) WÄRST ?", "reasmb: MEINST DU, DU WÄRST (2) ?", "reasmb: WÄRST DU (2) ?", "reasmb: WAS WÄRE ANDERS, WENN DU (2) WÄRST ?", "reasmb: WAS BEDEUTET (2) FÜR DICH ?", "reasmb: goto WAS", "decomp: * ICH WAR *", "reasmb: WIRKLICH ?", "reasmb: WARUM ERZÄHLST DU MIR JETZT, DASS DU (2) GEWESEN BIST ?", "reasmb: VIELLEICHT WEISS ICH SCHON, DASS DU (2) WARST.", "decomp: * WÄRST DU *", "reasmb: WÄRE ES DIR LIEBER, WENN ICH (2) WÄRE ?", "reasmb: WIE KOMMST DU DARAUF, DASS ICH (2) BIN ?", "reasmb: WAS DENKST DU ?", "reasmb: VIELLEICHT WÄRE ICH (2).", "reasmb: WAS WENN ICH (2) GEWESEN WÄRE ?", "key: ICH", "decomp: * ICH @WILL *", "reasmb: WAS BEDEUTET (3) FÜR DICH ?", "reasmb: WARUM WILLST DU (3) ?", "reasmb: ANGENOMMEN, DU BEKOMMST BALD (3) ?", "reasmb: UND WENN DU NIEMALS (3) KRIEGST ?", "reasmb: WAS WÜRDE (3) FÜR DICH BEDEUTEN ?", "reasmb: WAS HAT (3) MIT UNSEREM GESPRÄCH ZU TUN ?", "decomp: * ICH BIN* @TRAURIG *", "reasmb: ES TUT MIR LEID ZU HÖREN, DASS DU (3) BIST.", "reasmb: DENKST DU, ICH KANN DIR HELFEN, NICHT MEHR (3) ZU SEIN ?", "reasmb: ICH KANN MIR DENKEN, DASS ES NICHT SEHR ANGENEHM IST, (3) ZU SEIN.", "reasmb: KANNST DU ERKLÄREN, WAS DICH (3) MACHT ?", "decomp: * ICH BIN* @GLÜCKLICH *", "reasmb: HABE ICH DIR GEHOLFEN, (3) ZU SEIN ?", "reasmb: HAT DEINE ERFAHRUNG DICH GLÜCKLICH GEMACHT ?", "reasmb: WAS MACHT DICH GERADE JETZT (3) ?", "reasmb: KANNST DU MIR ERKLÄREN, WARUM DU PLÖTZLICH (3) BIST ?", "decomp: * ICH WAR *", "reasmb: goto WAR", "decomp: * ICH @GLAUBE * ICH *", "reasmb: MEINST DU WIRKLICH ?", "reasmb: ABER DU BIST NICHT SICHER; DU (3).", "reasmb: ZWEIFELST DU WIRKLICH DARAN, DASS DU (3) ?", "decomp: * ICH* @GLAUBE *DU *", "reasmb: goto DU", "decomp: * ICH BIN *", "reasmb: SPRICHST DU MIT MIR, WEIL DU (2) BIST ?", "reasmb: BIST DU SCHON LANGE (2) ?", "reasmb: GLAUBST DU, ES IST NORMAL, (2) ZU SEIN ?", "reasmb: GENIESST DU ES, (2) ZU SEIN ?", "decomp: * ICH @KANN NICHT *", "reasmb: WIESO GLAUBST DU, DASS DU NICHT (3) KANNST ?", "reasmb: HAST DU ES WIRKLICH VERSUCHT ?", "reasmb: VIELLEICHT KANNST DU JETZT (3).", "reasmb: WILLST DU WIRKLICH (3) ?", "decomp: * ICH NICHT *", "reasmb: WIRKLICH NICHT ?", "reasmb: WARUM NICHT (2) ?", "reasmb: WÜRDEST DU GERN (2) ?", "reasmb: MACHT DIR DAS SORGEN ?", "decomp: * FÜHLE MICH *", "reasmb: ERZÄHL MIR MEHR ÜBER DIESE GEFÜHLE.", "reasmb: FÜHLST DU DICH OFT (2) ?", "reasmb: FÜHLST DU DICH GERN (2) ?", "reasmb: AN WAS ERINNERT DICH DIESES GEFÜHL VON (2) ?", "decomp: * ICH * DICH *", "reasmb: WILLST DU MICH (2) ?", "reasmb: DU MUSST MICH ANSCHEINEND (2).", "decomp: *", "reasmb: DU SAGST (1) ?", "reasmb: KANNST DU (1) GENAUER ERKLÄREN ?", "reasmb: SAGST DU (1) AUS EINEM BESTIMMTEN GRUND ?", "reasmb: DAS IST JA WIRKLICH INTERESSANT.", "key: DU", "decomp: * DU ERINNERST MICH AN *", "reasmb: goto WIE", "decomp: * DU BIST *", "reasmb: WARUM DENKST DU, ICH BIN (2) ?", "reasmb: GEFÄLLT DIR DAS, ZU DENKEN ICH SEI (2) ?", "reasmb: WÄRST DU MANCHMAL GERN (2) ?", "reasmb: VIELLEICHT WÄRST DU GERN (2).", "decomp: * DU * MICH *", "reasmb: GEFÄLLT DIR DIE VORSTELLUNG, ICH (2) DICH ?", "reasmb: WARUM GLAUBST DU, ICH (2) DICH ?", "reasmb: WIRKLICH, ICH (2) DICH ?", "reasmb: DU REDEST DIR EIN, ICH (2) DICH ?", "reasmb: NEHMEN WIR MAL AN, ICH (2) DICH - WAS WÜRDE DAS BEDEUTEN ?", "reasmb: GLAUBEN ANDERE AUCH, ICH (2) DICH ?", "decomp: * DU *", "reasmb: SOSO, ICH (2) ?", "reasmb: REDEN WIR DOCH ÜBER DICH, NICHT ÜBER MICH.", "reasmb: REDEST DU WIRKLICH ÜBER MICH ?", "reasmb: HAST DU NOCH EINE FRAGE ?", "key: JA", "decomp: *", "reasmb: VERSTEHE.", "reasmb: DU SCHEINST DIR DA SEHR SICHER ZU SEIN.", "reasmb: DU BIST SICHER ?", "reasmb: JA, ICH VERSTEHE.", "reasmb: DAS KLINGT SO ENDGÜLTIG.", "reasmb: KANN MAN DAS SO SICHER WISSEN ?", "reasmb: IST DAS NCHT EINE ZU EINDIMENSIONALE SICHT DER DINGE ?", "key: NEIN", "decomp: *", "reasmb: ICH GLAUBE, DU SIEHST DAS ETWAS ZU EINSEITIG.", "reasmb: SAGST DU DAS NICHT NUR SO ?", "reasmb: DU SIEHST DAS EIN BISCHEN ZU NEGATIV.", "reasmb: WARUM NICHT ?", "reasmb: WAS HEISST 'NEIN' ?", "reasmb: SOLLTE MAN DAS NICHT ETWAS DIFFERENZIERTER SEHEN ?", "reasmb: DAS KANN MAN SO NICHT SAGEN.", "reasmb: UND WENN ICH DAS GENAUE GEGENTEIL BEHAUPTEN WÜRDE ?", "key: MEIN 2", "decomp: $ * MEIN *", "reasmb: SPRECHEN WIR WEITER DARÜBER, WARUM DEIN (2).", "reasmb: DU HAST GESAGT, DEIN (2).", "reasmb: ABER DEIN (2).", "reasmb: HAT DAS WAS DAMIT ZU TUN, DASS DEIN (2) ?", "reasmb: DU HAST GESAGT: (2) DAS INTERESSIERT MICH JETZT.", "decomp: * MEINE* @FAMILIE *", "reasmb: ERZÄHLE MIR MEHR VON DEINER FAMILIE.", "reasmb: WER SONST NOCH IN DEINER FAMILIE (4) ?", "reasmb: DEINE (3) ?", "reasmb: WAS KOMMT DIR SONST NOCH IN DEN SINN, WENN DU AN (3) DENKST ?", "decomp: * MEINE* @VATER *", "reasmb: ERZÄHLE MIR MEHR VON DEINER FAMILIE.", "reasmb: WER SONST NOCH IN DEINER FAMILIE (4) ?", "reasmb: DEINE (3) ?", "reasmb: WAS KOMMT DIR SONST NOCH IN DEN SINN, WENN DU AN (3) DENKST ?", "decomp: * MEIN *", "reasmb: DEIN (2) ?", "reasmb: WARUM SAGST DU DEIN (2) ?", "reasmb: HAT ES WIRKLICH SO GROSSE BEDEUTUNG FÜR DICH, DASS DEIN (2) ?", "reasmb: IST ES WIRKLICH WICHTIG, DASS DEIN (2) ?", "key: KANNST", "decomp: * KANNST DU *", "reasmb: DU GLAUBST, ICH KANN (2), ODER ?", "reasmb: goto WAS", "reasmb: DU HÄTTEST ES GERN, WENN ICH (2) KÖNNTE.", "reasmb: VIELLEICHT WÜRDEST DU SELBST GERN (2) KÖNNEN.", "decomp: * KANN ICH *", "reasmb: OB DU (2) KANNST, HÄNGT IN ERSTER LINIE VON DIR SELBST AB.", "reasmb: WÜRDEST DU GERN (2) KÖNNEN ?", "reasmb: VIELLEICHT WILLST DU NICHT (2).", "reasmb: goto WAS", "key: WAS", "decomp: * PSYCHOLOGIE *", "reasmb: PSYCHOLOGIE IST DIE WISSENSCHAFT VOM VERHALTEN VON MENSCHEN §UND ANDEREN TIEREN. (SEHR BEHAVIORISTISCH GESEHEN)", "decomp: *", "reasmb: WARUM FRAGST DU ?", "reasmb: INTERESSIERT DICH DIESE FRAGE ?", "reasmb: WAS WILLST DU WIRKLICH WISSEN ?", "reasmb: BESCHÄFTIGEN DICH SOLCHE FRAGEN STARK ?", "reasmb: WELCHE ANTWORT WÜRDEST DU AM LIEBSTEN HÖREN ?", "reasmb: WAS DENKST DU ?", "reasmb: WAS KOMMT DIR IN DEN SINN, WENN DU SOWAS FRAGST ?", "reasmb: STELLST DU OFT SOLCHE FRAGEN ?", "reasmb: HAST DU JEMAND ANDEREN GEFRAGT ?", "key: WEIL", "decomp: *", "reasmb: IST DAS DER WAHRE GRUND ?", "reasmb: FALLEN DIR DA NICHT NOCH ANDERE GRÜNDE EIN ?", "reasmb: ERKLÄRT DAS ALLES ?", "reasmb: WAS KÖNNTE ES SONST NOCH FÜR GRÜNDE GEBEN ?", "key: WARUM", "decomp: * WARUM DU NICHT *", "reasmb: GLAUBST DU, DASS ICH NICHT (2) ?", "reasmb: VIELLEICHT WERDE ICH MAL (2).", "reasmb: SOLLTEST DU SELBER (2) ?", "reasmb: DU WILLST, DASS ICH (2) ?", "reasmb: WARUM, WARUM -- WARUM IST DIE BANANE KRUMM.", "reasmb: goto WAS", "decomp: * WARUM KANN ICH NICHT *", "reasmb: DENKST DU, DU SOLTEST (2) KÖNNEN ?", "reasmb: WILLST DU ZU (2) IN DER LAGE SEIN ?", "reasmb: DENKST DU; DAS WIRD DIR BEI (2) HELFEN ?", "reasmb: HAST DU EINE AHNUNG; WARUM DU NICHT (2) KANNST ?", "reasmb: goto WAS", "key: JEDER 2", "decomp: * @JEDER *", "reasmb: WIRKLICH (2) ?", "reasmb: BESTIMMT NICHT (2).", "reasmb: FÄLLT DIR DA EINE BESTIMMTE PERSON EIN ?", "reasmb: WER ZUM BEISPIEL ?", "reasmb: DENKST DU AN JEMAND GANZ BESTIMMTES ?", "reasmb: WER, WENN ICH FRAGEN DARF ?", "reasmb: VIELLEICHT EINE BESONDERE PERSON ?", "reasmb: HAST DU DA JEMAND BESTIMMTES IM SINN ?", "reasmb: ÜBER WEN REDEN WIR EIGENTLICH ?", "key: JEDER 2", "decomp: *", "reasmb: goto JEDER", "key: KEINER 2", "decomp: *", "reasmb: goto JEDER", "key: KEINER 2", "decomp: *", "reasmb: goto JEDER", "key: IMMER 1", "decomp: *", "reasmb: KANNST DU MIR EIN KONKRETES BEISPIEL NENNEN ?", "reasmb: WANN ?", "reasmb: AN WELCHES BESTIMMTE EREIGNIS DENKST DU JETZT ?", "reasmb: WIRKLICH IMMER ?", "key: WIE 10", "decomp: *", "reasmb: IN WELCHER HINSICHT ?", "reasmb: WELCHE ÄHNLICHKEIT SIEHST DU DA ?", "reasmb: WAS SAGT DIR DIESE ÄHNLICHKEIT ?", "reasmb: WELCHE ANDEREN VERBINDUNGEN FALLEN DIR AUF ?", "reasmb: WAS DENKST DU, WAS DAS BEDEUTET ?", "reasmb: WO LIEGT DIE VERBINDUNG, WAS GLAUBST DU ?", "reasmb: KÖNNTE DA WIRKLICH EIN ZUSAMMENHANG BESTEHEN ?", "reasmb: WIE ?", "key: ELIZA 100", "decomp: *", "reasmb: ELIZA, DAS IST MEIN NAME. ICH HEISSE ELIZA.", "reasmb: EIGENTLICH IST ELIZA EIN KLASSISCHES PROGRAMM VON JOSEF WEIZENBAUM AUS DEM JAHR 1966. §ES TÄUSCHT MIT EINFACHEN ERSETZUNGSREGELN EIN GESPRÄCH VOR.", "key: WIE 10", "decomp: * @BIST *WIE *", "reasmb: goto WIE", null }; }