tagger benchmark
authorjjenista <jjenista>
Thu, 26 Feb 2009 23:26:37 +0000 (23:26 +0000)
committerjjenista <jjenista>
Thu, 26 Feb 2009 23:26:37 +0000 (23:26 +0000)
91 files changed:
Robust/src/Benchmarks/mlp/tagger/mlp-java/Action.java [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/Assert.java [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/Counter.java [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/Engine.java [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/Generator.java [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/Numbering.java [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/Property.java [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/PropertyMap.java [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/PropertyParser.java [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/QuarkGenerator.java [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/SourceParser.java [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/StandardEngine.java [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/Tagger.java [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/Token.java [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/charmap.txt [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/lucmathext-charmap.txt [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/lucmathit-charmap.txt [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/lucmathsym-charmap.txt [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/makefile [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/standard-charmap.txt [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/styles.txt [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/symbol-charmap.txt [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/symbols.txt [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/test.txt [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/mlp-java/test.txt.index.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/mlp-java/test.txt.tag.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/charmap.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/lucmathext-charmap.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/lucmathit-charmap.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/lucmathsym-charmap.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/makefile [new file with mode: 0644]
Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/standard-charmap.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/styles.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/symbol-charmap.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/symbols.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/test.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/doc/notes.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/charmap.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/foo-new.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/foo-old.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse-real.index.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse-real.tag.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse-real.tag.txt.xtg [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse-real.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse.index.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse.qxd [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse.tag.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/styles.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/symbols.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/test.index.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/test.tag.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/examples/test.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/charmap.pdf [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/charmaps-display.tag.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/charmaps-display.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/lucmatext-charmap.processed.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/lucmathext-charmap.processed.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/lucmathit-charmap.processed.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/lucmathsym-charmap.processed.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/standard-charmap.processed.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/symbol-charmap.processed.index.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/symbol-charmap.processed.tag.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/symbol-charmap.processed.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/lucmathext-charmap.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/lucmathit-charmap.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/lucmathsym-charmap.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/make-charmap-display.pl [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/make-map.pl [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/lucida-math-extended-map.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/lucida-math-italic-map.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/lucida-math-symbol-map.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/standard-map.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/symbol-map.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/standard-charmap.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/maps/symbol-charmap.txt [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Action.java [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Assert.java [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Counter.java [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Engine.java [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Generator.java [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Numbering.java [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Property.java [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/PropertyMap.java [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/PropertyParser.java [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/QuarkGenerator.java [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/SourceParser.java [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/StandardEngine.java [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Tagger.java [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Token.java [new file with mode: 0755]
Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/makefile [new file with mode: 0644]

diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/Action.java b/Robust/src/Benchmarks/mlp/tagger/mlp-java/Action.java
new file mode 100644 (file)
index 0000000..5b8654b
--- /dev/null
@@ -0,0 +1,513 @@
+/**\r
+ * Action class\r
+ * Represents an action performed in response to a token\r
+ * Instance of command pattern\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/06/01\r
+ */\r
+\r
+//package tagger;\r
+//import java.util.*;\r
+\r
+public /*abstract*/ class Action {\r
+  /**\r
+   * requires: iter is an iterator that just yielded this\r
+   * ensures: performs action for token, and may remove itself from iter\r
+   * default behaviour is equivalent to perform\r
+   */\r
+  public void perform (Token token, Iterator iter) {\r
+    perform (token);\r
+  }\r
+\r
+  public void perform (Token token) {\r
+    ;\r
+  }\r
+}\r
+\r
+public class ParagraphAction extends Action {\r
+  boolean first_para;\r
+\r
+  Generator generator;\r
+  StringBox current_para_style;\r
+  Numbering numbering;\r
+  public ParagraphAction( Generator g, \r
+                         StringBox cps,\r
+                         Numbering n) {\r
+    generator = g;\r
+    current_para_style = cps;\r
+    numbering = n;\r
+    first_para = true;\r
+  }  \r
+\r
+  public void perform (Token t, Iterator iter) {\r
+    if (t.type != Token.PARASTYLECOMMAND()) {\r
+      if (!first_para) generator.linefeed ();\r
+      generator.new_para (current_para_style.string);\r
+      String numstr = numbering.get_numbering_string (current_para_style.string);\r
+      if (numstr.length() != 0) {\r
+       // display numbering as evidence of progress\r
+       System.out.println (numstr);\r
+       generator.plaintext (numstr);\r
+      }\r
+      \r
+      iter.remove ();\r
+      first_para = false;\r
+    }\r
+  }\r
+}\r
+\r
+public class PlaintextAction extends Action {\r
+  Generator generator;\r
+  public PlaintextAction( Generator g ) {\r
+    generator = g;\r
+  }\r
+\r
+  public void perform(Token t) {\r
+    generator.plaintext (t.arg);\r
+  }\r
+}\r
+\r
+public class NewlineAction extends Action {\r
+  Generator generator;\r
+  public NewlineAction( Generator g ) {\r
+    generator = g;\r
+  }\r
+\r
+  public void perform(Token t) {\r
+    generator.new_line ();\r
+  }\r
+}\r
+\r
+public class ApostropheAction extends Action {\r
+  Generator generator;\r
+  PropertyMap char_map;\r
+  public ApostropheAction( Generator g,\r
+                          PropertyMap cm) {\r
+    generator = g;\r
+    char_map = cm;\r
+  }\r
+\r
+  public void perform (Token t) {\r
+    StandardEngine.put_special_char (generator, \r
+                                    char_map, \r
+                                    StandardEngine.apostrophe_char_name(), \r
+                                    t.line);\r
+  }\r
+}\r
+\r
+public class PrimeAction extends Action {\r
+  Generator generator;\r
+  PropertyMap char_map;\r
+  public PrimeAction( Generator g,\r
+                     PropertyMap cm) {\r
+    generator = g;\r
+    char_map = cm;\r
+  }\r
+\r
+  public void perform (Token t) {\r
+    StandardEngine.put_special_char (generator, \r
+                                    char_map, \r
+                                    StandardEngine.prime_char_name(), \r
+                                    t.line);\r
+  }  \r
+}\r
+\r
+public class OpenSingleQuoteAction extends Action {\r
+  Generator generator;\r
+  PropertyMap char_map;\r
+  public OpenSingleQuoteAction( Generator g,\r
+                               PropertyMap cm) {\r
+    generator = g;\r
+    char_map = cm;\r
+  }\r
+  \r
+  public void perform (Token t) {\r
+    StandardEngine.put_special_char (generator, \r
+                                    char_map, \r
+                                    StandardEngine.opensinglequote_char_name(), \r
+                                    t.line);\r
+  }  \r
+}\r
+\r
+public class CloseSingleQuoteAction extends Action {\r
+  Generator generator;\r
+  PropertyMap char_map;\r
+  public CloseSingleQuoteAction( Generator g,\r
+                                PropertyMap cm) {\r
+    generator = g;\r
+    char_map = cm;\r
+  }\r
+  \r
+  public void perform (Token t) {\r
+    StandardEngine.put_special_char (generator, \r
+                                    char_map, \r
+                                    StandardEngine.closesinglequote_char_name(), \r
+                                    t.line);\r
+  }  \r
+}\r
+\r
+public class OpenDoubleQuoteAction extends Action {\r
+  Generator generator;\r
+  PropertyMap char_map;\r
+  public OpenDoubleQuoteAction( Generator g,\r
+                               PropertyMap cm) {\r
+    generator = g;\r
+    char_map = cm;\r
+  }\r
+  \r
+  public void perform (Token t) {\r
+    StandardEngine.put_special_char (generator, \r
+                                    char_map, \r
+                                    StandardEngine.opendoublequote_char_name(), \r
+                                    t.line);\r
+  }  \r
+}\r
+\r
+public class CloseDoubleQuoteAction extends Action {\r
+  Generator generator;\r
+  PropertyMap char_map;\r
+  public CloseDoubleQuoteAction( Generator g,\r
+                                PropertyMap cm) {\r
+    generator = g;\r
+    char_map = cm;\r
+  }\r
+  \r
+  public void perform (Token t) {\r
+    StandardEngine.put_special_char (generator, \r
+                                    char_map, \r
+                                    StandardEngine.closedoublequote_char_name(), \r
+                                    t.line);\r
+  }  \r
+}\r
+\r
+public class HyphenAction extends Action {\r
+  Generator generator;\r
+  PropertyMap char_map;\r
+  public HyphenAction( Generator g,\r
+                      PropertyMap cm ) {\r
+    generator = g;\r
+    char_map = cm;\r
+  }\r
+\r
+  public void perform (Token t) {\r
+    int len = t.arg.length ();\r
+    if (len == 1)\r
+      StandardEngine.put_special_char (generator, \r
+                                      char_map, \r
+                                      StandardEngine.hyphen_char_name(), \r
+                                      t.line);\r
+    else if (len == 2)\r
+      StandardEngine.put_special_char (generator, \r
+                                      char_map, \r
+                                      StandardEngine.endash_char_name(), \r
+                                      t.line);\r
+    else if (len == 3)\r
+      StandardEngine.put_special_char (generator, \r
+                                      char_map, \r
+                                      StandardEngine.emdash_char_name(),\r
+                                      t.line);\r
+    else\r
+      System.out.println (t.line + ": Too many hyphens: " + t.arg);\r
+  }\r
+}\r
+\r
+public class DotsAction extends Action {\r
+  Generator generator;\r
+  PropertyMap char_map;\r
+  public DotsAction( Generator g,\r
+                    PropertyMap cm ) {\r
+    generator = g;\r
+    char_map = cm;\r
+  }\r
+\r
+  public void perform (Token t) {\r
+    int len = t.arg.length ();\r
+    if (len == 1)\r
+      generator.plaintext (".");\r
+    else if (len == 2)\r
+      StandardEngine.put_special_char (generator, \r
+                                      char_map, \r
+                                      StandardEngine.twodotleader_char_name(), \r
+                                      t.line);\r
+    else if (len == 3)\r
+      StandardEngine.put_special_char (generator, \r
+                                      char_map, \r
+                                      StandardEngine.ellipsis_char_name(), \r
+                                      t.line);\r
+    else\r
+      System.out.println (t.line + ": Too many dots: " + t.arg);\r
+  }\r
+}\r
+\r
+public class LoadCharMapCommandAction extends Action {\r
+  Generator generator;\r
+  PropertyMap char_map;\r
+  Numbering numbering;\r
+\r
+  public LoadCharMapCommandAction( Generator g,\r
+                                  PropertyMap cm,\r
+                                  Numbering n ) {\r
+    generator = g;\r
+    char_map = cm;\r
+    numbering = n;\r
+  }\r
+\r
+  public void perform (Token t) {\r
+    // open file with given name and load char map from it\r
+    String file_name = t.arg;\r
+    File f = new File (file_name);\r
+    FileInputStream s = new FileInputStream (f);\r
+    PropertyParser p = new PropertyParser (s);\r
+    char_map.incorporate (p);\r
+  }\r
+}\r
+\r
+public class LoadStyleSheetCommandAction extends Action {\r
+  Generator generator;\r
+  PropertyMap style_map;\r
+  Numbering numbering;\r
+\r
+  public LoadStyleSheetCommandAction( Generator g,\r
+                                     PropertyMap sm,\r
+                                     Numbering n ) {\r
+    generator = g;\r
+    style_map = sm;\r
+    numbering = n;\r
+  }\r
+\r
+  public void perform (Token t) {\r
+    // open file with given name and load char map from it\r
+    String file_name = t.arg;\r
+    File f = new File (file_name);\r
+    FileInputStream s = new FileInputStream (f);\r
+    PropertyParser p = new PropertyParser (s);\r
+    style_map.incorporate (p);\r
+    numbering.incorporate ();\r
+  }\r
+}\r
+\r
+public class UnsuppressAction extends Action {\r
+  Generator generator;\r
\r
+  public UnsuppressAction( Generator g ) {\r
+    generator = g;\r
+  }\r
+\r
+  public void perform (Token t, Iterator i) {\r
+    generator.suppress_off ();\r
+    i.remove ();\r
+  }\r
+}\r
+\r
+public class PreambleCommandAction extends Action {\r
+  Generator generator;\r
+  Action unsuppress_action;\r
+  StandardEngine engine;\r
+\r
+  public PreambleCommandAction( Generator g,\r
+                               Action ua,\r
+                               StandardEngine se ) {\r
+    generator = g;\r
+    unsuppress_action = ua;\r
+    engine = se;\r
+  }\r
+\r
+  public void perform (Token t) {\r
+    generator.suppress_on ();\r
+    engine.register_by_type (unsuppress_action, Token.PARABREAK());\r
+  }\r
+}\r
+\r
+public class ParaBreakAction extends Action {\r
+  Action paragraph_action;\r
+  StringBox current_para_style;\r
+  PropertyMap style_map;\r
+\r
+  public ParaBreakAction( Action pa,\r
+                         StringBox cps,\r
+                         PropertyMap sm ) {\r
+    paragraph_action = pa;\r
+    current_para_style = cps;\r
+    style_map = sm;\r
+  }\r
+\r
+  public void perform (Token t) {\r
+    String next_style = style_map.get_property (current_para_style.string, \r
+                                               StandardEngine.next_style_prop_name());\r
+    if (next_style == null) {\r
+      System.out.println (t.line + ": No next style property given for style: " + current_para_style.string);\r
+      return;\r
+    }\r
+    current_para_style.set (next_style);\r
+    StandardEngine.register_for_all (paragraph_action);\r
+  }\r
+}\r
+\r
+public class ParaStyleCommandAction extends Action {\r
+  StringBox current_para_style;\r
+\r
+  public ParaStyleCommandAction( StringBox cps ) {\r
+    current_para_style = cps;\r
+  }\r
+\r
+  public void perform (Token t) {\r
+    current_para_style.set (t.arg);\r
+  }\r
+}\r
+\r
+public class CharCommandAction extends Action {\r
+  Generator generator;\r
+  PropertyMap char_map;\r
+  \r
+  public CharCommandAction( Generator g,\r
+                           PropertyMap cm ) {\r
+    generator = g;\r
+    char_map = cm;\r
+  }\r
+  \r
+  public void perform (Token t) {\r
+    String index = char_map.get_property (t.arg, \r
+                                         StandardEngine.index_prop_name());\r
+    if (index == null) {\r
+      System.out.println (t.line + ": No index property given for character: " + t.arg);\r
+      return;\r
+    }\r
+    String font = char_map.get_property (t.arg, \r
+                                        StandardEngine.font_prop_name());\r
+    // if no font is listed, generate special character in standard font\r
+    if (font == null)\r
+      generator.special_char (index);\r
+    else\r
+      generator.special_char (font, index);\r
+  }  \r
+}\r
+\r
+public class UnderscoreAction extends Action {\r
+  Generator generator;\r
+  boolean italic_mode_on;\r
+  \r
+  public UnderscoreAction( Generator g ) {\r
+    generator = g;\r
+    italic_mode_on = false;\r
+  }\r
+\r
+  public void perform (Token t) {\r
+    if (italic_mode_on) {\r
+      italic_mode_on = false;\r
+      generator.pop_format ();\r
+    }\r
+    else {\r
+      italic_mode_on = true;\r
+      generator.push_format (Generator.ITALICS());\r
+    }\r
+  }  \r
+}\r
+\r
+public class PushItalicsAction extends Action {\r
+  Generator generator;\r
+  \r
+  public PushItalicsAction( Generator g ) {\r
+    generator = g;\r
+  }\r
+\r
+  public void perform (Token t, Iterator iter) {\r
+    Assert.assert_ (t.type == Token.ALPHABETIC());\r
+    generator.push_format (Generator.ITALICS());\r
+  }\r
+}\r
+\r
+public class PopItalicsAction extends Action {\r
+  Generator generator;\r
+  \r
+  public PopItalicsAction( Generator g ) {\r
+    generator = g;\r
+  }\r
+\r
+  public void perform (Token t, Iterator iter) {\r
+    Assert.assert_ (t.type == Token.ALPHABETIC());\r
+    generator.pop_format ();\r
+  }\r
+}\r
+\r
+public class DollarAction extends Action {\r
+  Action push_italics_action;\r
+  Action pop_italics_action;\r
+  boolean math_mode_on;\r
+\r
+  public DollarAction( Action pushia, Action popia ) {\r
+    push_italics_action = pushia;\r
+    pop_italics_action = popia;\r
+    math_mode_on = false;\r
+  }\r
+\r
+  public void perform (Token t) {\r
+    if (math_mode_on) {\r
+      math_mode_on = false;\r
+      StandardEngine.unregister_by_type (push_italics_action, Token.ALPHABETIC());\r
+      StandardEngine.unregister_by_type (pop_italics_action, Token.ALPHABETIC());\r
+    }\r
+    else {\r
+      math_mode_on = true;\r
+      StandardEngine.register_by_type_back (pop_italics_action, Token.ALPHABETIC());\r
+      StandardEngine.register_by_type_front (push_italics_action, Token.ALPHABETIC());\r
+    }\r
+  }  \r
+}\r
+\r
+public class FormatCommandAction extends Action {\r
+  Generator generator;\r
+\r
+  public FormatCommandAction( Generator g ) {\r
+    generator = g;\r
+  }\r
+\r
+  public void perform (Token t) {\r
+    if (t.arg.equals (StandardEngine.ROMAN_COMMANDNAME()))\r
+      generator.push_format (Generator.ROMAN());\r
+    else if (t.arg.equals (StandardEngine.BOLD_COMMANDNAME()))\r
+      generator.push_format (Generator.BOLD());\r
+    else if (t.arg.equals (StandardEngine.ITALICS_COMMANDNAME()))\r
+      generator.push_format (Generator.ITALICS());\r
+    else if (t.arg.equals (StandardEngine.SUBSCRIPT_COMMANDNAME()))\r
+      generator.push_format (Generator.SUBSCRIPT());\r
+    else if (t.arg.equals (StandardEngine.SUPERSCRIPT_COMMANDNAME()))\r
+      generator.push_format (Generator.SUPERSCRIPT());\r
+  }\r
+}\r
+\r
+public class PopFormatCommandAction extends Action {\r
+  Generator generator;\r
+\r
+  public PopFormatCommandAction( Generator g ) {\r
+    generator = g;\r
+  }\r
+\r
+  public void perform (Token t) {\r
+    generator.pop_format ();\r
+  }\r
+}\r
+\r
+public class OtherAction extends Action {\r
+  Generator generator;\r
+\r
+  public OtherAction( Generator g ) {\r
+    generator = g;\r
+  }\r
+\r
+  public void perform (Token t) {\r
+    generator.plaintext (t.arg);\r
+  }\r
+}\r
+\r
+public class EndOfStreamAction extends Action {\r
+  Generator generator;\r
+\r
+  public EndOfStreamAction( Generator g ) {\r
+    generator = g;\r
+  }\r
+  \r
+  public void perform (Token t) {\r
+    System.out.println ("... done");\r
+  }\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/Assert.java b/Robust/src/Benchmarks/mlp/tagger/mlp-java/Assert.java
new file mode 100644 (file)
index 0000000..4a90163
--- /dev/null
@@ -0,0 +1,29 @@
+/**\r
+ * Assert class\r
+ * Provides assertion checking\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/03/01\r
+ */\r
+\r
+//package tagger;\r
+//import java.io.*;\r
+\r
+public class Assert {\r
+  //static PrintStream error_stream = Tagger.error_stream;\r
+\r
+  public static void assert_ (boolean cond) {\r
+    if (!cond) {\r
+      //error_stream.println ("Assertion failure");\r
+      System.out.println ("Assertion failure");\r
+      System.exit(-1);\r
+      // print stack trace\r
+    }\r
+  }\r
+\r
+  public static void unreachable () {\r
+    //error_stream.println ("Assertion failure");\r
+    System.out.println ("Assertion failure");\r
+    System.exit(-1);\r
+  }\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/Counter.java b/Robust/src/Benchmarks/mlp/tagger/mlp-java/Counter.java
new file mode 100644 (file)
index 0000000..c07d0a0
--- /dev/null
@@ -0,0 +1,122 @@
+/**\r
+ * Counter class\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/03/01\r
+ */\r
+\r
+//package tagger;\r
+//import java.io.*;\r
+\r
+public class Counter {\r
+  private int count;\r
+  private int initial;\r
+  private int type;\r
+\r
+  static int NO_SUCH_TYPE() { return -1; }\r
+  static int ARABIC      () { return  0; }\r
+  static int ROMAN_UPPER () { return  1; }\r
+  static int ROMAN_LOWER () { return  2; }\r
+  static int ALPHA_UPPER () { return  3; }\r
+  static int ALPHA_LOWER () { return  4; }\r
+\r
+  // eventually recognize counter_type and set initial count and output format\r
+  // takes style and stream for error reporting\r
+  /*\r
+   * requires: count_prop and style are non null\r
+   *\r
+   */\r
+  public Counter (String count_prop, String style) {\r
+    Assert.assert_ (count_prop != null);\r
+    Assert.assert_ (style != null);\r
+    type = get_type (count_prop);\r
+\r
+    //switch (type) {\r
+    if( type == NO_SUCH_TYPE() ) {\r
+      type = ARABIC();\r
+      initial = 0;\r
+\r
+    } else if( type == ALPHA_LOWER() ||\r
+              type == ALPHA_UPPER() ) {\r
+      if (count_prop.length () != 1) {\r
+       System.out.println ("Bad counter type for style " + style + ": " + count_prop);\r
+       initial = 0;    \r
+      } else {\r
+       initial = count_prop.toLowerCase().charAt (0) - 'a';\r
+      }\r
+\r
+    } else if( type == ARABIC() ) {\r
+      initial = Integer.parseInt (count_prop) - 1;\r
+\r
+    } else if( type == ROMAN_LOWER() ||\r
+              type == ROMAN_UPPER() ) {\r
+      // not yet implemented\r
+      initial = 0;\r
+      type = ARABIC();\r
+    \r
+    } else {\r
+      Assert.unreachable ();\r
+    }\r
+\r
+    count = initial;\r
+  }\r
+  \r
+  /**\r
+   * ensures: increments counter\r
+   * returns true iff successful, false otherwise (eg, because alphabetic counter went past 'z')\r
+   */\r
+  public boolean increment () {\r
+    if ((type == ALPHA_UPPER() || type == ALPHA_LOWER()) && count == 26)\r
+      return false;\r
+    count++;\r
+    return true;\r
+  }\r
+  \r
+  public void reset () {\r
+    count = initial;\r
+  }\r
+  \r
+  public String unparse () {\r
+\r
+    //switch (type) {\r
+\r
+    if( type == ALPHA_LOWER() ) {\r
+      char c = (char) ('a' + count - 1);\r
+      return new Character (c).toString();\r
+    }\r
+\r
+    if( type == ALPHA_UPPER() ) {\r
+      char c = (char) ('A' + count - 1);\r
+      return new Character (c).toString();\r
+    }\r
+\r
+    if( type == ARABIC() ) {\r
+      return String.valueOf (count);\r
+    }\r
+\r
+    Assert.unreachable ();\r
+    return "DUMMY";\r
+  }\r
+  \r
+  /**\r
+   *\r
+   * ensures: returns counter type of counter given in the string counter_type\r
+   * as an int, being equal to one of the values of the constants declared in the Counter class.\r
+   * returns Counter.NO_SUCH_TYPE if the string is not well formed.\r
+   */\r
+  public static int get_type (String counter_type) {\r
+    if (counter_type.length() == 0) return NO_SUCH_TYPE();\r
+    char c = counter_type.charAt (0);\r
+    if (c >= 'a' && c <= 'z')\r
+      return ALPHA_LOWER();\r
+    if (c >= 'A' && c <= 'Z')\r
+      return ALPHA_UPPER();\r
+    if (c == 'i' || c == 'v' || c == 'x' ||c == 'l' || c == 'c' || c == 'm')\r
+      return ROMAN_LOWER();\r
+    if (c == 'I' || c == 'V' || c == 'X' ||c == 'L' || c == 'C' || c == 'M')\r
+      return ROMAN_LOWER();\r
+    if (c >= '0' && c <= '9')\r
+      return ARABIC();\r
+    return NO_SUCH_TYPE();\r
+  }\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/Engine.java b/Robust/src/Benchmarks/mlp/tagger/mlp-java/Engine.java
new file mode 100644 (file)
index 0000000..5c3d52c
--- /dev/null
@@ -0,0 +1,78 @@
+/**\r
+ * Engine class\r
+ * Maps token types to actions\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/06/01\r
+ */\r
+\r
+//package tagger;\r
+//import java.util.*;\r
+\r
+public class Engine {\r
+  /**\r
+   * There are some very tricky concurrent modification issues with this class.\r
+   * Can't execute a register or unregister method during an execution of consume_token\r
+   * if the register or unregister affects the same list of actions associated with the token.\r
+   * This means that during a consume_token for some type, can't register or unregister for\r
+   * that type, or for the all types.\r
+   * Note that a version of the perform method of action takes an iterator argument to\r
+   * allow an action to remove itself.\r
+   */\r
+  \r
+  // array of Action lists indexed on token type\r
+  private LinkedList [] actions;\r
+\r
+  // actions performed for all token types\r
+  private LinkedList default_actions;\r
+\r
+  public Engine () {\r
+    actions = new LinkedList [Token.MAXTOKEN() + 1];\r
+    for (int i = 0; i < actions.length; i++)\r
+      actions[i] = new LinkedList ();\r
+    default_actions = new LinkedList ();\r
+  }\r
+\r
+  public void register_by_type (Action action, int type) {\r
+    register_by_type_front (action, type);\r
+  }\r
+\r
+  public void register_for_all (Action action) {\r
+    default_actions.addFirst (action);\r
+  }\r
+\r
+  public void unregister_for_all (Action action) {\r
+    default_actions.remove (action);\r
+  }\r
+\r
+  public void register_by_type_front (Action action, int type) {\r
+    Assert.assert_ (type >= 0);\r
+    Assert.assert_ (type <= Token.MAXTOKEN());\r
+    actions[type].addFirst (action);\r
+  }\r
+\r
+  public void register_by_type_back (Action action, int type) {\r
+    Assert.assert_ (type >= 0);\r
+    Assert.assert_ (type <= Token.MAXTOKEN());\r
+    actions[type].addLast (action);\r
+  }\r
+\r
+  public void unregister_by_type (Action action, int type) {\r
+    Assert.assert_ (type >= 0);\r
+    Assert.assert_ (type <= Token.MAXTOKEN());\r
+    actions[type].remove (action);\r
+  }\r
+\r
+  public void consume_token (Token token) {\r
+    perform_actions (default_actions, token);\r
+    perform_actions (actions[token.type], token);\r
+  }\r
+  \r
+  public static void perform_actions (LinkedList actions, Token token) {\r
+    Iterator i = actions.iterator ();\r
+    while (i.hasNext ()) {\r
+      Action a = (Action) i.next ();\r
+      a.perform (token, i);\r
+    }\r
+  }\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/Generator.java b/Robust/src/Benchmarks/mlp/tagger/mlp-java/Generator.java
new file mode 100644 (file)
index 0000000..80a72d3
--- /dev/null
@@ -0,0 +1,43 @@
+/**\r
+ * Generator interface\r
+ * Generic backend tagged text generator\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/08/01\r
+ */\r
+\r
+//package tagger;\r
+//import java.io.*;\r
+//import java.util.*;\r
+\r
+public /*interface*/ class Generator {\r
+  \r
+  // formats to pass to push_format\r
+  public static int ROMAN      () { return  0; }\r
+  public static int ITALICS    () { return  1; }\r
+  public static int BOLD       () { return  2; }\r
+  public static int SUBSCRIPT  () { return  3; }\r
+  public static int SUPERSCRIPT() { return  4; }\r
+  \r
+  // prints new line to output\r
+  void linefeed (){}\r
+  \r
+  void new_para (String style){}\r
+  \r
+  // inserts code for new line\r
+  void new_line (){}\r
+  \r
+  void special_char (String font, String index){}\r
+  \r
+  // for dashes, ellipses, etc\r
+  void special_char (String index){}\r
+  \r
+  void plaintext (String text){}\r
+  void push_format (int format){}\r
+  void pop_format (){}\r
+  \r
+  // turn output suppression on and off\r
+  void suppress_on (){}\r
+  void suppress_off (){}\r
+  \r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/Numbering.java b/Robust/src/Benchmarks/mlp/tagger/mlp-java/Numbering.java
new file mode 100644 (file)
index 0000000..b46c1cb
--- /dev/null
@@ -0,0 +1,196 @@
+/**\r
+ * Numbering class\r
+ * Provides special navigations for numbering\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/03/01\r
+ */\r
+\r
+//package tagger;\r
+//import java.io.*;\r
+//import java.util.*;\r
+\r
+public class Numbering {\r
+  private PropertyMap style_map;\r
+\r
+  public static String PARENT_PROPNAME   () { return  "parent";   }\r
+  public static String CHILD_PROPNAME    () { return  "child";    }\r
+  public static String ROOT_PROPNAME     () { return  "root";     }\r
+  public static String COUNTER_PROPNAME  () { return  "counter";  }\r
+  public static String SEPARATOR_PROPNAME() { return  "separator";}\r
+  public static String LEADER_PROPNAME   () { return  "leader";   }\r
+  public static String TRAILER_PROPNAME  () { return  "trailer";  }\r
+\r
+  /*\r
+   * The graph structure of the numbering relations is represented using\r
+   * properties in the paragraph style property map.\r
+   * Each style is mapped to its root -- the ancestor with no parent in the\r
+   * numbering relationship -- and to its parent and child.\r
+   * The child and root properties are added; the parent property is given\r
+   * in the style sheet file.\r
+   *\r
+   * If a style is numbered, its ancestors must be also.\r
+   * This property is not currently checked.\r
+   */\r
+  \r
+  /*\r
+   * Representation invariant\r
+   *\r
+   * Definition: A style is numbered if it has a counter property.\r
+   * A numbered style has a root property.\r
+   * A root style has itself as root and has no parent.\r
+   * There is a bidirectional parent/child chain from a style to its root\r
+   *\r
+   * Checking that style sheet is well formed?\r
+   */\r
+  \r
+\r
+  // maps paragraph style names to counters\r
+  // styles that are not numbered are not mapped\r
+  private HashMap counter_map; // String -> Counter\r
+\r
+  /**\r
+   * ensures: constructs a Numbering\r
+   * not well formed until incorporate called\r
+   */\r
+  public Numbering (PropertyMap style_map) {\r
+    this.style_map = style_map;\r
+    counter_map = new HashMap ();\r
+  }\r
+  \r
+  /**\r
+   * ensures: constructs a Numbering\r
+   * modifies: property lists in style_map\r
+   */\r
+  /*\r
+    public Numbering (PropertyMap style_map) {\r
+    this.style_map = style_map;\r
+    add_extra_properties (style_map);\r
+    initialize_counters (style_map);\r
+    }\r
+  */\r
+  \r
+  /**\r
+   * ensures: constructs a Numbering using current entries in style_map\r
+   * modifies: property lists in style_map\r
+   */\r
+  public void incorporate () {\r
+    add_extra_properties ();\r
+    initialize_counters ();\r
+  }\r
+  \r
+  /*\r
+   * requires: all ancestor and descendant styles of style are numbered iff style is numbered\r
+   * ensures: returns the numbering string for a new paragraph whose style name is _style_\r
+   *\r
+   * format of numbering string is:\r
+   * <mytrailer><rootcounter><rootseparator>...<counter><separator>...<mycounter><mytrailer>\r
+   */\r
+  public String get_numbering_string (String style) {\r
+    // return empty string if style is not numbered\r
+    if (!style_has_property (style, COUNTER_PROPNAME())) return "";\r
+    \r
+    // initialize numbering string to leader\r
+    String leader = style_map.get_property (style, LEADER_PROPNAME());\r
+    String numbering = leader == null ? "" : leader;\r
+    \r
+    // append numbering for each style from root to this style\r
+    // each followed by its separator\r
+    String s = style_map.get_property (style, ROOT_PROPNAME());\r
+    Assert.assert_ (s != null);\r
+    while (! s.equals (style)) {\r
+      numbering += ((Counter) counter_map.get(s)).unparse ();\r
+      String separator = style_map.get_property (s, SEPARATOR_PROPNAME());\r
+      numbering += separator == null ? "" : separator;\r
+      s = style_map.get_property (s, CHILD_PROPNAME());\r
+    }\r
+    \r
+    // increment numbering for this style and append its string\r
+    Counter c = (Counter) counter_map.get (s);\r
+    boolean success = c.increment ();\r
+    if (!success)\r
+      System.out.println ("Counter overrun for style: " + style);\r
+    numbering += c.unparse ();\r
+    \r
+    // append trailer\r
+    String trailer = style_map.get_property (s, TRAILER_PROPNAME());\r
+    numbering += trailer == null ? "" : trailer;\r
+    \r
+    // reset counters for all descendant styles\r
+    s = style_map.get_property (s, CHILD_PROPNAME());\r
+    while (s != null) {\r
+      c = (Counter) counter_map.get (s);\r
+      c.reset ();\r
+      s = style_map.get_property (s, CHILD_PROPNAME());\r
+    }\r
+    return numbering;\r
+  }\r
+  \r
+  private void add_extra_properties () {\r
+    add_child_property ();\r
+    add_root_property ();\r
+  }\r
+  \r
+  // for each style with a counter property, insert into counter_map\r
+  private void initialize_counters () {\r
+    HashSet styles = style_map.get_items ();\r
+    Iterator iter = (Iterator) styles.iterator ();\r
+    while (iter.hasNext ()) {\r
+      String style = (String) iter.next ();\r
+      if (style_has_property (style, COUNTER_PROPNAME())) {\r
+       // get counter type (arabic, roman, etc)\r
+       String count_prop = style_map.get_property (style, COUNTER_PROPNAME());\r
+       int count_type = Counter.get_type (count_prop);\r
+       if (count_type == Counter.NO_SUCH_TYPE()) {\r
+         System.out.println ("Bad counter type for style " + style + ": " + count_prop);\r
+         // and insert into counter_map anyway to preserve rep invariant\r
+         // so must check counter type when counter is created and default if bad\r
+       }\r
+       counter_map.put (style, new Counter (count_prop, style));\r
+      }\r
+    }\r
+  }\r
+  \r
+  // add to each style that is a parent of another style a child property to it\r
+  private void add_child_property () {\r
+    HashSet styles = style_map.get_items ();\r
+    Iterator iter = (Iterator) styles.iterator ();\r
+    while (iter.hasNext ()) {\r
+      String style = (String) iter.next ();\r
+      String pstyle = (String) style_map.get_property (style, PARENT_PROPNAME());\r
+      // if parent exists, add child property to it\r
+      if (pstyle != null) {\r
+       LinkedList props = style_map.get_property_list (pstyle);\r
+       props.add (new Property (CHILD_PROPNAME(), style));\r
+      }\r
+    }\r
+  }\r
+  \r
+  // add root property to each numbered style\r
+  private void add_root_property () {\r
+    HashSet styles = style_map.get_items ();\r
+    Iterator iter = (Iterator) styles.iterator ();\r
+    while (iter.hasNext ()) {\r
+      String style = (String) iter.next ();\r
+      if (!style_has_property (style, PARENT_PROPNAME())) {\r
+       // if no parent, then it's a root, so add root property for it and all descendants\r
+       String root = style;\r
+       while (style != null) {\r
+         LinkedList props = style_map.get_property_list (style);\r
+         props.add (new Property (ROOT_PROPNAME(), root));\r
+         style = style_map.get_property (style, CHILD_PROPNAME());\r
+       }\r
+      }\r
+    }\r
+  }\r
+  \r
+  // ensures: returns true iff style has property prop_name\r
+  private boolean style_has_property (String style, String prop_name) {\r
+    String p = (String) style_map.get_property (style, prop_name);\r
+    return p != null;\r
+  }\r
+  \r
+  public String toString () {\r
+    return "UNIMPLEMENTED";\r
+  }\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/Property.java b/Robust/src/Benchmarks/mlp/tagger/mlp-java/Property.java
new file mode 100644 (file)
index 0000000..7bb87e6
--- /dev/null
@@ -0,0 +1,25 @@
+/**\r
+ * Property class\r
+ * <p>\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/02/01\r
+ */\r
+\r
+//package tagger;\r
+//import java.io.*;\r
+//import java.util.*;\r
+\r
+public class Property {\r
+  public String property;\r
+  public String value;\r
+  \r
+  public Property (String p, String v) {\r
+    property = p;\r
+    value = v;\r
+  }\r
+\r
+  public String toString () {\r
+    return "<" + property + ":" + value + ">";\r
+  }\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/PropertyMap.java b/Robust/src/Benchmarks/mlp/tagger/mlp-java/PropertyMap.java
new file mode 100644 (file)
index 0000000..da94478
--- /dev/null
@@ -0,0 +1,88 @@
+/**\r
+ * PropertyMap class\r
+ * Maps identifiers to property lists\r
+ * Used for stylesheets, character maps, etc\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/03/01\r
+ */\r
+\r
+//package tagger;\r
+//import java.io.*;\r
+//import java.util.*;\r
+\r
+public class PropertyMap {\r
+  private HashMap map; // String -> LinkedList [Property]\r
+  private HashSet keys;\r
+\r
+  /**\r
+   * ensures: constructs an empty property map\r
+   */\r
+  public PropertyMap () {\r
+    map = new HashMap ();\r
+    keys = new HashSet();\r
+  }\r
+\r
+  /**\r
+   * ensures: constructs a property map using the parser <code>p</code>.\r
+   */\r
+  public PropertyMap (PropertyParser p) {\r
+    map = new HashMap ();\r
+    keys = new HashSet();\r
+       \r
+    while (p.has_more_properties ()) {\r
+      LinkedList props = p.get_property_list ();\r
+      Property prop = (Property) props.removeFirst ();\r
+      map.put (prop.value, props);\r
+      keys.add(prop.value);\r
+    }\r
+  }\r
+\r
+  /**\r
+   * ensures: incorporates properties using the parser <code>p</code>.\r
+   */\r
+  public void incorporate (PropertyParser p) {\r
+    \r
+    while (p.has_more_properties ()) {\r
+      LinkedList props = p.get_property_list ();\r
+      Property prop = (Property) props.removeFirst ();\r
+      map.put (prop.value, props);\r
+      keys.add(prop.value);\r
+    }\r
+       \r
+  }\r
+\r
+  /**\r
+   * @return the property list for item <code>item</code>. Returns null if no such item.\r
+   */\r
+  public LinkedList get_property_list (String item) {\r
+    return (LinkedList) map.get (item);\r
+  }\r
+\r
+  /**\r
+   * @return the value of property <code>prop</code> for item <code>item</code>\r
+   * or null if it does not exist\r
+   */\r
+  public String get_property (String item, String prop) {\r
+    LinkedList props = (LinkedList) map.get (item);\r
+    if (props == null) return null;\r
+    Iterator iter = props.iterator ();\r
+    while (iter.hasNext ()) {\r
+      Property p = (Property) iter.next ();\r
+      if (p.property.equals (prop))\r
+       return p.value;\r
+    }\r
+    return null;\r
+  }\r
+\r
+  /**\r
+   * @return the set of items with property lists in the map\r
+   */\r
+  public HashSet get_items () {\r
+    return keys; //map.keySet ();\r
+  }\r
+  \r
+  public String toString () {\r
+    return map.toString ();\r
+  }\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/PropertyParser.java b/Robust/src/Benchmarks/mlp/tagger/mlp-java/PropertyParser.java
new file mode 100644 (file)
index 0000000..f6738d7
--- /dev/null
@@ -0,0 +1,102 @@
+/**\r
+ * PropertyParser class\r
+ * Parses property files\r
+ * <p>\r
+ * <code>int</code>.\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/02/01\r
+ */\r
+\r
+//package tagger;\r
+//import java.io.*;\r
+//import java.util.*;\r
+\r
+public class PropertyParser {\r
+  private FileInputStream reader;\r
+  private String token;\r
+  private int next_char;\r
+\r
+  public PropertyParser (FileInputStream r) {\r
+    reader = r;\r
+    next_char = reader.read ();\r
+    consume_comments ();\r
+  }\r
+  \r
+  private void consume_comments () {\r
+    // consume lines that don't start with <\r
+    while (next_char != '<' && !is_eos (next_char)) {\r
+      if (!is_eol (next_char))\r
+       reader.readLine ();\r
+      consume_char ();\r
+    }\r
+  }\r
+  \r
+  private void consume_char () {\r
+    token += (char) next_char;\r
+    next_char = reader.read ();\r
+  }\r
+  \r
+  private void error (String msg) {\r
+    // correct to number from 1, not zero\r
+    //t line_number = reader.getLineNumber() + 1;\r
+    System.out.println (msg);\r
+  }\r
+  \r
+  public boolean has_more_properties () {\r
+    return (!is_eos (next_char));\r
+  }\r
+  \r
+  /**\r
+   * requires: next_char contains next character in reader <p>\r
+   * ensures: returns list of properties until end of line or stream <p>\r
+   *   according to the following syntax:\r
+   *           property list is sequence of properties followed by eol of eos\r
+   *           property is left-angle, property-name, colon, value, right-angle\r
+   *           property-name is alphanumeric string, but value is any char sequence\r
+   *   skips lines that do not start with <\r
+   *   reports syntax errors on this.error_reporter\r
+   *   Syntax\r
+   * @return list of properties until end of line or stream.\r
+   *   Notes: chose LinkedList because it provides removeFirst, to support common\r
+   *   case in which first property is removed (eg, because it's a style name)\r
+   */\r
+  public LinkedList get_property_list () {\r
+    LinkedList result = new LinkedList ();\r
+    while (!is_eol (next_char) && !is_eos(next_char))\r
+      result.add (get_property ());\r
+    consume_char ();\r
+    consume_comments ();\r
+    return result;\r
+  }\r
+  \r
+  private Property get_property () {\r
+    if (next_char != '<')\r
+      error ("Found " + next_char + " when expecting <");\r
+    consume_char ();\r
+    token = "";\r
+    while (is_alphanumeric (next_char)) consume_char ();\r
+    String property = token;\r
+    if (next_char != ':')\r
+      error ("Found " + next_char + " following " + token + " when expecting :");\r
+    consume_char ();\r
+    token = "";\r
+    while (next_char != '>' && !is_eol(next_char) && !is_eos (next_char))\r
+      consume_char ();\r
+    String value = token;\r
+    if (next_char != '>')\r
+      error ("Found " + next_char + " following " + token + " when expecting >");\r
+    consume_char ();\r
+    return new Property (property, value);\r
+  }\r
+  \r
+  static boolean is_eol (int c) {return c == '\n';}\r
+  static boolean is_eos (int c) {return c == -1;}\r
+  static boolean is_alphabetic (int c) {\r
+    return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';\r
+  }\r
+  static boolean is_numeric (int c) {return c >= '0' && c <= '9';}\r
+  static boolean is_alphanumeric (int c) {\r
+    return is_numeric (c) || is_alphabetic (c);\r
+  }\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/QuarkGenerator.java b/Robust/src/Benchmarks/mlp/tagger/mlp-java/QuarkGenerator.java
new file mode 100644 (file)
index 0000000..981d68a
--- /dev/null
@@ -0,0 +1,100 @@
+/**\r
+ * QuarkGenerator interface\r
+ * Backend tagged text generator for QuarkXpress\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/08/01\r
+ */\r
+\r
+//package tagger;\r
+//import java.io.*;\r
+//import java.util.*;\r
+\r
+public class QuarkGenerator extends Generator {\r
+  FileOutputStream output_stream;\r
+  LinkedList format_stack;\r
+  private boolean on;\r
+\r
+  public QuarkGenerator (FileOutputStream s) {\r
+    on = true;\r
+    output_stream = s;\r
+    \r
+    // stack holds strings used to terminate formats\r
+    format_stack = new LinkedList ();\r
+  }\r
+  \r
+  public void suppress_on () {\r
+    on = false;\r
+  }\r
+  \r
+  public void suppress_off () {\r
+    on = true;\r
+  }\r
+\r
+  private void print (String s) {\r
+    if (on) output_stream.write (s.getBytes());\r
+  }\r
+\r
+  public void linefeed () {\r
+    if (on) output_stream.write ('\n');\r
+  }\r
+\r
+  // print "@style:"\r
+  public void new_para (String style) {\r
+    print ("@" + style + ":");\r
+  }\r
+\r
+  // print "<\n>"\r
+  public void new_line () {\r
+    print ("<\\n>");\r
+  }\r
+\r
+  public void special_char (String font, String index) {\r
+    print ("<f\"" + font + "\"><\\#" + index + "><f$>");\r
+  }\r
+\r
+  public void special_char (String index) {\r
+    print ("<\\#" + index + ">");\r
+  }\r
+\r
+  public void plaintext (String text) {\r
+    print (text);\r
+  }\r
+\r
+  public void push_format (int format) {\r
+    //switch (format) {\r
+\r
+    if( format == Generator.ROMAN() ||\r
+       format == Generator.ITALICS() ) {\r
+      print ("<I>");\r
+      format_stack.push ("<I>");\r
+      return;\r
+    }\r
+\r
+    if( format == Generator.BOLD() ) {\r
+      print ("<B>");\r
+      format_stack.push ("<B>");\r
+      return;\r
+    }\r
+\r
+    if( format == Generator.SUBSCRIPT() ) {\r
+      print ("<->");\r
+      format_stack.push ("<->");\r
+      return;\r
+    }\r
+\r
+    if( format == Generator.SUPERSCRIPT() ) {\r
+      print ("<+>");\r
+      format_stack.push ("<+>");\r
+      return;\r
+    }\r
+    \r
+    Assert.unreachable ();\r
+  }\r
+  \r
+  public void pop_format () {\r
+    // for now, handle too many pops without report\r
+    if (format_stack.isEmpty ()) return;\r
+    print ((String) format_stack.pop ());\r
+  }\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/SourceParser.java b/Robust/src/Benchmarks/mlp/tagger/mlp-java/SourceParser.java
new file mode 100644 (file)
index 0000000..5fe3717
--- /dev/null
@@ -0,0 +1,285 @@
+/**\r
+ * SourceParser class\r
+ * <p>\r
+ * <code>int</code>.\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/02/01\r
+ */\r
+\r
+//package tagger;\r
+//import java.io.*;\r
+//import java.util.*;\r
+\r
+public class SourceParser {\r
+  public static String loadcharmapcommand_name   () { return  "loadchars"; }\r
+  public static String loadstylesheetcommand_name() { return  "loadstyles";}\r
+  public static String preamblecommand_name      () { return  "preamble";  }\r
+  public static String refcommand_name           () { return  "ref";      }\r
+  public static String tagcommand_name           () { return  "tag";      }\r
+  public static String citecommand_name          () { return  "cite";     }\r
+  public static String separatorcommand_name     () { return  "sep";       }\r
+\r
+  private FileInputStream reader;\r
+\r
+  // holds set of strings recognized as paragraph styles\r
+  private HashSet parastyles;\r
+\r
+  // holds the previous value of next_char\r
+  private int last_char;\r
+  private int next_char;\r
+  private boolean within_single_quotes;\r
+  private boolean within_double_quotes;\r
+  private boolean at_start_of_line;\r
+  private String token;\r
+  \r
+  public SourceParser (FileInputStream reader, HashSet parastyles) {\r
+    this.reader = reader;\r
+    this.parastyles = parastyles;\r
+    next_char = reader.read ();\r
+    last_char = -1;\r
+    at_start_of_line = true;\r
+  }\r
+  \r
+  public boolean has_more_tokens () {\r
+    return (next_char != -1);\r
+  }\r
+  \r
+  private void consume_char () {\r
+    token += (char) next_char;\r
+    last_char = next_char;\r
+    next_char = reader.read ();\r
+  }\r
+\r
+  // consume until next close curly and return string excluding curly\r
+  private String consume_arg () {\r
+    consume_char (); // consume open curly\r
+    token = "";\r
+    consume_char ();\r
+    while (!is_close_curly (next_char) && !is_eol (next_char)) consume_char ();\r
+    String arg = token;\r
+    consume_char (); // consume close curly\r
+    return arg;\r
+  }\r
+  \r
+  /**\r
+   * requires: next_char contains next character in reader <p>\r
+   * ensures: returns next token according to one of these productions: <p>\r
+   * <blockquote><pre>\r
+   *           char-sequence = alphanumeric+\r
+   *           whitespace ::= (space | tab)+\r
+   *           command ::= slash alphanum* [star]\r
+   *           paragraph-break ::= <blank line>\r
+   *           line-break ::= slash slash\r
+   *           hyphen-sequence ::= hyphen+\r
+   *           dot-sequence ::= dot+\r
+   *           underscore ::= underscore\r
+   * </pre></blockquote>\r
+   *           quote characters, disambiguated by context:\r
+   *           open-single-quote: when not preceded by alphanumeric\r
+   *           close-single-quote: when not followed by alphanumeric and preceded by\r
+   *                   open-single-quote\r
+   *           open-double-quote: when not preceded by open-double-quote\r
+   *           close-double-quote: when preceded by open-double-quote\r
+   *           apostrophe: between alphanumerics, or when followed by numeric\r
+   *           prime: after alphanumeric, when not followed by alphanumeric,\r
+   *                   and not preceded by open-single-quote\r
+   * @return the next token.\r
+   *   explicitly returns end of stream token.\r
+   */\r
+  public Token get_token () {\r
+    token = new String ();\r
+    if (is_eos (next_char))\r
+      return new Token (Token.ENDOFSTREAM(), 0);\r
+    if (at_start_of_line) {\r
+      if (is_eol (next_char)) {\r
+       consume_char ();\r
+       within_single_quotes = false;\r
+       within_double_quotes = false;\r
+       return new Token (Token.PARABREAK(), 0);\r
+      }\r
+      else if (is_hash (next_char)) {\r
+       String line = reader.readLine ();\r
+       consume_char ();\r
+       return new Token (Token.COMMENT(), line, 0);\r
+      }\r
+      else\r
+       at_start_of_line = false;\r
+    }\r
+    if (is_eol (next_char)) {\r
+      consume_char ();\r
+      at_start_of_line = true;\r
+      if (is_eol (next_char)) {\r
+       consume_char ();\r
+       within_single_quotes = false;\r
+       within_double_quotes = false;\r
+       return new Token (Token.PARABREAK(), 0);\r
+      }\r
+      // check this\r
+      return new Token (Token.WHITESPACE(), " ", 0);\r
+    }\r
+    if (is_slash (next_char)) {\r
+      consume_char ();\r
+      token = "";\r
+      if (is_slash (next_char)) {\r
+       consume_char ();\r
+       return new Token (Token.LINEBREAK(), 0);\r
+      }\r
+      if (!is_alphabetic (next_char)) {\r
+       // next character assumed prefixed with slash to avoid special treatment\r
+       // eg, \< for <, \$ for $\r
+       token = new Character ((char) next_char).toString ();\r
+       return new Token (Token.OTHER(), token, 0);\r
+      }\r
+      while (is_alphanumeric (next_char)) consume_char ();\r
+      String command_name = token;\r
+      if (is_star (next_char)) consume_char ();\r
+      if (command_name.equals (preamblecommand_name())) {\r
+       return new Token (Token.PREAMBLECOMMAND(), 0);\r
+      }\r
+      if (command_name.equals (separatorcommand_name())) {\r
+       // consume whitespace until next token\r
+       while (is_whitespace (next_char)) consume_char ();\r
+       return new Token (Token.SEPARATORCOMMAND(), 0);\r
+      }\r
+      if (is_less_than (next_char)) {\r
+       consume_char ();\r
+       return new Token (Token.FORMATCOMMAND(), command_name, 0);\r
+      }\r
+      if (is_open_curly (next_char)) {\r
+       String arg = consume_arg ();\r
+       if (command_name.equals (loadcharmapcommand_name())) {\r
+         return new Token (Token.LOADCHARMAPCOMMAND(), arg, 0);\r
+       }\r
+       if (command_name.equals (loadstylesheetcommand_name())) {\r
+         return new Token (Token.LOADSTYLESHEETCOMMAND(), arg, 0);\r
+       }\r
+       if (command_name.equals (refcommand_name())) {\r
+         return new Token (Token.REFCOMMAND(), arg, 0);\r
+       }\r
+       if (command_name.equals (tagcommand_name())) {\r
+         return new Token (Token.TAGCOMMAND(), arg, 0);\r
+       }\r
+       if (command_name.equals (citecommand_name())) {\r
+         return new Token (Token.CITECOMMAND(), arg, 0);\r
+       }\r
+      }\r
+      if (parastyles.contains (command_name)) {\r
+       while (is_whitespace (next_char)) consume_char ();\r
+       // paragraph style command consumes the first linebreak following it also\r
+       if (is_eol (next_char)) consume_char ();\r
+       return new Token (Token.PARASTYLECOMMAND(), command_name, 0);\r
+      }\r
+      else\r
+       // temporary\r
+       return new Token (Token.CHARCOMMAND(), command_name, 0);\r
+    }\r
+    if (is_alphabetic (next_char)) {\r
+      consume_char ();\r
+      while (is_alphabetic (next_char)) consume_char ();\r
+      return new Token (Token.ALPHABETIC(), token, 0);\r
+    }\r
+    if (is_numeric (next_char)) {\r
+      consume_char ();\r
+      while (is_numeric (next_char)) consume_char ();\r
+      return new Token (Token.NUMERIC(), token, 0);\r
+    }\r
+    if (is_whitespace (next_char)) {\r
+      consume_char ();\r
+      while (is_whitespace (next_char)) consume_char ();\r
+      if (is_eol (next_char)) {\r
+       consume_char ();\r
+       // check this\r
+       return new Token (Token.WHITESPACE(), " ", 0);\r
+      }\r
+      return new Token (Token.WHITESPACE(), token, 0);\r
+    }\r
+    if (is_hyphen (next_char)) {\r
+      consume_char ();\r
+      while (is_hyphen (next_char)) consume_char ();\r
+      return new Token (Token.HYPHENS(), token, 0);\r
+    }\r
+    if (is_dot (next_char)) {\r
+      consume_char ();\r
+      while (is_dot (next_char)) consume_char ();\r
+      return new Token (Token.DOTS(), token, 0);\r
+    }\r
+    if (is_underscore (next_char)) {\r
+      consume_char ();\r
+      return new Token (Token.UNDERSCORE(), 0);\r
+    }\r
+    if (is_dollar (next_char)) {\r
+      consume_char ();\r
+      return new Token (Token.DOLLAR(), 0);\r
+    }\r
+    if (is_greater_than (next_char)) {\r
+      consume_char ();\r
+      return new Token (Token.POPFORMATCOMMAND(), 0);\r
+    }\r
+    if (is_single_quote (next_char)) {\r
+      if (is_alphanumeric (last_char)) {\r
+       if (is_alphanumeric (next_char)) {\r
+         consume_char ();\r
+         return new Token (Token.APOSTROPHE(), 0);\r
+       }\r
+       else if (within_single_quotes) {\r
+         within_single_quotes = false;\r
+         consume_char ();\r
+         return new Token (Token.CLOSESINGLEQUOTE(), 0);\r
+       }\r
+       else {\r
+         consume_char ();\r
+         return new Token (Token.PRIME(), 0);\r
+       }\r
+      }\r
+      consume_char ();\r
+      if (is_numeric (next_char)) {\r
+       return new Token (Token.APOSTROPHE(), 0);\r
+      }\r
+      else {\r
+       within_single_quotes = true;\r
+       return new Token (Token.OPENSINGLEQUOTE(), 0);\r
+      }\r
+    }\r
+    if (is_double_quote (next_char)) {\r
+      consume_char ();\r
+      if (within_double_quotes) {\r
+       within_double_quotes = false;\r
+       return new Token (Token.CLOSEDOUBLEQUOTE(), 0);\r
+      }\r
+      else {\r
+       within_double_quotes = true;\r
+       return new Token (Token.OPENDOUBLEQUOTE(), 0);\r
+      }\r
+    }\r
+    consume_char ();\r
+    return new Token (Token.OTHER(), token, 0);\r
+  }\r
+\r
+  static boolean is_eol (int c) {return c == '\n';}\r
+  static boolean is_eos (int c) {return c == -1;}\r
+  static boolean is_star (int c) {return c == '*';}\r
+  static boolean is_hash (int c) {return c == '#';}\r
+  static boolean is_dot (int c) {return c == '.';}\r
+  static boolean is_slash (int c) {return c == '\\';}\r
+  static boolean is_hyphen (int c) {return c == '-';}\r
+  static boolean is_underscore (int c) {return c == '_';}\r
+  static boolean is_dollar (int c) {return c == '$';}\r
+  static boolean is_single_quote (int c) {return c == '\'';}\r
+  static boolean is_double_quote (int c) {return c == '\"';}\r
+  static boolean is_open_curly (int c) {return c == '{';}\r
+  static boolean is_close_curly (int c) {return c == '}';}\r
+  static boolean is_less_than (int c) {return c == '<';}\r
+  static boolean is_greater_than (int c) {return c == '>';}\r
+  \r
+  // should perhaps use Character.isLetter? not sure, because that allows Unicode chars for\r
+  // other languages that are outside the a-Z range.\r
+  static boolean is_alphabetic (int c) {\r
+    return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';\r
+  }\r
+  static boolean is_numeric (int c) {return c >= '0' && c <= '9';}\r
+  static boolean is_alphanumeric (int c) {\r
+    return is_numeric (c) || is_alphabetic (c);\r
+  }\r
+  static boolean is_whitespace (int c) {return c == ' ' || c == '\t';}\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/StandardEngine.java b/Robust/src/Benchmarks/mlp/tagger/mlp-java/StandardEngine.java
new file mode 100644 (file)
index 0000000..89a303f
--- /dev/null
@@ -0,0 +1,203 @@
+/**\r
+ * StandardEngine class\r
+ * Standard registration of actions\r
+ * Implemented as a subclass of Engine for no good reason\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/08/01\r
+ */\r
+\r
+//package tagger;\r
+//import java.io.*;\r
+//import java.util.*;\r
+\r
+\r
+// a hack to work around lack of proper closures in Java\r
+// can't assign to local variable within actions\r
+class StringBox {\r
+  String string;\r
+  StringBox (String s) {string = s;}\r
+  void set (String s) {string = s;}\r
+}\r
+\r
+\r
+public class StandardEngine extends Engine {\r
+\r
+  //static Engine STANDARD;\r
+\r
+  // reserved words for property files\r
+\r
+  // character table\r
+  static public String index_prop_name           () { return "index";         }\r
+  static public String font_prop_name            () { return "font";         }\r
+                                                                             \r
+  static public String apostrophe_char_name      () { return "quoteright";    }\r
+  static public String prime_char_name           () { return "prime";        }\r
+  static public String opensinglequote_char_name () { return "quoteleft";     }\r
+  static public String closesinglequote_char_name() { return "quoteright";    }\r
+  static public String opendoublequote_char_name () { return "quotedblleft";  }\r
+  static public String closedoublequote_char_name() { return "quotedblright"; }\r
+  static public String hyphen_char_name          () { return "hyphen";       }\r
+  static public String endash_char_name          () { return "endash";       }\r
+  static public String emdash_char_name          () { return "emdash";       }\r
+  static public String period_char_name          () { return "period";       }\r
+  static public String twodotleader_char_name    () { return "twodotleader";  }\r
+  static public String ellipsis_char_name        () { return "ellipsis";      }\r
+                                                                             \r
+  static public String ROMAN_COMMANDNAME         () { return "roman";        }\r
+  static public String BOLD_COMMANDNAME          () { return "bold";         }\r
+  static public String ITALICS_COMMANDNAME       () { return "italic";       }\r
+  static public String SUBSCRIPT_COMMANDNAME     () { return "sub";          }\r
+  static public String SUPERSCRIPT_COMMANDNAME   () { return "sup";          }\r
+                                                                             \r
+  // style sheet                                                             \r
+  static public String next_style_prop_name      () { return "next";         }\r
+  static public String default_style_name        () { return "body";          }\r
+\r
+  \r
+  public StandardEngine (\r
+                        final Generator generator,\r
+                        final PropertyMap style_map,\r
+                        final FileOutputStream index_stream\r
+                        ) {\r
+    Engine();\r
+    \r
+    final PropertyMap char_map = new PropertyMap ();\r
+    final Numbering numbering = new Numbering (style_map);\r
+    \r
+    final StringBox current_para_style = new StringBox (default_style_name());\r
+\r
+    // special action for start of paragraph\r
+    // created once, but dynamically inserted and removed\r
+    // so that it's performed once at the start of each paragraph\r
+    final Action paragraph_action = new ParagraphAction ( generator,\r
+                                                         current_para_style,\r
+                                                         numbering );\r
+    \r
+    register_by_type (new PlaintextAction (generator),\r
+                     Token.ALPHABETIC());\r
+    \r
+    register_by_type (new PlaintextAction (generator),\r
+                     Token.NUMERIC());\r
+    \r
+    register_by_type (new PlaintextAction (generator),\r
+                     Token.WHITESPACE());\r
+    \r
+    register_by_type (new NewlineAction (generator),\r
+                     Token.LINEBREAK());\r
+    \r
+    register_by_type (new ApostropheAction (generator, char_map),\r
+                     Token.APOSTROPHE());\r
+    \r
+    register_by_type (new PrimeAction (generator, char_map),\r
+                     Token.PRIME());\r
+\r
+    register_by_type (new OpenSingleQuoteAction (generator, char_map),\r
+                     Token.OPENSINGLEQUOTE());\r
+    \r
+    register_by_type (new CloseSingleQuoteAction (generator, char_map),\r
+                     Token.CLOSESINGLEQUOTE());\r
+    \r
+    register_by_type (new OpenDoubleQuoteAction (generator, char_map),\r
+                     Token.OPENDOUBLEQUOTE());\r
+    \r
+    register_by_type (new CloseDoubleQuoteAction (generator, char_map),\r
+                     Token.CLOSEDOUBLEQUOTE());\r
+    \r
+    register_by_type (new HyphenAction (generator, char_map),\r
+                     Token.HYPHENS());\r
+    \r
+    register_by_type (new DotsAction (generator, char_map),\r
+                     Token.DOTS());\r
+    \r
+    register_by_type (new LoadCharMapCommandAction (generator,\r
+                                                   char_map,\r
+                                                   numbering),\r
+                     Token.LOADCHARMAPCOMMAND());\r
+    \r
+    register_by_type (new LoadStyleSheetCommandAction (generator,\r
+                                                      style_map,\r
+                                                      numbering),\r
+                     Token.LOADSTYLESHEETCOMMAND());\r
+    \r
+    final Action unsuppress_action = new UnsuppressAction (generator);\r
+    \r
+    // preamble command switches on output suppression\r
+    // registers action to turn suppression off with paragraph break command\r
+    register_by_type (new PreambleCommandAction (generator,\r
+                                                unsuppress_action,\r
+                                                this ),\r
+                     Token.PREAMBLECOMMAND());\r
+    \r
+    register_by_type (new ParaBreakAction (paragraph_action,\r
+                                          current_para_style,\r
+                                          style_map),\r
+                     Token.PARABREAK());\r
+    \r
+    register_by_type (new ParaStyleCommandAction (current_para_style),\r
+                     Token.PARASTYLECOMMAND());\r
+    \r
+    register_by_type (new CharCommandAction (generator,\r
+                                            char_map),\r
+                     Token.CHARCOMMAND());\r
+    \r
+    register_by_type (new UnderscoreAction (generator) {},\r
+                     Token.UNDERSCORE());\r
+    \r
+    // used to italicize alphabetic tokens in math mode\r
+    final Action push_italics_action = new PushItalicsAction (generator);\r
+    final Action pop_italics_action = new PopItalicsAction (generator);\r
+    \r
+    register_by_type (new DollarAction (push_italics_action,\r
+                                       pop_italics_action),\r
+                     Token.DOLLAR());\r
+    \r
+    register_by_type (new FormatCommandAction (generator),\r
+                     Token.FORMATCOMMAND());\r
+    \r
+    register_by_type (new PopFormatCommandAction (generator),\r
+                     Token.POPFORMATCOMMAND());\r
+    \r
+    register_by_type (new OtherAction (generator),\r
+                     Token.OTHER());\r
+    \r
+    register_by_type (new EndOfStreamAction (generator),\r
+                     Token.ENDOFSTREAM());\r
+    \r
+    //STANDARD = this;\r
+  }\r
+  \r
+  /* no actions for these token types:\r
+     COMMENT\r
+     SEPARATORCOMMAND\r
+  */\r
+  \r
+  /*\r
+    not yet coded:\r
+    \r
+    public static final int REFCOMMAND = 32;\r
+    public static final int TAGCOMMAND = 33;\r
+    public static final int CITECOMMAND = 34;\r
+  */\r
+  \r
+  \r
+  /* general form of action registration is this:\r
+     register_by_type (new Action () {\r
+     public void perform (Token t) {\r
+     // put code to be executed for token type here\r
+     }},\r
+     Token.TYPENAME);\r
+  */\r
+      \r
+  static public void put_special_char (Generator generator, \r
+                                      PropertyMap char_map,\r
+                                      String char_name,                \r
+                                      int line) {\r
+    String index = char_map.get_property (char_name, index_prop_name());\r
+    if (index == null) {\r
+      System.out.println (line + ": Unresolved character: " + char_name);\r
+    }\r
+    else\r
+      generator.special_char (index);\r
+  }\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/Tagger.java b/Robust/src/Benchmarks/mlp/tagger/mlp-java/Tagger.java
new file mode 100644 (file)
index 0000000..ed66fed
--- /dev/null
@@ -0,0 +1,70 @@
+/**\r
+ * Tagger class\r
+ * Main class of Tagger application\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/02/01\r
+ */\r
+\r
+\r
+//package tagger;\r
+//import java.io.*;\r
+//import java.util.*;\r
+\r
+public class Tagger {\r
+\r
+  // holds mapping of token types to actions\r
+  //Engine engine;\r
+\r
+  /**\r
+   * The main method of the Tagger application.\r
+   * @param args The command line arguments, described in usage method\r
+   */\r
+  public static void main (String[] args) {\r
+    check_usage (args);\r
+\r
+    String base_name = args[0];\r
+    String source_file_name = base_name + ".txt";\r
+    String output_file_name = base_name + ".tag.txt";\r
+    String index_file_name = base_name + ".index.txt";\r
+    FileInputStream input_stream;\r
+    FileOutputStream output_stream;\r
+    FileOutputStream index_stream;\r
+    \r
+    input_stream = new FileInputStream(source_file_name);\r
+    output_stream = new FileOutputStream(output_file_name);\r
+    index_stream = new FileOutputStream(index_file_name);\r
+\r
+    // for now, hardwire to Quark\r
+    Generator generator = new QuarkGenerator (output_stream);\r
+\r
+    PropertyMap style_map = new PropertyMap ();\r
+    Engine engine = new StandardEngine (generator, style_map, index_stream);\r
+\r
+    consume_source (engine, style_map, input_stream);\r
+\r
+    output_stream.close ();\r
+  }\r
+  \r
+  public static void consume_source (Engine engine, \r
+                                    PropertyMap style_map,\r
+                                    FileInputStream source_reader) {\r
+    HashSet para_styles = style_map.get_items ();\r
+    SourceParser p = new SourceParser (source_reader, para_styles);\r
+    Token token;\r
+    while (p.has_more_tokens ()) {\r
+      token = p.get_token ();\r
+      engine.consume_token (token);\r
+    }\r
+    // consume end of stream token explicitly\r
+    // depends on get_token returning ENDOFSTREAM token when no more tokens\r
+    token = p.get_token ();\r
+    engine.consume_token (token);\r
+  }\r
+  \r
+  static void check_usage (String args []) {\r
+    if (args.length == 0) {\r
+      System.out.println ("one argument required, should be name of source file, excluding .txt extension");\r
+    }\r
+  }  \r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/Token.java b/Robust/src/Benchmarks/mlp/tagger/mlp-java/Token.java
new file mode 100644 (file)
index 0000000..fc99c39
--- /dev/null
@@ -0,0 +1,71 @@
+/**\r
+ * Token class\r
+ * Represents tokens generated by lexer\r
+ * <p>\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/06/01\r
+ */\r
+\r
+//package tagger;\r
+//import java.io.*;\r
+//import java.util.*;\r
+\r
+public class Token {\r
+  // may be null\r
+  public String arg;\r
+  public int line;\r
+  public int type;\r
+\r
+  public static final int COMMENT              () { return  0;  }\r
+  public static final int WHITESPACE           () { return  1; }\r
+  public static final int ALPHABETIC           () { return  2; }\r
+  public static final int NUMERIC              () { return  3; }\r
+\r
+  public static final int PARABREAK            () { return  4; }\r
+  public static final int LINEBREAK            () { return  5; }\r
+\r
+  public static final int APOSTROPHE           () { return  10;        }\r
+  public static final int PRIME                () { return  11;        }\r
+  public static final int OPENSINGLEQUOTE      () { return  12;        }\r
+  public static final int CLOSESINGLEQUOTE     () { return  13;        }\r
+  public static final int OPENDOUBLEQUOTE      () { return  14;        }\r
+  public static final int CLOSEDOUBLEQUOTE     () { return  15;        }\r
+  public static final int HYPHENS              () { return  16;        }\r
+  public static final int DOTS                 () { return  17;        }\r
+\r
+  public static final int PARASTYLECOMMAND     () { return  20;        }\r
+  public static final int FORMATCOMMAND        () { return  21;        }\r
+  public static final int POPFORMATCOMMAND     () { return  22;        }\r
+  public static final int REFCOMMAND           () { return  23;        }\r
+  public static final int TAGCOMMAND           () { return  24;        }\r
+  public static final int CITECOMMAND          () { return  25;        }\r
+  public static final int CHARCOMMAND          () { return  26;        }\r
+  public static final int LOADCHARMAPCOMMAND   () { return  27;        }\r
+  public static final int LOADSTYLESHEETCOMMAND() { return  28;        }\r
+  public static final int PREAMBLECOMMAND      () { return  29;        }\r
+  public static final int SEPARATORCOMMAND     () { return  30;        }\r
+\r
+  public static final int UNDERSCORE           () { return  31;        }\r
+  public static final int DOLLAR               () { return  32;        }\r
+  public static final int OTHER                () { return  33;        }\r
+  public static final int ENDOFSTREAM          () { return  34;        }\r
+\r
+  public static final int MAXTOKEN             () { return  34; }\r
+  \r
+  public Token (int type, String arg, int line) {\r
+    this.type = type;\r
+    this.arg = arg;\r
+    this.line = line;\r
+  }\r
+  \r
+  public Token (int type, int line) {\r
+    this.type = type;\r
+    this.line = line;\r
+  }\r
+\r
+  // temporary implementation\r
+  public String toString () {\r
+    return arg;\r
+  }\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/charmap.txt b/Robust/src/Benchmarks/mlp/tagger/mlp-java/charmap.txt
new file mode 100644 (file)
index 0000000..cc4ab0e
--- /dev/null
@@ -0,0 +1,31 @@
+# basic characters\r
+<char:linebreak><index:22>\r
+\r
+# dots\r
+<char:cdot><index:22>\r
+\r
+# quotes\r
+<char:quote><index:22>\r
+<char:quoteleft><index:22>\r
+<char:quoteright><index:22>\r
+<char:quotedblleft><index:22>\r
+<char:quotedblright><index:22>\r
+\r
+#dashes\r
+<char:hyphen><index:22>\r
+<char:endash><index:22>\r
+<char:emdash><index:22>\r
+\r
+# math symbols\r
+<char:oplus><index:22>\r
+<char:langle><index:22>\r
+<char:rangle><index:22>\r
+<char:textarrow><index:22>\r
+<char:hat><index:22>\r
+<char:fatsemi><index:22>\r
+<char:forall><index:22>\r
+<char:fatdot><index:22>\r
+<char:fatsemi><index:22>\r
+<char:implies><index:22>\r
+<char:exists><index:22>\r
+<char:and><index:22>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/lucmathext-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/mlp-java/lucmathext-charmap.txt
new file mode 100644 (file)
index 0000000..623b304
--- /dev/null
@@ -0,0 +1,130 @@
+# character map for Lucida New Math Extended font\r
+\r
+<char:parenleftbig><font:LucidNewMatExtT><index:161>\r
+<char:parenrightbig><font:LucidNewMatExtT><index:162>\r
+<char:bracketleftbig><font:LucidNewMatExtT><index:163>\r
+<char:bracketrightbig><font:LucidNewMatExtT><index:164>\r
+<char:floorleftbig><font:LucidNewMatExtT><index:165>\r
+<char:floorrightbig><font:LucidNewMatExtT><index:166>\r
+<char:ceilingleftbig><font:LucidNewMatExtT><index:167>\r
+<char:ceilingrightbig><font:LucidNewMatExtT><index:168>\r
+<char:braceleftbig><font:LucidNewMatExtT><index:169>\r
+<char:bracerightbig><font:LucidNewMatExtT><index:170>\r
+<char:angbracketleftbig><font:LucidNewMatExtT><index:173>\r
+<char:angbracketrightbig><font:LucidNewMatExtT><index:174>\r
+<char:vextendsingle><font:LucidNewMatExtT><index:175>\r
+<char:vextenddouble><font:LucidNewMatExtT><index:176>\r
+<char:slashbig><font:LucidNewMatExtT><index:177>\r
+<char:backslashbig><font:LucidNewMatExtT><index:178>\r
+<char:parenleftBig><font:LucidNewMatExtT><index:179>\r
+<char:parenrightBig><font:LucidNewMatExtT><index:180>\r
+<char:parenleftbigg><font:LucidNewMatExtT><index:181>\r
+<char:parenrightbigg><font:LucidNewMatExtT><index:182>\r
+<char:bracketleftbigg><font:LucidNewMatExtT><index:183>\r
+<char:bracketrightbigg><font:LucidNewMatExtT><index:184>\r
+<char:floorleftbigg><font:LucidNewMatExtT><index:185>\r
+<char:floorrightbigg><font:LucidNewMatExtT><index:186>\r
+<char:ceilingleftbigg><font:LucidNewMatExtT><index:187>\r
+<char:ceilingrightbigg><font:LucidNewMatExtT><index:188>\r
+<char:braceleftbigg><font:LucidNewMatExtT><index:189>\r
+<char:bracerightbigg><font:LucidNewMatExtT><index:190>\r
+<char:angbracketleftbigg><font:LucidNewMatExtT><index:28>\r
+<char:angbracketrightbigg><font:LucidNewMatExtT><index:29>\r
+<char:slashbigg><font:LucidNewMatExtT><index:193>\r
+<char:backslashbigg><font:LucidNewMatExtT><index:194>\r
+<char:parenleftBigg><font:LucidNewMatExtT><index:195>\r
+<char:parenrightBigg><font:LucidNewMatExtT><index:33>\r
+<char:bracketleftBigg><font:LucidNewMatExtT><index:34>\r
+<char:bracketrightBigg><font:LucidNewMatExtT><index:35>\r
+<char:floorleftBigg><font:LucidNewMatExtT><index:36>\r
+<char:floorrightBigg><font:LucidNewMatExtT><index:37>\r
+<char:ceilingleftBigg><font:LucidNewMatExtT><index:38>\r
+<char:ceilingrightBigg><font:LucidNewMatExtT><index:39>\r
+<char:braceleftBigg><font:LucidNewMatExtT><index:40>\r
+<char:bracerightBigg><font:LucidNewMatExtT><index:41>\r
+<char:angbracketleftBigg><font:LucidNewMatExtT><index:42>\r
+<char:angbracketrightBigg><font:LucidNewMatExtT><index:43>\r
+<char:slashBigg><font:LucidNewMatExtT><index:44>\r
+<char:backslashBigg><font:LucidNewMatExtT><index:45>\r
+<char:slashBig><font:LucidNewMatExtT><index:46>\r
+<char:backslashBig><font:LucidNewMatExtT><index:47>\r
+<char:parenlefttp><font:LucidNewMatExtT><index:48>\r
+<char:parenrighttp><font:LucidNewMatExtT><index:49>\r
+<char:bracketlefttp><font:LucidNewMatExtT><index:50>\r
+<char:bracketrighttp><font:LucidNewMatExtT><index:51>\r
+<char:bracketleftbt><font:LucidNewMatExtT><index:52>\r
+<char:bracketrightbt><font:LucidNewMatExtT><index:53>\r
+<char:bracketleftex><font:LucidNewMatExtT><index:54>\r
+<char:bracketrightex><font:LucidNewMatExtT><index:55>\r
+<char:bracelefttp><font:LucidNewMatExtT><index:56>\r
+<char:bracerighttp><font:LucidNewMatExtT><index:57>\r
+<char:braceleftbt><font:LucidNewMatExtT><index:58>\r
+<char:bracerightbt><font:LucidNewMatExtT><index:59>\r
+<char:braceleftmid><font:LucidNewMatExtT><index:60>\r
+<char:bracerightmid><font:LucidNewMatExtT><index:61>\r
+<char:braceex><font:LucidNewMatExtT><index:62>\r
+<char:arrowvertex><font:LucidNewMatExtT><index:63>\r
+<char:parenleftbt><font:LucidNewMatExtT><index:64>\r
+<char:parenrightbt><font:LucidNewMatExtT><index:65>\r
+<char:parenleftex><font:LucidNewMatExtT><index:66>\r
+<char:parenrightex><font:LucidNewMatExtT><index:67>\r
+<char:angbracketleftBig><font:LucidNewMatExtT><index:68>\r
+<char:angbracketrightBig><font:LucidNewMatExtT><index:69>\r
+<char:unionsqtext><font:LucidNewMatExtT><index:70>\r
+<char:unionsqdisplay><font:LucidNewMatExtT><index:71>\r
+<char:contintegraltext><font:LucidNewMatExtT><index:72>\r
+<char:contintegraldisplay><font:LucidNewMatExtT><index:73>\r
+<char:circledottext><font:LucidNewMatExtT><index:74>\r
+<char:circledotdisplay><font:LucidNewMatExtT><index:75>\r
+<char:circleplustext><font:LucidNewMatExtT><index:76>\r
+<char:circleplusdisplay><font:LucidNewMatExtT><index:77>\r
+<char:circlemultiplytext><font:LucidNewMatExtT><index:78>\r
+<char:circlemultiplydisplay><font:LucidNewMatExtT><index:79>\r
+<char:summationtext><font:LucidNewMatExtT><index:80>\r
+<char:producttext><font:LucidNewMatExtT><index:81>\r
+<char:integraltext><font:LucidNewMatExtT><index:82>\r
+<char:uniontext><font:LucidNewMatExtT><index:83>\r
+<char:intersectiontext><font:LucidNewMatExtT><index:84>\r
+<char:unionmultitext><font:LucidNewMatExtT><index:85>\r
+<char:logicalandtext><font:LucidNewMatExtT><index:86>\r
+<char:logicalortext><font:LucidNewMatExtT><index:87>\r
+<char:summationdisplay><font:LucidNewMatExtT><index:88>\r
+<char:productdisplay><font:LucidNewMatExtT><index:89>\r
+<char:integraldisplay><font:LucidNewMatExtT><index:90>\r
+<char:uniondisplay><font:LucidNewMatExtT><index:91>\r
+<char:intersectiondisplay><font:LucidNewMatExtT><index:92>\r
+<char:unionmultidisplay><font:LucidNewMatExtT><index:93>\r
+<char:logicalanddisplay><font:LucidNewMatExtT><index:94>\r
+<char:logicalordisplay><font:LucidNewMatExtT><index:95>\r
+<char:coproducttext><font:LucidNewMatExtT><index:96>\r
+<char:coproductdisplay><font:LucidNewMatExtT><index:97>\r
+<char:hatwide><font:LucidNewMatExtT><index:98>\r
+<char:hatwider><font:LucidNewMatExtT><index:99>\r
+<char:hatwidest><font:LucidNewMatExtT><index:100>\r
+<char:tildewide><font:LucidNewMatExtT><index:101>\r
+<char:tildewider><font:LucidNewMatExtT><index:102>\r
+<char:tildewidest><font:LucidNewMatExtT><index:103>\r
+<char:bracketleftBig><font:LucidNewMatExtT><index:104>\r
+<char:bracketrightBig><font:LucidNewMatExtT><index:105>\r
+<char:floorleftBig><font:LucidNewMatExtT><index:106>\r
+<char:floorrightBig><font:LucidNewMatExtT><index:107>\r
+<char:ceilingleftBig><font:LucidNewMatExtT><index:108>\r
+<char:ceilingrightBig><font:LucidNewMatExtT><index:109>\r
+<char:braceleftBig><font:LucidNewMatExtT><index:110>\r
+<char:bracerightBig><font:LucidNewMatExtT><index:111>\r
+<char:radicalbig><font:LucidNewMatExtT><index:112>\r
+<char:radicalBig><font:LucidNewMatExtT><index:113>\r
+<char:radicalbigg><font:LucidNewMatExtT><index:114>\r
+<char:radicalBigg><font:LucidNewMatExtT><index:115>\r
+<char:radicalbt><font:LucidNewMatExtT><index:116>\r
+<char:radicalvertex><font:LucidNewMatExtT><index:117>\r
+<char:radicaltp><font:LucidNewMatExtT><index:118>\r
+<char:arrowvertexdbl><font:LucidNewMatExtT><index:119>\r
+<char:arrowtp><font:LucidNewMatExtT><index:120>\r
+<char:arrowbt><font:LucidNewMatExtT><index:121>\r
+<char:bracehtipdownleft><font:LucidNewMatExtT><index:122>\r
+<char:bracehtipdownright><font:LucidNewMatExtT><index:123>\r
+<char:bracehtipupleft><font:LucidNewMatExtT><index:124>\r
+<char:bracehtipupright><font:LucidNewMatExtT><index:125>\r
+<char:arrowdbltp><font:LucidNewMatExtT><index:126>\r
+<char:arrowdblbt><font:LucidNewMatExtT><index:196>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/lucmathit-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/mlp-java/lucmathit-charmap.txt
new file mode 100644 (file)
index 0000000..612d09c
--- /dev/null
@@ -0,0 +1,68 @@
+# character map for Lucida Math Italic font\r
+\r
+<char:Gamma><font:LucidNewMatItaT><index:161>\r
+<char:Delta><font:LucidNewMatItaT><index:162>\r
+<char:Theta><font:LucidNewMatItaT><index:163>\r
+<char:Lambda><font:LucidNewMatItaT><index:164>\r
+<char:Xi><font:LucidNewMatItaT><index:165>\r
+<char:Pi><font:LucidNewMatItaT><index:166>\r
+<char:Sigma><font:LucidNewMatItaT><index:167>\r
+<char:Upsilon><font:LucidNewMatItaT><index:7>\r
+<char:Phi><font:LucidNewMatItaT><index:169>\r
+<char:Psi><font:LucidNewMatItaT><index:170>\r
+<char:Omega><font:LucidNewMatItaT><index:173>\r
+<char:alpha><font:LucidNewMatItaT><index:174>\r
+<char:beta><font:LucidNewMatItaT><index:175>\r
+<char:gamma><font:LucidNewMatItaT><index:176>\r
+<char:delta><font:LucidNewMatItaT><index:177>\r
+<char:epsilon1><font:LucidNewMatItaT><index:178>\r
+<char:zeta><font:LucidNewMatItaT><index:179>\r
+<char:eta><font:LucidNewMatItaT><index:180>\r
+<char:theta><font:LucidNewMatItaT><index:181>\r
+<char:iota><font:LucidNewMatItaT><index:182>\r
+<char:kappa><font:LucidNewMatItaT><index:183>\r
+<char:lambda><font:LucidNewMatItaT><index:184>\r
+<char:mu><font:LucidNewMatItaT><index:185>\r
+<char:nu><font:LucidNewMatItaT><index:186>\r
+<char:xi><font:LucidNewMatItaT><index:187>\r
+<char:pi><font:LucidNewMatItaT><index:188>\r
+<char:rho><font:LucidNewMatItaT><index:189>\r
+<char:sigma><font:LucidNewMatItaT><index:190>\r
+<char:tau><font:LucidNewMatItaT><index:191>\r
+<char:upsilon><font:LucidNewMatItaT><index:192>\r
+<char:phi><font:LucidNewMatItaT><index:193>\r
+<char:chi><font:LucidNewMatItaT><index:194>\r
+<char:psi><font:LucidNewMatItaT><index:195>\r
+<char:tie><font:LucidNewMatItaT><index:196>\r
+<char:omega><font:LucidNewMatItaT><index:33>\r
+<char:epsilon><font:LucidNewMatItaT><index:34>\r
+<char:theta1><font:LucidNewMatItaT><index:35>\r
+<char:pi1><font:LucidNewMatItaT><index:36>\r
+<char:rho1><font:LucidNewMatItaT><index:37>\r
+<char:sigma1><font:LucidNewMatItaT><index:38>\r
+<char:phi1><font:LucidNewMatItaT><index:39>\r
+<char:arrowlefttophalf><font:LucidNewMatItaT><index:40>\r
+<char:arrowleftbothalf><font:LucidNewMatItaT><index:41>\r
+<char:arrowrighttophalf><font:LucidNewMatItaT><index:42>\r
+<char:arrowrightbothalf><font:LucidNewMatItaT><index:43>\r
+<char:arrowhookleft><font:LucidNewMatItaT><index:44>\r
+<char:arrowhookright><font:LucidNewMatItaT><index:45>\r
+<char:triangleright><font:LucidNewMatItaT><index:46>\r
+<char:triangleleft><font:LucidNewMatItaT><index:47>\r
+<char:period><font:LucidNewMatItaT><index:58>\r
+<char:comma><font:LucidNewMatItaT><index:59>\r
+<char:less><font:LucidNewMatItaT><index:60>\r
+<char:slash><font:LucidNewMatItaT><index:61>\r
+<char:greater><font:LucidNewMatItaT><index:62>\r
+<char:star><font:LucidNewMatItaT><index:63>\r
+<char:partialdiff><font:LucidNewMatItaT><index:64>\r
+<char:flat><font:LucidNewMatItaT><index:91>\r
+<char:natural><font:LucidNewMatItaT><index:92>\r
+<char:sharp><font:LucidNewMatItaT><index:93>\r
+<char:slurbelow><font:LucidNewMatItaT><index:94>\r
+<char:slurabove><font:LucidNewMatItaT><index:95>\r
+<char:lscript><font:LucidNewMatItaT><index:96>\r
+<char:dotlessi><font:LucidNewMatItaT><index:123>\r
+<char:dotlessj><font:LucidNewMatItaT><index:124>\r
+<char:weierstrass><font:LucidNewMatItaT><index:125>\r
+<char:vector><font:LucidNewMatItaT><index:126>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/lucmathsym-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/mlp-java/lucmathsym-charmap.txt
new file mode 100644 (file)
index 0000000..bdde61d
--- /dev/null
@@ -0,0 +1,130 @@
+# mathematical characters for Lucida New Math Symbol font\r
+\r
+<char:minus><font:LucidNewMatSymT><index:161>\r
+<char:periodcentered><font:LucidNewMatSymT><index:162>\r
+<char:multiply><font:LucidNewMatSymT><index:163>\r
+<char:asteriskmath><font:LucidNewMatSymT><index:164>\r
+<char:divide><font:LucidNewMatSymT><index:165>\r
+<char:diamondmath><font:LucidNewMatSymT><index:166>\r
+<char:plusminus><font:LucidNewMatSymT><index:167>\r
+<char:minusplus><font:LucidNewMatSymT><index:168>\r
+<char:circleplus><font:LucidNewMatSymT><index:169>\r
+<char:circleminus><font:LucidNewMatSymT><index:170>\r
+<char:circlemultiply><font:LucidNewMatSymT><index:173>\r
+<char:circledivide><font:LucidNewMatSymT><index:174>\r
+<char:circledot><font:LucidNewMatSymT><index:175>\r
+<char:circlecopyrt><font:LucidNewMatSymT><index:176>\r
+<char:openbullet><font:LucidNewMatSymT><index:177>\r
+<char:bullet><font:LucidNewMatSymT><index:178>\r
+<char:equivasymptotic><font:LucidNewMatSymT><index:179>\r
+<char:equivalence><font:LucidNewMatSymT><index:180>\r
+<char:reflexsubset><font:LucidNewMatSymT><index:181>\r
+<char:reflexsuperset><font:LucidNewMatSymT><index:182>\r
+<char:lessequal><font:LucidNewMatSymT><index:183>\r
+<char:greaterequal><font:LucidNewMatSymT><index:184>\r
+<char:precedesequal><font:LucidNewMatSymT><index:185>\r
+<char:followsequal><font:LucidNewMatSymT><index:186>\r
+<char:similar><font:LucidNewMatSymT><index:187>\r
+<char:approxequal><font:LucidNewMatSymT><index:188>\r
+<char:propersubset><font:LucidNewMatSymT><index:189>\r
+<char:propersuperset><font:LucidNewMatSymT><index:190>\r
+<char:lessmuch><font:LucidNewMatSymT><index:191>\r
+<char:greatermuch><font:LucidNewMatSymT><index:192>\r
+<char:precedes><font:LucidNewMatSymT><index:193>\r
+<char:follows><font:LucidNewMatSymT><index:194>\r
+<char:arrowleft><font:LucidNewMatSymT><index:195>\r
+<char:spade><font:LucidNewMatSymT><index:196>\r
+<char:arrowright><font:LucidNewMatSymT><index:33>\r
+<char:arrowup><font:LucidNewMatSymT><index:34>\r
+<char:arrowdown><font:LucidNewMatSymT><index:35>\r
+<char:arrowboth><font:LucidNewMatSymT><index:36>\r
+<char:arrownortheast><font:LucidNewMatSymT><index:37>\r
+<char:arrowsoutheast><font:LucidNewMatSymT><index:38>\r
+<char:similarequal><font:LucidNewMatSymT><index:39>\r
+<char:arrowdblleft><font:LucidNewMatSymT><index:40>\r
+<char:arrowdblright><font:LucidNewMatSymT><index:41>\r
+<char:arrowdblup><font:LucidNewMatSymT><index:42>\r
+<char:arrowdbldown><font:LucidNewMatSymT><index:43>\r
+<char:arrowdblboth><font:LucidNewMatSymT><index:44>\r
+<char:arrownorthwest><font:LucidNewMatSymT><index:45>\r
+<char:arrowsouthwest><font:LucidNewMatSymT><index:46>\r
+<char:proportional><font:LucidNewMatSymT><index:47>\r
+<char:prime><font:LucidNewMatSymT><index:48>\r
+<char:infinity><font:LucidNewMatSymT><index:49>\r
+<char:element><font:LucidNewMatSymT><index:50>\r
+<char:owner><font:LucidNewMatSymT><index:51>\r
+<char:triangle><font:LucidNewMatSymT><index:52>\r
+<char:triangleinv><font:LucidNewMatSymT><index:53>\r
+<char:negationslash><font:LucidNewMatSymT><index:54>\r
+<char:mapsto><font:LucidNewMatSymT><index:55>\r
+<char:universal><font:LucidNewMatSymT><index:56>\r
+<char:existential><font:LucidNewMatSymT><index:57>\r
+<char:logicalnot><font:LucidNewMatSymT><index:58>\r
+<char:emptyset><font:LucidNewMatSymT><index:59>\r
+<char:Rfractur><font:LucidNewMatSymT><index:60>\r
+<char:Ifractur><font:LucidNewMatSymT><index:61>\r
+<char:latticetop><font:LucidNewMatSymT><index:62>\r
+<char:perpendicular><font:LucidNewMatSymT><index:63>\r
+<char:aleph><font:LucidNewMatSymT><index:64>\r
+<char:scriptA><font:LucidNewMatSymT><index:65>\r
+<char:scriptB><font:LucidNewMatSymT><index:66>\r
+<char:scriptC><font:LucidNewMatSymT><index:67>\r
+<char:scriptD><font:LucidNewMatSymT><index:68>\r
+<char:scriptE><font:LucidNewMatSymT><index:69>\r
+<char:scriptF><font:LucidNewMatSymT><index:70>\r
+<char:scriptG><font:LucidNewMatSymT><index:71>\r
+<char:scriptH><font:LucidNewMatSymT><index:72>\r
+<char:scriptI><font:LucidNewMatSymT><index:73>\r
+<char:scriptJ><font:LucidNewMatSymT><index:74>\r
+<char:scriptK><font:LucidNewMatSymT><index:75>\r
+<char:scriptL><font:LucidNewMatSymT><index:76>\r
+<char:scriptM><font:LucidNewMatSymT><index:77>\r
+<char:scriptN><font:LucidNewMatSymT><index:78>\r
+<char:scriptO><font:LucidNewMatSymT><index:79>\r
+<char:scriptP><font:LucidNewMatSymT><index:80>\r
+<char:scriptQ><font:LucidNewMatSymT><index:81>\r
+<char:scriptR><font:LucidNewMatSymT><index:82>\r
+<char:scriptS><font:LucidNewMatSymT><index:83>\r
+<char:scriptT><font:LucidNewMatSymT><index:84>\r
+<char:scriptU><font:LucidNewMatSymT><index:85>\r
+<char:scriptV><font:LucidNewMatSymT><index:86>\r
+<char:scriptW><font:LucidNewMatSymT><index:87>\r
+<char:scriptX><font:LucidNewMatSymT><index:88>\r
+<char:scriptY><font:LucidNewMatSymT><index:89>\r
+<char:scriptZ><font:LucidNewMatSymT><index:90>\r
+<char:union><font:LucidNewMatSymT><index:91>\r
+<char:intersection><font:LucidNewMatSymT><index:92>\r
+<char:unionmulti><font:LucidNewMatSymT><index:93>\r
+<char:logicaland><font:LucidNewMatSymT><index:94>\r
+<char:logicalor><font:LucidNewMatSymT><index:95>\r
+<char:turnstileleft><font:LucidNewMatSymT><index:96>\r
+<char:turnstileright><font:LucidNewMatSymT><index:97>\r
+<char:floorleft><font:LucidNewMatSymT><index:98>\r
+<char:floorright><font:LucidNewMatSymT><index:99>\r
+<char:ceilingleft><font:LucidNewMatSymT><index:100>\r
+<char:ceilingright><font:LucidNewMatSymT><index:101>\r
+<char:braceleft><font:LucidNewMatSymT><index:102>\r
+<char:braceright><font:LucidNewMatSymT><index:103>\r
+<char:angbracketleft><font:LucidNewMatSymT><index:104>\r
+<char:angbracketright><font:LucidNewMatSymT><index:105>\r
+<char:bar><font:LucidNewMatSymT><index:106>\r
+<char:bardbl><font:LucidNewMatSymT><index:107>\r
+<char:arrowbothv><font:LucidNewMatSymT><index:108>\r
+<char:arrowdblbothv><font:LucidNewMatSymT><index:109>\r
+<char:backslash><font:LucidNewMatSymT><index:110>\r
+<char:wreathproduct><font:LucidNewMatSymT><index:111>\r
+<char:radical><font:LucidNewMatSymT><index:112>\r
+<char:coproduct><font:LucidNewMatSymT><index:113>\r
+<char:nabla><font:LucidNewMatSymT><index:114>\r
+<char:integral><font:LucidNewMatSymT><index:115>\r
+<char:unionsq><font:LucidNewMatSymT><index:116>\r
+<char:intersectionsq><font:LucidNewMatSymT><index:117>\r
+<char:subsetsqequal><font:LucidNewMatSymT><index:118>\r
+<char:supersetsqequal><font:LucidNewMatSymT><index:119>\r
+<char:section><font:LucidNewMatSymT><index:120>\r
+<char:dagger><font:LucidNewMatSymT><index:121>\r
+<char:daggerdbl><font:LucidNewMatSymT><index:122>\r
+<char:paragraph><font:LucidNewMatSymT><index:123>\r
+<char:club><font:LucidNewMatSymT><index:124>\r
+<char:diamond><font:LucidNewMatSymT><index:125>\r
+<char:heart><font:LucidNewMatSymT><index:126>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/makefile b/Robust/src/Benchmarks/mlp/tagger/mlp-java/makefile
new file mode 100644 (file)
index 0000000..831977f
--- /dev/null
@@ -0,0 +1,33 @@
+MAIN_CLASS=Tagger
+
+PROGRAM=test
+SOURCE_FILES=*.java
+
+BUILDSCRIPT=~/research/Robust/src/buildscript
+BSFLAGS= -debug -nooptimize -mainclass $(MAIN_CLASS) #-justanalyze -ownership -ownallocdepth 1 -ownwritedots final -enable-assertions
+
+all: run
+
+run: $(PROGRAM).bin
+       $(PROGRAM).bin test.txt
+
+view: PNGs
+       eog *.png &
+
+PNGs: DOTs
+       d2p *COMPLETE*.dot
+
+DOTs: $(PROGRAM).bin
+
+$(PROGRAM).bin: $(SOURCE_FILES)
+       $(BUILDSCRIPT) $(BSFLAGS) -o $(PROGRAM) $(SOURCE_FILES)
+
+clean:
+       rm -f  $(PROGRAM).bin
+       rm -fr tmpbuilddirectory
+       rm -f  *~
+       rm -f  *.dot
+       rm -f  *.png
+       rm -f  aliases.txt
+       rm -f test.index.txt
+       rm -f test.tag.txt
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/standard-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/mlp-java/standard-charmap.txt
new file mode 100644 (file)
index 0000000..9e6a44f
--- /dev/null
@@ -0,0 +1,220 @@
+# character map for standard font\r
+\r
+<char:space><font:><index:32>\r
+<char:exclam><font:><index:33>\r
+<char:quotedbl><font:><index:34>\r
+<char:numbersign><font:><index:35>\r
+<char:dollar><font:><index:36>\r
+<char:percent><font:><index:37>\r
+<char:ampersand><font:><index:38>\r
+<char:quotesingle><font:><index:39>\r
+<char:parenleft><font:><index:40>\r
+<char:parenright><font:><index:41>\r
+<char:asterisk><font:><index:42>\r
+<char:plus><font:><index:43>\r
+<char:comma><font:><index:44>\r
+<char:hyphen><font:><index:45>\r
+<char:period><font:><index:46>\r
+<char:slash><font:><index:47>\r
+<char:zero><font:><index:48>\r
+<char:one><font:><index:49>\r
+<char:two><font:><index:50>\r
+<char:three><font:><index:51>\r
+<char:four><font:><index:52>\r
+<char:five><font:><index:53>\r
+<char:six><font:><index:54>\r
+<char:seven><font:><index:55>\r
+<char:eight><font:><index:56>\r
+<char:nine><font:><index:57>\r
+<char:colon><font:><index:58>\r
+<char:semicolon><font:><index:59>\r
+<char:less><font:><index:60>\r
+<char:equal><font:><index:61>\r
+<char:greater><font:><index:62>\r
+<char:question><font:><index:63>\r
+<char:at><font:><index:64>\r
+<char:A><font:><index:65>\r
+<char:B><font:><index:66>\r
+<char:C><font:><index:67>\r
+<char:D><font:><index:68>\r
+<char:E><font:><index:69>\r
+<char:F><font:><index:70>\r
+<char:G><font:><index:71>\r
+<char:H><font:><index:72>\r
+<char:I><font:><index:73>\r
+<char:J><font:><index:74>\r
+<char:K><font:><index:75>\r
+<char:L><font:><index:76>\r
+<char:M><font:><index:77>\r
+<char:N><font:><index:78>\r
+<char:O><font:><index:79>\r
+<char:P><font:><index:80>\r
+<char:Q><font:><index:81>\r
+<char:R><font:><index:82>\r
+<char:S><font:><index:83>\r
+<char:T><font:><index:84>\r
+<char:U><font:><index:85>\r
+<char:V><font:><index:86>\r
+<char:W><font:><index:87>\r
+<char:X><font:><index:88>\r
+<char:Y><font:><index:89>\r
+<char:Z><font:><index:90>\r
+<char:bracketleft><font:><index:91>\r
+<char:backslash><font:><index:92>\r
+<char:bracketright><font:><index:93>\r
+<char:asciicircum><font:><index:94>\r
+<char:underscore><font:><index:95>\r
+<char:grave><font:><index:96>\r
+<char:a><font:><index:97>\r
+<char:b><font:><index:98>\r
+<char:c><font:><index:99>\r
+<char:d><font:><index:100>\r
+<char:e><font:><index:101>\r
+<char:f><font:><index:102>\r
+<char:g><font:><index:103>\r
+<char:h><font:><index:104>\r
+<char:i><font:><index:105>\r
+<char:j><font:><index:106>\r
+<char:k><font:><index:107>\r
+<char:l><font:><index:108>\r
+<char:m><font:><index:109>\r
+<char:n><font:><index:110>\r
+<char:o><font:><index:111>\r
+<char:p><font:><index:112>\r
+<char:q><font:><index:113>\r
+<char:r><font:><index:114>\r
+<char:s><font:><index:115>\r
+<char:t><font:><index:116>\r
+<char:u><font:><index:117>\r
+<char:v><font:><index:118>\r
+<char:w><font:><index:119>\r
+<char:x><font:><index:120>\r
+<char:y><font:><index:121>\r
+<char:z><font:><index:122>\r
+<char:braceleft><font:><index:123>\r
+<char:bar><font:><index:124>\r
+<char:braceright><font:><index:125>\r
+<char:asciitilde><font:><index:126>\r
+<char:euro><font:><index:128>\r
+<char:quotesinglbase><font:><index:130>\r
+<char:florin><font:><index:131>\r
+<char:quotedblbase><font:><index:132>\r
+<char:ellipsis><font:><index:133>\r
+<char:dagger><font:><index:134>\r
+<char:daggerdbl><font:><index:135>\r
+<char:circumflex><font:><index:136>\r
+<char:perthousand><font:><index:137>\r
+<char:Scaron><font:><index:138>\r
+<char:guilsinglleft><font:><index:139>\r
+<char:OE><font:><index:140>\r
+<char:Zcaron><font:><index:142>\r
+<char:quoteleft><font:><index:145>\r
+<char:quoteright><font:><index:146>\r
+<char:quotedblleft><font:><index:147>\r
+<char:quotedblright><font:><index:148>\r
+<char:bullet><font:><index:149>\r
+<char:endash><font:><index:150>\r
+<char:emdash><font:><index:151>\r
+<char:tilde><font:><index:152>\r
+<char:trademark><font:><index:153>\r
+<char:scaron><font:><index:154>\r
+<char:guilsinglright><font:><index:155>\r
+<char:oe><font:><index:156>\r
+<char:zcaron><font:><index:158>\r
+<char:Ydieresis><font:><index:159>\r
+<char:nbspace><font:><index:160>\r
+<char:exclamdown><font:><index:161>\r
+<char:cent><font:><index:162>\r
+<char:sterling><font:><index:163>\r
+<char:currency><font:><index:164>\r
+<char:yen><font:><index:165>\r
+<char:brokenbar><font:><index:166>\r
+<char:section><font:><index:167>\r
+<char:dieresis><font:><index:168>\r
+<char:copyright><font:><index:169>\r
+<char:ordfeminine><font:><index:170>\r
+<char:guillemotleft><font:><index:171>\r
+<char:logicalnot><font:><index:172>\r
+<char:sfthyphen><font:><index:173>\r
+<char:registered><font:><index:174>\r
+<char:macron><font:><index:175>\r
+<char:degree><font:><index:176>\r
+<char:plusminus><font:><index:177>\r
+<char:twosuperior><font:><index:178>\r
+<char:threesuperior><font:><index:179>\r
+<char:acute><font:><index:180>\r
+<char:mu><font:><index:181>\r
+<char:paragraph><font:><index:182>\r
+<char:periodcentered><font:><index:183>\r
+<char:cedilla><font:><index:184>\r
+<char:onesuperior><font:><index:185>\r
+<char:ordmasculine><font:><index:186>\r
+<char:guillemotright><font:><index:187>\r
+<char:onequarter><font:><index:188>\r
+<char:onehalf><font:><index:189>\r
+<char:threequarters><font:><index:190>\r
+<char:questiondown><font:><index:191>\r
+<char:Agrave><font:><index:192>\r
+<char:Aacute><font:><index:193>\r
+<char:Acircumflex><font:><index:194>\r
+<char:Atilde><font:><index:195>\r
+<char:Adieresis><font:><index:196>\r
+<char:Aring><font:><index:197>\r
+<char:AE><font:><index:198>\r
+<char:Ccedilla><font:><index:199>\r
+<char:Egrave><font:><index:200>\r
+<char:Eacute><font:><index:201>\r
+<char:Ecircumflex><font:><index:202>\r
+<char:Edieresis><font:><index:203>\r
+<char:Igrave><font:><index:204>\r
+<char:Iacute><font:><index:205>\r
+<char:Icircumflex><font:><index:206>\r
+<char:Idieresis><font:><index:207>\r
+<char:Eth><font:><index:208>\r
+<char:Ntilde><font:><index:209>\r
+<char:Ograve><font:><index:210>\r
+<char:Oacute><font:><index:211>\r
+<char:Ocircumflex><font:><index:212>\r
+<char:Otilde><font:><index:213>\r
+<char:Odieresis><font:><index:214>\r
+<char:multiply><font:><index:215>\r
+<char:Oslash><font:><index:216>\r
+<char:Ugrave><font:><index:217>\r
+<char:Uacute><font:><index:218>\r
+<char:Ucircumflex><font:><index:219>\r
+<char:Udieresis><font:><index:220>\r
+<char:Yacute><font:><index:221>\r
+<char:Thorn><font:><index:222>\r
+<char:germandbls><font:><index:223>\r
+<char:agrave><font:><index:224>\r
+<char:aacute><font:><index:225>\r
+<char:acircumflex><font:><index:226>\r
+<char:atilde><font:><index:227>\r
+<char:adieresis><font:><index:228>\r
+<char:aring><font:><index:229>\r
+<char:ae><font:><index:230>\r
+<char:ccedilla><font:><index:231>\r
+<char:egrave><font:><index:232>\r
+<char:eacute><font:><index:233>\r
+<char:ecircumflex><font:><index:234>\r
+<char:edieresis><font:><index:235>\r
+<char:igrave><font:><index:236>\r
+<char:iacute><font:><index:237>\r
+<char:icircumflex><font:><index:238>\r
+<char:idieresis><font:><index:239>\r
+<char:eth><font:><index:240>\r
+<char:ntilde><font:><index:241>\r
+<char:ograve><font:><index:242>\r
+<char:oacute><font:><index:243>\r
+<char:ocircumflex><font:><index:244>\r
+<char:otilde><font:><index:245>\r
+<char:odieresis><font:><index:246>\r
+<char:divide><font:><index:247>\r
+<char:oslash><font:><index:248>\r
+<char:ugrave><font:><index:249>\r
+<char:uacute><font:><index:250>\r
+<char:ucircumflex><font:><index:251>\r
+<char:udieresis><font:><index:252>\r
+<char:yacute><font:><index:253>\r
+<char:thorn><font:><index:254>\r
+<char:ydieresis><font:><index:255>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/styles.txt b/Robust/src/Benchmarks/mlp/tagger/mlp-java/styles.txt
new file mode 100644 (file)
index 0000000..55aaf72
--- /dev/null
@@ -0,0 +1,11 @@
+<style:title><next:author>\r
+<style:author><next:section>\r
+<style:section><next:noindent><counter:1><separator:.><trailer:        >\r
+<style:opening><next:noindent>\r
+<style:noindent><next:body>\r
+<style:body><next:body>\r
+<style:subsection><next:noindent><parent:section><counter:1><separator:.><trailer:     >\r
+<style:subsubsection><next:noindent><parent:subsection><counter:a><separator:.><trailer:       >\r
+<style:geekmath><next:noindent>\r
+<style:point><next:noindent><counter:A><leader:\alpha >\r
+<style:ref><next:ref>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/symbol-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/mlp-java/symbol-charmap.txt
new file mode 100644 (file)
index 0000000..4481c17
--- /dev/null
@@ -0,0 +1,195 @@
+# character map for Symbol font\r
+\r
+<char:Symbol><font:Symbol><index:for>\r
+<char:space><font:Symbol><index:32>\r
+<char:exclam><font:Symbol><index:33>\r
+<char:universal><font:Symbol><index:34>\r
+<char:numbersign><font:Symbol><index:35>\r
+<char:existential><font:Symbol><index:36>\r
+<char:percent><font:Symbol><index:37>\r
+<char:ampersand><font:Symbol><index:38>\r
+<char:suchthat><font:Symbol><index:39>\r
+<char:parenleft><font:Symbol><index:40>\r
+<char:parenright><font:Symbol><index:41>\r
+<char:asteriskmath><font:Symbol><index:42>\r
+<char:plus><font:Symbol><index:43>\r
+<char:comma><font:Symbol><index:44>\r
+<char:minus><font:Symbol><index:45>\r
+<char:period><font:Symbol><index:46>\r
+<char:slash><font:Symbol><index:47>\r
+<char:zero><font:Symbol><index:48>\r
+<char:one><font:Symbol><index:49>\r
+<char:two><font:Symbol><index:50>\r
+<char:three><font:Symbol><index:51>\r
+<char:four><font:Symbol><index:52>\r
+<char:five><font:Symbol><index:53>\r
+<char:six><font:Symbol><index:54>\r
+<char:seven><font:Symbol><index:55>\r
+<char:eight><font:Symbol><index:56>\r
+<char:nine><font:Symbol><index:57>\r
+<char:colon><font:Symbol><index:58>\r
+<char:semicolon><font:Symbol><index:59>\r
+<char:less><font:Symbol><index:60>\r
+<char:equal><font:Symbol><index:61>\r
+<char:greater><font:Symbol><index:62>\r
+<char:question><font:Symbol><index:63>\r
+<char:congruent><font:Symbol><index:64>\r
+<char:Alpha><font:Symbol><index:65>\r
+<char:Beta><font:Symbol><index:66>\r
+<char:Chi><font:Symbol><index:67>\r
+<char:Delta><font:Symbol><index:68>\r
+<char:Epsilon><font:Symbol><index:69>\r
+<char:Phi><font:Symbol><index:70>\r
+<char:Gamma><font:Symbol><index:71>\r
+<char:Eta><font:Symbol><index:72>\r
+<char:Iota><font:Symbol><index:73>\r
+<char:theta1><font:Symbol><index:74>\r
+<char:Kappa><font:Symbol><index:75>\r
+<char:Lambda><font:Symbol><index:76>\r
+<char:Mu><font:Symbol><index:77>\r
+<char:Nu><font:Symbol><index:78>\r
+<char:Omicron><font:Symbol><index:79>\r
+<char:Pi><font:Symbol><index:80>\r
+<char:Theta><font:Symbol><index:81>\r
+<char:Rho><font:Symbol><index:82>\r
+<char:Sigma><font:Symbol><index:83>\r
+<char:Tau><font:Symbol><index:84>\r
+<char:Upsilon><font:Symbol><index:85>\r
+<char:sigma1><font:Symbol><index:86>\r
+<char:Omega><font:Symbol><index:87>\r
+<char:Xi><font:Symbol><index:88>\r
+<char:Psi><font:Symbol><index:89>\r
+<char:Zeta><font:Symbol><index:90>\r
+<char:bracketleft><font:Symbol><index:91>\r
+<char:therefore><font:Symbol><index:92>\r
+<char:bracketright><font:Symbol><index:93>\r
+<char:perpendicular><font:Symbol><index:94>\r
+<char:underscore><font:Symbol><index:95>\r
+<char:radicalex><font:Symbol><index:96>\r
+<char:alpha><font:Symbol><index:97>\r
+<char:beta><font:Symbol><index:98>\r
+<char:chi><font:Symbol><index:99>\r
+<char:delta><font:Symbol><index:100>\r
+<char:epsilon><font:Symbol><index:101>\r
+<char:phi><font:Symbol><index:102>\r
+<char:gamma><font:Symbol><index:103>\r
+<char:eta><font:Symbol><index:104>\r
+<char:iota><font:Symbol><index:105>\r
+<char:phi1><font:Symbol><index:106>\r
+<char:kappa><font:Symbol><index:107>\r
+<char:lambda><font:Symbol><index:108>\r
+<char:mu><font:Symbol><index:109>\r
+<char:nu><font:Symbol><index:110>\r
+<char:omicron><font:Symbol><index:111>\r
+<char:pi><font:Symbol><index:112>\r
+<char:theta><font:Symbol><index:113>\r
+<char:rho><font:Symbol><index:114>\r
+<char:sigma><font:Symbol><index:115>\r
+<char:tau><font:Symbol><index:116>\r
+<char:upsilon><font:Symbol><index:117>\r
+<char:omega1><font:Symbol><index:118>\r
+<char:omega><font:Symbol><index:119>\r
+<char:xi><font:Symbol><index:120>\r
+<char:psi><font:Symbol><index:121>\r
+<char:zeta><font:Symbol><index:122>\r
+<char:braceleft><font:Symbol><index:123>\r
+<char:bar><font:Symbol><index:124>\r
+<char:braceright><font:Symbol><index:125>\r
+<char:similar><font:Symbol><index:126>\r
+<char:Euro><font:Symbol><index:160>\r
+<char:Upsilon1><font:Symbol><index:161>\r
+<char:minute><font:Symbol><index:162>\r
+<char:lessequal><font:Symbol><index:163>\r
+<char:fraction><font:Symbol><index:164>\r
+<char:infinity><font:Symbol><index:165>\r
+<char:florin><font:Symbol><index:166>\r
+<char:club><font:Symbol><index:167>\r
+<char:diamond><font:Symbol><index:168>\r
+<char:heart><font:Symbol><index:169>\r
+<char:spade><font:Symbol><index:170>\r
+<char:arrowboth><font:Symbol><index:171>\r
+<char:arrowleft><font:Symbol><index:172>\r
+<char:arrowup><font:Symbol><index:173>\r
+<char:arrowright><font:Symbol><index:174>\r
+<char:arrowdown><font:Symbol><index:175>\r
+<char:degree><font:Symbol><index:176>\r
+<char:plusminus><font:Symbol><index:177>\r
+<char:second><font:Symbol><index:178>\r
+<char:greaterequal><font:Symbol><index:179>\r
+<char:multiply><font:Symbol><index:180>\r
+<char:proportional><font:Symbol><index:181>\r
+<char:partialdiff><font:Symbol><index:182>\r
+<char:bullet><font:Symbol><index:183>\r
+<char:divide><font:Symbol><index:184>\r
+<char:notequal><font:Symbol><index:185>\r
+<char:equivalence><font:Symbol><index:186>\r
+<char:approxequal><font:Symbol><index:187>\r
+\r
+# seems to be a quarter fraction\r
+# <char:ellipsis><font:Symbol><index:188>\r
+\r
+<char:arrowvertex><font:Symbol><index:189>\r
+<char:arrowhorizex><font:Symbol><index:190>\r
+<char:carriagereturn><font:Symbol><index:191>\r
+<char:aleph><font:Symbol><index:192>\r
+<char:Ifraktur><font:Symbol><index:193>\r
+<char:Rfraktur><font:Symbol><index:194>\r
+<char:weierstrass><font:Symbol><index:195>\r
+<char:circlemultiply><font:Symbol><index:196>\r
+<char:circleplus><font:Symbol><index:197>\r
+<char:emptyset><font:Symbol><index:198>\r
+<char:intersection><font:Symbol><index:199>\r
+<char:union><font:Symbol><index:200>\r
+<char:propersuperset><font:Symbol><index:201>\r
+<char:reflexsuperset><font:Symbol><index:202>\r
+<char:notsubset><font:Symbol><index:203>\r
+<char:propersubset><font:Symbol><index:204>\r
+<char:reflexsubset><font:Symbol><index:205>\r
+<char:element><font:Symbol><index:206>\r
+<char:notelement><font:Symbol><index:207>\r
+<char:angle><font:Symbol><index:208>\r
+<char:gradient><font:Symbol><index:209>\r
+<char:registerserif><font:Symbol><index:210>\r
+<char:copyrightserif><font:Symbol><index:211>\r
+<char:trademarkserif><font:Symbol><index:212>\r
+<char:product><font:Symbol><index:213>\r
+<char:radical><font:Symbol><index:214>\r
+<char:dotmath><font:Symbol><index:215>\r
+<char:logicalnot><font:Symbol><index:216>\r
+<char:logicaland><font:Symbol><index:217>\r
+<char:logicalor><font:Symbol><index:218>\r
+<char:arrowdblboth><font:Symbol><index:219>\r
+<char:arrowdblleft><font:Symbol><index:220>\r
+<char:arrowdblup><font:Symbol><index:221>\r
+<char:arrowdblright><font:Symbol><index:222>\r
+<char:arrowdbldown><font:Symbol><index:223>\r
+<char:lozenge><font:Symbol><index:224>\r
+<char:angleleft><font:Symbol><index:225>\r
+<char:registersans><font:Symbol><index:226>\r
+<char:copyrightsans><font:Symbol><index:227>\r
+<char:trademarksans><font:Symbol><index:228>\r
+<char:summation><font:Symbol><index:229>\r
+<char:parenlefttp><font:Symbol><index:230>\r
+<char:parenleftex><font:Symbol><index:231>\r
+<char:parenleftbt><font:Symbol><index:232>\r
+<char:bracketlefttp><font:Symbol><index:233>\r
+<char:bracketleftex><font:Symbol><index:234>\r
+<char:bracketleftbt><font:Symbol><index:235>\r
+<char:bracelefttp><font:Symbol><index:236>\r
+<char:braceleftmid><font:Symbol><index:237>\r
+<char:braceleftbt><font:Symbol><index:238>\r
+<char:braceex><font:Symbol><index:239>\r
+<char:angleright><font:Symbol><index:241>\r
+<char:integral><font:Symbol><index:242>\r
+<char:integraltp><font:Symbol><index:243>\r
+<char:integralex><font:Symbol><index:244>\r
+<char:integralbt><font:Symbol><index:245>\r
+<char:parenrighttp><font:Symbol><index:246>\r
+<char:parenrightex><font:Symbol><index:247>\r
+<char:parenrightbt><font:Symbol><index:248>\r
+<char:bracketrighttp><font:Symbol><index:249>\r
+<char:bracketrightex><font:Symbol><index:250>\r
+<char:bracketrightbt><font:Symbol><index:251>\r
+<char:bracerighttp><font:Symbol><index:252>\r
+<char:bracerightmid><font:Symbol><index:253>\r
+<char:bracerightbt><font:Symbol><index:254>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/symbols.txt b/Robust/src/Benchmarks/mlp/tagger/mlp-java/symbols.txt
new file mode 100644 (file)
index 0000000..9b89caf
--- /dev/null
@@ -0,0 +1,530 @@
+# character map for Lucida Math Italic font\r
+\r
+<char:Gamma><font:LucidNewMatItaT><index:161>\r
+<char:Delta><font:LucidNewMatItaT><index:162>\r
+<char:Theta><font:LucidNewMatItaT><index:163>\r
+<char:Lambda><font:LucidNewMatItaT><index:164>\r
+<char:Xi><font:LucidNewMatItaT><index:165>\r
+<char:Pi><font:LucidNewMatItaT><index:166>\r
+<char:Sigma><font:LucidNewMatItaT><index:167>\r
+<char:Upsilon><font:LucidNewMatItaT><index:7>\r
+<char:Phi><font:LucidNewMatItaT><index:169>\r
+<char:Psi><font:LucidNewMatItaT><index:170>\r
+<char:Omega><font:LucidNewMatItaT><index:173>\r
+<char:alpha><font:LucidNewMatItaT><index:174>\r
+<char:beta><font:LucidNewMatItaT><index:175>\r
+<char:gamma><font:LucidNewMatItaT><index:176>\r
+<char:delta><font:LucidNewMatItaT><index:177>\r
+<char:epsilon1><font:LucidNewMatItaT><index:178>\r
+<char:zeta><font:LucidNewMatItaT><index:179>\r
+<char:eta><font:LucidNewMatItaT><index:180>\r
+<char:theta><font:LucidNewMatItaT><index:181>\r
+<char:iota><font:LucidNewMatItaT><index:182>\r
+<char:kappa><font:LucidNewMatItaT><index:183>\r
+<char:lambda><font:LucidNewMatItaT><index:184>\r
+<char:mu><font:LucidNewMatItaT><index:185>\r
+<char:nu><font:LucidNewMatItaT><index:186>\r
+<char:xi><font:LucidNewMatItaT><index:187>\r
+<char:pi><font:LucidNewMatItaT><index:188>\r
+<char:rho><font:LucidNewMatItaT><index:189>\r
+<char:sigma><font:LucidNewMatItaT><index:190>\r
+<char:tau><font:LucidNewMatItaT><index:191>\r
+<char:upsilon><font:LucidNewMatItaT><index:192>\r
+<char:phi><font:LucidNewMatItaT><index:193>\r
+<char:chi><font:LucidNewMatItaT><index:194>\r
+<char:psi><font:LucidNewMatItaT><index:195>\r
+<char:tie><font:LucidNewMatItaT><index:196>\r
+<char:omega><font:LucidNewMatItaT><index:33>\r
+<char:epsilon><font:LucidNewMatItaT><index:34>\r
+<char:theta1><font:LucidNewMatItaT><index:35>\r
+<char:pi1><font:LucidNewMatItaT><index:36>\r
+<char:rho1><font:LucidNewMatItaT><index:37>\r
+<char:sigma1><font:LucidNewMatItaT><index:38>\r
+<char:phi1><font:LucidNewMatItaT><index:39>\r
+<char:arrowlefttophalf><font:LucidNewMatItaT><index:40>\r
+<char:arrowleftbothalf><font:LucidNewMatItaT><index:41>\r
+<char:arrowrighttophalf><font:LucidNewMatItaT><index:42>\r
+<char:arrowrightbothalf><font:LucidNewMatItaT><index:43>\r
+<char:arrowhookleft><font:LucidNewMatItaT><index:44>\r
+<char:arrowhookright><font:LucidNewMatItaT><index:45>\r
+<char:triangleright><font:LucidNewMatItaT><index:46>\r
+<char:triangleleft><font:LucidNewMatItaT><index:47>\r
+<char:period><font:LucidNewMatItaT><index:58>\r
+<char:comma><font:LucidNewMatItaT><index:59>\r
+<char:less><font:LucidNewMatItaT><index:60>\r
+<char:slash><font:LucidNewMatItaT><index:61>\r
+<char:greater><font:LucidNewMatItaT><index:62>\r
+<char:star><font:LucidNewMatItaT><index:63>\r
+<char:partialdiff><font:LucidNewMatItaT><index:64>\r
+<char:flat><font:LucidNewMatItaT><index:91>\r
+<char:natural><font:LucidNewMatItaT><index:92>\r
+<char:sharp><font:LucidNewMatItaT><index:93>\r
+<char:slurbelow><font:LucidNewMatItaT><index:94>\r
+<char:slurabove><font:LucidNewMatItaT><index:95>\r
+<char:lscript><font:LucidNewMatItaT><index:96>\r
+<char:dotlessi><font:LucidNewMatItaT><index:123>\r
+<char:dotlessj><font:LucidNewMatItaT><index:124>\r
+<char:weierstrass><font:LucidNewMatItaT><index:125>\r
+<char:vector><font:LucidNewMatItaT><index:126>\r
+\r
+\r
+# mathematical characters for Lucida New Math Symbol font\r
+\r
+<char:minus><font:LucidNewMatSymT><index:161>\r
+<char:periodcentered><font:LucidNewMatSymT><index:162>\r
+<char:multiply><font:LucidNewMatSymT><index:163>\r
+<char:asteriskmath><font:LucidNewMatSymT><index:164>\r
+<char:divide><font:LucidNewMatSymT><index:165>\r
+<char:diamondmath><font:LucidNewMatSymT><index:166>\r
+<char:plusminus><font:LucidNewMatSymT><index:167>\r
+<char:minusplus><font:LucidNewMatSymT><index:168>\r
+<char:circleplus><font:LucidNewMatSymT><index:169>\r
+<char:circleminus><font:LucidNewMatSymT><index:170>\r
+<char:circlemultiply><font:LucidNewMatSymT><index:173>\r
+<char:circledivide><font:LucidNewMatSymT><index:174>\r
+<char:circledot><font:LucidNewMatSymT><index:175>\r
+<char:circlecopyrt><font:LucidNewMatSymT><index:176>\r
+<char:openbullet><font:LucidNewMatSymT><index:177>\r
+<char:bullet><font:LucidNewMatSymT><index:178>\r
+<char:equivasymptotic><font:LucidNewMatSymT><index:179>\r
+<char:equivalence><font:LucidNewMatSymT><index:180>\r
+<char:reflexsubset><font:LucidNewMatSymT><index:181>\r
+<char:reflexsuperset><font:LucidNewMatSymT><index:182>\r
+<char:lessequal><font:LucidNewMatSymT><index:183>\r
+<char:greaterequal><font:LucidNewMatSymT><index:184>\r
+<char:precedesequal><font:LucidNewMatSymT><index:185>\r
+<char:followsequal><font:LucidNewMatSymT><index:186>\r
+<char:similar><font:LucidNewMatSymT><index:187>\r
+<char:approxequal><font:LucidNewMatSymT><index:188>\r
+<char:propersubset><font:LucidNewMatSymT><index:189>\r
+<char:propersuperset><font:LucidNewMatSymT><index:190>\r
+<char:lessmuch><font:LucidNewMatSymT><index:191>\r
+<char:greatermuch><font:LucidNewMatSymT><index:192>\r
+<char:precedes><font:LucidNewMatSymT><index:193>\r
+<char:follows><font:LucidNewMatSymT><index:194>\r
+<char:arrowleft><font:LucidNewMatSymT><index:195>\r
+<char:spade><font:LucidNewMatSymT><index:196>\r
+<char:arrowright><font:LucidNewMatSymT><index:33>\r
+<char:arrowup><font:LucidNewMatSymT><index:34>\r
+<char:arrowdown><font:LucidNewMatSymT><index:35>\r
+<char:arrowboth><font:LucidNewMatSymT><index:36>\r
+<char:arrownortheast><font:LucidNewMatSymT><index:37>\r
+<char:arrowsoutheast><font:LucidNewMatSymT><index:38>\r
+<char:similarequal><font:LucidNewMatSymT><index:39>\r
+<char:arrowdblleft><font:LucidNewMatSymT><index:40>\r
+<char:arrowdblright><font:LucidNewMatSymT><index:41>\r
+<char:arrowdblup><font:LucidNewMatSymT><index:42>\r
+<char:arrowdbldown><font:LucidNewMatSymT><index:43>\r
+<char:arrowdblboth><font:LucidNewMatSymT><index:44>\r
+<char:arrownorthwest><font:LucidNewMatSymT><index:45>\r
+<char:arrowsouthwest><font:LucidNewMatSymT><index:46>\r
+<char:proportional><font:LucidNewMatSymT><index:47>\r
+<char:prime><font:LucidNewMatSymT><index:48>\r
+<char:infinity><font:LucidNewMatSymT><index:49>\r
+<char:element><font:LucidNewMatSymT><index:50>\r
+<char:owner><font:LucidNewMatSymT><index:51>\r
+<char:triangle><font:LucidNewMatSymT><index:52>\r
+<char:triangleinv><font:LucidNewMatSymT><index:53>\r
+<char:negationslash><font:LucidNewMatSymT><index:54>\r
+<char:mapsto><font:LucidNewMatSymT><index:55>\r
+<char:universal><font:LucidNewMatSymT><index:56>\r
+<char:existential><font:LucidNewMatSymT><index:57>\r
+<char:logicalnot><font:LucidNewMatSymT><index:58>\r
+<char:emptyset><font:LucidNewMatSymT><index:59>\r
+<char:Rfractur><font:LucidNewMatSymT><index:60>\r
+<char:Ifractur><font:LucidNewMatSymT><index:61>\r
+<char:latticetop><font:LucidNewMatSymT><index:62>\r
+<char:perpendicular><font:LucidNewMatSymT><index:63>\r
+<char:aleph><font:LucidNewMatSymT><index:64>\r
+<char:scriptA><font:LucidNewMatSymT><index:65>\r
+<char:scriptB><font:LucidNewMatSymT><index:66>\r
+<char:scriptC><font:LucidNewMatSymT><index:67>\r
+<char:scriptD><font:LucidNewMatSymT><index:68>\r
+<char:scriptE><font:LucidNewMatSymT><index:69>\r
+<char:scriptF><font:LucidNewMatSymT><index:70>\r
+<char:scriptG><font:LucidNewMatSymT><index:71>\r
+<char:scriptH><font:LucidNewMatSymT><index:72>\r
+<char:scriptI><font:LucidNewMatSymT><index:73>\r
+<char:scriptJ><font:LucidNewMatSymT><index:74>\r
+<char:scriptK><font:LucidNewMatSymT><index:75>\r
+<char:scriptL><font:LucidNewMatSymT><index:76>\r
+<char:scriptM><font:LucidNewMatSymT><index:77>\r
+<char:scriptN><font:LucidNewMatSymT><index:78>\r
+<char:scriptO><font:LucidNewMatSymT><index:79>\r
+<char:scriptP><font:LucidNewMatSymT><index:80>\r
+<char:scriptQ><font:LucidNewMatSymT><index:81>\r
+<char:scriptR><font:LucidNewMatSymT><index:82>\r
+<char:scriptS><font:LucidNewMatSymT><index:83>\r
+<char:scriptT><font:LucidNewMatSymT><index:84>\r
+<char:scriptU><font:LucidNewMatSymT><index:85>\r
+<char:scriptV><font:LucidNewMatSymT><index:86>\r
+<char:scriptW><font:LucidNewMatSymT><index:87>\r
+<char:scriptX><font:LucidNewMatSymT><index:88>\r
+<char:scriptY><font:LucidNewMatSymT><index:89>\r
+<char:scriptZ><font:LucidNewMatSymT><index:90>\r
+<char:union><font:LucidNewMatSymT><index:91>\r
+<char:intersection><font:LucidNewMatSymT><index:92>\r
+<char:unionmulti><font:LucidNewMatSymT><index:93>\r
+<char:logicaland><font:LucidNewMatSymT><index:94>\r
+<char:logicalor><font:LucidNewMatSymT><index:95>\r
+<char:turnstileleft><font:LucidNewMatSymT><index:96>\r
+<char:turnstileright><font:LucidNewMatSymT><index:97>\r
+<char:floorleft><font:LucidNewMatSymT><index:98>\r
+<char:floorright><font:LucidNewMatSymT><index:99>\r
+<char:ceilingleft><font:LucidNewMatSymT><index:100>\r
+<char:ceilingright><font:LucidNewMatSymT><index:101>\r
+<char:braceleft><font:LucidNewMatSymT><index:102>\r
+<char:braceright><font:LucidNewMatSymT><index:103>\r
+<char:angbracketleft><font:LucidNewMatSymT><index:104>\r
+<char:angbracketright><font:LucidNewMatSymT><index:105>\r
+<char:bar><font:LucidNewMatSymT><index:106>\r
+<char:bardbl><font:LucidNewMatSymT><index:107>\r
+<char:arrowbothv><font:LucidNewMatSymT><index:108>\r
+<char:arrowdblbothv><font:LucidNewMatSymT><index:109>\r
+<char:backslash><font:LucidNewMatSymT><index:110>\r
+<char:wreathproduct><font:LucidNewMatSymT><index:111>\r
+<char:radical><font:LucidNewMatSymT><index:112>\r
+<char:coproduct><font:LucidNewMatSymT><index:113>\r
+<char:nabla><font:LucidNewMatSymT><index:114>\r
+<char:integral><font:LucidNewMatSymT><index:115>\r
+<char:unionsq><font:LucidNewMatSymT><index:116>\r
+<char:intersectionsq><font:LucidNewMatSymT><index:117>\r
+<char:subsetsqequal><font:LucidNewMatSymT><index:118>\r
+<char:supersetsqequal><font:LucidNewMatSymT><index:119>\r
+<char:section><font:LucidNewMatSymT><index:120>\r
+<char:dagger><font:LucidNewMatSymT><index:121>\r
+<char:daggerdbl><font:LucidNewMatSymT><index:122>\r
+<char:paragraph><font:LucidNewMatSymT><index:123>\r
+<char:club><font:LucidNewMatSymT><index:124>\r
+<char:diamond><font:LucidNewMatSymT><index:125>\r
+<char:heart><font:LucidNewMatSymT><index:126>\r
+\r
+\r
+\r
+# character map for Symbol font\r
+\r
+<char:Symbol><font:Symbol><index:for>\r
+<char:space><font:Symbol><index:32>\r
+<char:exclam><font:Symbol><index:33>\r
+<char:universal><font:Symbol><index:34>\r
+<char:numbersign><font:Symbol><index:35>\r
+<char:existential><font:Symbol><index:36>\r
+<char:percent><font:Symbol><index:37>\r
+<char:ampersand><font:Symbol><index:38>\r
+<char:suchthat><font:Symbol><index:39>\r
+<char:parenleft><font:Symbol><index:40>\r
+<char:parenright><font:Symbol><index:41>\r
+<char:asteriskmath><font:Symbol><index:42>\r
+<char:plus><font:Symbol><index:43>\r
+<char:comma><font:Symbol><index:44>\r
+<char:minus><font:Symbol><index:45>\r
+<char:period><font:Symbol><index:46>\r
+<char:slash><font:Symbol><index:47>\r
+<char:zero><font:Symbol><index:48>\r
+<char:one><font:Symbol><index:49>\r
+<char:two><font:Symbol><index:50>\r
+<char:three><font:Symbol><index:51>\r
+<char:four><font:Symbol><index:52>\r
+<char:five><font:Symbol><index:53>\r
+<char:six><font:Symbol><index:54>\r
+<char:seven><font:Symbol><index:55>\r
+<char:eight><font:Symbol><index:56>\r
+<char:nine><font:Symbol><index:57>\r
+<char:colon><font:Symbol><index:58>\r
+<char:semicolon><font:Symbol><index:59>\r
+<char:less><font:Symbol><index:60>\r
+<char:equal><font:Symbol><index:61>\r
+<char:greater><font:Symbol><index:62>\r
+<char:question><font:Symbol><index:63>\r
+<char:congruent><font:Symbol><index:64>\r
+<char:Alpha><font:Symbol><index:65>\r
+<char:Beta><font:Symbol><index:66>\r
+<char:Chi><font:Symbol><index:67>\r
+<char:Delta><font:Symbol><index:68>\r
+<char:Epsilon><font:Symbol><index:69>\r
+<char:Phi><font:Symbol><index:70>\r
+<char:Gamma><font:Symbol><index:71>\r
+<char:Eta><font:Symbol><index:72>\r
+<char:Iota><font:Symbol><index:73>\r
+<char:theta1><font:Symbol><index:74>\r
+<char:Kappa><font:Symbol><index:75>\r
+<char:Lambda><font:Symbol><index:76>\r
+<char:Mu><font:Symbol><index:77>\r
+<char:Nu><font:Symbol><index:78>\r
+<char:Omicron><font:Symbol><index:79>\r
+<char:Pi><font:Symbol><index:80>\r
+<char:Theta><font:Symbol><index:81>\r
+<char:Rho><font:Symbol><index:82>\r
+<char:Sigma><font:Symbol><index:83>\r
+<char:Tau><font:Symbol><index:84>\r
+<char:Upsilon><font:Symbol><index:85>\r
+<char:sigma1><font:Symbol><index:86>\r
+<char:Omega><font:Symbol><index:87>\r
+<char:Xi><font:Symbol><index:88>\r
+<char:Psi><font:Symbol><index:89>\r
+<char:Zeta><font:Symbol><index:90>\r
+<char:bracketleft><font:Symbol><index:91>\r
+<char:therefore><font:Symbol><index:92>\r
+<char:bracketright><font:Symbol><index:93>\r
+<char:perpendicular><font:Symbol><index:94>\r
+<char:underscore><font:Symbol><index:95>\r
+<char:radicalex><font:Symbol><index:96>\r
+<char:alpha><font:Symbol><index:97>\r
+<char:beta><font:Symbol><index:98>\r
+<char:chi><font:Symbol><index:99>\r
+<char:delta><font:Symbol><index:100>\r
+<char:epsilon><font:Symbol><index:101>\r
+<char:phi><font:Symbol><index:102>\r
+<char:gamma><font:Symbol><index:103>\r
+<char:eta><font:Symbol><index:104>\r
+<char:iota><font:Symbol><index:105>\r
+<char:phi1><font:Symbol><index:106>\r
+<char:kappa><font:Symbol><index:107>\r
+<char:lambda><font:Symbol><index:108>\r
+<char:mu><font:Symbol><index:109>\r
+<char:nu><font:Symbol><index:110>\r
+<char:omicron><font:Symbol><index:111>\r
+<char:pi><font:Symbol><index:112>\r
+<char:theta><font:Symbol><index:113>\r
+<char:rho><font:Symbol><index:114>\r
+<char:sigma><font:Symbol><index:115>\r
+<char:tau><font:Symbol><index:116>\r
+<char:upsilon><font:Symbol><index:117>\r
+<char:omega1><font:Symbol><index:118>\r
+<char:omega><font:Symbol><index:119>\r
+<char:xi><font:Symbol><index:120>\r
+<char:psi><font:Symbol><index:121>\r
+<char:zeta><font:Symbol><index:122>\r
+<char:braceleft><font:Symbol><index:123>\r
+<char:bar><font:Symbol><index:124>\r
+<char:braceright><font:Symbol><index:125>\r
+<char:similar><font:Symbol><index:126>\r
+<char:Euro><font:Symbol><index:160>\r
+<char:Upsilon1><font:Symbol><index:161>\r
+<char:minute><font:Symbol><index:162>\r
+<char:lessequal><font:Symbol><index:163>\r
+<char:fraction><font:Symbol><index:164>\r
+<char:infinity><font:Symbol><index:165>\r
+<char:florin><font:Symbol><index:166>\r
+<char:club><font:Symbol><index:167>\r
+<char:diamond><font:Symbol><index:168>\r
+<char:heart><font:Symbol><index:169>\r
+<char:spade><font:Symbol><index:170>\r
+<char:arrowboth><font:Symbol><index:171>\r
+<char:arrowleft><font:Symbol><index:172>\r
+<char:arrowup><font:Symbol><index:173>\r
+<char:arrowright><font:Symbol><index:174>\r
+<char:arrowdown><font:Symbol><index:175>\r
+<char:degree><font:Symbol><index:176>\r
+<char:plusminus><font:Symbol><index:177>\r
+<char:second><font:Symbol><index:178>\r
+<char:greaterequal><font:Symbol><index:179>\r
+<char:multiply><font:Symbol><index:180>\r
+<char:proportional><font:Symbol><index:181>\r
+<char:partialdiff><font:Symbol><index:182>\r
+<char:bullet><font:Symbol><index:183>\r
+<char:divide><font:Symbol><index:184>\r
+<char:notequal><font:Symbol><index:185>\r
+<char:equivalence><font:Symbol><index:186>\r
+<char:approxequal><font:Symbol><index:187>\r
+\r
+# seems to be a quarter fraction\r
+# <char:ellipsis><font:Symbol><index:188>\r
+\r
+<char:arrowvertex><font:Symbol><index:189>\r
+<char:arrowhorizex><font:Symbol><index:190>\r
+<char:carriagereturn><font:Symbol><index:191>\r
+<char:aleph><font:Symbol><index:192>\r
+<char:Ifraktur><font:Symbol><index:193>\r
+<char:Rfraktur><font:Symbol><index:194>\r
+<char:weierstrass><font:Symbol><index:195>\r
+<char:circlemultiply><font:Symbol><index:196>\r
+<char:circleplus><font:Symbol><index:197>\r
+<char:emptyset><font:Symbol><index:198>\r
+<char:intersection><font:Symbol><index:199>\r
+<char:union><font:Symbol><index:200>\r
+<char:propersuperset><font:Symbol><index:201>\r
+<char:reflexsuperset><font:Symbol><index:202>\r
+<char:notsubset><font:Symbol><index:203>\r
+<char:propersubset><font:Symbol><index:204>\r
+<char:reflexsubset><font:Symbol><index:205>\r
+<char:element><font:Symbol><index:206>\r
+<char:notelement><font:Symbol><index:207>\r
+<char:angle><font:Symbol><index:208>\r
+<char:gradient><font:Symbol><index:209>\r
+<char:registerserif><font:Symbol><index:210>\r
+<char:copyrightserif><font:Symbol><index:211>\r
+<char:trademarkserif><font:Symbol><index:212>\r
+<char:product><font:Symbol><index:213>\r
+<char:radical><font:Symbol><index:214>\r
+<char:dotmath><font:Symbol><index:215>\r
+<char:logicalnot><font:Symbol><index:216>\r
+<char:logicaland><font:Symbol><index:217>\r
+<char:logicalor><font:Symbol><index:218>\r
+<char:arrowdblboth><font:Symbol><index:219>\r
+<char:arrowdblleft><font:Symbol><index:220>\r
+<char:arrowdblup><font:Symbol><index:221>\r
+<char:arrowdblright><font:Symbol><index:222>\r
+<char:arrowdbldown><font:Symbol><index:223>\r
+<char:lozenge><font:Symbol><index:224>\r
+<char:angleleft><font:Symbol><index:225>\r
+<char:registersans><font:Symbol><index:226>\r
+<char:copyrightsans><font:Symbol><index:227>\r
+<char:trademarksans><font:Symbol><index:228>\r
+<char:summation><font:Symbol><index:229>\r
+<char:parenlefttp><font:Symbol><index:230>\r
+<char:parenleftex><font:Symbol><index:231>\r
+<char:parenleftbt><font:Symbol><index:232>\r
+<char:bracketlefttp><font:Symbol><index:233>\r
+<char:bracketleftex><font:Symbol><index:234>\r
+<char:bracketleftbt><font:Symbol><index:235>\r
+<char:bracelefttp><font:Symbol><index:236>\r
+<char:braceleftmid><font:Symbol><index:237>\r
+<char:braceleftbt><font:Symbol><index:238>\r
+<char:braceex><font:Symbol><index:239>\r
+<char:angleright><font:Symbol><index:241>\r
+<char:integral><font:Symbol><index:242>\r
+<char:integraltp><font:Symbol><index:243>\r
+<char:integralex><font:Symbol><index:244>\r
+<char:integralbt><font:Symbol><index:245>\r
+<char:parenrighttp><font:Symbol><index:246>\r
+<char:parenrightex><font:Symbol><index:247>\r
+<char:parenrightbt><font:Symbol><index:248>\r
+<char:bracketrighttp><font:Symbol><index:249>\r
+<char:bracketrightex><font:Symbol><index:250>\r
+<char:bracketrightbt><font:Symbol><index:251>\r
+<char:bracerighttp><font:Symbol><index:252>\r
+<char:bracerightmid><font:Symbol><index:253>\r
+<char:bracerightbt><font:Symbol><index:254>\r
+\r
+\r
+# character map for Lucida New Math Extended font\r
+\r
+<char:parenleftbig><font:LucidNewMatExtT><index:161>\r
+<char:parenrightbig><font:LucidNewMatExtT><index:162>\r
+<char:bracketleftbig><font:LucidNewMatExtT><index:163>\r
+<char:bracketrightbig><font:LucidNewMatExtT><index:164>\r
+<char:floorleftbig><font:LucidNewMatExtT><index:165>\r
+<char:floorrightbig><font:LucidNewMatExtT><index:166>\r
+<char:ceilingleftbig><font:LucidNewMatExtT><index:167>\r
+<char:ceilingrightbig><font:LucidNewMatExtT><index:168>\r
+<char:braceleftbig><font:LucidNewMatExtT><index:169>\r
+<char:bracerightbig><font:LucidNewMatExtT><index:170>\r
+<char:angbracketleftbig><font:LucidNewMatExtT><index:173>\r
+<char:angbracketrightbig><font:LucidNewMatExtT><index:174>\r
+<char:vextendsingle><font:LucidNewMatExtT><index:175>\r
+<char:vextenddouble><font:LucidNewMatExtT><index:176>\r
+<char:slashbig><font:LucidNewMatExtT><index:177>\r
+<char:backslashbig><font:LucidNewMatExtT><index:178>\r
+<char:parenleftBig><font:LucidNewMatExtT><index:179>\r
+<char:parenrightBig><font:LucidNewMatExtT><index:180>\r
+<char:parenleftbigg><font:LucidNewMatExtT><index:181>\r
+<char:parenrightbigg><font:LucidNewMatExtT><index:182>\r
+<char:bracketleftbigg><font:LucidNewMatExtT><index:183>\r
+<char:bracketrightbigg><font:LucidNewMatExtT><index:184>\r
+<char:floorleftbigg><font:LucidNewMatExtT><index:185>\r
+<char:floorrightbigg><font:LucidNewMatExtT><index:186>\r
+<char:ceilingleftbigg><font:LucidNewMatExtT><index:187>\r
+<char:ceilingrightbigg><font:LucidNewMatExtT><index:188>\r
+<char:braceleftbigg><font:LucidNewMatExtT><index:189>\r
+<char:bracerightbigg><font:LucidNewMatExtT><index:190>\r
+<char:angbracketleftbigg><font:LucidNewMatExtT><index:28>\r
+<char:angbracketrightbigg><font:LucidNewMatExtT><index:29>\r
+<char:slashbigg><font:LucidNewMatExtT><index:193>\r
+<char:backslashbigg><font:LucidNewMatExtT><index:194>\r
+<char:parenleftBigg><font:LucidNewMatExtT><index:195>\r
+<char:parenrightBigg><font:LucidNewMatExtT><index:33>\r
+<char:bracketleftBigg><font:LucidNewMatExtT><index:34>\r
+<char:bracketrightBigg><font:LucidNewMatExtT><index:35>\r
+<char:floorleftBigg><font:LucidNewMatExtT><index:36>\r
+<char:floorrightBigg><font:LucidNewMatExtT><index:37>\r
+<char:ceilingleftBigg><font:LucidNewMatExtT><index:38>\r
+<char:ceilingrightBigg><font:LucidNewMatExtT><index:39>\r
+<char:braceleftBigg><font:LucidNewMatExtT><index:40>\r
+<char:bracerightBigg><font:LucidNewMatExtT><index:41>\r
+<char:angbracketleftBigg><font:LucidNewMatExtT><index:42>\r
+<char:angbracketrightBigg><font:LucidNewMatExtT><index:43>\r
+<char:slashBigg><font:LucidNewMatExtT><index:44>\r
+<char:backslashBigg><font:LucidNewMatExtT><index:45>\r
+<char:slashBig><font:LucidNewMatExtT><index:46>\r
+<char:backslashBig><font:LucidNewMatExtT><index:47>\r
+<char:parenlefttp><font:LucidNewMatExtT><index:48>\r
+<char:parenrighttp><font:LucidNewMatExtT><index:49>\r
+<char:bracketlefttp><font:LucidNewMatExtT><index:50>\r
+<char:bracketrighttp><font:LucidNewMatExtT><index:51>\r
+<char:bracketleftbt><font:LucidNewMatExtT><index:52>\r
+<char:bracketrightbt><font:LucidNewMatExtT><index:53>\r
+<char:bracketleftex><font:LucidNewMatExtT><index:54>\r
+<char:bracketrightex><font:LucidNewMatExtT><index:55>\r
+<char:bracelefttp><font:LucidNewMatExtT><index:56>\r
+<char:bracerighttp><font:LucidNewMatExtT><index:57>\r
+<char:braceleftbt><font:LucidNewMatExtT><index:58>\r
+<char:bracerightbt><font:LucidNewMatExtT><index:59>\r
+<char:braceleftmid><font:LucidNewMatExtT><index:60>\r
+<char:bracerightmid><font:LucidNewMatExtT><index:61>\r
+<char:braceex><font:LucidNewMatExtT><index:62>\r
+<char:arrowvertex><font:LucidNewMatExtT><index:63>\r
+<char:parenleftbt><font:LucidNewMatExtT><index:64>\r
+<char:parenrightbt><font:LucidNewMatExtT><index:65>\r
+<char:parenleftex><font:LucidNewMatExtT><index:66>\r
+<char:parenrightex><font:LucidNewMatExtT><index:67>\r
+<char:angbracketleftBig><font:LucidNewMatExtT><index:68>\r
+<char:angbracketrightBig><font:LucidNewMatExtT><index:69>\r
+<char:unionsqtext><font:LucidNewMatExtT><index:70>\r
+<char:unionsqdisplay><font:LucidNewMatExtT><index:71>\r
+<char:contintegraltext><font:LucidNewMatExtT><index:72>\r
+<char:contintegraldisplay><font:LucidNewMatExtT><index:73>\r
+<char:circledottext><font:LucidNewMatExtT><index:74>\r
+<char:circledotdisplay><font:LucidNewMatExtT><index:75>\r
+<char:circleplustext><font:LucidNewMatExtT><index:76>\r
+<char:circleplusdisplay><font:LucidNewMatExtT><index:77>\r
+<char:circlemultiplytext><font:LucidNewMatExtT><index:78>\r
+<char:circlemultiplydisplay><font:LucidNewMatExtT><index:79>\r
+<char:summationtext><font:LucidNewMatExtT><index:80>\r
+<char:producttext><font:LucidNewMatExtT><index:81>\r
+<char:integraltext><font:LucidNewMatExtT><index:82>\r
+<char:uniontext><font:LucidNewMatExtT><index:83>\r
+<char:intersectiontext><font:LucidNewMatExtT><index:84>\r
+<char:unionmultitext><font:LucidNewMatExtT><index:85>\r
+<char:logicalandtext><font:LucidNewMatExtT><index:86>\r
+<char:logicalortext><font:LucidNewMatExtT><index:87>\r
+<char:summationdisplay><font:LucidNewMatExtT><index:88>\r
+<char:productdisplay><font:LucidNewMatExtT><index:89>\r
+<char:integraldisplay><font:LucidNewMatExtT><index:90>\r
+<char:uniondisplay><font:LucidNewMatExtT><index:91>\r
+<char:intersectiondisplay><font:LucidNewMatExtT><index:92>\r
+<char:unionmultidisplay><font:LucidNewMatExtT><index:93>\r
+<char:logicalanddisplay><font:LucidNewMatExtT><index:94>\r
+<char:logicalordisplay><font:LucidNewMatExtT><index:95>\r
+<char:coproducttext><font:LucidNewMatExtT><index:96>\r
+<char:coproductdisplay><font:LucidNewMatExtT><index:97>\r
+<char:hatwide><font:LucidNewMatExtT><index:98>\r
+<char:hatwider><font:LucidNewMatExtT><index:99>\r
+<char:hatwidest><font:LucidNewMatExtT><index:100>\r
+<char:tildewide><font:LucidNewMatExtT><index:101>\r
+<char:tildewider><font:LucidNewMatExtT><index:102>\r
+<char:tildewidest><font:LucidNewMatExtT><index:103>\r
+<char:bracketleftBig><font:LucidNewMatExtT><index:104>\r
+<char:bracketrightBig><font:LucidNewMatExtT><index:105>\r
+<char:floorleftBig><font:LucidNewMatExtT><index:106>\r
+<char:floorrightBig><font:LucidNewMatExtT><index:107>\r
+<char:ceilingleftBig><font:LucidNewMatExtT><index:108>\r
+<char:ceilingrightBig><font:LucidNewMatExtT><index:109>\r
+<char:braceleftBig><font:LucidNewMatExtT><index:110>\r
+<char:bracerightBig><font:LucidNewMatExtT><index:111>\r
+<char:radicalbig><font:LucidNewMatExtT><index:112>\r
+<char:radicalBig><font:LucidNewMatExtT><index:113>\r
+<char:radicalbigg><font:LucidNewMatExtT><index:114>\r
+<char:radicalBigg><font:LucidNewMatExtT><index:115>\r
+<char:radicalbt><font:LucidNewMatExtT><index:116>\r
+<char:radicalvertex><font:LucidNewMatExtT><index:117>\r
+<char:radicaltp><font:LucidNewMatExtT><index:118>\r
+<char:arrowvertexdbl><font:LucidNewMatExtT><index:119>\r
+<char:arrowtp><font:LucidNewMatExtT><index:120>\r
+<char:arrowbt><font:LucidNewMatExtT><index:121>\r
+<char:bracehtipdownleft><font:LucidNewMatExtT><index:122>\r
+<char:bracehtipdownright><font:LucidNewMatExtT><index:123>\r
+<char:bracehtipupleft><font:LucidNewMatExtT><index:124>\r
+<char:bracehtipupright><font:LucidNewMatExtT><index:125>\r
+<char:arrowdbltp><font:LucidNewMatExtT><index:126>\r
+<char:arrowdblbt><font:LucidNewMatExtT><index:196>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/test.txt b/Robust/src/Benchmarks/mlp/tagger/mlp-java/test.txt
new file mode 100644 (file)
index 0000000..a41f466
--- /dev/null
@@ -0,0 +1,1057 @@
+\preamble\r
+\loadchars{charmap.txt}\r
+\loadchars{standard-charmap.txt}\r
+\loadchars{lucmathsym-charmap.txt}\r
+\loadchars{lucmathit-charmap.txt}\r
+\loadchars{lucmathext-charmap.txt}\r
+\loadchars{symbol-charmap.txt}\r
+\loadstyles{styles.txt}\r
+\r
+\title A Micromodularity Mechanism\r
+\r
+\section Testing\r
+\r
+This is gamma: \gamma.\\\r
+This is Delta: \Delta.\\\r
+This is oplus: \oplus.\r
+\scriptA \arrowdblright \scriptA\r
+\r
+This is a subscripted variable: A\sub<\bold<hello>\italics<there>>.\r
+Math mode: $x + 2 = y, and && x\sub<2> = y\sub<3> = x\sub<ijk>$\r
+\r
+\author Daniel Jackson, Ilya Shlyakhter and Manu Sridharan\\\r
+Laboratory for Computer Science\\\r
+Massachusetts Institute of Technology\\\r
+Cambridge, Massachusetts, USA\\\r
+dnj@mit.edu\r
+\r
+\opening Abstract\r
+\r
+A simple mechanism for structuring specifications is described. By modelling structures as atoms, it  remains entirely first-order and thus amenable to automatic analysis. And by interpreting fields of structures as relations, it allows the same relational operators used in the formula language to be used for dereferencing. An extension feature allows structures to be developed incrementally, but requires no textual inclusion nor any notion of subtyping. The paper demonstrates the flexibility of the mechanism by application in a variety of common idioms.\r
+\r
+\subsection* Categories and Subject Descriptors\r
+\r
+D.2.1 Requirements/Specifications---Languages; D.2.4 Software/Program Verification---Formal methods, Model checking; F.3.1 Specifying and Verifying and Reasoning about Programs---Assertions, Invariants, Specification techniques.\r
+\r
+\subsection* General Terms\r
+\r
+Design; Documentation; Languages; Verification.\r
+\r
+\subsection* Keywords\r
+\r
+Modeling languages; formal specification; first-order logic; relational calculus; Alloy language; Z specification language; schema calculus.\r
+\r
+\section* Introduction\r
+\r
+\quote I am neither crazy nor a micromaniac.\\\r
+(A micromaniac is someone obsessed with\\\r
+reducing things to their smallest possible form.\\\r
+This word, by the way, is not in the dictionary.)\\\r
+--_Edouard de Pomiane, French Cooking in Ten Minutes, 1930_\r
+\r
+\noindent Most specification languages provide mechanisms that allow larger specifications to be built from smaller ones. These mechanisms are often the most complicated part of the language, and present obstacles to analysis. This paper presents a simple mechanism that seems to be expressive enough for a wide variety of uses, without compromising analyzability.\r
+\r
+This work is part of a larger project investigating the design of a "micro modelling language". Our premise is that lightweight application of formal methods [6] demands an unusually small and simple language that is amenable to fully automatic semantic analysis. The Alloy language is the result to date of our efforts to design such a language. Based on our experiences with the language [4] and its analyzer [5], we have recently developed a revision of Alloy that overcomes many of its limitations. This paper describes the key feature of the revised language: the _signature_, a new modularity mechanism.\r
+\r
+The mechanism allows our existing analysis scheme [3] to be applied to specifications involving structures. This is not achieved by treating the structuring mechanism as a syntactic sugar, which would limit the power of the notation (ruling out, for example, quantification over structures) and would complicate the analysis tool and make output harder for users to interpret. Because of the mechanism's generality, it has also enabled us to simplify the language as a whole, making it more uniform and eliminating some ad hoc elements.\r
+\r
+Our mechanism has a variety of applications. It can express inherent structure in the system being modelled, and can be used to organize a specification in which details are added incrementally. It can be used to construct a library of datatypes, or to describe a system as an instantiation of a more general system. And it can express state invariants, transitions, and sequences, despite the lack of any special syntax for state machines.\r
+\r
+In this last respect, the new language differs most markedly from its predecessor [4], which provided built-in notions of state invariants and operations. We now think this was a bad idea, because it made the language cumbersome for problems (such as the analysis of security policies or architectural topology constraints) in which temporal behaviour can be fruitfully ignored, and too inflexible for many problems in which temporal behaviour is important.\r
+\r
+#Because the notation as a whole is small, simple and analyzable, and free of bias towards any particular domain of application, it may be suitable as an intermediate language. A tool for architectural design, for example, might translate a more domain-specific notation into our language, allowing analyses that such tools do not currently support (such as automatic generation of sample configurations from style rules, and checking of consistency).\r
+#\r
+Our paper begins by explaining our motivations---the requirements our mechanism is designed to meet. The mechanism is then presented first informally in a series of examples, and then slightly more rigorously feature-by-feature. We discuss related work, especially the schema calculus of Z, and close with a summary of the merits and deficiences of our notation as a whole.\r
+\r
+\section Requirements\r
+\r
+The goal of this work was to find a single structuring mechanism that would support a variety of common specification idioms:\r
+\r
+\point \cdot   _States_: description of complex state as a collection of named components; incremental description both by hierarchy, in which a complex state becomes a component of a larger state, and by extension, in which new components are added; declaration of invariants and definitions of derived components;\r
+\r
+\point \cdot   _Datatypes_: separate description of a library of polymorphic datatypes, such as lists, sequences, trees and orders, along with their operators;\r
+\r
+\point \cdot   _Transitions_: specification of state transitions as operations described implicitly as formulas relating pre- and post-state; composition of operations from previously defined invariants and operations; sequential composition of operations; description of traces as sequences of states;\r
+\r
+\point \cdot   _Abstractions_: description of abstraction relations between state spaces;\r
+\r
+\point \cdot   _Assertions_: expression of properties intended to be redundant, to be checked by analysis, including: relationships amongst invariants; wellformedness of definitions (eg, that an implicit definition is functional); establishment and preservation of invariants by operations; properties of states reachable along finite traces; and simulation relationships between abstract and concrete versions of an operation.\r
+\r
+\noindent We wanted additionally to meet some more general criteria:\r
+\r
+\point \cdot   _Simplicity_. The language as a whole should be exceptionally small and simple.\r
+\r
+\point \cdot   _Flexibility_. Support for the particular idioms of state-machine specification should not be a straitjacket; the language should not dictate how state machines are expressed, and should not make it hard to describe structures that are not state machines (such as security models and architectural styles).\r
+\r
+\point \cdot   _Analyzability_. A fully automatic semantic analysis should be possible. In the present work, this has been achieved by requiring that the modularity mechanism be first order, and expressible in the kernel of the existing language.\r
+\r
+\noindent Finally, our language design decisions have been influenced by some principles that we believe contribute to these goals, make the language easier to use, and analysis tools easier to build:\r
+\r
+\point \cdot   _Explicitness_. The language should be fully explicit, with as few implicit constraints, coercions, etc, as possible.\r
+\r
+\point \cdot   _Minimal mathematics_. The basic theory of sets and relations should suffice; it should not be necessary to introduce domains, fixed points, infinities or special logical values.\r
+\r
+\point \cdot   _Minimal syntax_. There should be very few keywords or special symbols, and no need for special typography or layout.\r
+\r
+\point \cdot   _Uniformity_. A small and general set of constructs should be applied uniformly, independent of context.\r
+\r
+\point \cdot   _Lack of novelty_. Whenever possible, notions and syntax should follow standard usage of conventional mathematics and programming.\r
+\r
+\section Informal Description\r
+\r
+As a running example, we will specify a simple memory system involving a cache and a main memory. The memory has a fixed set of addresses and associates a data value with each address. The cache, in contrast, associates data values with some subset of addresses that varies over time. The cache is updated by a "write-back scheme", which means that updates need not be reflected to main memory immediately. The cache may therefore hold a more current value for an address than the main memory; the two are brought into alignment when the address is flushed from the cache and its value is written to main memory.\r
+\r
+\subsection States\r
+\r
+We start by declaring the existence of addresses and data values:\r
+\r
+\geekmath sig Addr {}\\\r
+sig Data {}\r
+\r
+Each line declares a _signature_, and introduces a set of atoms: _Addr_ for the set of addresses, and _Data_ for the set of data values. Like 'given types' in Z, these sets are disjoint from one another, and their atoms are unstructured and uninterpreted. Signature names can be used as expressions denoting sets, but they are also treated as types, so the expression _Addr+Data_, for example, is ill-typed, since the union operator (+) requires the types of its operands to match.\r
+\r
+The signature declaration\r
+\r
+\geekmath sig Memory {\\\r
+       addrs: set Addr,\\\r
+       map: addrs ->! Data\\\r
+       }\r
+\r
+likewise declares a set of atoms, _Memory_, corresponding to the set of all possible memories. In addition, it declares two fields: _addrs_ and _map_ which associate with a memory a set of addresses and a mapping from addresses to data values respectively. Thus, given a memory _m_, the expression _m.addrs_ will be a set of addresses, _m.map_ will be a relation from addresses to data values. The memory, addresses and data values should be viewed as distinct atoms in their own right; fields don't decompose an atom, but rather relate one atom to others. The exclamation mark in the declaration of the field _map_ is a 'multiplicity marking': it says that _m.map_ associates exactly one data value with each address in the set _m.addrs_. The use of _addrs_ rather than _Addr_ on the left side of the arrow indicates that _m.map_ does not associate a data value with an address that is not in the set _m.addrs_.\r
+\r
+In these expressions, the dot is simply relational image. More precisely, when we say that _m_ is a memory, we mean that the expression _m_ denotes a set consisting of a single atom. The field _addrs_ is a relation from _Memory_ to _Addr_, and _m.addrs_ denotes the image of the singleton set under this relation. So for a set of memories _ms_, the expression _ms.addrs_ will denote the union of the sets of addresses that belong to the individual memories. Given an address _a_, the expression _a.(m.map)_ denotes the set of data values associated with address _a_ in memory _m_, which will either be empty (when the address is not mapped) or a singleton. For convenience, we allow the relational image _s.r_ to be written equivalently as _r_[_s_], where [] binds more loosely than dot, so this expression may be written as _m.map_[_a_] instead.\r
+\r
+Like objects of an object-oriented language, two distinct atoms can have fields of the same value. Unlike objects, however, atoms are immutable. Each field is fixed, and cannot map an atom to one value at one time and another value at another time. To describe an operation that changes the state of a memory, therefore, we will use two distinct atoms in the set _Memory_ to represent the memory's state before and after.\r
+\r
+\subsection Extension\r
+\r
+A signature declaration can introduce a set as a subset of one previously declared, in which case we call it a _subsignature_. In this case, the set does not correspond to a type, but rather its atoms take on the type of the superset. For example, the declaration\r
+\r
+\geekmath sig MainMemory extends Memory {}\r
+\r
+introduces a set of atoms _MainMemory_ representing main memories, which is constrained to be a subset of the set _Memory_. Likewise\r
+\r
+\geekmath sig Cache extends Memory {\\\r
+       dirty: set addrs\\\r
+       }\r
+\r
+introduces a set of atoms _Cache_ representing those memories that can be regarded as caches. It also introduces a field _dirty_ that associates with a cache the set of addresses that is dirty; later, we will use this to represent those addresses for which a cache and main memory differ. Because _Cache_ is a subset of _Memory_, and _m.addrs_ (for any memory _m_) is a subset of _Addr_, the field denotes a relation whose type is from _Memory_ to _Addr_. Expressions such as _m.dirty_ are therefore type-correct for a memory _m_, whether or not _m_ is a cache. But since declaration of the field _dirty_ within the signature _Cache_ constrains _dirty_ to be a relation that maps only caches, _m.dirty_ will always denote the empty set when _m_ is not a cache.\r
+\r
+This approach avoids introducing a notion of subtyping. Subtypes complicate the language, and tend to make it more difficult to use. In OCL [17], which models extension with subtypes rather than subsets, an expression such as _m.dirty_ would be illegal, and would require a coercion of _m_ to the subtype _Cache_. Coercions do not fit smoothly into the relational framework; they interfere with the ability to take the image of a set under a relation, for example.  Moreover, subtypes are generally disjoint, whereas our approach allows the sets denoted by subsignatures to overlap. In this case, we'll add a constraint (in Section 2.4 below) to ensure that _MainMemory_ and _Cache_ are in fact disjoint.\r
+\r
+Declaring _Cache_ and _MainMemory_ as subsignatures of _Memory_ serves to factor out their common properties. Extension can be used for a different purpose, in which a single signature is developed by repeated extensions along a chain. In this case, the supersignatures may not correspond to entities in the domain being modelled, but are simply artifacts of specification---fragments developed along the way. Z specifications are typically developed in this style.\r
+\r
+\subsection Hierarchy\r
+\r
+The signature declaration also supports hierarchical structuring. We can declare a signature for systems each consisting of a cache and a main memory:\r
+\r
+\geekmath sig System {\\\r
+       cache: Cache,\\\r
+       main: MainMemory\\\r
+       }\r
+\r
+Again, _System_ introduces a set of atoms, and each field represents a relation. The omission of the keyword _set_ indicates that a relation is a total function. So for a system _s_, the expression _s.cache_ denotes one cache---that is, a set consisting of a single cache. This is one of very few instances of implicit constraints in our language, which we introduced in order to make declaration syntax conventional.\r
+\r
+Since signatures denote sets of atoms, apparently circular references are allowed. Linked lists, for example, may be modelled like this, exactly as they might be implemented in a language like Java:\r
+\r
+\geekmath sig List {}\\\r
+sig NonEmptyList extends List {elt: Elt, rest: List}\r
+       \r
+There is no recursion here; the field _rest_ is simply a homogeneous relation of type _List_ to _List_, with its domain restricted to the subset _NonEmptyList_.\r
+\r
+\subsection State Properties\r
+\r
+Properties of signature atoms are recorded as logical formulas. To indicate that such a property always holds, we package it as a _fact_. To say that, for any memory system, the addresses in a cache are always addresses within the main memory, we might write:\r
+\r
+\geekmath fact {all s: System | s.cache.addrs in s.main.addrs}\r
+\r
+or, using a shorthand that allows facts about atoms of a signature to be appended to it:\r
+\r
+\geekmath sig System {cache: Cache, main: MainMemory}\\\r
+       {cache.addrs in main.addrs}\r
+\r
+The appended fact is implicitly prefixed by\r
+\r
+\geekmath all this: System | with this |\r
+\r
+in which the _with_ construct, explained in Sectiom 3.6 below, causes the fields implicitly to be dereferences of the atom _this_.\r
+\r
+A fact can constrain atoms of arbitrary signatures; to say that no main memory is a cache we might write:\r
+\r
+\geekmath fact {no (MainMemory & Cache)}\r
+\r
+where _no e_ means that the expression _e_ has no elements, and & is intersection.\r
+\r
+#Again, this is common enough that we provide a shorthand. Declaring a subsignature as _disjoint_ indicates that it shares no atoms with any other subsignatures of the same supersignature. So the fact can be replaced by changing our declaration of _MainMemory_ to:\r
+#\r
+#\geekmath disjoint sig MainMemory extends Memory {}\r
+#\r
+Most descriptions have more interesting facts. We can express the fact that linked lists are acyclic, for example:\r
+\r
+\geekmath fact {no p: List | p in p.\hat @sep rest}\r
+\r
+The expression _\hat @sep rest_ denotes the transitive closure of the relation _rest_, so that _p.^rest_ denotes the set of lists reachable from _p_ by following the field _rest_ once or more. This illustrates a benefit of treating a field as a relation---that we can apply standard relational operators to it---and is also an example of an expression hard to write in a language that treats extension as subtyping (since each application of _rest_ would require its own coercion).\r
+\r
+Often we want to define a property without imposing it as a permanent constraint. In that case, we declare it as a _function_. Here, for example, is the invariant that the cache lines not marked as dirty are consistent with main memory:\r
+\r
+\geekmath fun DirtyInv (s: System) {\\\r
+       all a !: s.cache.dirty | s.cache.map[a] = s.main.map[a]\\\r
+       }\r
+       \r
+(The exclamation mark negates an operator, so the quantification is over all addresses that are _not_ dirty.) Packaging this as a function that can be applied to a particular system, rather than as a fact for all systems, will allow us to express assertions about preservation of the invariant (Section 2.8).\r
+\r
+By default, a function returns a boolean value---the value of the formula in its body. The value of _DirtyInv(s)_ for a system _s_ is therefore true or false. A function may return non-boolean values. We might, for example, define the set of bad addresses to be those for which the cache and main memory differ:\r
+\r
+\geekmath fun BadAddrs (s: System): set Addr {\\\r
+       result = {a: Addr | s.cache.map[a] != s.main.map[a]}\\\r
+       }\r
+\r
+and then write our invariant like this:\r
+\r
+\geekmath fun DirtyInv (s: System) {BadAddrs(s) in s.cache.dirty}\r
+\r
+In this case, _BadAddrs(s)_ denotes a set of addresses, and is short for the expression on the right-hand side of the equality in the definition of the function _BadAddrs_. The use of the function application as an expression does not in fact depend on the function being defined explicitly. Had we written\r
+\r
+\geekmath fun BadAddrs (s: System): set Addr {\\\r
+       all a: Addr | a in result iff s.cache.map[a] != s.main.map[a]\\\r
+       }\r
+       \r
+the application would still be legal; details are explained in Section 3.7.\r
+# \r
+# \geekmath BadAddrs(s) in s.cache.dirty\r
+# \r
+# would be treated as short for \r
+# \r
+# \geekmath all result: set Addr |\\\r
+#      (all a: Addr | a in result iff  s.cache.map[a] != s.main.map[a])\\\r
+#      => result in s.cache.dirty\r
+# \r
+# This desugaring is explained in more detail in Section 99 below.\r
+\r
+\subsection Operations\r
+\r
+Following Z, we can specify operations as formulas that constrain pre- and post-states. An operation may be packaged as a single function (or as two functions if we want to separate pre- and post-conditions in the style of VDM or Larch).\r
+\r
+The action of writing a data value to an address in memory might be specified like this:\r
+\r
+\geekmath fun Write (m,m': Memory, d: Data, a: Addr) {\\\r
+       m'.map = m.map ++ (a->d)\\\r
+       }\r
+\r
+The formula in the body of the function relates _m_, the value of the memory before, to _m'_, the value after. These identifers are just formal arguments, so the choice of names is not significant. Moreover, the prime mark plays no special role akin to decoration in Z---it's a character like any other. The operator ++ is relational override, and the arrow forms a cross product. As mentioned above, scalars are represented as singleton sets, so there is no distinction between a tuple and a relation. The arrows in the expressions _a->d_ here and _addrs->Data_ in the declaration of the _map_ field of _Memory_ are one and the same. \r
+\r
+The action of reading a data value can likewise be specified as a function, although since it has no side-effect we omit the _m'_ parameter:\r
+\r
+\geekmath fun Read (m: Memory, d: Data, a: Addr) {\\\r
+       d = m.map[a]\\\r
+       }\r
+       \r
+Actions on the system as a whole can be specified using these primitive operations; in Z, this idiom is called 'promotion'. A read on the system is equivalent to reading the cache:\r
+\r
+\geekmath fun SystemRead (s: System, d: Data, a: Addr) {\\\r
+       Read (s.cache, d, a)\\\r
+       }\r
+\r
+The _Read_ operation has an implicit precondition. Since the data parameter _d_ is constrained (implicitly by its declaration) to be scalar---that is, a singleton set---the relation _m.map_ must include a mapping for the address parameter _a_, since otherwise the expression _m.map[a]_ will evaluate to the empty set, and the formula will not be satisfiable. This precondition is inherited by _SystemRead_. If the address _a_ is not in the cache, the operation cannot proceed, and it will be necessary first to load the data from main memory. It is convenient to specify this action as a distinct operation:\r
+\r
+\geekmath fun Load (s,s': System, a: Addr) {\\\r
+       a !in s.cache.addrs\\\r
+       s'.cache.map = s.cache.map + (a->s.main.map[a])\\\r
+       s'.main = s.main\\\r
+       }\r
+\r
+The + operator is just set union (in this case, of two binary relations, the second consisting of a single tuple). A write on the system involves a write to the cache, and setting the dirty bit. Again, this can be specified using a primitive memory operation:\r
+\r
+\geekmath fun SystemWrite (s,s': System, d: Data, a: Addr) {\\\r
+       Write (s.cache, s'.cache, d, a)\\\r
+       s'.cache.dirty = s.cache.dirty + a\\\r
+       s'.main = s.main\\\r
+       }\r
+\r
+A cache has much smaller capacity than main memory, so it will occasionally be necessary (prior to loading or writing) to flush lines from the cache back to main memory. We specify flushing as a non-deterministic operation that picks some subset of the cache addrs and writes them back to main memory:\r
+\r
+\geekmath fun Flush (s,s': System) {\\\r
+       some x: set s.cache.addrs {\\\r
+               s'.cache.map = s'.cache.map - (x->Data)\\\r
+               s'.cache.dirty = s.cache.dirty - x\\\r
+               s'.main.map = s.main.map ++ \\\r
+                       {a: x, d: Data | d = s.cache.map[a]}\\\r
+               }\r
+\r
+The - operator is set difference; note that it is applied to sets of addresses (in the third line) and to binary relations (in the second). The comprehension expression creates a relation of pairs _a_->_d_ satisfying the condition.\r
+\r
+Finally, it is often useful to specify the initial conditions of a system. To say that the cache initially has no addresses, we might write a function imposing this condition on a memory system:\r
+\r
+\geekmath fun Init (s: System) {no s.cache.addrs}\r
+\r
+\subsection Traces\r
+\r
+To support analyses of behaviours consisting of sequences of states, we declare two signatures, for ticks of a clock and traces of states:\r
+\r
+\geekmath sig Tick {}\\\r
+sig SystemTrace {\\\r
+       ticks: set Tick,\\\r
+       first, last: ticks,\\\r
+       next: (ticks - last) !->! (ticks - first)\\\r
+       state: ticks ->! System}\\\r
+       {\\\r
+       first.*next = ticks\\\r
+       Init (first.state)\\\r
+       all t: ticks - last | \\\r
+               some s = t.state, s' = t.next.state |\\\r
+                       Flush (s,s')\\\r
+                       || (some a: Addr | Load (s,s',a))\\\r
+                       || (some d: Data, a: Addr | SystemWrite (s,s',d,a))\\\r
+       }\r
+\r
+Each trace consists of a set of _ticks_, a _first_ and _last_ tick, an ordering relation _next_ (whose declaration makes it a bijection from all ticks except the last to all ticks except the first), and a relation _state_ that maps each tick to a system state.\r
+\r
+The fact appended to the signature states first a generic property of traces: that the ticks of a trace are those reachable from the first tick. It then imposes the constraints of the operations on the states in the trace. The initial condition is required to hold in the first state. Any subsequent pair of states is constrained to be related by one of the three side-effecting operations. The existential quantifier plays the role of a _let_ binding, allowing _s_ and _s'_ in place of _t.state_ and _t.next.state_, representing the state for tick _t_ and the state for its successor _t.next_. Note that this formulation precludes stuttering; we could admit it simply by adding the disjunct _s_=_s'_ allowing a transition that corresponds to no operation occurring.\r
+\r
+Bear in mind that this fact is a constraint on all atoms in the set _SystemTrace_. As a free standing fact, the second line of the fact---the initial condition--- would have been written:\r
+\r
+\geekmath fact {all x: SystemTrace | Init ((x.first).(x.state))}\r
+\r
+\subsection Abstraction\r
+\r
+Abstraction relationships are easily expressed using our function syntax. To show that our memory system refines a simple memory without a cache, we define an abstraction function _Alpha_ saying that a system corresponds to a memory that is like the system's memory, overwritten by the entries of the system's cache:\r
+\r
+\geekmath fun Alpha (s: System, m: Memory) {\\\r
+       m.map = s.main.map ++ s.cache.map\\\r
+       }\r
+       \r
+As another example, if our linked list were to represent a set, we might define the set corresponding to a given list as that containing the elements reachable from the start:\r
+\r
+\geekmath fun ListAlpha (p: List, s: set Elt) {\\\r
+       s = p.*rest.elt\\\r
+       }\r
+\r
+\subsection Assertions\r
+\r
+Theorems about a specification are packaged as _assertions_. An assertion is simply a formula that is intended to hold. A tool can check an assertion by searching for a counterexample---that is, a model of the formula's negation.\r
+\r
+The simplest kinds of assertion record consequences of state properties. For example,\r
+\r
+\geekmath assert {\\\r
+       all s: System | DirtyInv (s) && no s.cache.dirty\\\r
+               => s.cache.map in s.main.map\\\r
+       }\r
+\r
+asserts that if the dirtiness invariant holds,and there are no dirty addresses, then the mapping of addresses to data in the cache is a subset of the mapping in the main memory.\r
+\r
+An assertion can express consequences of operations. For example,\r
+\r
+\geekmath assert {\\\r
+       all s: System, d: Data, a: Addr |\\\r
+               SystemRead (s,d,a) => a in s.cache.addrs\\\r
+       }\r
+\r
+embodies the claim made above that _SystemRead_ has an implicit precondition; it asserts that whenever _SystemRead_ occurs for an address, that address must be in the cache beforehand. An assertion can likewise identify a consequence in the post-state; this assertion\r
+\r
+\geekmath assert {\\\r
+       all s,s': System, d: Data, a: Addr |\\\r
+               SystemWrite (s,s',d,a) => s'.cache.map[a] = d\\\r
+       }\r
+       \r
+says that after a _SystemWrite_, the data value appears in the cache at the given address. \r
+\r
+Preservation of an invariant by an operation is easily recorded as an assertion. To check that our dirtiness invariant is preserved when writes occur, we would assert\r
+\r
+\geekmath assert {\\\r
+       all s,s': System, d: Data, a: Addr |\\\r
+               SystemWrite (s,s',d,a) && DirtyInv (s) => DirtyInv (s')\\\r
+       }\r
+\r
+Invariant preservation is not the only consequence of an operation that we would like to check that relates pre- and post-states. We might, for example, want to check that operations on the memory system do not change the set of addresses of the main memory. For the _Flush_ operation, for example, the assertion would be\r
+\r
+\geekmath assert {\\\r
+       all s,s': System | Flush(s,s') => s.main.addrs = s'.main.addrs\\\r
+       }\r
+       \r
+which holds only because the cache addresses are guaranteed to be a subset of the main memory addresses (by the fact associated with the _System_ signature).\r
+\r
+The effect of a sequence of operations can be expressed by quantifying appropriately over states. For example, \r
+\r
+\geekmath assert {\\\r
+       all s, s': System, a: Addr, d,d': Data | \\\r
+               SystemWrite (s,s',d,a) && SystemRead (s',d',a) => d = d'\\\r
+       }\r
+\r
+says that when a write is followed by a read of the same address, the read returns the data value just written.\r
+\r
+To check that a property holds for all reachable states, we can assert that the property is an invariant of every operation, and is established by the initial condition. This strategy can be shown (by induction) to be sound, but it is not complete. A property may hold for all reachable states, but may not be preserved because an operation breaks the property when executed in a state that happens not to be reachable.\r
+\r
+Traces overcome this incompleteness. Suppose, for example, that we want to check the (rather contrived) property that, in every reachable state, if the cache contains an address that isn't dirty, then it agrees with the main memory on at least one address:\r
+\r
+\geekmath fun DirtyProp (s: System) {\\\r
+       some (s.cache.addrs - s.cache.dirty)\\\r
+               => some a: Addr | s.cache.map[a] = s.main.map[a]\\\r
+       }\r
+\r
+We can assert that this property holds in the last state of every trace:\r
+\r
+\geekmath assert {\\\r
+       all t: SystemTrace | with t | DirtyProp (last.state)\\\r
+       }\r
+       \r
+This assertion is valid, even though _DirtyProp_ is not an invariant. A write invoked in a state in which all clean entries but one had non-matching values can result in a state in which there are still clean entries but none has a matching value.\r
+\r
+Finally, refinements are checked by assertions involving abstraction relations. We can assert that a _SystemWrite_ refines a basic _Write_ operation on a simple memory:\r
+\r
+\geekmath assert {\\\r
+       all s,s': System, m,m': Memory, a: Addr, d: Data |\\\r
+               Alpha (s,m) && Alpha (s',m') && SystemWrite (s,s',a,d)\\\r
+               => Write (m,m',a,d)\\\r
+       }\r
+\r
+or that the _Flush_ operation is a no-op when viewed abstractly:\r
+\r
+\geekmath assert {\\\r
+       all s,s': System, m,m': Memory |\\\r
+               Alpha (s,m) && Alpha (s',m') && Flush (s,s')\\\r
+               => m.map = m'.map\\\r
+       }\r
+\r
+Note the form of the equality; _m = m'_ would be wrong, since two distinct memories may have the same mapping, and the abstraction _Alpha_ constrains only the mapping and not the memory atom itself.\r
+\r
+Many of the assertions shown here can be made more succinct by the function shorthand explained in Section 3.7 below. For example, the assertion that a read following a write returns the value just written becomes:\r
+\r
+\geekmath assert {\\\r
+       all s: System, a: Addr, d: Data | \\\r
+               SystemRead (SystemWrite (s,d,a),a) = d\\\r
+       }\r
+\r
+and the assertion that _Flush_ is a no-op becomes:\r
+\r
+\geekmath assert {\\\r
+       all s: System | Alpha (s).map = Alpha (Flush (s)).map\\\r
+       }\r
+\r
+\subsection Polymorphism\r
+\r
+Signatures can be parameterized by signature types. Rather than declaring a linked list whose elements belong to a particular type _Elt_, as above, we would prefer to declare a generic list:\r
+\r
+\geekmath sig List [T] {}\\\r
+sig NonEmptyList [T] extends List [T] {elt: T, rest: List [T]}\r
+\r
+Functions and facts may be parameterized in the same way, so we can define generic operators, such as:\r
+\r
+\geekmath fun first [T] (p: List [T]): T {result = p.elt}\\\r
+fun last [T] (p: List [T]): T {some q: p.*rest | result = q.elt && no q.rest}\\\r
+fun elements [T] (p: List [T]): set T {result = p.*rest.elt}\r
+\r
+In addition, let's define a generic function that determines whether two elements follow one another in a list:\r
+\r
+\geekmath fun follows [T] (p: List[T], a,b: T) {\\\r
+       some x: p.*rest | x.elt = a && x.next.elt = b\\\r
+       }\r
+\r
+To see how a generic signature and operators are used, consider replacing the traces of Section 2.6 with lists of system states. Define a function that determines whether a list is a trace:\r
+\r
+\geekmath fun isTrace (t: List [System]) {\\\r
+       Init (first(t))\\\r
+       all s, s': System | follows (t,s,s') => {\\\r
+               Flush (s,s')\\\r
+               || (some a: Addr | Load (s,s',a))\\\r
+               || (some d: Data, a: Addr | SystemWrite (s,s',d,a))\\\r
+               }\\\r
+       }\r
+\r
+Now our assertion that every reachable system state satisfies _DirtyProp_ can now be written:\r
+\r
+\geekmath assert {\\\r
+       all t: List[System] | isTrace(t) => DirtyProp (last(t))\\\r
+       }\r
+\r
+\subsection    Variants\r
+\r
+To illustrate the flexibility of our notation, we sketch a different formulation of state machines oriented around transitions rather than states.\r
+\r
+Let's introduce a signature representing state transitions of our memory system:\r
+\r
+\geekmath sig SystemTrans {pre,post: System}\\\r
+       {pre.main.addrs = post.main.addrs}\r
+\r
+Declaring the transitions as a signature gives us the opportunity to record properties of all transitions---in this case requiring that the set of addresses of the main memory is fixed.\r
+\r
+Now we introduce a subsignature for the transitions of each operation. For example, the transitions that correspond to load actions are given by:\r
+\r
+\geekmath sig LoadTrans extends SystemTrans {a: Addr}\\\r
+       {Load (pre, post, a)}\r
+#      } {\r
+#      a !in pre.cache.addrs\\\r
+#      post.cache.map = pre.cache.map ++ (a->pre.main.map[a])\\\r
+#      post.main = pre.main\\\r
+#      }\r
+# \r
+# The formula here is actually identical to the one declared above, but with _pre_ and _post_ for # _s_ and _s'_ ; we could in fact replace it by the function application _Load(pre,post,a)_.\r
+\r
+For each invariant, we define a set of states. For the states satisfying the dirty invariant, we might declare\r
+\r
+\geekmath sig DirtyInvStates extends System {}\r
+\r
+along with the fact\r
+\r
+\geekmath fact {DirtyInvStates = {s: System | DirtyInv(s)}}\r
+\r
+To express invariant preservation, it will be handy to declare a function that gives the image of a set of states under a set of transitions:\r
+\r
+\geekmath fun postimage (ss: set System, tt: set SystemTrans): set System {\\\r
+       result = {s: System | some t: tt | t.pre in ss && s = t.post}\\\r
+       }\r
+\r
+so that we can write the assertion like this:\r
+\r
+\geekmath assert {postimage (DirtyInvStates, LoadTrans) in DirtyInvStates}\r
+\r
+For an even more direct formulation of state machine properties, wemight have defined a  transition relation instead:\r
+\r
+\geekmath fun Trans (r: System -> System) {\\\r
+       all s, s' : System | \\\r
+               s->s' in r => Flush (s,s') || ...\\\r
+               }\r
+\r
+Then, using transitive closure, we can express the set of states reachable from an initial state, and assert that this set belongs to the set characterized by some property:\r
+\r
+\geekmath assert {all r: System -> System, s: System |\\\r
+       Init (s) && Trans(r) => s.*r in DirtyPropStates\\\r
+       }\r
+\r
+where _DirtyPropStates_ is defined analogously to _DirtyInvStates_.\r
+\r
+\subsection    Definitions\r
+\r
+Instead of declaring the addresses of a memory along with its mapping, as we did before:\r
+\r
+\geekmath sig Memory {\\\r
+       addrs: set Addr,\\\r
+       map: addrs ->! Data\\\r
+       }\r
+\r
+we could instead have declared the mapping alone:\r
+\r
+\geekmath sig Memory {\\\r
+       map: Addr ->? Data\\\r
+       }\r
+\r
+and then _defined_ the addresses using a subsignature:\r
+\r
+\geekmath sig MemoryWithAddrs extends Memory {\\\r
+       addrs: set Addr}\\\r
+       {addrs = {a: Addr | some a.map}}\r
+       \r
+Now by making the subsignature subsume all memories:\r
+\r
+\geekmath fact {Memory in MemoryWithAddrs}\r
+\r
+we have essentially 'retrofitted' the field. Any formula involving memory atoms now implicitly constrains the _addrs_ field. For example, we can assert that _Read_ has an implicit precondition requiring that the argument be a valid address:\r
+\r
+\geekmath assert {all m: Memory, a: Addr, d: Data | Read (m,d,a) => a in m.addrs}\r
+\r
+even though the specification of _Read_ was written when the field _addrs_ did not even exist.\r
+\r
+\section Semantics\r
+\r
+For completeness, we give an overview of the semantics of the language. The novelties with respect to the original version of Alloy [4] are (1) the idea of organizing relations around basic types as signatures, (2) the treatment of extension as subsetting, and (3) the packaging of formulas in a more explicit (and conventional) style. The semantic basis has been made cleaner, by generalizing relations to arbitrary arity, eliminating 'indexed relations' and the need for a special treatment of sets.\r
+\r
+\subsection Types\r
+\r
+We assume a universe of atoms. The standard notion of a mathematical relation gives us our only composite datatype. The value of an expression will always be a relation---that is, a collection of tuples of atoms. Relations are first order: the elements of a tuple are themselves atoms and never relations.\r
+\r
+The language is strongly typed. We partition the universe into subsets each associated with a _basic_ type, and write (T_1, T_2, ..., T_n) for the type of a relation whose tuples each consist of _n_ atoms, with types T_1, T_2, etc.\r
+\r
+A set is represented semantically as a unary relation, namely a relation whose tuples each contain one atom. A tuple is represented as a singleton relation, namely a relation containing exactly one tuple. A scalar is represented as a unary, singleton relation. We use the terms 'set', 'tuple' and 'scalar' to describe relations with the appropriate properties. Basic types are used only to construct relation types, and every expression that appears in a specification has a relational type. Often we will say informally that an expression has a type _T_ where _T_ is the name of a basic type when more precisely we mean that the expression has the type (_T_).\r
+\r
+So, in contrast to traditional mathematical style, we do not make distinctions amongst the atom _a_, the tuple (_a_), the set {_a_} containing just the atom, or the set {(_a_)} containing the tuple, and represent all of these as the last. This simplifies the semantics and gives a more succinct and uniform syntax.\r
+# Because the language is first order (and has no sets of sets, for example), it requires no coercions, and seems not to cause confusion even for novice specifiers.\r
+\r
+\subsection Expression Operators\r
+\r
+Expressions can be formed using the standard set operators written as ASCII characters: union (+), intersection (&) and difference (-). Some standard relational operators, such as transpose (~) and transitive closure (^), can be applied to expressions that denote binary relations. Relational override (++) has its standard meaning for binary relations but can applied more broadly.\r
+#The type rules and semantics are completely standard. For example, if _e_ has the type (S,T), then ~_e_ has the type (T,S) and denotes the collection of pairs obtained by reversing each pair in _e_; if _p_ and _q_ both have the type (T_1, T_2, ..., T_n), then the union _p+q_, intersection _p_&_q_, and difference _p-q_ also have that type, and denote respectively the relations whose tuples are those that appear in either of _p_ and _q_, both of _p_ and _q_, and _p_ but not _q_.\r
+\r
+There are two special relational operators, dot and arrow. The dot operator is a generalized relational composition. Given expressions $p$ and $q$, the expression $p.q$ contains the tuple\r
+$\angleleft\sep  p\sub<1>, ... p\sub<m-1>, q\sub<2>, ..., q\sub<n>\angleright$\r
+when _p_ contains \r
+@math \langle@sep p_1, ..., p_{m}\rangle,\r
+_q_ contains\r
+@math \langle@sep q_1, ... q_n\rangle,\r
+and\r
+@math p_m = q_1. The last type of _p_ and the first type of _q_ must match, and _m_ + _n_, the sum of the arities of _p_ and _q_, must be three or more so that the result is not degenerate. When _p_ is a set and _q_ is a binary relation, the composition _p.q_ is the standard relational image of _p_ under _q_; when _p_ and _q_ are both binary relations, _p.q_ is standard relational composition. In all of the examples above, the dot operator is used only for relational image.\r
+\r
+The arrow operator is cross product: _p \textarrow q_ is the relation containing the tuple\r
+@math \langle@sep p_1, ..., p_{m}, q_1, ... q_n\rangle\r
+when _p_ contains \r
+@math \langle@sep p_1, ..., p_{m}\rangle,\r
+and _q_ contains\r
+@math \langle@sep q_1, ... q_n\rangle.\r
+In all the examples in this paper, _p_ and _q_ are sets, and _p \textarrow q_ is their standard cross product.\r
+\r
+\subsection Formula Operators\r
+\r
+Elementary formulas are formed from the subset operator, written _in_. Thus _p in q_ is true when every tuple in _p_ is in _q_. The formula _p : q_ has the same meaning, but when _q_ is a set, adds an implicit constraint that _p_ be scalar (ie, a singleton). This constraint is overridden by writing _p: option q_ (which lets _p_ to be empty or a scalar) or _p: set q_ (which eliminates the constraint entirely). Equality is just standard set equality, and is short for a subset constraint in each direction.\r
+\r
+An arrow that appears as the outermost expression operator on the right-hand side of a subset formula can be annotated with _multiplicity markings_: + (one or more), ? (zero or one) and ! (exactly one). The formula\r
+\r
+\geekmath r: S m \textarrow n T\r
+\r
+where _m_ and _n_ are multiplicity markings constrains the relation _r_ to map each atom of _S_ to _n_ atoms of _T_, and to map _m_ atoms of _S_ to each atom of _T_. _S_ and _T_ may themselves be product expressions, but are usually variables denoting sets. For example,\r
+\r
+\geekmath r: S \textarrow ! T\\\r
+r: S ? \textarrow ! T\r
+\r
+make _r_ respectively a total function on _S_ and an injection.\r
+\r
+Larger formulas are obtained using the standard logical connectives: && (and), || (or), ! (not), => (implies), _iff_ (bi-implication). The formula _if b then f else g_ is short for _b_ => _f_ && !_b_ => _g_. Within curly braces, consecutive formulas are implicitly conjoined.\r
+\r
+Quantifications take their usual form:\r
+\r
+\geekmath all x: e | F\r
+\r
+is true when the formula _F_ holds under every binding of the variable _x_ to a member of the set _e_.  In addition to the standard quantifiers,  _all_ (universal) and _some_ (existential), we have _no_, _sole_ and _one_ meaning respectively that there are no values, at most one value, and exactly one value satisfying the formula. For a quantifier _Q_ and expression _e_, the formula _Q e_ is short for _Q x: T | e_ (where _T_ is the type of _e_), so _no e_, for example, says that _e_ is empty.\r
+\r
+The declaration of a quantified formula is itself a formula---an elementary formula in which the left-hand side is a variable. Thus\r
+\r
+\geekmath some x = e | F\r
+\r
+is permitted, and is a useful way to express a _let_ binding. Quantifiers may be higher-order; the formula\r
+\r
+\geekmath all f: s ->! t | F\r
+\r
+is true when _F_ holds for every binding of a total function from _s_ to _t_ to the variable _f_. Our analysis tool cannot currently handle higher-order quantifiers, but many uses of higher-order quantifiers that arise in practice can be eliminated by skolemization.\r
+\r
+Finally, we have relational comprehensions; the expression\r
+\r
+\geekmath {x_1: e_1, x_2: e_2, ... | F}\r
+\r
+constructs a relation of tuples with elements _x_1_, _x_2_, etc., drawn from set expressions _e_1_, _e_2_, etc., whose values satisfy _F_.\r
+\r
+# \subsection Choice of Operator Symbols\r
+# \r
+# The choice of symbols, especially the arrow, may seem unconventional, but results in familiar-# looking formulas. The dot operator generalizes the 'navigation expressions' of Syntropy#  [CD94], now adopted by UML's Object Constraint Language [17], and is intended to be fa# miliar to programmers by resembling object dereferencing. Thus, _x.f_ can be viewed as dere# ferencing the object _x_ with field _f_ when _x_ is a scalar and _f_ is a binary relation. The cho# ice of relational composition rather than function application allows such an expression to be wr# itten without concern for whether _f_ is a function. It also gives a simple and workable treatmen# t of partiality. When _x_ is not in the domain of _f_, _x.f_ is the empty set, and _x.f = y_ will be#  false if _y_ is a scalar.\r
+# \r
+# The arrow notation is designed to allow declarations to be written in a familiar way, but to be # given a simple, first-order interpretation. For example, if _S_ and _T_ denote sets,\r
+# \r
+# \geekmath f: S \textarrow T\r
+# \r
+# declares _f_ to be a binary relation from _S_ to _T_. A conventional interpretation would have # the arrow construct a set of relations---a higher-order notion. Instead, we interpret the arrow # as cross product and the colon as subset, with the same result. The choice of arrow is also # convenient for constructing tuples; when _x_ and _y_ are scalars, the formula# \r
+# \r
+# \geekmath r' = r + (x \textarrow y)\r
+# \r
+# makes _r'_ the relation containing the tuples of _r_, and additionally, a mapping from _x_ to # _y_. # \r
+\subsection Signatures\r
+\r
+A _signature_ declaration introduces a basic type, along with a collection of relations called _fields_. The declaration\r
+\r
+\geekmath sig S {f: E}\r
+\r
+declares a basic type _S_, and a relation _f_. If _E_ has the type (T_1, T_2, ..., T_n), the relation _f_ will have the type (S, T_1, T_2, ..., T_n), and if _x_ has the type _S_, the expression _x.f_ will have the same type as _E_. When there are several fields, field names already declared may appear in expressions on the right-hand side of declarations; in this case, a field _f_ is typed as if it were the expression _this.f_, where _this_ denotes an atom of the signature type (see Section 3.6).\r
+\r
+The meaning of a specification consisting of a collection of signature declarations is an assignment of values to global constants-- the signatures and the fields. For example, the specification\r
+\r
+\geekmath sig Addr {}\\\r
+sig Data {}\\\r
+sig Memory {map: Addr -> Data}\r
+\r
+has 4 constants---the three signatures and one field---with assignments such as:\r
+\r
+\geekmath Addr = {a0, a1}\\\r
+Data = {d0, d1, d2}\\\r
+Memory = {m0, m1}\\\r
+map = {(m0,a0,d0), (m1,a0,d1), (m1,a0,d2)}\r
+\r
+corresponding to a world in which there are 2 addresses, 3 data values and 2 memories, with the first memory (_m0_) mapping the first address (_a0_) to the first data value (_d0_), and the second memory (_m1_) mapping the first address (_a0_) both to the second (_d1_) and third (_d2_) data values.\r
+\r
+A fact is a formula that constrains the constants of the specification, and therefore tends to reduce the set of assignments denoted by the specification. For example,\r
+\r
+\geekmath fact {all m: Memory | all a: Addr | sole m.map[a]}\r
+\r
+rules out the above assignment, since it does not permit a memory (such as _m1_) to map an address (such as _a0_) to more than one data value. \r
+\r
+The meaning of a function is a set of assignments, like the meaning of the specification as a whole, but these include bindings to parameters. For example, the function\r
+\r
+\geekmath fun Read (m: Memory, d: Data, a: Addr) {\\\r
+       d = m.map[a]\\\r
+       }\r
+\r
+has assignments such as:\r
+\r
+\geekmath Addr = {a0, a1}\\\r
+Data = {d0, d1, d2}\\\r
+Memory = {m0, m1}\\\r
+map = {(m0,a0,d1)}\\\r
+m = {m0}\\\r
+d = {d1}\\\r
+a = {a0}\r
+\r
+The assignments of a function representing a state invariant correspond to states satisfying the invariant; the functions of a function representing an operation (such as _Read_) correspond to executions of the operation.\r
+\r
+An assertion is a formula that is claimed to be _valid_: that is, true for every assignment that satisfies the facts of the specification. To check an assertion, one can search for a _counterexample_: an assignment that makes the formula false.\r
+For example, the assertion\r
+\r
+\geekmath assert {\\\r
+       all m,m': Memory, d: Data, a: Addr | Read (m,d,a) => Read (m',d,a)}\r
+\r
+which claims, implausibly, that if a read of memory _m_ returns _d_ at _a_, then so does a read at memory _m'_, has the counterexample\r
+\r
+\geekmath Addr = {a0}\\\r
+Data = {d0,d1}\\\r
+Memory = {m0, m1}\\\r
+map = {(m0,a0,d0), (m1,a0,d1)}\r
+\r
+To find a counterexample, a tool should negate the formula and then skolemize away the bound variables, treating them like the parameters of a function, with values to be determined as part of the assignment. In this case, the assignment might include:\r
+\r
+\geekmath m = {m0}\\\r
+m' = {m1}\\\r
+d = {d0}\\\r
+a = {a0}\r
+\r
+\subsection Extension\r
+\r
+Not every signature declaration introduces a new basic type. A signature declared without an extension clause is a _type signature_, and creates both a basic type and a set constant of the same name. A signature _S_ declared as an extension is a _subsignature_, and creates only a set constant, along with a constraint making it a subset of each _supersignature_ listed in the extension clause. The subsignature takes on the type of the supersignatures, so if there is more than one, they must therefore have the same type, by being direct or indirect subsignatures of the same type signature.\r
+\r
+A field declared in a subsignature is as if declared in the corresponding type signature, with the constraint that the domain of the field is the subsignature. For example,\r
+\r
+\geekmath sig List {}\\\r
+sig NonEmptyList extends List {elt: Elt,rest: List}\r
+\r
+makes _List_ a type signature, and _NonEmptyList_ a subset of _List_. The fields _elt_ and _rest_ map atoms from the type _List_, but are constrained to have domain _NonEmptyList_. Semantically, it would have been equivalent to declare them as fields of _List_, along with facts constraining their domains:\r
+\r
+\geekmath sig List {elt: Elt,rest: List}\\\r
+sig NonEmptyList extends List {}\\\r
+fact {elt.Elt in NonEmptyList}\\\r
+fact {rest.List in NonEmptyList}\r
+\r
+(exploiting our dot notation to write the domain of a relation _r_ from _S_ to _T_ as _r.T_).\r
+\r
+\subsection Overloading and Implicit Prefixing\r
+\r
+Whenever a variable is declared, its type can be easily obtained from its declaration (from the type of the expression on the right-hand side of the declaration), and every variable appearing in an expression is declared in an enclosing scope. The one complication to this rule is the typing of fields.\r
+\r
+For modularity, a signature creates a local namespace. Two fields with the name _f_ appearing in different signatures do not denote the same relational constant. Interpreting an expression therefore depends on first resolving any field names that appear in it. \r
+#We have devised a simple resolution scheme whose details are beyond the scope of this paper.\r
+In an expression of the form _e.f_, the signature to which _f_ belongs is determined according to the type of _e_. To keep the scheme simple, we require that sometimes the specifier resolve the overloading explicitly by writing the field _f_ of signature _S_ as _S$f_. (At the end of the previous section, for example, the reference in the fact to _rest_ should actually be to _List$rest_, since the context does not indicate which signature _rest_ belongs to.)\r
+\r
+In many formulas, a single expression is dereferenced several times with different fields. A couple of language features are designed to allow these formulas to be written more succinctly, and, if used with care, more comprehensibly.  First, we provide two syntactic variants of the dot operator. Both _p_::_q_ and _q_[_p_] are equivalent to _p.q_, but have different precedence: the double colon binds more tightly than the dot, and the square brackets bind more loosely than the dot. Second, we provide a _with_ construct similar to Pascal's that makes dereferencing implicit.\r
+\r
+Consider, for example, the following simplified signature for a trace:\r
+\r
+\geekmath sig Trace {\\\r
+       ticks: set Tick,\\\r
+       first: Tick,\\\r
+       next: Tick -> Tick,\\\r
+       state: Tick -> State\\\r
+       }\r
+\r
+Each trace _t_ has a set of ticks _t.ticks_, a first tick _t.first_, an ordering _t.next_ that maps ticks to ticks, and a relation _t.state_ mapping each tick to a state. For a trace _t_ and tick _k_, the state is _k_.(_t.state_); the square brackets allow this expression to be written instead as _t.state_[_k_]. To constrain _t.ticks_ to be those reachable from _t. first_ we might write:\r
+\r
+\geekmath fact {all t: Trace | (t.first).*(t.next ) = t.ticks}\r
+\r
+Relying on the tighter binding of the double colon, we can eliminate the parentheses:\r
+\r
+\geekmath fact {all t: Trace | t::first.*t::next = t.ticks}\r
+\r
+Using _with_, we can make the _t_ prefixes implicit:\r
+\r
+\geekmath fact {all t: Trace | with t | first.*next = ticks}\r
+\r
+In general, _with e | F_ is like _F_, but with _e_ prefixed wherever appropriate to a field name. Appropriateness is determined by type: _e_ is matched to any field name with which it can be composed using the dot operator.\r
+#Fields that are prefixed using a double colon operator are not automatically prefixed, so one can use _with_ to prefix some fields of a given signature but not others. There is a corresponding _with_ construct for expressions also, so that _with e | E_ is  like the expression _E_, with _e_ prefixed as appropriate.\r
+A fact attached to a signature _S_ is implicitly enclosed by _all this: S | with this |_, and the declarations of a signature are interpreted as constraints as if they had been declared within this scope. Consequently, the declaration of _first_ above should be interpreted as if it were the formula:\r
+\r
+\geekmath all this: Trace | with this | first: ticks\r
+\r
+which is equivalent to\r
+\r
+\geekmath all this: Trace | this.first: this.ticks\r
+\r
+and should be typed accordingly.\r
+# \r
+# So, in the following fuller version of the above signature:\r
+# \r
+# \geekmath sig Trace {\\\r
+#      ticks: set Tick\\\r
+#      first: ticks,\\\r
+#      next: (ticks - first) ->? ticks\\\r
+#      state: ticks ->! State\\\r
+#      } {first.*next = ticks}\r
+# \r
+# the declaration of the field _first_, for example, includes the constraint\r
+# \r
+# \geekmath all this: Trace | with this | first: ticks\r
+# \r
+# which is equivalent to\r
+# \r
+# \geekmath all this: Trace | this.first: this.ticks\r
+\r
+\subsection Function Applications\r
+\r
+A function may be applied by binding its parameters to expressions. The resulting application may be either an expression or a formula, but in both cases the function body is treated as a formula. The formula case is simple: the application is simply short for the body with the formal parameters replaced by the actual expressions (and bound variables renamed where necessary to avoid clashes).\r
+\r
+The expression case is more interesting. The application is treated as a syntactic sugar. Suppose we have a function application expression, _e_ say, of the form\r
+\r
+\geekmath f(a_1, a_2, ..., a_n)\r
+\r
+that appears in an elementary formula _F_. The declaration of the function _f_ must list _n_ + 1 formal arguments, of which the _second_ will be treated as the result. The entire elementary formula is taken to be short for\r
+\r
+\geekmath all result: D | f (a_1, result, a_2, ..., a_n) => F [result/e]\r
+\r
+where _D_ is the right-hand side of the declaration of the missing argument, and _F_ [_result_/_e_] is _F_ with the fresh variable _result_ substituted for the application expression _e_. The application of _f_ in this elaborated formula is now a formula, and is treated simply as an inlining of the formula of _f_.\r
+\r
+#Type checking will thus require that the actual arguments match the formals that are listed first, third, fourth, fifth, etc. (This choice of the second argument, incidentally, is one concession we make to specifying state machines; function applications can be used to model operation invocations in which it is convenient to declare the pre- and post- states as the first and second arguments of the operation.)\r
+#\r
+To see how this works, consider the definition of a function _dom_ that gives the domain of a relation over signature _X_:\r
+\r
+\geekmath fun dom (r: X -> X, d: set X) {d = r.X}\r
+\r
+(We have defined the function monomorphically for a homogeneous relation. In practice, one would define a polymorphic function, but we want to avoid conflating two unrelated issues.) Here is a trivial assertion that applies the function as an expression:\r
+\r
+\geekmath assert {all p: X \textarrow X | (dom (p)).p in X}\r
+\r
+Desugaring the formula, we get\r
+\r
+\geekmath all p: X \textarrow X | all result: set X | dom (p, result) => result.p in X\r
+\r
+and then inlining\r
+\r
+\geekmath all p: X \textarrow X | all result: set X | result = p.X => result.p in X\r
+\r
+This formula can be reduced (by applying a universal form of the One Point Rule) to\r
+\r
+\geekmath all p: X \textarrow X | (p.X).p in X\r
+\r
+which is exactly what would have been obtained had we just replaced the application expression by the expression on the right-hand side of the equality in the function's definition!\r
+#\r
+# If there is more than one application expression in an elementary formula, a fresh quantification is # generated for each. For example,# \r
+# \r
+# \geekmath assert {all p, q: X \textarrow X | dom (p.q) in dom (p)}\r
+# \r
+# becomes\r
+# \r
+# \geekmath all p,q: X \textarrow X | all result1, result2: set X | \\\r
+#              dom (p.q, result1) => dom (p, result2) => result1 in result2\r
+# \r
+# which can again be reduced by inlining and the One Point Rule to \r
+# \r
+# \geekmath all p,q: X \textarrow X | (p.q).X in p.X\r
+\r
+Now let's consider an implicit definition. Suppose we have a signature _X_ with an ordering _lte_, so that _e.lte_ is the set of elements that _e_ is less than or equal to, and a function _min_ that gives the minimum of a set, defined implicitly as the element that is a member of the set, and less than or equal to all members of the set:\r
+\r
+\geekmath sig X {lte: set X}\\\r
+fun min (s: set X, m: option X) {\\\r
+       m in s && s in m.lte\\\r
+       }\r
+\r
+Because the set may be empty, _min_ is partial. Depending on the properties of _lte_ it may also fail to be deterministic. A formula that applies this function\r
+\r
+\geekmath assert {all s: set X | min (s) in s}\r
+\r
+can as before be desugared\r
+\r
+\geekmath all s: set X | all result: option X | min (s, result) => result in s\r
+\r
+and expanded by inlining\r
+\r
+\geekmath all s: set X | all result: option X |\\\r
+       (result in s) && s in result.lte => result in s\r
+\r
+but in this case the One Point Rule is not applicable.\r
+\r
+As a convenience, our language allows the result argument of a function to be declared anonymously in a special position, and given the name _result_. The domain function, for example, can be defined as:\r
+\r
+\geekmath fun dom (r: X -> X): set X {result = r.X}\r
+\r
+How the function is defined has no bearing on how it is used; this definition is entirely equivalent to the one above, and can also be applied as a formula with two arguments.\r
+\r
+\subsection Polymorphism\r
+\r
+Polymorphism is treated as a syntactic shorthand. Lack of space does not permit a full discussion here.\r
+\r
+\section Related Work\r
+\r
+We have shown how a handful of elements can be assembled into a rather simple but flexible notation. The elements themselves are far from novel---indeed, we hope that their familiarity will make the notation easy to learn and use---but their assembly into a coherent whole results in a language rather different from existing specification languages.\r
+\r
+\subsection New Aspects\r
+\r
+The more novel aspects of our work are:\r
+\r
+\point \cdot   _Objectification of state_. Most specification languages represent states as cartesian products of components; in our approach, a state, like a member of any signature, is an individual---a distinct atom with identity. A similar idea is used in the situation calculus [11], whose 'relational fluents' add a situation variable to each time-varying relation. The general idea of objectifying all values is of course the foundation of object-oriented programming languages, and was present in LISP. Interestingly, object-oriented variants of Z (such as [1]) do not objectify schemas. The idea of representing structures in first-order style as atoms is present also in algebraic specifications such as Larch [2], which treat even sets and relations in this manner.\r
+\r
+\point \cdot   _Components as relations_. Interpreting fields of a structure as functions goes back to early work on verification, and is widely used (for example, by Leino and Nelson [10]). We are not aware, however, of specification languages that use this idea, or that flatten fields to relations over atoms.\r
+\r
+\point \cdot   _Extension by global axioms_. The 'facts' of our notation allow the properties of a signature to be extended monotonically. The idea of writing axioms that constrain the members of a set constant declared globally is hardly remarkable, but it appears not to have been widely exploited in specification languages.\r
+\r
+\point \cdot   _Extension by subset_. Treating the extension of a structure as a refinement modelled by subset results in a simple semantics, and melds well with the use of global axioms. Again, this seems to be an unremarkable idea, but one whose power has not been fully recognized.\r
+\r
+\subsection Old Aspects\r
+\r
+The aspects of our work that are directly taken from existing languages are:\r
+\r
+\point \cdot   _Formulas_. The idea of treating invariants, definitions, operations, etc, uniformly as logical formulas is due to Z [14].\r
+\r
+\point \cdot   _Assertions_. Larch [2] provides a variety of constructs for adding intentional redundancy to a specification in order to provide error-detection opportunities. \r
+\r
+\point \cdot   _Parameterized formulas_. The 'functional' style we have adopted, in which all formulas are explicitly parameterized, in contrast to the style of most specification languages, is used also by languages for theorem provers, such as PVS [13]. VDM [8] offers a mechanism called 'operation quotation' in which pre- and post conditions are reused by interpreting them as functions similar to ours.\r
+\r
+\point \cdot   _Parametric Polymorphism_. The idea of parameterizing descriptions by types was developed in the programming languages community, most notably in the context of ML [12].\r
+\r
+\point \cdot   _Implicit Prefixing_. Our 'with' operator is taken from Pascal [9].\r
+\r
+\point \cdot   _Relational operators_. The dot operator, and the treament of scalars as singletons, comes from the earlier version of Alloy [4].\r
+#\r
+#\point \cdot  _Function shorthands_. The idea of desugaring function applications by quantifying over the result is present in Beth's extensionality theorem [Beth].\r
+\r
+\subsection Z's Schema Calculus\r
+\r
+Z has been a strong influence on our work; indeed, this paper may be viewed as an attempt to achieve some of the power and flexibility of Z's schema calculus in a first-order setting. Readers unfamiliar with Z can find an excellent presentation of the schema calculus in [16]. The current definitive reference is [15], although Spivey's manual [14] is more accessible for practioners.\r
+\r
+A _schema_ consists of a collection of variable declarations and a formula constraining the variables. Schemas can be anonymous. When a name has been bound to a schema, it can be used in three different ways, distinguished according to context. First, it can be used as a _declaration_, in which case it introduces its variables into the local scope, constraining them with its formula. Second, where the variables are already in scope, it can be used as a _predicate_, in which case the formula applies and no new declarations are added. Both of these uses are syntactic; the schema can be viewed as a macro.\r
+\r
+In the third use, the schema is semantic. Its name represents a set of _bindings_, each binding being a finite function from variables names to values. The bindings denoted by the schema name are the models of the schema's formula: those bindings of variable names to values that make the formula true.\r
+\r
+How a schema is being applied is not always obvious; in the set comprehension {_S_}, for example, _S_ represents a declaration, so that the expression as a whole denotes the same set of bindings as _S_ itself. Given a binding _b_ for a schema with component variable _x_, the expression _b.x_ denotes the value assigned to _x_ in _b_. Unlike Alloy's dot, this dot is a function application, so for a set of bindings _B_, the expression _B.x_ is not well formed.\r
+\r
+Operations in Z are expressed using the convention that primed variables denote components of the post-state. A mechanism known as _decoration_ allows one to write _S'_ for the schema that is like _S_, but whose variable names have been primed. Many idioms, such as promotion, rely on being able to manipulate the values of a schema's variables in aggregate. To support this, Z provides the theta operator: \theta @sep _S_ is an expression that denotes a binding in which each variable _x_ that belongs to _S_ is bound to a variable of the same name _x_ declared in the local scope. Theta and decoration interact subtly: \theta @sep _S'_ is not a binding of _S'_, but rather binds each variable _x_ of _S_ to a variable _x'_ declared locally. So where we would write _s=s'_ to say that pre- and post-states _s_ and _s'_ are the same, a Z specifier would write \theta @sep _S_ = \theta @sep _S'_. This formula equates each component _x_ of _S_ to its matching component _x'_ of _S'_, because _x_ and _x'_ are the respective values bound to _x_ by \theta @sep _S_ and \theta @sep _S'_ respectively.\r
+\r
+Our 'fact' construct allows the meaning of a signature name to be constrained subsequent to its declaration. A schema, in contrast, is 'closed': a new schema name must be introduced for each additional constraint. This can produce an undesirable proliferation of names for a system's state, but it does make it easier to track down those formulas that affect a schema's meaning.\r
+\r
+The variables of a schema can be renamed, but cannot be replaced by arbitrary expressions (since this would make nonsense of declarations).This requires the introduction of existential quantifiers where in our notation an expression is passed as an actual. On the other hand, when no renaming is needed, it is more succinct.\r
+\r
+Z's sequential composition operator is defined by a rather complicated transformation, and relies on adherence to particular conventions. The schema _P_ @sep \fatsemi @sep _Q_ is obtained by collecting primed variables in _P_ that match unprimed variables in _Q_; renaming these in both _P_ and _Q_ with a new set of variable names; and then existentially quantifying the new names away. For example, to say that a read following a write to the same address yields the value written, we would write:\r
+\r
+\geekmath\r
+all m: Memory, a: Addr, d, d': Data | Read (Write(m,a,d),d') => d = d'\r
+\r
+which is short for\r
+\r
+\geekmath all m: Memory, a: Addr, d, d': Data |\\\r
+       all m': Memory | Write (m,m',a,d) => Read (m,a,d') => d = d'\r
+\r
+In Z, assuming appropriate declarations of a schema _Memory_ and a given type _Data_, the formula would be:\r
+\r
+\geekmath\r
+\forall Memory; Memory'; x!: Data \fatdot Write \fatsemi Read [x!/d!] \implies x! = d!\r
+\r
+which is short for\r
+\r
+\geekmath\r
+\forall Memory; Memory'; x!: Data \fatdot \\\r
+       \exists Memory'' \fatdot \\\r
+               \exists Memory' \fatdot Write \and \theta @sep Memory' = \theta @sep Memory''\\\r
+               \exists Memory'; d!: Data \fatdot \\\r
+                       Read \and \theta @sep Memory = \theta @sep Memory'' \and d! = x!\\\r
+       \implies x! = d!\r
+\r
+The key semantic difference between signatures and schemas is this. A signature is a set of atoms; its fields are relational constants declared in global scope. A schema, on the other hand, denotes a higher-order object: a set of functions from field names to values. Our approach was motivated by the desire to remain first order, so that the analysis we have developed [3] can be applied. Not surprisingly, there is a cost in expressiveness. We cannot express higher-order formulas, most notably those involving preconditions. Suppose we want to assert that our write operation has no implicit precondition. In Z, such an assertion is easily written:\r
+\r
+\geekmath\r
+\forall Memory; a?: Addr \fatdot  \exists Memory'; d!: Data \fatdot Write\r
+\r
+We might attempt to formulate such an assertion in our notation as follows:\r
+\r
+\geekmath assert {\\\r
+       all m: Memory, a: Addr, d: Data | some m': Memory | Write (m,m',d,a)\r
+       }\r
+\r
+Unfortunately, this has counterexamples such as\r
+\r
+\geekmath Addr = {a0}\\\r
+Data = {d0}\\\r
+Memory = {m0, m1}\\\r
+map = {}\r
+\r
+in which the _map_ relation lacks an appropriate tuple. Intuitively, the assertion claims that there is no context in which a write cannot proceed; a legitimate counterexample---but one we certainly did not intend---simply gives a context in which a memory with the appropriate address-value mapping is not available.\r
+\r
+We have focused in this discussion on schemas. It is worth noting that Z is expressive enough to allow a style of structuring almost identical to ours, simply by declaring signatures as given types, fields and functions as global variables, and by writing facts, and the bodies of functions, as axioms. Field names would have to be globally unique, and the resulting specification would likely be less succinct than if expressed in our notation.\r
+\r
+\subsection Phenomenology\r
+\r
+Pamela Zave and Michael Jackson have developed an approach to composing descriptions [18] that objectifies states, events and time intervals, and constrains their properties with global axioms. Objectification allows descriptions to be reduced to a common phenomenology, so that descriptions in different languages, and even in different paradigms can be combined. Michael Jackson has argued separately for the importance of objectification as a means of making a more direct connection between a formal description and the informal world: as he puts it, "domain phenomena are facts about individuals" [7]. It is reassuring that the concerns of language design and tractability of analysis that motivated our notation are not in conflict with sound method, and it seems that our notation would be a good choice for expressing descriptions in the form that Zave and Jackson have proposed.\r
+\r
+\section       Evaluation\r
+\r
+\subsection Merits\r
+\r
+The key motivations of the design of our mechanism have been minimality and flexibility. It is worth noting how this has been achived by the _omission_ of certain features:\r
+\r
+\point \cdot   There is only one form of semantic structuring; our opinion is that adding extra mechanisms, for example to group operations into classes, does not bring enough benefit to merit the additional complexity, and tends to be inflexible. (Our language does provide some namespace control for signature and paragraph names in the style of Java packages, but this is trivial and does not interact with the basic mechanism).\r
+\r
+\point \cdot   There is no subtyping; subsignatures are just subsets of their supersignatures, and have the same type. There are only two types: basic types (for signatures), and relational types (for expressions). Types are not nested.\r
+\r
+\point \cdot   There is only one way that formulas are packaged for reuse. The same function syntax is used for observers, operations, refinement relations, etc. The function shorthand syntax unifies the syntax of both declaration and use for explicit and implicit function definitions.\r
+\r
+\point \cdot   The values of a signature with fields are just like the values of any basic type; there is nothing like Z's notion of a schema binding.\r
+\r
+Our interpretation of a subsignature as a subset of the supersignature appears to be novel as a mechanism for structuring in a specification language. It has three nice consequences:\r
+\r
+\point \cdot   _Elimination of type coercions_. If _x_ belongs to a signature _S_ whose extension _S'_ defines a field _f_, the expression _x.f_ will just denote an empty set if _x_ does not belong to _S'_. Contrast this with the treatment of subclasses in the Object Constraint Language [17], for example, which results in pervasive coercions and often prevents the use of set and relation operators (since elements must be coerced one at a time).\r
+\r
+\point \cdot   _Ease of extension_. Constraints can be added to the subsignature simply by writing a constraint that is universally quantified over elements of that subset.\r
+\r
+\point \cdot   _Definitional extension_. We can declare an extension _S'_ of a signature _S_ with additional fields, relate these fields to the fields declared explicitly for _S_, and then record the fact that _S=S'_ (as illustrated in Section 2.11). The effect is that every atom of _S_ has been extended with appropriately defined fields, which can be accessed whenever an expression denoting such an atom is in scope! We expect to find this idiom especially useful for defining additional fields for visualization purposes.\r
+\r
+\subsection    Deficiencies\r
+\r
+One might wonder whether, having encoded structures using atoms, and having provided quantifiers over those atoms, one can express arbitrary properties of higher-order structures. Unfortunately, but not surprisingly, this is not possible. The catch is that fields are treated in any formulas as global variables that are existentially quantified. To simulate higher-order logic, it would be necessary to allow quantifications over these variables, and since they have relational type, that would imply higher-order quantification. The practical consequence is that properties requiring higher-order logic cannot be expressed. One cannot assert that the precondition of an operation is no stronger than some predicate; one cannot in general specify operations by minimization; and one cannot express certain forms of refinement check. An example of this problem is given in Section 4.3 above. Whether the problem is fundamental or can be partially overcome remains to be seen.\r
+\r
+The treatment of subsignatures as subsets has a nasty consequence. Since a field declared in a subsignature becomes implicitly a field of the supersignature, two subsignatures cannot declare fields of the same name. The extension mechanism is therefore not properly modular, and a specification should use hierarchical structure instead where this matters.\r
+\r
+Modelling a set of states as atoms entails a certain loss of abstraction. In this specification\r
+\r
+\geekmath sig A {}\\\r
+sig S {a: A}\\\r
+fun op (s,s': S) {s.a = s'.a}\r
+\r
+the operation _op_ has executions in which the pre- and post-states are equal (that is, the same atom in _S_), and executions in which only their _a_ components are equal. One might object that this distinction is not observable. Moreover, replacing the formula by _s=s'_ would arguably be an overspecification---a 'bias' in VDM terminology [8]. The situation calculus [11] solves this problem by requiring every operation to produce a state change: _s_ and _s'_ are thus regarded as distinct situations by virtue of occurring at different points in the execution. The dual of this solution is to add an axiom requiring that no two distinct atoms of _S_ may have equal _a_ fields. Either of these solutions is easily imposed in our notation.\r
+\r
+Our treatment of scalars and sets uniformly as relations has raised the concern that the resulting succinctness comes with a loss of clarity and redundancy. Extensive use of the previous version of our language, mostly by inexperienced specifiers, suggests that this is not a problem. The loss of some static checking is more than compensated by the semantic analysis that our tool performs.\r
+\r
+\section Conclusion\r
+\r
+Two simple ideas form the basis of our modularity mechanism: (1) that a structure is just a set of atoms, and its fields are global relations that map those atoms to structure components; and (2) that extensions of a structure are just subsets. Our relational semantics, in which all variables and fields are represented as relations, makes the use of structures simple and succinct, and it ensures that the language as a whole remains first order. For a variety of modelling tasks, we believe that our approach provides a useful balance of expressiveness and tractability.\r
+\r
+\section* Acknowledgments\r
+\r
+The language described here was refined by experience writing specifications, long before an analyzer existed, and by the development of the analyzer tool itself. Mandana Vaziri and Sarfraz Khurshid were our early adopters, and Brian Lin and Joe Cohen helped implement the tool. The paper itself was improved greatly by comments from Mandana and Sarfraz, from Michael Jackson, from Tomi Mannisto, and especially from Pamela Zave, whose suggestions prompted a major rewrite. Jim Woodcock helped us understand Z, and the clarity and simplicity of his own work has been a source of inspiration to us. Our ideas have also been improved by the comments of the members of IFIP working groups 2.3 and 2.9, especially Tony Hoare, Greg Nelson and Rustan Leino. This work was funded in part by ITR grant #0086154 from the National Science Foundation, by a grant from NASA, and by an endowment from Doug and Pat Ross.\r
+\r
+\section* References\r
+\r
+#\ref [CD94]   Steve Cook and John Daniels. Designing Object Systems: Object-Oriented Modelling with Syntropy. Prentice Hall, 1994.\r
+#\r
+\ref [1]       R. Duke, G. Rose and G. Smith. Object-Z: A Specification Language Advocated for the Description of Standards.  SVRC Technical Report 94-45. The Software Verification Research Centre, University of Queensland, Australia.\r
+\r
+\ref [2]       John V. Guttag, James J. Horning, and Andres Modet. Report on the Larch Shared Language: Version 2.3. Technical Report 58, Compaq Systems Research Center, Palo Alto, CA, 1990.\r
+\r
+#\ref [Hal90]  Anthony Hall. Using Z as a Specification Calculus for Object-Oriented Systems. In D. Bjorner, C.A.R. Hoare, and H. Langmaack, eds., VDM and Z: Formal Methods in Software Development, Lecture Notes in Computer Science, Volume 428, pp. 290\96381, Springer-Verlag, New York, 1990.\r
+#\r
+\ref [3]       Daniel Jackson. Automating first-order relational logic. Proc. ACM SIGSOFT Conf. Foundations of Software Engineering. San Diego, November 2000.\r
+\r
+\ref [4]       Daniel Jackson. Alloy: A Lightweight Object Modelling Notation. To appear, ACM Transactions on Software Engineering and Methodology, October 2001.\r
+\r
+\ref [5]       Daniel Jackson, Ian Schechter and Ilya Shlyakhter. Alcoa: the Alloy Constraint Analyzer. Proc. International Conference on Software Engineering, Limerick, Ireland, June 2000.\r
+\r
+\ref [6]       Daniel Jackson and Jeannette Wing. Lightweight Formal Methods. In: H. Saiedian (ed.), An Invitation to Formal Methods. IEEE Computer, 29(4):16-30, April 1996. \r
+\r
+\ref [7]       Michael Jackson. Software Requirements and Specifications: A Lexicon of Practice, Principles and Prejudices. Addison-Wesley, 1995.\r
+\r
+\ref [8]       Cliff Jones. Systematic Software Development Using VDM. Second edition, Prentice Hall, 1990.\r
+\r
+\ref [9]       Kathleen Jensen and Nicklaus Wirth. Pascal: User Manual and Report. Springer-# Verlag, 1974.\r
+\r
+\ref [10]      K. Rustan M. Leino and Greg Nelson. Data abstraction and information hiding . Research Report 160, Compaq Systems Research Center, November 2000.\r
+\r
+\ref [11]      Hector Levesque, Fiora Pirri, and Ray Reiter. Foundations for the Situation Calculus. Linköping Electronic Articles in Computer and Information Science, ISSN 1401-9841, Vol. 3(1998), Nr. 018.\r
+\r
+\ref [12]      Robin Milner, Mads Tofte and Robert Harper. The Definition of Standard ML. MIT Press, 1990.\r
+\r
+\ref [13]      S. Owre, N. Shankar, J. M. Rushby, and D. W. J. Stringer-Calvert. PVS Language Reference. Computer Science Laboratory, SRI International, Menlo Park, CA, September 1999.\r
+\r
+\ref [14]      J. Michael Spivey. The Z Notation: A Reference Manual. Second edition, Prentice Hall, 1992.\r
+\r
+\ref [15]      Ian Toyn et al. Formal Specification---Z Notation---Syntax, Type and Semantics. Consensus Working Draft 2.6 of the Z Standards Panel BSI Panel IST/5/-/19/2 (Z Notation). August 24, 2000.\r
+\r
+\ref [16]      Jim Woodcock and Jim Davies. Using Z: Specification, Refinement and Proof. Prentice Hall, 1996.\r
+\r
+\ref [17]      Jos Warmer and Anneke Kleppe. The Object Constraint Language: Precise Modeling with UML. Addison Wesley, 1999.\r
+\r
+\ref [18]      Pamela Zave and Michael Jackson. Conjunction as Composition. ACM Transactions on Software Engineering and Methodology II(4): 379--411, October 1993.\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/test.txt.index.txt b/Robust/src/Benchmarks/mlp/tagger/mlp-java/test.txt.index.txt
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/Robust/src/Benchmarks/mlp/tagger/mlp-java/test.txt.tag.txt b/Robust/src/Benchmarks/mlp/tagger/mlp-java/test.txt.tag.txt
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/charmap.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/charmap.txt
new file mode 100755 (executable)
index 0000000..cc4ab0e
--- /dev/null
@@ -0,0 +1,31 @@
+# basic characters\r
+<char:linebreak><index:22>\r
+\r
+# dots\r
+<char:cdot><index:22>\r
+\r
+# quotes\r
+<char:quote><index:22>\r
+<char:quoteleft><index:22>\r
+<char:quoteright><index:22>\r
+<char:quotedblleft><index:22>\r
+<char:quotedblright><index:22>\r
+\r
+#dashes\r
+<char:hyphen><index:22>\r
+<char:endash><index:22>\r
+<char:emdash><index:22>\r
+\r
+# math symbols\r
+<char:oplus><index:22>\r
+<char:langle><index:22>\r
+<char:rangle><index:22>\r
+<char:textarrow><index:22>\r
+<char:hat><index:22>\r
+<char:fatsemi><index:22>\r
+<char:forall><index:22>\r
+<char:fatdot><index:22>\r
+<char:fatsemi><index:22>\r
+<char:implies><index:22>\r
+<char:exists><index:22>\r
+<char:and><index:22>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/lucmathext-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/lucmathext-charmap.txt
new file mode 100755 (executable)
index 0000000..623b304
--- /dev/null
@@ -0,0 +1,130 @@
+# character map for Lucida New Math Extended font\r
+\r
+<char:parenleftbig><font:LucidNewMatExtT><index:161>\r
+<char:parenrightbig><font:LucidNewMatExtT><index:162>\r
+<char:bracketleftbig><font:LucidNewMatExtT><index:163>\r
+<char:bracketrightbig><font:LucidNewMatExtT><index:164>\r
+<char:floorleftbig><font:LucidNewMatExtT><index:165>\r
+<char:floorrightbig><font:LucidNewMatExtT><index:166>\r
+<char:ceilingleftbig><font:LucidNewMatExtT><index:167>\r
+<char:ceilingrightbig><font:LucidNewMatExtT><index:168>\r
+<char:braceleftbig><font:LucidNewMatExtT><index:169>\r
+<char:bracerightbig><font:LucidNewMatExtT><index:170>\r
+<char:angbracketleftbig><font:LucidNewMatExtT><index:173>\r
+<char:angbracketrightbig><font:LucidNewMatExtT><index:174>\r
+<char:vextendsingle><font:LucidNewMatExtT><index:175>\r
+<char:vextenddouble><font:LucidNewMatExtT><index:176>\r
+<char:slashbig><font:LucidNewMatExtT><index:177>\r
+<char:backslashbig><font:LucidNewMatExtT><index:178>\r
+<char:parenleftBig><font:LucidNewMatExtT><index:179>\r
+<char:parenrightBig><font:LucidNewMatExtT><index:180>\r
+<char:parenleftbigg><font:LucidNewMatExtT><index:181>\r
+<char:parenrightbigg><font:LucidNewMatExtT><index:182>\r
+<char:bracketleftbigg><font:LucidNewMatExtT><index:183>\r
+<char:bracketrightbigg><font:LucidNewMatExtT><index:184>\r
+<char:floorleftbigg><font:LucidNewMatExtT><index:185>\r
+<char:floorrightbigg><font:LucidNewMatExtT><index:186>\r
+<char:ceilingleftbigg><font:LucidNewMatExtT><index:187>\r
+<char:ceilingrightbigg><font:LucidNewMatExtT><index:188>\r
+<char:braceleftbigg><font:LucidNewMatExtT><index:189>\r
+<char:bracerightbigg><font:LucidNewMatExtT><index:190>\r
+<char:angbracketleftbigg><font:LucidNewMatExtT><index:28>\r
+<char:angbracketrightbigg><font:LucidNewMatExtT><index:29>\r
+<char:slashbigg><font:LucidNewMatExtT><index:193>\r
+<char:backslashbigg><font:LucidNewMatExtT><index:194>\r
+<char:parenleftBigg><font:LucidNewMatExtT><index:195>\r
+<char:parenrightBigg><font:LucidNewMatExtT><index:33>\r
+<char:bracketleftBigg><font:LucidNewMatExtT><index:34>\r
+<char:bracketrightBigg><font:LucidNewMatExtT><index:35>\r
+<char:floorleftBigg><font:LucidNewMatExtT><index:36>\r
+<char:floorrightBigg><font:LucidNewMatExtT><index:37>\r
+<char:ceilingleftBigg><font:LucidNewMatExtT><index:38>\r
+<char:ceilingrightBigg><font:LucidNewMatExtT><index:39>\r
+<char:braceleftBigg><font:LucidNewMatExtT><index:40>\r
+<char:bracerightBigg><font:LucidNewMatExtT><index:41>\r
+<char:angbracketleftBigg><font:LucidNewMatExtT><index:42>\r
+<char:angbracketrightBigg><font:LucidNewMatExtT><index:43>\r
+<char:slashBigg><font:LucidNewMatExtT><index:44>\r
+<char:backslashBigg><font:LucidNewMatExtT><index:45>\r
+<char:slashBig><font:LucidNewMatExtT><index:46>\r
+<char:backslashBig><font:LucidNewMatExtT><index:47>\r
+<char:parenlefttp><font:LucidNewMatExtT><index:48>\r
+<char:parenrighttp><font:LucidNewMatExtT><index:49>\r
+<char:bracketlefttp><font:LucidNewMatExtT><index:50>\r
+<char:bracketrighttp><font:LucidNewMatExtT><index:51>\r
+<char:bracketleftbt><font:LucidNewMatExtT><index:52>\r
+<char:bracketrightbt><font:LucidNewMatExtT><index:53>\r
+<char:bracketleftex><font:LucidNewMatExtT><index:54>\r
+<char:bracketrightex><font:LucidNewMatExtT><index:55>\r
+<char:bracelefttp><font:LucidNewMatExtT><index:56>\r
+<char:bracerighttp><font:LucidNewMatExtT><index:57>\r
+<char:braceleftbt><font:LucidNewMatExtT><index:58>\r
+<char:bracerightbt><font:LucidNewMatExtT><index:59>\r
+<char:braceleftmid><font:LucidNewMatExtT><index:60>\r
+<char:bracerightmid><font:LucidNewMatExtT><index:61>\r
+<char:braceex><font:LucidNewMatExtT><index:62>\r
+<char:arrowvertex><font:LucidNewMatExtT><index:63>\r
+<char:parenleftbt><font:LucidNewMatExtT><index:64>\r
+<char:parenrightbt><font:LucidNewMatExtT><index:65>\r
+<char:parenleftex><font:LucidNewMatExtT><index:66>\r
+<char:parenrightex><font:LucidNewMatExtT><index:67>\r
+<char:angbracketleftBig><font:LucidNewMatExtT><index:68>\r
+<char:angbracketrightBig><font:LucidNewMatExtT><index:69>\r
+<char:unionsqtext><font:LucidNewMatExtT><index:70>\r
+<char:unionsqdisplay><font:LucidNewMatExtT><index:71>\r
+<char:contintegraltext><font:LucidNewMatExtT><index:72>\r
+<char:contintegraldisplay><font:LucidNewMatExtT><index:73>\r
+<char:circledottext><font:LucidNewMatExtT><index:74>\r
+<char:circledotdisplay><font:LucidNewMatExtT><index:75>\r
+<char:circleplustext><font:LucidNewMatExtT><index:76>\r
+<char:circleplusdisplay><font:LucidNewMatExtT><index:77>\r
+<char:circlemultiplytext><font:LucidNewMatExtT><index:78>\r
+<char:circlemultiplydisplay><font:LucidNewMatExtT><index:79>\r
+<char:summationtext><font:LucidNewMatExtT><index:80>\r
+<char:producttext><font:LucidNewMatExtT><index:81>\r
+<char:integraltext><font:LucidNewMatExtT><index:82>\r
+<char:uniontext><font:LucidNewMatExtT><index:83>\r
+<char:intersectiontext><font:LucidNewMatExtT><index:84>\r
+<char:unionmultitext><font:LucidNewMatExtT><index:85>\r
+<char:logicalandtext><font:LucidNewMatExtT><index:86>\r
+<char:logicalortext><font:LucidNewMatExtT><index:87>\r
+<char:summationdisplay><font:LucidNewMatExtT><index:88>\r
+<char:productdisplay><font:LucidNewMatExtT><index:89>\r
+<char:integraldisplay><font:LucidNewMatExtT><index:90>\r
+<char:uniondisplay><font:LucidNewMatExtT><index:91>\r
+<char:intersectiondisplay><font:LucidNewMatExtT><index:92>\r
+<char:unionmultidisplay><font:LucidNewMatExtT><index:93>\r
+<char:logicalanddisplay><font:LucidNewMatExtT><index:94>\r
+<char:logicalordisplay><font:LucidNewMatExtT><index:95>\r
+<char:coproducttext><font:LucidNewMatExtT><index:96>\r
+<char:coproductdisplay><font:LucidNewMatExtT><index:97>\r
+<char:hatwide><font:LucidNewMatExtT><index:98>\r
+<char:hatwider><font:LucidNewMatExtT><index:99>\r
+<char:hatwidest><font:LucidNewMatExtT><index:100>\r
+<char:tildewide><font:LucidNewMatExtT><index:101>\r
+<char:tildewider><font:LucidNewMatExtT><index:102>\r
+<char:tildewidest><font:LucidNewMatExtT><index:103>\r
+<char:bracketleftBig><font:LucidNewMatExtT><index:104>\r
+<char:bracketrightBig><font:LucidNewMatExtT><index:105>\r
+<char:floorleftBig><font:LucidNewMatExtT><index:106>\r
+<char:floorrightBig><font:LucidNewMatExtT><index:107>\r
+<char:ceilingleftBig><font:LucidNewMatExtT><index:108>\r
+<char:ceilingrightBig><font:LucidNewMatExtT><index:109>\r
+<char:braceleftBig><font:LucidNewMatExtT><index:110>\r
+<char:bracerightBig><font:LucidNewMatExtT><index:111>\r
+<char:radicalbig><font:LucidNewMatExtT><index:112>\r
+<char:radicalBig><font:LucidNewMatExtT><index:113>\r
+<char:radicalbigg><font:LucidNewMatExtT><index:114>\r
+<char:radicalBigg><font:LucidNewMatExtT><index:115>\r
+<char:radicalbt><font:LucidNewMatExtT><index:116>\r
+<char:radicalvertex><font:LucidNewMatExtT><index:117>\r
+<char:radicaltp><font:LucidNewMatExtT><index:118>\r
+<char:arrowvertexdbl><font:LucidNewMatExtT><index:119>\r
+<char:arrowtp><font:LucidNewMatExtT><index:120>\r
+<char:arrowbt><font:LucidNewMatExtT><index:121>\r
+<char:bracehtipdownleft><font:LucidNewMatExtT><index:122>\r
+<char:bracehtipdownright><font:LucidNewMatExtT><index:123>\r
+<char:bracehtipupleft><font:LucidNewMatExtT><index:124>\r
+<char:bracehtipupright><font:LucidNewMatExtT><index:125>\r
+<char:arrowdbltp><font:LucidNewMatExtT><index:126>\r
+<char:arrowdblbt><font:LucidNewMatExtT><index:196>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/lucmathit-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/lucmathit-charmap.txt
new file mode 100755 (executable)
index 0000000..612d09c
--- /dev/null
@@ -0,0 +1,68 @@
+# character map for Lucida Math Italic font\r
+\r
+<char:Gamma><font:LucidNewMatItaT><index:161>\r
+<char:Delta><font:LucidNewMatItaT><index:162>\r
+<char:Theta><font:LucidNewMatItaT><index:163>\r
+<char:Lambda><font:LucidNewMatItaT><index:164>\r
+<char:Xi><font:LucidNewMatItaT><index:165>\r
+<char:Pi><font:LucidNewMatItaT><index:166>\r
+<char:Sigma><font:LucidNewMatItaT><index:167>\r
+<char:Upsilon><font:LucidNewMatItaT><index:7>\r
+<char:Phi><font:LucidNewMatItaT><index:169>\r
+<char:Psi><font:LucidNewMatItaT><index:170>\r
+<char:Omega><font:LucidNewMatItaT><index:173>\r
+<char:alpha><font:LucidNewMatItaT><index:174>\r
+<char:beta><font:LucidNewMatItaT><index:175>\r
+<char:gamma><font:LucidNewMatItaT><index:176>\r
+<char:delta><font:LucidNewMatItaT><index:177>\r
+<char:epsilon1><font:LucidNewMatItaT><index:178>\r
+<char:zeta><font:LucidNewMatItaT><index:179>\r
+<char:eta><font:LucidNewMatItaT><index:180>\r
+<char:theta><font:LucidNewMatItaT><index:181>\r
+<char:iota><font:LucidNewMatItaT><index:182>\r
+<char:kappa><font:LucidNewMatItaT><index:183>\r
+<char:lambda><font:LucidNewMatItaT><index:184>\r
+<char:mu><font:LucidNewMatItaT><index:185>\r
+<char:nu><font:LucidNewMatItaT><index:186>\r
+<char:xi><font:LucidNewMatItaT><index:187>\r
+<char:pi><font:LucidNewMatItaT><index:188>\r
+<char:rho><font:LucidNewMatItaT><index:189>\r
+<char:sigma><font:LucidNewMatItaT><index:190>\r
+<char:tau><font:LucidNewMatItaT><index:191>\r
+<char:upsilon><font:LucidNewMatItaT><index:192>\r
+<char:phi><font:LucidNewMatItaT><index:193>\r
+<char:chi><font:LucidNewMatItaT><index:194>\r
+<char:psi><font:LucidNewMatItaT><index:195>\r
+<char:tie><font:LucidNewMatItaT><index:196>\r
+<char:omega><font:LucidNewMatItaT><index:33>\r
+<char:epsilon><font:LucidNewMatItaT><index:34>\r
+<char:theta1><font:LucidNewMatItaT><index:35>\r
+<char:pi1><font:LucidNewMatItaT><index:36>\r
+<char:rho1><font:LucidNewMatItaT><index:37>\r
+<char:sigma1><font:LucidNewMatItaT><index:38>\r
+<char:phi1><font:LucidNewMatItaT><index:39>\r
+<char:arrowlefttophalf><font:LucidNewMatItaT><index:40>\r
+<char:arrowleftbothalf><font:LucidNewMatItaT><index:41>\r
+<char:arrowrighttophalf><font:LucidNewMatItaT><index:42>\r
+<char:arrowrightbothalf><font:LucidNewMatItaT><index:43>\r
+<char:arrowhookleft><font:LucidNewMatItaT><index:44>\r
+<char:arrowhookright><font:LucidNewMatItaT><index:45>\r
+<char:triangleright><font:LucidNewMatItaT><index:46>\r
+<char:triangleleft><font:LucidNewMatItaT><index:47>\r
+<char:period><font:LucidNewMatItaT><index:58>\r
+<char:comma><font:LucidNewMatItaT><index:59>\r
+<char:less><font:LucidNewMatItaT><index:60>\r
+<char:slash><font:LucidNewMatItaT><index:61>\r
+<char:greater><font:LucidNewMatItaT><index:62>\r
+<char:star><font:LucidNewMatItaT><index:63>\r
+<char:partialdiff><font:LucidNewMatItaT><index:64>\r
+<char:flat><font:LucidNewMatItaT><index:91>\r
+<char:natural><font:LucidNewMatItaT><index:92>\r
+<char:sharp><font:LucidNewMatItaT><index:93>\r
+<char:slurbelow><font:LucidNewMatItaT><index:94>\r
+<char:slurabove><font:LucidNewMatItaT><index:95>\r
+<char:lscript><font:LucidNewMatItaT><index:96>\r
+<char:dotlessi><font:LucidNewMatItaT><index:123>\r
+<char:dotlessj><font:LucidNewMatItaT><index:124>\r
+<char:weierstrass><font:LucidNewMatItaT><index:125>\r
+<char:vector><font:LucidNewMatItaT><index:126>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/lucmathsym-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/lucmathsym-charmap.txt
new file mode 100755 (executable)
index 0000000..bdde61d
--- /dev/null
@@ -0,0 +1,130 @@
+# mathematical characters for Lucida New Math Symbol font\r
+\r
+<char:minus><font:LucidNewMatSymT><index:161>\r
+<char:periodcentered><font:LucidNewMatSymT><index:162>\r
+<char:multiply><font:LucidNewMatSymT><index:163>\r
+<char:asteriskmath><font:LucidNewMatSymT><index:164>\r
+<char:divide><font:LucidNewMatSymT><index:165>\r
+<char:diamondmath><font:LucidNewMatSymT><index:166>\r
+<char:plusminus><font:LucidNewMatSymT><index:167>\r
+<char:minusplus><font:LucidNewMatSymT><index:168>\r
+<char:circleplus><font:LucidNewMatSymT><index:169>\r
+<char:circleminus><font:LucidNewMatSymT><index:170>\r
+<char:circlemultiply><font:LucidNewMatSymT><index:173>\r
+<char:circledivide><font:LucidNewMatSymT><index:174>\r
+<char:circledot><font:LucidNewMatSymT><index:175>\r
+<char:circlecopyrt><font:LucidNewMatSymT><index:176>\r
+<char:openbullet><font:LucidNewMatSymT><index:177>\r
+<char:bullet><font:LucidNewMatSymT><index:178>\r
+<char:equivasymptotic><font:LucidNewMatSymT><index:179>\r
+<char:equivalence><font:LucidNewMatSymT><index:180>\r
+<char:reflexsubset><font:LucidNewMatSymT><index:181>\r
+<char:reflexsuperset><font:LucidNewMatSymT><index:182>\r
+<char:lessequal><font:LucidNewMatSymT><index:183>\r
+<char:greaterequal><font:LucidNewMatSymT><index:184>\r
+<char:precedesequal><font:LucidNewMatSymT><index:185>\r
+<char:followsequal><font:LucidNewMatSymT><index:186>\r
+<char:similar><font:LucidNewMatSymT><index:187>\r
+<char:approxequal><font:LucidNewMatSymT><index:188>\r
+<char:propersubset><font:LucidNewMatSymT><index:189>\r
+<char:propersuperset><font:LucidNewMatSymT><index:190>\r
+<char:lessmuch><font:LucidNewMatSymT><index:191>\r
+<char:greatermuch><font:LucidNewMatSymT><index:192>\r
+<char:precedes><font:LucidNewMatSymT><index:193>\r
+<char:follows><font:LucidNewMatSymT><index:194>\r
+<char:arrowleft><font:LucidNewMatSymT><index:195>\r
+<char:spade><font:LucidNewMatSymT><index:196>\r
+<char:arrowright><font:LucidNewMatSymT><index:33>\r
+<char:arrowup><font:LucidNewMatSymT><index:34>\r
+<char:arrowdown><font:LucidNewMatSymT><index:35>\r
+<char:arrowboth><font:LucidNewMatSymT><index:36>\r
+<char:arrownortheast><font:LucidNewMatSymT><index:37>\r
+<char:arrowsoutheast><font:LucidNewMatSymT><index:38>\r
+<char:similarequal><font:LucidNewMatSymT><index:39>\r
+<char:arrowdblleft><font:LucidNewMatSymT><index:40>\r
+<char:arrowdblright><font:LucidNewMatSymT><index:41>\r
+<char:arrowdblup><font:LucidNewMatSymT><index:42>\r
+<char:arrowdbldown><font:LucidNewMatSymT><index:43>\r
+<char:arrowdblboth><font:LucidNewMatSymT><index:44>\r
+<char:arrownorthwest><font:LucidNewMatSymT><index:45>\r
+<char:arrowsouthwest><font:LucidNewMatSymT><index:46>\r
+<char:proportional><font:LucidNewMatSymT><index:47>\r
+<char:prime><font:LucidNewMatSymT><index:48>\r
+<char:infinity><font:LucidNewMatSymT><index:49>\r
+<char:element><font:LucidNewMatSymT><index:50>\r
+<char:owner><font:LucidNewMatSymT><index:51>\r
+<char:triangle><font:LucidNewMatSymT><index:52>\r
+<char:triangleinv><font:LucidNewMatSymT><index:53>\r
+<char:negationslash><font:LucidNewMatSymT><index:54>\r
+<char:mapsto><font:LucidNewMatSymT><index:55>\r
+<char:universal><font:LucidNewMatSymT><index:56>\r
+<char:existential><font:LucidNewMatSymT><index:57>\r
+<char:logicalnot><font:LucidNewMatSymT><index:58>\r
+<char:emptyset><font:LucidNewMatSymT><index:59>\r
+<char:Rfractur><font:LucidNewMatSymT><index:60>\r
+<char:Ifractur><font:LucidNewMatSymT><index:61>\r
+<char:latticetop><font:LucidNewMatSymT><index:62>\r
+<char:perpendicular><font:LucidNewMatSymT><index:63>\r
+<char:aleph><font:LucidNewMatSymT><index:64>\r
+<char:scriptA><font:LucidNewMatSymT><index:65>\r
+<char:scriptB><font:LucidNewMatSymT><index:66>\r
+<char:scriptC><font:LucidNewMatSymT><index:67>\r
+<char:scriptD><font:LucidNewMatSymT><index:68>\r
+<char:scriptE><font:LucidNewMatSymT><index:69>\r
+<char:scriptF><font:LucidNewMatSymT><index:70>\r
+<char:scriptG><font:LucidNewMatSymT><index:71>\r
+<char:scriptH><font:LucidNewMatSymT><index:72>\r
+<char:scriptI><font:LucidNewMatSymT><index:73>\r
+<char:scriptJ><font:LucidNewMatSymT><index:74>\r
+<char:scriptK><font:LucidNewMatSymT><index:75>\r
+<char:scriptL><font:LucidNewMatSymT><index:76>\r
+<char:scriptM><font:LucidNewMatSymT><index:77>\r
+<char:scriptN><font:LucidNewMatSymT><index:78>\r
+<char:scriptO><font:LucidNewMatSymT><index:79>\r
+<char:scriptP><font:LucidNewMatSymT><index:80>\r
+<char:scriptQ><font:LucidNewMatSymT><index:81>\r
+<char:scriptR><font:LucidNewMatSymT><index:82>\r
+<char:scriptS><font:LucidNewMatSymT><index:83>\r
+<char:scriptT><font:LucidNewMatSymT><index:84>\r
+<char:scriptU><font:LucidNewMatSymT><index:85>\r
+<char:scriptV><font:LucidNewMatSymT><index:86>\r
+<char:scriptW><font:LucidNewMatSymT><index:87>\r
+<char:scriptX><font:LucidNewMatSymT><index:88>\r
+<char:scriptY><font:LucidNewMatSymT><index:89>\r
+<char:scriptZ><font:LucidNewMatSymT><index:90>\r
+<char:union><font:LucidNewMatSymT><index:91>\r
+<char:intersection><font:LucidNewMatSymT><index:92>\r
+<char:unionmulti><font:LucidNewMatSymT><index:93>\r
+<char:logicaland><font:LucidNewMatSymT><index:94>\r
+<char:logicalor><font:LucidNewMatSymT><index:95>\r
+<char:turnstileleft><font:LucidNewMatSymT><index:96>\r
+<char:turnstileright><font:LucidNewMatSymT><index:97>\r
+<char:floorleft><font:LucidNewMatSymT><index:98>\r
+<char:floorright><font:LucidNewMatSymT><index:99>\r
+<char:ceilingleft><font:LucidNewMatSymT><index:100>\r
+<char:ceilingright><font:LucidNewMatSymT><index:101>\r
+<char:braceleft><font:LucidNewMatSymT><index:102>\r
+<char:braceright><font:LucidNewMatSymT><index:103>\r
+<char:angbracketleft><font:LucidNewMatSymT><index:104>\r
+<char:angbracketright><font:LucidNewMatSymT><index:105>\r
+<char:bar><font:LucidNewMatSymT><index:106>\r
+<char:bardbl><font:LucidNewMatSymT><index:107>\r
+<char:arrowbothv><font:LucidNewMatSymT><index:108>\r
+<char:arrowdblbothv><font:LucidNewMatSymT><index:109>\r
+<char:backslash><font:LucidNewMatSymT><index:110>\r
+<char:wreathproduct><font:LucidNewMatSymT><index:111>\r
+<char:radical><font:LucidNewMatSymT><index:112>\r
+<char:coproduct><font:LucidNewMatSymT><index:113>\r
+<char:nabla><font:LucidNewMatSymT><index:114>\r
+<char:integral><font:LucidNewMatSymT><index:115>\r
+<char:unionsq><font:LucidNewMatSymT><index:116>\r
+<char:intersectionsq><font:LucidNewMatSymT><index:117>\r
+<char:subsetsqequal><font:LucidNewMatSymT><index:118>\r
+<char:supersetsqequal><font:LucidNewMatSymT><index:119>\r
+<char:section><font:LucidNewMatSymT><index:120>\r
+<char:dagger><font:LucidNewMatSymT><index:121>\r
+<char:daggerdbl><font:LucidNewMatSymT><index:122>\r
+<char:paragraph><font:LucidNewMatSymT><index:123>\r
+<char:club><font:LucidNewMatSymT><index:124>\r
+<char:diamond><font:LucidNewMatSymT><index:125>\r
+<char:heart><font:LucidNewMatSymT><index:126>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/makefile b/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/makefile
new file mode 100644 (file)
index 0000000..7c816d2
--- /dev/null
@@ -0,0 +1,10 @@
+
+
+run:
+       java -cp ../src tagger/Tagger test
+
+
+clean:
+       rm -f test.index.txt
+       rm -f test.tag.txt
+       rm -f *~
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/standard-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/standard-charmap.txt
new file mode 100755 (executable)
index 0000000..9e6a44f
--- /dev/null
@@ -0,0 +1,220 @@
+# character map for standard font\r
+\r
+<char:space><font:><index:32>\r
+<char:exclam><font:><index:33>\r
+<char:quotedbl><font:><index:34>\r
+<char:numbersign><font:><index:35>\r
+<char:dollar><font:><index:36>\r
+<char:percent><font:><index:37>\r
+<char:ampersand><font:><index:38>\r
+<char:quotesingle><font:><index:39>\r
+<char:parenleft><font:><index:40>\r
+<char:parenright><font:><index:41>\r
+<char:asterisk><font:><index:42>\r
+<char:plus><font:><index:43>\r
+<char:comma><font:><index:44>\r
+<char:hyphen><font:><index:45>\r
+<char:period><font:><index:46>\r
+<char:slash><font:><index:47>\r
+<char:zero><font:><index:48>\r
+<char:one><font:><index:49>\r
+<char:two><font:><index:50>\r
+<char:three><font:><index:51>\r
+<char:four><font:><index:52>\r
+<char:five><font:><index:53>\r
+<char:six><font:><index:54>\r
+<char:seven><font:><index:55>\r
+<char:eight><font:><index:56>\r
+<char:nine><font:><index:57>\r
+<char:colon><font:><index:58>\r
+<char:semicolon><font:><index:59>\r
+<char:less><font:><index:60>\r
+<char:equal><font:><index:61>\r
+<char:greater><font:><index:62>\r
+<char:question><font:><index:63>\r
+<char:at><font:><index:64>\r
+<char:A><font:><index:65>\r
+<char:B><font:><index:66>\r
+<char:C><font:><index:67>\r
+<char:D><font:><index:68>\r
+<char:E><font:><index:69>\r
+<char:F><font:><index:70>\r
+<char:G><font:><index:71>\r
+<char:H><font:><index:72>\r
+<char:I><font:><index:73>\r
+<char:J><font:><index:74>\r
+<char:K><font:><index:75>\r
+<char:L><font:><index:76>\r
+<char:M><font:><index:77>\r
+<char:N><font:><index:78>\r
+<char:O><font:><index:79>\r
+<char:P><font:><index:80>\r
+<char:Q><font:><index:81>\r
+<char:R><font:><index:82>\r
+<char:S><font:><index:83>\r
+<char:T><font:><index:84>\r
+<char:U><font:><index:85>\r
+<char:V><font:><index:86>\r
+<char:W><font:><index:87>\r
+<char:X><font:><index:88>\r
+<char:Y><font:><index:89>\r
+<char:Z><font:><index:90>\r
+<char:bracketleft><font:><index:91>\r
+<char:backslash><font:><index:92>\r
+<char:bracketright><font:><index:93>\r
+<char:asciicircum><font:><index:94>\r
+<char:underscore><font:><index:95>\r
+<char:grave><font:><index:96>\r
+<char:a><font:><index:97>\r
+<char:b><font:><index:98>\r
+<char:c><font:><index:99>\r
+<char:d><font:><index:100>\r
+<char:e><font:><index:101>\r
+<char:f><font:><index:102>\r
+<char:g><font:><index:103>\r
+<char:h><font:><index:104>\r
+<char:i><font:><index:105>\r
+<char:j><font:><index:106>\r
+<char:k><font:><index:107>\r
+<char:l><font:><index:108>\r
+<char:m><font:><index:109>\r
+<char:n><font:><index:110>\r
+<char:o><font:><index:111>\r
+<char:p><font:><index:112>\r
+<char:q><font:><index:113>\r
+<char:r><font:><index:114>\r
+<char:s><font:><index:115>\r
+<char:t><font:><index:116>\r
+<char:u><font:><index:117>\r
+<char:v><font:><index:118>\r
+<char:w><font:><index:119>\r
+<char:x><font:><index:120>\r
+<char:y><font:><index:121>\r
+<char:z><font:><index:122>\r
+<char:braceleft><font:><index:123>\r
+<char:bar><font:><index:124>\r
+<char:braceright><font:><index:125>\r
+<char:asciitilde><font:><index:126>\r
+<char:euro><font:><index:128>\r
+<char:quotesinglbase><font:><index:130>\r
+<char:florin><font:><index:131>\r
+<char:quotedblbase><font:><index:132>\r
+<char:ellipsis><font:><index:133>\r
+<char:dagger><font:><index:134>\r
+<char:daggerdbl><font:><index:135>\r
+<char:circumflex><font:><index:136>\r
+<char:perthousand><font:><index:137>\r
+<char:Scaron><font:><index:138>\r
+<char:guilsinglleft><font:><index:139>\r
+<char:OE><font:><index:140>\r
+<char:Zcaron><font:><index:142>\r
+<char:quoteleft><font:><index:145>\r
+<char:quoteright><font:><index:146>\r
+<char:quotedblleft><font:><index:147>\r
+<char:quotedblright><font:><index:148>\r
+<char:bullet><font:><index:149>\r
+<char:endash><font:><index:150>\r
+<char:emdash><font:><index:151>\r
+<char:tilde><font:><index:152>\r
+<char:trademark><font:><index:153>\r
+<char:scaron><font:><index:154>\r
+<char:guilsinglright><font:><index:155>\r
+<char:oe><font:><index:156>\r
+<char:zcaron><font:><index:158>\r
+<char:Ydieresis><font:><index:159>\r
+<char:nbspace><font:><index:160>\r
+<char:exclamdown><font:><index:161>\r
+<char:cent><font:><index:162>\r
+<char:sterling><font:><index:163>\r
+<char:currency><font:><index:164>\r
+<char:yen><font:><index:165>\r
+<char:brokenbar><font:><index:166>\r
+<char:section><font:><index:167>\r
+<char:dieresis><font:><index:168>\r
+<char:copyright><font:><index:169>\r
+<char:ordfeminine><font:><index:170>\r
+<char:guillemotleft><font:><index:171>\r
+<char:logicalnot><font:><index:172>\r
+<char:sfthyphen><font:><index:173>\r
+<char:registered><font:><index:174>\r
+<char:macron><font:><index:175>\r
+<char:degree><font:><index:176>\r
+<char:plusminus><font:><index:177>\r
+<char:twosuperior><font:><index:178>\r
+<char:threesuperior><font:><index:179>\r
+<char:acute><font:><index:180>\r
+<char:mu><font:><index:181>\r
+<char:paragraph><font:><index:182>\r
+<char:periodcentered><font:><index:183>\r
+<char:cedilla><font:><index:184>\r
+<char:onesuperior><font:><index:185>\r
+<char:ordmasculine><font:><index:186>\r
+<char:guillemotright><font:><index:187>\r
+<char:onequarter><font:><index:188>\r
+<char:onehalf><font:><index:189>\r
+<char:threequarters><font:><index:190>\r
+<char:questiondown><font:><index:191>\r
+<char:Agrave><font:><index:192>\r
+<char:Aacute><font:><index:193>\r
+<char:Acircumflex><font:><index:194>\r
+<char:Atilde><font:><index:195>\r
+<char:Adieresis><font:><index:196>\r
+<char:Aring><font:><index:197>\r
+<char:AE><font:><index:198>\r
+<char:Ccedilla><font:><index:199>\r
+<char:Egrave><font:><index:200>\r
+<char:Eacute><font:><index:201>\r
+<char:Ecircumflex><font:><index:202>\r
+<char:Edieresis><font:><index:203>\r
+<char:Igrave><font:><index:204>\r
+<char:Iacute><font:><index:205>\r
+<char:Icircumflex><font:><index:206>\r
+<char:Idieresis><font:><index:207>\r
+<char:Eth><font:><index:208>\r
+<char:Ntilde><font:><index:209>\r
+<char:Ograve><font:><index:210>\r
+<char:Oacute><font:><index:211>\r
+<char:Ocircumflex><font:><index:212>\r
+<char:Otilde><font:><index:213>\r
+<char:Odieresis><font:><index:214>\r
+<char:multiply><font:><index:215>\r
+<char:Oslash><font:><index:216>\r
+<char:Ugrave><font:><index:217>\r
+<char:Uacute><font:><index:218>\r
+<char:Ucircumflex><font:><index:219>\r
+<char:Udieresis><font:><index:220>\r
+<char:Yacute><font:><index:221>\r
+<char:Thorn><font:><index:222>\r
+<char:germandbls><font:><index:223>\r
+<char:agrave><font:><index:224>\r
+<char:aacute><font:><index:225>\r
+<char:acircumflex><font:><index:226>\r
+<char:atilde><font:><index:227>\r
+<char:adieresis><font:><index:228>\r
+<char:aring><font:><index:229>\r
+<char:ae><font:><index:230>\r
+<char:ccedilla><font:><index:231>\r
+<char:egrave><font:><index:232>\r
+<char:eacute><font:><index:233>\r
+<char:ecircumflex><font:><index:234>\r
+<char:edieresis><font:><index:235>\r
+<char:igrave><font:><index:236>\r
+<char:iacute><font:><index:237>\r
+<char:icircumflex><font:><index:238>\r
+<char:idieresis><font:><index:239>\r
+<char:eth><font:><index:240>\r
+<char:ntilde><font:><index:241>\r
+<char:ograve><font:><index:242>\r
+<char:oacute><font:><index:243>\r
+<char:ocircumflex><font:><index:244>\r
+<char:otilde><font:><index:245>\r
+<char:odieresis><font:><index:246>\r
+<char:divide><font:><index:247>\r
+<char:oslash><font:><index:248>\r
+<char:ugrave><font:><index:249>\r
+<char:uacute><font:><index:250>\r
+<char:ucircumflex><font:><index:251>\r
+<char:udieresis><font:><index:252>\r
+<char:yacute><font:><index:253>\r
+<char:thorn><font:><index:254>\r
+<char:ydieresis><font:><index:255>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/styles.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/styles.txt
new file mode 100755 (executable)
index 0000000..55aaf72
--- /dev/null
@@ -0,0 +1,11 @@
+<style:title><next:author>\r
+<style:author><next:section>\r
+<style:section><next:noindent><counter:1><separator:.><trailer:        >\r
+<style:opening><next:noindent>\r
+<style:noindent><next:body>\r
+<style:body><next:body>\r
+<style:subsection><next:noindent><parent:section><counter:1><separator:.><trailer:     >\r
+<style:subsubsection><next:noindent><parent:subsection><counter:a><separator:.><trailer:       >\r
+<style:geekmath><next:noindent>\r
+<style:point><next:noindent><counter:A><leader:\alpha >\r
+<style:ref><next:ref>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/symbol-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/symbol-charmap.txt
new file mode 100755 (executable)
index 0000000..4481c17
--- /dev/null
@@ -0,0 +1,195 @@
+# character map for Symbol font\r
+\r
+<char:Symbol><font:Symbol><index:for>\r
+<char:space><font:Symbol><index:32>\r
+<char:exclam><font:Symbol><index:33>\r
+<char:universal><font:Symbol><index:34>\r
+<char:numbersign><font:Symbol><index:35>\r
+<char:existential><font:Symbol><index:36>\r
+<char:percent><font:Symbol><index:37>\r
+<char:ampersand><font:Symbol><index:38>\r
+<char:suchthat><font:Symbol><index:39>\r
+<char:parenleft><font:Symbol><index:40>\r
+<char:parenright><font:Symbol><index:41>\r
+<char:asteriskmath><font:Symbol><index:42>\r
+<char:plus><font:Symbol><index:43>\r
+<char:comma><font:Symbol><index:44>\r
+<char:minus><font:Symbol><index:45>\r
+<char:period><font:Symbol><index:46>\r
+<char:slash><font:Symbol><index:47>\r
+<char:zero><font:Symbol><index:48>\r
+<char:one><font:Symbol><index:49>\r
+<char:two><font:Symbol><index:50>\r
+<char:three><font:Symbol><index:51>\r
+<char:four><font:Symbol><index:52>\r
+<char:five><font:Symbol><index:53>\r
+<char:six><font:Symbol><index:54>\r
+<char:seven><font:Symbol><index:55>\r
+<char:eight><font:Symbol><index:56>\r
+<char:nine><font:Symbol><index:57>\r
+<char:colon><font:Symbol><index:58>\r
+<char:semicolon><font:Symbol><index:59>\r
+<char:less><font:Symbol><index:60>\r
+<char:equal><font:Symbol><index:61>\r
+<char:greater><font:Symbol><index:62>\r
+<char:question><font:Symbol><index:63>\r
+<char:congruent><font:Symbol><index:64>\r
+<char:Alpha><font:Symbol><index:65>\r
+<char:Beta><font:Symbol><index:66>\r
+<char:Chi><font:Symbol><index:67>\r
+<char:Delta><font:Symbol><index:68>\r
+<char:Epsilon><font:Symbol><index:69>\r
+<char:Phi><font:Symbol><index:70>\r
+<char:Gamma><font:Symbol><index:71>\r
+<char:Eta><font:Symbol><index:72>\r
+<char:Iota><font:Symbol><index:73>\r
+<char:theta1><font:Symbol><index:74>\r
+<char:Kappa><font:Symbol><index:75>\r
+<char:Lambda><font:Symbol><index:76>\r
+<char:Mu><font:Symbol><index:77>\r
+<char:Nu><font:Symbol><index:78>\r
+<char:Omicron><font:Symbol><index:79>\r
+<char:Pi><font:Symbol><index:80>\r
+<char:Theta><font:Symbol><index:81>\r
+<char:Rho><font:Symbol><index:82>\r
+<char:Sigma><font:Symbol><index:83>\r
+<char:Tau><font:Symbol><index:84>\r
+<char:Upsilon><font:Symbol><index:85>\r
+<char:sigma1><font:Symbol><index:86>\r
+<char:Omega><font:Symbol><index:87>\r
+<char:Xi><font:Symbol><index:88>\r
+<char:Psi><font:Symbol><index:89>\r
+<char:Zeta><font:Symbol><index:90>\r
+<char:bracketleft><font:Symbol><index:91>\r
+<char:therefore><font:Symbol><index:92>\r
+<char:bracketright><font:Symbol><index:93>\r
+<char:perpendicular><font:Symbol><index:94>\r
+<char:underscore><font:Symbol><index:95>\r
+<char:radicalex><font:Symbol><index:96>\r
+<char:alpha><font:Symbol><index:97>\r
+<char:beta><font:Symbol><index:98>\r
+<char:chi><font:Symbol><index:99>\r
+<char:delta><font:Symbol><index:100>\r
+<char:epsilon><font:Symbol><index:101>\r
+<char:phi><font:Symbol><index:102>\r
+<char:gamma><font:Symbol><index:103>\r
+<char:eta><font:Symbol><index:104>\r
+<char:iota><font:Symbol><index:105>\r
+<char:phi1><font:Symbol><index:106>\r
+<char:kappa><font:Symbol><index:107>\r
+<char:lambda><font:Symbol><index:108>\r
+<char:mu><font:Symbol><index:109>\r
+<char:nu><font:Symbol><index:110>\r
+<char:omicron><font:Symbol><index:111>\r
+<char:pi><font:Symbol><index:112>\r
+<char:theta><font:Symbol><index:113>\r
+<char:rho><font:Symbol><index:114>\r
+<char:sigma><font:Symbol><index:115>\r
+<char:tau><font:Symbol><index:116>\r
+<char:upsilon><font:Symbol><index:117>\r
+<char:omega1><font:Symbol><index:118>\r
+<char:omega><font:Symbol><index:119>\r
+<char:xi><font:Symbol><index:120>\r
+<char:psi><font:Symbol><index:121>\r
+<char:zeta><font:Symbol><index:122>\r
+<char:braceleft><font:Symbol><index:123>\r
+<char:bar><font:Symbol><index:124>\r
+<char:braceright><font:Symbol><index:125>\r
+<char:similar><font:Symbol><index:126>\r
+<char:Euro><font:Symbol><index:160>\r
+<char:Upsilon1><font:Symbol><index:161>\r
+<char:minute><font:Symbol><index:162>\r
+<char:lessequal><font:Symbol><index:163>\r
+<char:fraction><font:Symbol><index:164>\r
+<char:infinity><font:Symbol><index:165>\r
+<char:florin><font:Symbol><index:166>\r
+<char:club><font:Symbol><index:167>\r
+<char:diamond><font:Symbol><index:168>\r
+<char:heart><font:Symbol><index:169>\r
+<char:spade><font:Symbol><index:170>\r
+<char:arrowboth><font:Symbol><index:171>\r
+<char:arrowleft><font:Symbol><index:172>\r
+<char:arrowup><font:Symbol><index:173>\r
+<char:arrowright><font:Symbol><index:174>\r
+<char:arrowdown><font:Symbol><index:175>\r
+<char:degree><font:Symbol><index:176>\r
+<char:plusminus><font:Symbol><index:177>\r
+<char:second><font:Symbol><index:178>\r
+<char:greaterequal><font:Symbol><index:179>\r
+<char:multiply><font:Symbol><index:180>\r
+<char:proportional><font:Symbol><index:181>\r
+<char:partialdiff><font:Symbol><index:182>\r
+<char:bullet><font:Symbol><index:183>\r
+<char:divide><font:Symbol><index:184>\r
+<char:notequal><font:Symbol><index:185>\r
+<char:equivalence><font:Symbol><index:186>\r
+<char:approxequal><font:Symbol><index:187>\r
+\r
+# seems to be a quarter fraction\r
+# <char:ellipsis><font:Symbol><index:188>\r
+\r
+<char:arrowvertex><font:Symbol><index:189>\r
+<char:arrowhorizex><font:Symbol><index:190>\r
+<char:carriagereturn><font:Symbol><index:191>\r
+<char:aleph><font:Symbol><index:192>\r
+<char:Ifraktur><font:Symbol><index:193>\r
+<char:Rfraktur><font:Symbol><index:194>\r
+<char:weierstrass><font:Symbol><index:195>\r
+<char:circlemultiply><font:Symbol><index:196>\r
+<char:circleplus><font:Symbol><index:197>\r
+<char:emptyset><font:Symbol><index:198>\r
+<char:intersection><font:Symbol><index:199>\r
+<char:union><font:Symbol><index:200>\r
+<char:propersuperset><font:Symbol><index:201>\r
+<char:reflexsuperset><font:Symbol><index:202>\r
+<char:notsubset><font:Symbol><index:203>\r
+<char:propersubset><font:Symbol><index:204>\r
+<char:reflexsubset><font:Symbol><index:205>\r
+<char:element><font:Symbol><index:206>\r
+<char:notelement><font:Symbol><index:207>\r
+<char:angle><font:Symbol><index:208>\r
+<char:gradient><font:Symbol><index:209>\r
+<char:registerserif><font:Symbol><index:210>\r
+<char:copyrightserif><font:Symbol><index:211>\r
+<char:trademarkserif><font:Symbol><index:212>\r
+<char:product><font:Symbol><index:213>\r
+<char:radical><font:Symbol><index:214>\r
+<char:dotmath><font:Symbol><index:215>\r
+<char:logicalnot><font:Symbol><index:216>\r
+<char:logicaland><font:Symbol><index:217>\r
+<char:logicalor><font:Symbol><index:218>\r
+<char:arrowdblboth><font:Symbol><index:219>\r
+<char:arrowdblleft><font:Symbol><index:220>\r
+<char:arrowdblup><font:Symbol><index:221>\r
+<char:arrowdblright><font:Symbol><index:222>\r
+<char:arrowdbldown><font:Symbol><index:223>\r
+<char:lozenge><font:Symbol><index:224>\r
+<char:angleleft><font:Symbol><index:225>\r
+<char:registersans><font:Symbol><index:226>\r
+<char:copyrightsans><font:Symbol><index:227>\r
+<char:trademarksans><font:Symbol><index:228>\r
+<char:summation><font:Symbol><index:229>\r
+<char:parenlefttp><font:Symbol><index:230>\r
+<char:parenleftex><font:Symbol><index:231>\r
+<char:parenleftbt><font:Symbol><index:232>\r
+<char:bracketlefttp><font:Symbol><index:233>\r
+<char:bracketleftex><font:Symbol><index:234>\r
+<char:bracketleftbt><font:Symbol><index:235>\r
+<char:bracelefttp><font:Symbol><index:236>\r
+<char:braceleftmid><font:Symbol><index:237>\r
+<char:braceleftbt><font:Symbol><index:238>\r
+<char:braceex><font:Symbol><index:239>\r
+<char:angleright><font:Symbol><index:241>\r
+<char:integral><font:Symbol><index:242>\r
+<char:integraltp><font:Symbol><index:243>\r
+<char:integralex><font:Symbol><index:244>\r
+<char:integralbt><font:Symbol><index:245>\r
+<char:parenrighttp><font:Symbol><index:246>\r
+<char:parenrightex><font:Symbol><index:247>\r
+<char:parenrightbt><font:Symbol><index:248>\r
+<char:bracketrighttp><font:Symbol><index:249>\r
+<char:bracketrightex><font:Symbol><index:250>\r
+<char:bracketrightbt><font:Symbol><index:251>\r
+<char:bracerighttp><font:Symbol><index:252>\r
+<char:bracerightmid><font:Symbol><index:253>\r
+<char:bracerightbt><font:Symbol><index:254>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/symbols.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/symbols.txt
new file mode 100755 (executable)
index 0000000..9b89caf
--- /dev/null
@@ -0,0 +1,530 @@
+# character map for Lucida Math Italic font\r
+\r
+<char:Gamma><font:LucidNewMatItaT><index:161>\r
+<char:Delta><font:LucidNewMatItaT><index:162>\r
+<char:Theta><font:LucidNewMatItaT><index:163>\r
+<char:Lambda><font:LucidNewMatItaT><index:164>\r
+<char:Xi><font:LucidNewMatItaT><index:165>\r
+<char:Pi><font:LucidNewMatItaT><index:166>\r
+<char:Sigma><font:LucidNewMatItaT><index:167>\r
+<char:Upsilon><font:LucidNewMatItaT><index:7>\r
+<char:Phi><font:LucidNewMatItaT><index:169>\r
+<char:Psi><font:LucidNewMatItaT><index:170>\r
+<char:Omega><font:LucidNewMatItaT><index:173>\r
+<char:alpha><font:LucidNewMatItaT><index:174>\r
+<char:beta><font:LucidNewMatItaT><index:175>\r
+<char:gamma><font:LucidNewMatItaT><index:176>\r
+<char:delta><font:LucidNewMatItaT><index:177>\r
+<char:epsilon1><font:LucidNewMatItaT><index:178>\r
+<char:zeta><font:LucidNewMatItaT><index:179>\r
+<char:eta><font:LucidNewMatItaT><index:180>\r
+<char:theta><font:LucidNewMatItaT><index:181>\r
+<char:iota><font:LucidNewMatItaT><index:182>\r
+<char:kappa><font:LucidNewMatItaT><index:183>\r
+<char:lambda><font:LucidNewMatItaT><index:184>\r
+<char:mu><font:LucidNewMatItaT><index:185>\r
+<char:nu><font:LucidNewMatItaT><index:186>\r
+<char:xi><font:LucidNewMatItaT><index:187>\r
+<char:pi><font:LucidNewMatItaT><index:188>\r
+<char:rho><font:LucidNewMatItaT><index:189>\r
+<char:sigma><font:LucidNewMatItaT><index:190>\r
+<char:tau><font:LucidNewMatItaT><index:191>\r
+<char:upsilon><font:LucidNewMatItaT><index:192>\r
+<char:phi><font:LucidNewMatItaT><index:193>\r
+<char:chi><font:LucidNewMatItaT><index:194>\r
+<char:psi><font:LucidNewMatItaT><index:195>\r
+<char:tie><font:LucidNewMatItaT><index:196>\r
+<char:omega><font:LucidNewMatItaT><index:33>\r
+<char:epsilon><font:LucidNewMatItaT><index:34>\r
+<char:theta1><font:LucidNewMatItaT><index:35>\r
+<char:pi1><font:LucidNewMatItaT><index:36>\r
+<char:rho1><font:LucidNewMatItaT><index:37>\r
+<char:sigma1><font:LucidNewMatItaT><index:38>\r
+<char:phi1><font:LucidNewMatItaT><index:39>\r
+<char:arrowlefttophalf><font:LucidNewMatItaT><index:40>\r
+<char:arrowleftbothalf><font:LucidNewMatItaT><index:41>\r
+<char:arrowrighttophalf><font:LucidNewMatItaT><index:42>\r
+<char:arrowrightbothalf><font:LucidNewMatItaT><index:43>\r
+<char:arrowhookleft><font:LucidNewMatItaT><index:44>\r
+<char:arrowhookright><font:LucidNewMatItaT><index:45>\r
+<char:triangleright><font:LucidNewMatItaT><index:46>\r
+<char:triangleleft><font:LucidNewMatItaT><index:47>\r
+<char:period><font:LucidNewMatItaT><index:58>\r
+<char:comma><font:LucidNewMatItaT><index:59>\r
+<char:less><font:LucidNewMatItaT><index:60>\r
+<char:slash><font:LucidNewMatItaT><index:61>\r
+<char:greater><font:LucidNewMatItaT><index:62>\r
+<char:star><font:LucidNewMatItaT><index:63>\r
+<char:partialdiff><font:LucidNewMatItaT><index:64>\r
+<char:flat><font:LucidNewMatItaT><index:91>\r
+<char:natural><font:LucidNewMatItaT><index:92>\r
+<char:sharp><font:LucidNewMatItaT><index:93>\r
+<char:slurbelow><font:LucidNewMatItaT><index:94>\r
+<char:slurabove><font:LucidNewMatItaT><index:95>\r
+<char:lscript><font:LucidNewMatItaT><index:96>\r
+<char:dotlessi><font:LucidNewMatItaT><index:123>\r
+<char:dotlessj><font:LucidNewMatItaT><index:124>\r
+<char:weierstrass><font:LucidNewMatItaT><index:125>\r
+<char:vector><font:LucidNewMatItaT><index:126>\r
+\r
+\r
+# mathematical characters for Lucida New Math Symbol font\r
+\r
+<char:minus><font:LucidNewMatSymT><index:161>\r
+<char:periodcentered><font:LucidNewMatSymT><index:162>\r
+<char:multiply><font:LucidNewMatSymT><index:163>\r
+<char:asteriskmath><font:LucidNewMatSymT><index:164>\r
+<char:divide><font:LucidNewMatSymT><index:165>\r
+<char:diamondmath><font:LucidNewMatSymT><index:166>\r
+<char:plusminus><font:LucidNewMatSymT><index:167>\r
+<char:minusplus><font:LucidNewMatSymT><index:168>\r
+<char:circleplus><font:LucidNewMatSymT><index:169>\r
+<char:circleminus><font:LucidNewMatSymT><index:170>\r
+<char:circlemultiply><font:LucidNewMatSymT><index:173>\r
+<char:circledivide><font:LucidNewMatSymT><index:174>\r
+<char:circledot><font:LucidNewMatSymT><index:175>\r
+<char:circlecopyrt><font:LucidNewMatSymT><index:176>\r
+<char:openbullet><font:LucidNewMatSymT><index:177>\r
+<char:bullet><font:LucidNewMatSymT><index:178>\r
+<char:equivasymptotic><font:LucidNewMatSymT><index:179>\r
+<char:equivalence><font:LucidNewMatSymT><index:180>\r
+<char:reflexsubset><font:LucidNewMatSymT><index:181>\r
+<char:reflexsuperset><font:LucidNewMatSymT><index:182>\r
+<char:lessequal><font:LucidNewMatSymT><index:183>\r
+<char:greaterequal><font:LucidNewMatSymT><index:184>\r
+<char:precedesequal><font:LucidNewMatSymT><index:185>\r
+<char:followsequal><font:LucidNewMatSymT><index:186>\r
+<char:similar><font:LucidNewMatSymT><index:187>\r
+<char:approxequal><font:LucidNewMatSymT><index:188>\r
+<char:propersubset><font:LucidNewMatSymT><index:189>\r
+<char:propersuperset><font:LucidNewMatSymT><index:190>\r
+<char:lessmuch><font:LucidNewMatSymT><index:191>\r
+<char:greatermuch><font:LucidNewMatSymT><index:192>\r
+<char:precedes><font:LucidNewMatSymT><index:193>\r
+<char:follows><font:LucidNewMatSymT><index:194>\r
+<char:arrowleft><font:LucidNewMatSymT><index:195>\r
+<char:spade><font:LucidNewMatSymT><index:196>\r
+<char:arrowright><font:LucidNewMatSymT><index:33>\r
+<char:arrowup><font:LucidNewMatSymT><index:34>\r
+<char:arrowdown><font:LucidNewMatSymT><index:35>\r
+<char:arrowboth><font:LucidNewMatSymT><index:36>\r
+<char:arrownortheast><font:LucidNewMatSymT><index:37>\r
+<char:arrowsoutheast><font:LucidNewMatSymT><index:38>\r
+<char:similarequal><font:LucidNewMatSymT><index:39>\r
+<char:arrowdblleft><font:LucidNewMatSymT><index:40>\r
+<char:arrowdblright><font:LucidNewMatSymT><index:41>\r
+<char:arrowdblup><font:LucidNewMatSymT><index:42>\r
+<char:arrowdbldown><font:LucidNewMatSymT><index:43>\r
+<char:arrowdblboth><font:LucidNewMatSymT><index:44>\r
+<char:arrownorthwest><font:LucidNewMatSymT><index:45>\r
+<char:arrowsouthwest><font:LucidNewMatSymT><index:46>\r
+<char:proportional><font:LucidNewMatSymT><index:47>\r
+<char:prime><font:LucidNewMatSymT><index:48>\r
+<char:infinity><font:LucidNewMatSymT><index:49>\r
+<char:element><font:LucidNewMatSymT><index:50>\r
+<char:owner><font:LucidNewMatSymT><index:51>\r
+<char:triangle><font:LucidNewMatSymT><index:52>\r
+<char:triangleinv><font:LucidNewMatSymT><index:53>\r
+<char:negationslash><font:LucidNewMatSymT><index:54>\r
+<char:mapsto><font:LucidNewMatSymT><index:55>\r
+<char:universal><font:LucidNewMatSymT><index:56>\r
+<char:existential><font:LucidNewMatSymT><index:57>\r
+<char:logicalnot><font:LucidNewMatSymT><index:58>\r
+<char:emptyset><font:LucidNewMatSymT><index:59>\r
+<char:Rfractur><font:LucidNewMatSymT><index:60>\r
+<char:Ifractur><font:LucidNewMatSymT><index:61>\r
+<char:latticetop><font:LucidNewMatSymT><index:62>\r
+<char:perpendicular><font:LucidNewMatSymT><index:63>\r
+<char:aleph><font:LucidNewMatSymT><index:64>\r
+<char:scriptA><font:LucidNewMatSymT><index:65>\r
+<char:scriptB><font:LucidNewMatSymT><index:66>\r
+<char:scriptC><font:LucidNewMatSymT><index:67>\r
+<char:scriptD><font:LucidNewMatSymT><index:68>\r
+<char:scriptE><font:LucidNewMatSymT><index:69>\r
+<char:scriptF><font:LucidNewMatSymT><index:70>\r
+<char:scriptG><font:LucidNewMatSymT><index:71>\r
+<char:scriptH><font:LucidNewMatSymT><index:72>\r
+<char:scriptI><font:LucidNewMatSymT><index:73>\r
+<char:scriptJ><font:LucidNewMatSymT><index:74>\r
+<char:scriptK><font:LucidNewMatSymT><index:75>\r
+<char:scriptL><font:LucidNewMatSymT><index:76>\r
+<char:scriptM><font:LucidNewMatSymT><index:77>\r
+<char:scriptN><font:LucidNewMatSymT><index:78>\r
+<char:scriptO><font:LucidNewMatSymT><index:79>\r
+<char:scriptP><font:LucidNewMatSymT><index:80>\r
+<char:scriptQ><font:LucidNewMatSymT><index:81>\r
+<char:scriptR><font:LucidNewMatSymT><index:82>\r
+<char:scriptS><font:LucidNewMatSymT><index:83>\r
+<char:scriptT><font:LucidNewMatSymT><index:84>\r
+<char:scriptU><font:LucidNewMatSymT><index:85>\r
+<char:scriptV><font:LucidNewMatSymT><index:86>\r
+<char:scriptW><font:LucidNewMatSymT><index:87>\r
+<char:scriptX><font:LucidNewMatSymT><index:88>\r
+<char:scriptY><font:LucidNewMatSymT><index:89>\r
+<char:scriptZ><font:LucidNewMatSymT><index:90>\r
+<char:union><font:LucidNewMatSymT><index:91>\r
+<char:intersection><font:LucidNewMatSymT><index:92>\r
+<char:unionmulti><font:LucidNewMatSymT><index:93>\r
+<char:logicaland><font:LucidNewMatSymT><index:94>\r
+<char:logicalor><font:LucidNewMatSymT><index:95>\r
+<char:turnstileleft><font:LucidNewMatSymT><index:96>\r
+<char:turnstileright><font:LucidNewMatSymT><index:97>\r
+<char:floorleft><font:LucidNewMatSymT><index:98>\r
+<char:floorright><font:LucidNewMatSymT><index:99>\r
+<char:ceilingleft><font:LucidNewMatSymT><index:100>\r
+<char:ceilingright><font:LucidNewMatSymT><index:101>\r
+<char:braceleft><font:LucidNewMatSymT><index:102>\r
+<char:braceright><font:LucidNewMatSymT><index:103>\r
+<char:angbracketleft><font:LucidNewMatSymT><index:104>\r
+<char:angbracketright><font:LucidNewMatSymT><index:105>\r
+<char:bar><font:LucidNewMatSymT><index:106>\r
+<char:bardbl><font:LucidNewMatSymT><index:107>\r
+<char:arrowbothv><font:LucidNewMatSymT><index:108>\r
+<char:arrowdblbothv><font:LucidNewMatSymT><index:109>\r
+<char:backslash><font:LucidNewMatSymT><index:110>\r
+<char:wreathproduct><font:LucidNewMatSymT><index:111>\r
+<char:radical><font:LucidNewMatSymT><index:112>\r
+<char:coproduct><font:LucidNewMatSymT><index:113>\r
+<char:nabla><font:LucidNewMatSymT><index:114>\r
+<char:integral><font:LucidNewMatSymT><index:115>\r
+<char:unionsq><font:LucidNewMatSymT><index:116>\r
+<char:intersectionsq><font:LucidNewMatSymT><index:117>\r
+<char:subsetsqequal><font:LucidNewMatSymT><index:118>\r
+<char:supersetsqequal><font:LucidNewMatSymT><index:119>\r
+<char:section><font:LucidNewMatSymT><index:120>\r
+<char:dagger><font:LucidNewMatSymT><index:121>\r
+<char:daggerdbl><font:LucidNewMatSymT><index:122>\r
+<char:paragraph><font:LucidNewMatSymT><index:123>\r
+<char:club><font:LucidNewMatSymT><index:124>\r
+<char:diamond><font:LucidNewMatSymT><index:125>\r
+<char:heart><font:LucidNewMatSymT><index:126>\r
+\r
+\r
+\r
+# character map for Symbol font\r
+\r
+<char:Symbol><font:Symbol><index:for>\r
+<char:space><font:Symbol><index:32>\r
+<char:exclam><font:Symbol><index:33>\r
+<char:universal><font:Symbol><index:34>\r
+<char:numbersign><font:Symbol><index:35>\r
+<char:existential><font:Symbol><index:36>\r
+<char:percent><font:Symbol><index:37>\r
+<char:ampersand><font:Symbol><index:38>\r
+<char:suchthat><font:Symbol><index:39>\r
+<char:parenleft><font:Symbol><index:40>\r
+<char:parenright><font:Symbol><index:41>\r
+<char:asteriskmath><font:Symbol><index:42>\r
+<char:plus><font:Symbol><index:43>\r
+<char:comma><font:Symbol><index:44>\r
+<char:minus><font:Symbol><index:45>\r
+<char:period><font:Symbol><index:46>\r
+<char:slash><font:Symbol><index:47>\r
+<char:zero><font:Symbol><index:48>\r
+<char:one><font:Symbol><index:49>\r
+<char:two><font:Symbol><index:50>\r
+<char:three><font:Symbol><index:51>\r
+<char:four><font:Symbol><index:52>\r
+<char:five><font:Symbol><index:53>\r
+<char:six><font:Symbol><index:54>\r
+<char:seven><font:Symbol><index:55>\r
+<char:eight><font:Symbol><index:56>\r
+<char:nine><font:Symbol><index:57>\r
+<char:colon><font:Symbol><index:58>\r
+<char:semicolon><font:Symbol><index:59>\r
+<char:less><font:Symbol><index:60>\r
+<char:equal><font:Symbol><index:61>\r
+<char:greater><font:Symbol><index:62>\r
+<char:question><font:Symbol><index:63>\r
+<char:congruent><font:Symbol><index:64>\r
+<char:Alpha><font:Symbol><index:65>\r
+<char:Beta><font:Symbol><index:66>\r
+<char:Chi><font:Symbol><index:67>\r
+<char:Delta><font:Symbol><index:68>\r
+<char:Epsilon><font:Symbol><index:69>\r
+<char:Phi><font:Symbol><index:70>\r
+<char:Gamma><font:Symbol><index:71>\r
+<char:Eta><font:Symbol><index:72>\r
+<char:Iota><font:Symbol><index:73>\r
+<char:theta1><font:Symbol><index:74>\r
+<char:Kappa><font:Symbol><index:75>\r
+<char:Lambda><font:Symbol><index:76>\r
+<char:Mu><font:Symbol><index:77>\r
+<char:Nu><font:Symbol><index:78>\r
+<char:Omicron><font:Symbol><index:79>\r
+<char:Pi><font:Symbol><index:80>\r
+<char:Theta><font:Symbol><index:81>\r
+<char:Rho><font:Symbol><index:82>\r
+<char:Sigma><font:Symbol><index:83>\r
+<char:Tau><font:Symbol><index:84>\r
+<char:Upsilon><font:Symbol><index:85>\r
+<char:sigma1><font:Symbol><index:86>\r
+<char:Omega><font:Symbol><index:87>\r
+<char:Xi><font:Symbol><index:88>\r
+<char:Psi><font:Symbol><index:89>\r
+<char:Zeta><font:Symbol><index:90>\r
+<char:bracketleft><font:Symbol><index:91>\r
+<char:therefore><font:Symbol><index:92>\r
+<char:bracketright><font:Symbol><index:93>\r
+<char:perpendicular><font:Symbol><index:94>\r
+<char:underscore><font:Symbol><index:95>\r
+<char:radicalex><font:Symbol><index:96>\r
+<char:alpha><font:Symbol><index:97>\r
+<char:beta><font:Symbol><index:98>\r
+<char:chi><font:Symbol><index:99>\r
+<char:delta><font:Symbol><index:100>\r
+<char:epsilon><font:Symbol><index:101>\r
+<char:phi><font:Symbol><index:102>\r
+<char:gamma><font:Symbol><index:103>\r
+<char:eta><font:Symbol><index:104>\r
+<char:iota><font:Symbol><index:105>\r
+<char:phi1><font:Symbol><index:106>\r
+<char:kappa><font:Symbol><index:107>\r
+<char:lambda><font:Symbol><index:108>\r
+<char:mu><font:Symbol><index:109>\r
+<char:nu><font:Symbol><index:110>\r
+<char:omicron><font:Symbol><index:111>\r
+<char:pi><font:Symbol><index:112>\r
+<char:theta><font:Symbol><index:113>\r
+<char:rho><font:Symbol><index:114>\r
+<char:sigma><font:Symbol><index:115>\r
+<char:tau><font:Symbol><index:116>\r
+<char:upsilon><font:Symbol><index:117>\r
+<char:omega1><font:Symbol><index:118>\r
+<char:omega><font:Symbol><index:119>\r
+<char:xi><font:Symbol><index:120>\r
+<char:psi><font:Symbol><index:121>\r
+<char:zeta><font:Symbol><index:122>\r
+<char:braceleft><font:Symbol><index:123>\r
+<char:bar><font:Symbol><index:124>\r
+<char:braceright><font:Symbol><index:125>\r
+<char:similar><font:Symbol><index:126>\r
+<char:Euro><font:Symbol><index:160>\r
+<char:Upsilon1><font:Symbol><index:161>\r
+<char:minute><font:Symbol><index:162>\r
+<char:lessequal><font:Symbol><index:163>\r
+<char:fraction><font:Symbol><index:164>\r
+<char:infinity><font:Symbol><index:165>\r
+<char:florin><font:Symbol><index:166>\r
+<char:club><font:Symbol><index:167>\r
+<char:diamond><font:Symbol><index:168>\r
+<char:heart><font:Symbol><index:169>\r
+<char:spade><font:Symbol><index:170>\r
+<char:arrowboth><font:Symbol><index:171>\r
+<char:arrowleft><font:Symbol><index:172>\r
+<char:arrowup><font:Symbol><index:173>\r
+<char:arrowright><font:Symbol><index:174>\r
+<char:arrowdown><font:Symbol><index:175>\r
+<char:degree><font:Symbol><index:176>\r
+<char:plusminus><font:Symbol><index:177>\r
+<char:second><font:Symbol><index:178>\r
+<char:greaterequal><font:Symbol><index:179>\r
+<char:multiply><font:Symbol><index:180>\r
+<char:proportional><font:Symbol><index:181>\r
+<char:partialdiff><font:Symbol><index:182>\r
+<char:bullet><font:Symbol><index:183>\r
+<char:divide><font:Symbol><index:184>\r
+<char:notequal><font:Symbol><index:185>\r
+<char:equivalence><font:Symbol><index:186>\r
+<char:approxequal><font:Symbol><index:187>\r
+\r
+# seems to be a quarter fraction\r
+# <char:ellipsis><font:Symbol><index:188>\r
+\r
+<char:arrowvertex><font:Symbol><index:189>\r
+<char:arrowhorizex><font:Symbol><index:190>\r
+<char:carriagereturn><font:Symbol><index:191>\r
+<char:aleph><font:Symbol><index:192>\r
+<char:Ifraktur><font:Symbol><index:193>\r
+<char:Rfraktur><font:Symbol><index:194>\r
+<char:weierstrass><font:Symbol><index:195>\r
+<char:circlemultiply><font:Symbol><index:196>\r
+<char:circleplus><font:Symbol><index:197>\r
+<char:emptyset><font:Symbol><index:198>\r
+<char:intersection><font:Symbol><index:199>\r
+<char:union><font:Symbol><index:200>\r
+<char:propersuperset><font:Symbol><index:201>\r
+<char:reflexsuperset><font:Symbol><index:202>\r
+<char:notsubset><font:Symbol><index:203>\r
+<char:propersubset><font:Symbol><index:204>\r
+<char:reflexsubset><font:Symbol><index:205>\r
+<char:element><font:Symbol><index:206>\r
+<char:notelement><font:Symbol><index:207>\r
+<char:angle><font:Symbol><index:208>\r
+<char:gradient><font:Symbol><index:209>\r
+<char:registerserif><font:Symbol><index:210>\r
+<char:copyrightserif><font:Symbol><index:211>\r
+<char:trademarkserif><font:Symbol><index:212>\r
+<char:product><font:Symbol><index:213>\r
+<char:radical><font:Symbol><index:214>\r
+<char:dotmath><font:Symbol><index:215>\r
+<char:logicalnot><font:Symbol><index:216>\r
+<char:logicaland><font:Symbol><index:217>\r
+<char:logicalor><font:Symbol><index:218>\r
+<char:arrowdblboth><font:Symbol><index:219>\r
+<char:arrowdblleft><font:Symbol><index:220>\r
+<char:arrowdblup><font:Symbol><index:221>\r
+<char:arrowdblright><font:Symbol><index:222>\r
+<char:arrowdbldown><font:Symbol><index:223>\r
+<char:lozenge><font:Symbol><index:224>\r
+<char:angleleft><font:Symbol><index:225>\r
+<char:registersans><font:Symbol><index:226>\r
+<char:copyrightsans><font:Symbol><index:227>\r
+<char:trademarksans><font:Symbol><index:228>\r
+<char:summation><font:Symbol><index:229>\r
+<char:parenlefttp><font:Symbol><index:230>\r
+<char:parenleftex><font:Symbol><index:231>\r
+<char:parenleftbt><font:Symbol><index:232>\r
+<char:bracketlefttp><font:Symbol><index:233>\r
+<char:bracketleftex><font:Symbol><index:234>\r
+<char:bracketleftbt><font:Symbol><index:235>\r
+<char:bracelefttp><font:Symbol><index:236>\r
+<char:braceleftmid><font:Symbol><index:237>\r
+<char:braceleftbt><font:Symbol><index:238>\r
+<char:braceex><font:Symbol><index:239>\r
+<char:angleright><font:Symbol><index:241>\r
+<char:integral><font:Symbol><index:242>\r
+<char:integraltp><font:Symbol><index:243>\r
+<char:integralex><font:Symbol><index:244>\r
+<char:integralbt><font:Symbol><index:245>\r
+<char:parenrighttp><font:Symbol><index:246>\r
+<char:parenrightex><font:Symbol><index:247>\r
+<char:parenrightbt><font:Symbol><index:248>\r
+<char:bracketrighttp><font:Symbol><index:249>\r
+<char:bracketrightex><font:Symbol><index:250>\r
+<char:bracketrightbt><font:Symbol><index:251>\r
+<char:bracerighttp><font:Symbol><index:252>\r
+<char:bracerightmid><font:Symbol><index:253>\r
+<char:bracerightbt><font:Symbol><index:254>\r
+\r
+\r
+# character map for Lucida New Math Extended font\r
+\r
+<char:parenleftbig><font:LucidNewMatExtT><index:161>\r
+<char:parenrightbig><font:LucidNewMatExtT><index:162>\r
+<char:bracketleftbig><font:LucidNewMatExtT><index:163>\r
+<char:bracketrightbig><font:LucidNewMatExtT><index:164>\r
+<char:floorleftbig><font:LucidNewMatExtT><index:165>\r
+<char:floorrightbig><font:LucidNewMatExtT><index:166>\r
+<char:ceilingleftbig><font:LucidNewMatExtT><index:167>\r
+<char:ceilingrightbig><font:LucidNewMatExtT><index:168>\r
+<char:braceleftbig><font:LucidNewMatExtT><index:169>\r
+<char:bracerightbig><font:LucidNewMatExtT><index:170>\r
+<char:angbracketleftbig><font:LucidNewMatExtT><index:173>\r
+<char:angbracketrightbig><font:LucidNewMatExtT><index:174>\r
+<char:vextendsingle><font:LucidNewMatExtT><index:175>\r
+<char:vextenddouble><font:LucidNewMatExtT><index:176>\r
+<char:slashbig><font:LucidNewMatExtT><index:177>\r
+<char:backslashbig><font:LucidNewMatExtT><index:178>\r
+<char:parenleftBig><font:LucidNewMatExtT><index:179>\r
+<char:parenrightBig><font:LucidNewMatExtT><index:180>\r
+<char:parenleftbigg><font:LucidNewMatExtT><index:181>\r
+<char:parenrightbigg><font:LucidNewMatExtT><index:182>\r
+<char:bracketleftbigg><font:LucidNewMatExtT><index:183>\r
+<char:bracketrightbigg><font:LucidNewMatExtT><index:184>\r
+<char:floorleftbigg><font:LucidNewMatExtT><index:185>\r
+<char:floorrightbigg><font:LucidNewMatExtT><index:186>\r
+<char:ceilingleftbigg><font:LucidNewMatExtT><index:187>\r
+<char:ceilingrightbigg><font:LucidNewMatExtT><index:188>\r
+<char:braceleftbigg><font:LucidNewMatExtT><index:189>\r
+<char:bracerightbigg><font:LucidNewMatExtT><index:190>\r
+<char:angbracketleftbigg><font:LucidNewMatExtT><index:28>\r
+<char:angbracketrightbigg><font:LucidNewMatExtT><index:29>\r
+<char:slashbigg><font:LucidNewMatExtT><index:193>\r
+<char:backslashbigg><font:LucidNewMatExtT><index:194>\r
+<char:parenleftBigg><font:LucidNewMatExtT><index:195>\r
+<char:parenrightBigg><font:LucidNewMatExtT><index:33>\r
+<char:bracketleftBigg><font:LucidNewMatExtT><index:34>\r
+<char:bracketrightBigg><font:LucidNewMatExtT><index:35>\r
+<char:floorleftBigg><font:LucidNewMatExtT><index:36>\r
+<char:floorrightBigg><font:LucidNewMatExtT><index:37>\r
+<char:ceilingleftBigg><font:LucidNewMatExtT><index:38>\r
+<char:ceilingrightBigg><font:LucidNewMatExtT><index:39>\r
+<char:braceleftBigg><font:LucidNewMatExtT><index:40>\r
+<char:bracerightBigg><font:LucidNewMatExtT><index:41>\r
+<char:angbracketleftBigg><font:LucidNewMatExtT><index:42>\r
+<char:angbracketrightBigg><font:LucidNewMatExtT><index:43>\r
+<char:slashBigg><font:LucidNewMatExtT><index:44>\r
+<char:backslashBigg><font:LucidNewMatExtT><index:45>\r
+<char:slashBig><font:LucidNewMatExtT><index:46>\r
+<char:backslashBig><font:LucidNewMatExtT><index:47>\r
+<char:parenlefttp><font:LucidNewMatExtT><index:48>\r
+<char:parenrighttp><font:LucidNewMatExtT><index:49>\r
+<char:bracketlefttp><font:LucidNewMatExtT><index:50>\r
+<char:bracketrighttp><font:LucidNewMatExtT><index:51>\r
+<char:bracketleftbt><font:LucidNewMatExtT><index:52>\r
+<char:bracketrightbt><font:LucidNewMatExtT><index:53>\r
+<char:bracketleftex><font:LucidNewMatExtT><index:54>\r
+<char:bracketrightex><font:LucidNewMatExtT><index:55>\r
+<char:bracelefttp><font:LucidNewMatExtT><index:56>\r
+<char:bracerighttp><font:LucidNewMatExtT><index:57>\r
+<char:braceleftbt><font:LucidNewMatExtT><index:58>\r
+<char:bracerightbt><font:LucidNewMatExtT><index:59>\r
+<char:braceleftmid><font:LucidNewMatExtT><index:60>\r
+<char:bracerightmid><font:LucidNewMatExtT><index:61>\r
+<char:braceex><font:LucidNewMatExtT><index:62>\r
+<char:arrowvertex><font:LucidNewMatExtT><index:63>\r
+<char:parenleftbt><font:LucidNewMatExtT><index:64>\r
+<char:parenrightbt><font:LucidNewMatExtT><index:65>\r
+<char:parenleftex><font:LucidNewMatExtT><index:66>\r
+<char:parenrightex><font:LucidNewMatExtT><index:67>\r
+<char:angbracketleftBig><font:LucidNewMatExtT><index:68>\r
+<char:angbracketrightBig><font:LucidNewMatExtT><index:69>\r
+<char:unionsqtext><font:LucidNewMatExtT><index:70>\r
+<char:unionsqdisplay><font:LucidNewMatExtT><index:71>\r
+<char:contintegraltext><font:LucidNewMatExtT><index:72>\r
+<char:contintegraldisplay><font:LucidNewMatExtT><index:73>\r
+<char:circledottext><font:LucidNewMatExtT><index:74>\r
+<char:circledotdisplay><font:LucidNewMatExtT><index:75>\r
+<char:circleplustext><font:LucidNewMatExtT><index:76>\r
+<char:circleplusdisplay><font:LucidNewMatExtT><index:77>\r
+<char:circlemultiplytext><font:LucidNewMatExtT><index:78>\r
+<char:circlemultiplydisplay><font:LucidNewMatExtT><index:79>\r
+<char:summationtext><font:LucidNewMatExtT><index:80>\r
+<char:producttext><font:LucidNewMatExtT><index:81>\r
+<char:integraltext><font:LucidNewMatExtT><index:82>\r
+<char:uniontext><font:LucidNewMatExtT><index:83>\r
+<char:intersectiontext><font:LucidNewMatExtT><index:84>\r
+<char:unionmultitext><font:LucidNewMatExtT><index:85>\r
+<char:logicalandtext><font:LucidNewMatExtT><index:86>\r
+<char:logicalortext><font:LucidNewMatExtT><index:87>\r
+<char:summationdisplay><font:LucidNewMatExtT><index:88>\r
+<char:productdisplay><font:LucidNewMatExtT><index:89>\r
+<char:integraldisplay><font:LucidNewMatExtT><index:90>\r
+<char:uniondisplay><font:LucidNewMatExtT><index:91>\r
+<char:intersectiondisplay><font:LucidNewMatExtT><index:92>\r
+<char:unionmultidisplay><font:LucidNewMatExtT><index:93>\r
+<char:logicalanddisplay><font:LucidNewMatExtT><index:94>\r
+<char:logicalordisplay><font:LucidNewMatExtT><index:95>\r
+<char:coproducttext><font:LucidNewMatExtT><index:96>\r
+<char:coproductdisplay><font:LucidNewMatExtT><index:97>\r
+<char:hatwide><font:LucidNewMatExtT><index:98>\r
+<char:hatwider><font:LucidNewMatExtT><index:99>\r
+<char:hatwidest><font:LucidNewMatExtT><index:100>\r
+<char:tildewide><font:LucidNewMatExtT><index:101>\r
+<char:tildewider><font:LucidNewMatExtT><index:102>\r
+<char:tildewidest><font:LucidNewMatExtT><index:103>\r
+<char:bracketleftBig><font:LucidNewMatExtT><index:104>\r
+<char:bracketrightBig><font:LucidNewMatExtT><index:105>\r
+<char:floorleftBig><font:LucidNewMatExtT><index:106>\r
+<char:floorrightBig><font:LucidNewMatExtT><index:107>\r
+<char:ceilingleftBig><font:LucidNewMatExtT><index:108>\r
+<char:ceilingrightBig><font:LucidNewMatExtT><index:109>\r
+<char:braceleftBig><font:LucidNewMatExtT><index:110>\r
+<char:bracerightBig><font:LucidNewMatExtT><index:111>\r
+<char:radicalbig><font:LucidNewMatExtT><index:112>\r
+<char:radicalBig><font:LucidNewMatExtT><index:113>\r
+<char:radicalbigg><font:LucidNewMatExtT><index:114>\r
+<char:radicalBigg><font:LucidNewMatExtT><index:115>\r
+<char:radicalbt><font:LucidNewMatExtT><index:116>\r
+<char:radicalvertex><font:LucidNewMatExtT><index:117>\r
+<char:radicaltp><font:LucidNewMatExtT><index:118>\r
+<char:arrowvertexdbl><font:LucidNewMatExtT><index:119>\r
+<char:arrowtp><font:LucidNewMatExtT><index:120>\r
+<char:arrowbt><font:LucidNewMatExtT><index:121>\r
+<char:bracehtipdownleft><font:LucidNewMatExtT><index:122>\r
+<char:bracehtipdownright><font:LucidNewMatExtT><index:123>\r
+<char:bracehtipupleft><font:LucidNewMatExtT><index:124>\r
+<char:bracehtipupright><font:LucidNewMatExtT><index:125>\r
+<char:arrowdbltp><font:LucidNewMatExtT><index:126>\r
+<char:arrowdblbt><font:LucidNewMatExtT><index:196>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/test.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/JIMTEST/test.txt
new file mode 100755 (executable)
index 0000000..a41f466
--- /dev/null
@@ -0,0 +1,1057 @@
+\preamble\r
+\loadchars{charmap.txt}\r
+\loadchars{standard-charmap.txt}\r
+\loadchars{lucmathsym-charmap.txt}\r
+\loadchars{lucmathit-charmap.txt}\r
+\loadchars{lucmathext-charmap.txt}\r
+\loadchars{symbol-charmap.txt}\r
+\loadstyles{styles.txt}\r
+\r
+\title A Micromodularity Mechanism\r
+\r
+\section Testing\r
+\r
+This is gamma: \gamma.\\\r
+This is Delta: \Delta.\\\r
+This is oplus: \oplus.\r
+\scriptA \arrowdblright \scriptA\r
+\r
+This is a subscripted variable: A\sub<\bold<hello>\italics<there>>.\r
+Math mode: $x + 2 = y, and && x\sub<2> = y\sub<3> = x\sub<ijk>$\r
+\r
+\author Daniel Jackson, Ilya Shlyakhter and Manu Sridharan\\\r
+Laboratory for Computer Science\\\r
+Massachusetts Institute of Technology\\\r
+Cambridge, Massachusetts, USA\\\r
+dnj@mit.edu\r
+\r
+\opening Abstract\r
+\r
+A simple mechanism for structuring specifications is described. By modelling structures as atoms, it  remains entirely first-order and thus amenable to automatic analysis. And by interpreting fields of structures as relations, it allows the same relational operators used in the formula language to be used for dereferencing. An extension feature allows structures to be developed incrementally, but requires no textual inclusion nor any notion of subtyping. The paper demonstrates the flexibility of the mechanism by application in a variety of common idioms.\r
+\r
+\subsection* Categories and Subject Descriptors\r
+\r
+D.2.1 Requirements/Specifications---Languages; D.2.4 Software/Program Verification---Formal methods, Model checking; F.3.1 Specifying and Verifying and Reasoning about Programs---Assertions, Invariants, Specification techniques.\r
+\r
+\subsection* General Terms\r
+\r
+Design; Documentation; Languages; Verification.\r
+\r
+\subsection* Keywords\r
+\r
+Modeling languages; formal specification; first-order logic; relational calculus; Alloy language; Z specification language; schema calculus.\r
+\r
+\section* Introduction\r
+\r
+\quote I am neither crazy nor a micromaniac.\\\r
+(A micromaniac is someone obsessed with\\\r
+reducing things to their smallest possible form.\\\r
+This word, by the way, is not in the dictionary.)\\\r
+--_Edouard de Pomiane, French Cooking in Ten Minutes, 1930_\r
+\r
+\noindent Most specification languages provide mechanisms that allow larger specifications to be built from smaller ones. These mechanisms are often the most complicated part of the language, and present obstacles to analysis. This paper presents a simple mechanism that seems to be expressive enough for a wide variety of uses, without compromising analyzability.\r
+\r
+This work is part of a larger project investigating the design of a "micro modelling language". Our premise is that lightweight application of formal methods [6] demands an unusually small and simple language that is amenable to fully automatic semantic analysis. The Alloy language is the result to date of our efforts to design such a language. Based on our experiences with the language [4] and its analyzer [5], we have recently developed a revision of Alloy that overcomes many of its limitations. This paper describes the key feature of the revised language: the _signature_, a new modularity mechanism.\r
+\r
+The mechanism allows our existing analysis scheme [3] to be applied to specifications involving structures. This is not achieved by treating the structuring mechanism as a syntactic sugar, which would limit the power of the notation (ruling out, for example, quantification over structures) and would complicate the analysis tool and make output harder for users to interpret. Because of the mechanism's generality, it has also enabled us to simplify the language as a whole, making it more uniform and eliminating some ad hoc elements.\r
+\r
+Our mechanism has a variety of applications. It can express inherent structure in the system being modelled, and can be used to organize a specification in which details are added incrementally. It can be used to construct a library of datatypes, or to describe a system as an instantiation of a more general system. And it can express state invariants, transitions, and sequences, despite the lack of any special syntax for state machines.\r
+\r
+In this last respect, the new language differs most markedly from its predecessor [4], which provided built-in notions of state invariants and operations. We now think this was a bad idea, because it made the language cumbersome for problems (such as the analysis of security policies or architectural topology constraints) in which temporal behaviour can be fruitfully ignored, and too inflexible for many problems in which temporal behaviour is important.\r
+\r
+#Because the notation as a whole is small, simple and analyzable, and free of bias towards any particular domain of application, it may be suitable as an intermediate language. A tool for architectural design, for example, might translate a more domain-specific notation into our language, allowing analyses that such tools do not currently support (such as automatic generation of sample configurations from style rules, and checking of consistency).\r
+#\r
+Our paper begins by explaining our motivations---the requirements our mechanism is designed to meet. The mechanism is then presented first informally in a series of examples, and then slightly more rigorously feature-by-feature. We discuss related work, especially the schema calculus of Z, and close with a summary of the merits and deficiences of our notation as a whole.\r
+\r
+\section Requirements\r
+\r
+The goal of this work was to find a single structuring mechanism that would support a variety of common specification idioms:\r
+\r
+\point \cdot   _States_: description of complex state as a collection of named components; incremental description both by hierarchy, in which a complex state becomes a component of a larger state, and by extension, in which new components are added; declaration of invariants and definitions of derived components;\r
+\r
+\point \cdot   _Datatypes_: separate description of a library of polymorphic datatypes, such as lists, sequences, trees and orders, along with their operators;\r
+\r
+\point \cdot   _Transitions_: specification of state transitions as operations described implicitly as formulas relating pre- and post-state; composition of operations from previously defined invariants and operations; sequential composition of operations; description of traces as sequences of states;\r
+\r
+\point \cdot   _Abstractions_: description of abstraction relations between state spaces;\r
+\r
+\point \cdot   _Assertions_: expression of properties intended to be redundant, to be checked by analysis, including: relationships amongst invariants; wellformedness of definitions (eg, that an implicit definition is functional); establishment and preservation of invariants by operations; properties of states reachable along finite traces; and simulation relationships between abstract and concrete versions of an operation.\r
+\r
+\noindent We wanted additionally to meet some more general criteria:\r
+\r
+\point \cdot   _Simplicity_. The language as a whole should be exceptionally small and simple.\r
+\r
+\point \cdot   _Flexibility_. Support for the particular idioms of state-machine specification should not be a straitjacket; the language should not dictate how state machines are expressed, and should not make it hard to describe structures that are not state machines (such as security models and architectural styles).\r
+\r
+\point \cdot   _Analyzability_. A fully automatic semantic analysis should be possible. In the present work, this has been achieved by requiring that the modularity mechanism be first order, and expressible in the kernel of the existing language.\r
+\r
+\noindent Finally, our language design decisions have been influenced by some principles that we believe contribute to these goals, make the language easier to use, and analysis tools easier to build:\r
+\r
+\point \cdot   _Explicitness_. The language should be fully explicit, with as few implicit constraints, coercions, etc, as possible.\r
+\r
+\point \cdot   _Minimal mathematics_. The basic theory of sets and relations should suffice; it should not be necessary to introduce domains, fixed points, infinities or special logical values.\r
+\r
+\point \cdot   _Minimal syntax_. There should be very few keywords or special symbols, and no need for special typography or layout.\r
+\r
+\point \cdot   _Uniformity_. A small and general set of constructs should be applied uniformly, independent of context.\r
+\r
+\point \cdot   _Lack of novelty_. Whenever possible, notions and syntax should follow standard usage of conventional mathematics and programming.\r
+\r
+\section Informal Description\r
+\r
+As a running example, we will specify a simple memory system involving a cache and a main memory. The memory has a fixed set of addresses and associates a data value with each address. The cache, in contrast, associates data values with some subset of addresses that varies over time. The cache is updated by a "write-back scheme", which means that updates need not be reflected to main memory immediately. The cache may therefore hold a more current value for an address than the main memory; the two are brought into alignment when the address is flushed from the cache and its value is written to main memory.\r
+\r
+\subsection States\r
+\r
+We start by declaring the existence of addresses and data values:\r
+\r
+\geekmath sig Addr {}\\\r
+sig Data {}\r
+\r
+Each line declares a _signature_, and introduces a set of atoms: _Addr_ for the set of addresses, and _Data_ for the set of data values. Like 'given types' in Z, these sets are disjoint from one another, and their atoms are unstructured and uninterpreted. Signature names can be used as expressions denoting sets, but they are also treated as types, so the expression _Addr+Data_, for example, is ill-typed, since the union operator (+) requires the types of its operands to match.\r
+\r
+The signature declaration\r
+\r
+\geekmath sig Memory {\\\r
+       addrs: set Addr,\\\r
+       map: addrs ->! Data\\\r
+       }\r
+\r
+likewise declares a set of atoms, _Memory_, corresponding to the set of all possible memories. In addition, it declares two fields: _addrs_ and _map_ which associate with a memory a set of addresses and a mapping from addresses to data values respectively. Thus, given a memory _m_, the expression _m.addrs_ will be a set of addresses, _m.map_ will be a relation from addresses to data values. The memory, addresses and data values should be viewed as distinct atoms in their own right; fields don't decompose an atom, but rather relate one atom to others. The exclamation mark in the declaration of the field _map_ is a 'multiplicity marking': it says that _m.map_ associates exactly one data value with each address in the set _m.addrs_. The use of _addrs_ rather than _Addr_ on the left side of the arrow indicates that _m.map_ does not associate a data value with an address that is not in the set _m.addrs_.\r
+\r
+In these expressions, the dot is simply relational image. More precisely, when we say that _m_ is a memory, we mean that the expression _m_ denotes a set consisting of a single atom. The field _addrs_ is a relation from _Memory_ to _Addr_, and _m.addrs_ denotes the image of the singleton set under this relation. So for a set of memories _ms_, the expression _ms.addrs_ will denote the union of the sets of addresses that belong to the individual memories. Given an address _a_, the expression _a.(m.map)_ denotes the set of data values associated with address _a_ in memory _m_, which will either be empty (when the address is not mapped) or a singleton. For convenience, we allow the relational image _s.r_ to be written equivalently as _r_[_s_], where [] binds more loosely than dot, so this expression may be written as _m.map_[_a_] instead.\r
+\r
+Like objects of an object-oriented language, two distinct atoms can have fields of the same value. Unlike objects, however, atoms are immutable. Each field is fixed, and cannot map an atom to one value at one time and another value at another time. To describe an operation that changes the state of a memory, therefore, we will use two distinct atoms in the set _Memory_ to represent the memory's state before and after.\r
+\r
+\subsection Extension\r
+\r
+A signature declaration can introduce a set as a subset of one previously declared, in which case we call it a _subsignature_. In this case, the set does not correspond to a type, but rather its atoms take on the type of the superset. For example, the declaration\r
+\r
+\geekmath sig MainMemory extends Memory {}\r
+\r
+introduces a set of atoms _MainMemory_ representing main memories, which is constrained to be a subset of the set _Memory_. Likewise\r
+\r
+\geekmath sig Cache extends Memory {\\\r
+       dirty: set addrs\\\r
+       }\r
+\r
+introduces a set of atoms _Cache_ representing those memories that can be regarded as caches. It also introduces a field _dirty_ that associates with a cache the set of addresses that is dirty; later, we will use this to represent those addresses for which a cache and main memory differ. Because _Cache_ is a subset of _Memory_, and _m.addrs_ (for any memory _m_) is a subset of _Addr_, the field denotes a relation whose type is from _Memory_ to _Addr_. Expressions such as _m.dirty_ are therefore type-correct for a memory _m_, whether or not _m_ is a cache. But since declaration of the field _dirty_ within the signature _Cache_ constrains _dirty_ to be a relation that maps only caches, _m.dirty_ will always denote the empty set when _m_ is not a cache.\r
+\r
+This approach avoids introducing a notion of subtyping. Subtypes complicate the language, and tend to make it more difficult to use. In OCL [17], which models extension with subtypes rather than subsets, an expression such as _m.dirty_ would be illegal, and would require a coercion of _m_ to the subtype _Cache_. Coercions do not fit smoothly into the relational framework; they interfere with the ability to take the image of a set under a relation, for example.  Moreover, subtypes are generally disjoint, whereas our approach allows the sets denoted by subsignatures to overlap. In this case, we'll add a constraint (in Section 2.4 below) to ensure that _MainMemory_ and _Cache_ are in fact disjoint.\r
+\r
+Declaring _Cache_ and _MainMemory_ as subsignatures of _Memory_ serves to factor out their common properties. Extension can be used for a different purpose, in which a single signature is developed by repeated extensions along a chain. In this case, the supersignatures may not correspond to entities in the domain being modelled, but are simply artifacts of specification---fragments developed along the way. Z specifications are typically developed in this style.\r
+\r
+\subsection Hierarchy\r
+\r
+The signature declaration also supports hierarchical structuring. We can declare a signature for systems each consisting of a cache and a main memory:\r
+\r
+\geekmath sig System {\\\r
+       cache: Cache,\\\r
+       main: MainMemory\\\r
+       }\r
+\r
+Again, _System_ introduces a set of atoms, and each field represents a relation. The omission of the keyword _set_ indicates that a relation is a total function. So for a system _s_, the expression _s.cache_ denotes one cache---that is, a set consisting of a single cache. This is one of very few instances of implicit constraints in our language, which we introduced in order to make declaration syntax conventional.\r
+\r
+Since signatures denote sets of atoms, apparently circular references are allowed. Linked lists, for example, may be modelled like this, exactly as they might be implemented in a language like Java:\r
+\r
+\geekmath sig List {}\\\r
+sig NonEmptyList extends List {elt: Elt, rest: List}\r
+       \r
+There is no recursion here; the field _rest_ is simply a homogeneous relation of type _List_ to _List_, with its domain restricted to the subset _NonEmptyList_.\r
+\r
+\subsection State Properties\r
+\r
+Properties of signature atoms are recorded as logical formulas. To indicate that such a property always holds, we package it as a _fact_. To say that, for any memory system, the addresses in a cache are always addresses within the main memory, we might write:\r
+\r
+\geekmath fact {all s: System | s.cache.addrs in s.main.addrs}\r
+\r
+or, using a shorthand that allows facts about atoms of a signature to be appended to it:\r
+\r
+\geekmath sig System {cache: Cache, main: MainMemory}\\\r
+       {cache.addrs in main.addrs}\r
+\r
+The appended fact is implicitly prefixed by\r
+\r
+\geekmath all this: System | with this |\r
+\r
+in which the _with_ construct, explained in Sectiom 3.6 below, causes the fields implicitly to be dereferences of the atom _this_.\r
+\r
+A fact can constrain atoms of arbitrary signatures; to say that no main memory is a cache we might write:\r
+\r
+\geekmath fact {no (MainMemory & Cache)}\r
+\r
+where _no e_ means that the expression _e_ has no elements, and & is intersection.\r
+\r
+#Again, this is common enough that we provide a shorthand. Declaring a subsignature as _disjoint_ indicates that it shares no atoms with any other subsignatures of the same supersignature. So the fact can be replaced by changing our declaration of _MainMemory_ to:\r
+#\r
+#\geekmath disjoint sig MainMemory extends Memory {}\r
+#\r
+Most descriptions have more interesting facts. We can express the fact that linked lists are acyclic, for example:\r
+\r
+\geekmath fact {no p: List | p in p.\hat @sep rest}\r
+\r
+The expression _\hat @sep rest_ denotes the transitive closure of the relation _rest_, so that _p.^rest_ denotes the set of lists reachable from _p_ by following the field _rest_ once or more. This illustrates a benefit of treating a field as a relation---that we can apply standard relational operators to it---and is also an example of an expression hard to write in a language that treats extension as subtyping (since each application of _rest_ would require its own coercion).\r
+\r
+Often we want to define a property without imposing it as a permanent constraint. In that case, we declare it as a _function_. Here, for example, is the invariant that the cache lines not marked as dirty are consistent with main memory:\r
+\r
+\geekmath fun DirtyInv (s: System) {\\\r
+       all a !: s.cache.dirty | s.cache.map[a] = s.main.map[a]\\\r
+       }\r
+       \r
+(The exclamation mark negates an operator, so the quantification is over all addresses that are _not_ dirty.) Packaging this as a function that can be applied to a particular system, rather than as a fact for all systems, will allow us to express assertions about preservation of the invariant (Section 2.8).\r
+\r
+By default, a function returns a boolean value---the value of the formula in its body. The value of _DirtyInv(s)_ for a system _s_ is therefore true or false. A function may return non-boolean values. We might, for example, define the set of bad addresses to be those for which the cache and main memory differ:\r
+\r
+\geekmath fun BadAddrs (s: System): set Addr {\\\r
+       result = {a: Addr | s.cache.map[a] != s.main.map[a]}\\\r
+       }\r
+\r
+and then write our invariant like this:\r
+\r
+\geekmath fun DirtyInv (s: System) {BadAddrs(s) in s.cache.dirty}\r
+\r
+In this case, _BadAddrs(s)_ denotes a set of addresses, and is short for the expression on the right-hand side of the equality in the definition of the function _BadAddrs_. The use of the function application as an expression does not in fact depend on the function being defined explicitly. Had we written\r
+\r
+\geekmath fun BadAddrs (s: System): set Addr {\\\r
+       all a: Addr | a in result iff s.cache.map[a] != s.main.map[a]\\\r
+       }\r
+       \r
+the application would still be legal; details are explained in Section 3.7.\r
+# \r
+# \geekmath BadAddrs(s) in s.cache.dirty\r
+# \r
+# would be treated as short for \r
+# \r
+# \geekmath all result: set Addr |\\\r
+#      (all a: Addr | a in result iff  s.cache.map[a] != s.main.map[a])\\\r
+#      => result in s.cache.dirty\r
+# \r
+# This desugaring is explained in more detail in Section 99 below.\r
+\r
+\subsection Operations\r
+\r
+Following Z, we can specify operations as formulas that constrain pre- and post-states. An operation may be packaged as a single function (or as two functions if we want to separate pre- and post-conditions in the style of VDM or Larch).\r
+\r
+The action of writing a data value to an address in memory might be specified like this:\r
+\r
+\geekmath fun Write (m,m': Memory, d: Data, a: Addr) {\\\r
+       m'.map = m.map ++ (a->d)\\\r
+       }\r
+\r
+The formula in the body of the function relates _m_, the value of the memory before, to _m'_, the value after. These identifers are just formal arguments, so the choice of names is not significant. Moreover, the prime mark plays no special role akin to decoration in Z---it's a character like any other. The operator ++ is relational override, and the arrow forms a cross product. As mentioned above, scalars are represented as singleton sets, so there is no distinction between a tuple and a relation. The arrows in the expressions _a->d_ here and _addrs->Data_ in the declaration of the _map_ field of _Memory_ are one and the same. \r
+\r
+The action of reading a data value can likewise be specified as a function, although since it has no side-effect we omit the _m'_ parameter:\r
+\r
+\geekmath fun Read (m: Memory, d: Data, a: Addr) {\\\r
+       d = m.map[a]\\\r
+       }\r
+       \r
+Actions on the system as a whole can be specified using these primitive operations; in Z, this idiom is called 'promotion'. A read on the system is equivalent to reading the cache:\r
+\r
+\geekmath fun SystemRead (s: System, d: Data, a: Addr) {\\\r
+       Read (s.cache, d, a)\\\r
+       }\r
+\r
+The _Read_ operation has an implicit precondition. Since the data parameter _d_ is constrained (implicitly by its declaration) to be scalar---that is, a singleton set---the relation _m.map_ must include a mapping for the address parameter _a_, since otherwise the expression _m.map[a]_ will evaluate to the empty set, and the formula will not be satisfiable. This precondition is inherited by _SystemRead_. If the address _a_ is not in the cache, the operation cannot proceed, and it will be necessary first to load the data from main memory. It is convenient to specify this action as a distinct operation:\r
+\r
+\geekmath fun Load (s,s': System, a: Addr) {\\\r
+       a !in s.cache.addrs\\\r
+       s'.cache.map = s.cache.map + (a->s.main.map[a])\\\r
+       s'.main = s.main\\\r
+       }\r
+\r
+The + operator is just set union (in this case, of two binary relations, the second consisting of a single tuple). A write on the system involves a write to the cache, and setting the dirty bit. Again, this can be specified using a primitive memory operation:\r
+\r
+\geekmath fun SystemWrite (s,s': System, d: Data, a: Addr) {\\\r
+       Write (s.cache, s'.cache, d, a)\\\r
+       s'.cache.dirty = s.cache.dirty + a\\\r
+       s'.main = s.main\\\r
+       }\r
+\r
+A cache has much smaller capacity than main memory, so it will occasionally be necessary (prior to loading or writing) to flush lines from the cache back to main memory. We specify flushing as a non-deterministic operation that picks some subset of the cache addrs and writes them back to main memory:\r
+\r
+\geekmath fun Flush (s,s': System) {\\\r
+       some x: set s.cache.addrs {\\\r
+               s'.cache.map = s'.cache.map - (x->Data)\\\r
+               s'.cache.dirty = s.cache.dirty - x\\\r
+               s'.main.map = s.main.map ++ \\\r
+                       {a: x, d: Data | d = s.cache.map[a]}\\\r
+               }\r
+\r
+The - operator is set difference; note that it is applied to sets of addresses (in the third line) and to binary relations (in the second). The comprehension expression creates a relation of pairs _a_->_d_ satisfying the condition.\r
+\r
+Finally, it is often useful to specify the initial conditions of a system. To say that the cache initially has no addresses, we might write a function imposing this condition on a memory system:\r
+\r
+\geekmath fun Init (s: System) {no s.cache.addrs}\r
+\r
+\subsection Traces\r
+\r
+To support analyses of behaviours consisting of sequences of states, we declare two signatures, for ticks of a clock and traces of states:\r
+\r
+\geekmath sig Tick {}\\\r
+sig SystemTrace {\\\r
+       ticks: set Tick,\\\r
+       first, last: ticks,\\\r
+       next: (ticks - last) !->! (ticks - first)\\\r
+       state: ticks ->! System}\\\r
+       {\\\r
+       first.*next = ticks\\\r
+       Init (first.state)\\\r
+       all t: ticks - last | \\\r
+               some s = t.state, s' = t.next.state |\\\r
+                       Flush (s,s')\\\r
+                       || (some a: Addr | Load (s,s',a))\\\r
+                       || (some d: Data, a: Addr | SystemWrite (s,s',d,a))\\\r
+       }\r
+\r
+Each trace consists of a set of _ticks_, a _first_ and _last_ tick, an ordering relation _next_ (whose declaration makes it a bijection from all ticks except the last to all ticks except the first), and a relation _state_ that maps each tick to a system state.\r
+\r
+The fact appended to the signature states first a generic property of traces: that the ticks of a trace are those reachable from the first tick. It then imposes the constraints of the operations on the states in the trace. The initial condition is required to hold in the first state. Any subsequent pair of states is constrained to be related by one of the three side-effecting operations. The existential quantifier plays the role of a _let_ binding, allowing _s_ and _s'_ in place of _t.state_ and _t.next.state_, representing the state for tick _t_ and the state for its successor _t.next_. Note that this formulation precludes stuttering; we could admit it simply by adding the disjunct _s_=_s'_ allowing a transition that corresponds to no operation occurring.\r
+\r
+Bear in mind that this fact is a constraint on all atoms in the set _SystemTrace_. As a free standing fact, the second line of the fact---the initial condition--- would have been written:\r
+\r
+\geekmath fact {all x: SystemTrace | Init ((x.first).(x.state))}\r
+\r
+\subsection Abstraction\r
+\r
+Abstraction relationships are easily expressed using our function syntax. To show that our memory system refines a simple memory without a cache, we define an abstraction function _Alpha_ saying that a system corresponds to a memory that is like the system's memory, overwritten by the entries of the system's cache:\r
+\r
+\geekmath fun Alpha (s: System, m: Memory) {\\\r
+       m.map = s.main.map ++ s.cache.map\\\r
+       }\r
+       \r
+As another example, if our linked list were to represent a set, we might define the set corresponding to a given list as that containing the elements reachable from the start:\r
+\r
+\geekmath fun ListAlpha (p: List, s: set Elt) {\\\r
+       s = p.*rest.elt\\\r
+       }\r
+\r
+\subsection Assertions\r
+\r
+Theorems about a specification are packaged as _assertions_. An assertion is simply a formula that is intended to hold. A tool can check an assertion by searching for a counterexample---that is, a model of the formula's negation.\r
+\r
+The simplest kinds of assertion record consequences of state properties. For example,\r
+\r
+\geekmath assert {\\\r
+       all s: System | DirtyInv (s) && no s.cache.dirty\\\r
+               => s.cache.map in s.main.map\\\r
+       }\r
+\r
+asserts that if the dirtiness invariant holds,and there are no dirty addresses, then the mapping of addresses to data in the cache is a subset of the mapping in the main memory.\r
+\r
+An assertion can express consequences of operations. For example,\r
+\r
+\geekmath assert {\\\r
+       all s: System, d: Data, a: Addr |\\\r
+               SystemRead (s,d,a) => a in s.cache.addrs\\\r
+       }\r
+\r
+embodies the claim made above that _SystemRead_ has an implicit precondition; it asserts that whenever _SystemRead_ occurs for an address, that address must be in the cache beforehand. An assertion can likewise identify a consequence in the post-state; this assertion\r
+\r
+\geekmath assert {\\\r
+       all s,s': System, d: Data, a: Addr |\\\r
+               SystemWrite (s,s',d,a) => s'.cache.map[a] = d\\\r
+       }\r
+       \r
+says that after a _SystemWrite_, the data value appears in the cache at the given address. \r
+\r
+Preservation of an invariant by an operation is easily recorded as an assertion. To check that our dirtiness invariant is preserved when writes occur, we would assert\r
+\r
+\geekmath assert {\\\r
+       all s,s': System, d: Data, a: Addr |\\\r
+               SystemWrite (s,s',d,a) && DirtyInv (s) => DirtyInv (s')\\\r
+       }\r
+\r
+Invariant preservation is not the only consequence of an operation that we would like to check that relates pre- and post-states. We might, for example, want to check that operations on the memory system do not change the set of addresses of the main memory. For the _Flush_ operation, for example, the assertion would be\r
+\r
+\geekmath assert {\\\r
+       all s,s': System | Flush(s,s') => s.main.addrs = s'.main.addrs\\\r
+       }\r
+       \r
+which holds only because the cache addresses are guaranteed to be a subset of the main memory addresses (by the fact associated with the _System_ signature).\r
+\r
+The effect of a sequence of operations can be expressed by quantifying appropriately over states. For example, \r
+\r
+\geekmath assert {\\\r
+       all s, s': System, a: Addr, d,d': Data | \\\r
+               SystemWrite (s,s',d,a) && SystemRead (s',d',a) => d = d'\\\r
+       }\r
+\r
+says that when a write is followed by a read of the same address, the read returns the data value just written.\r
+\r
+To check that a property holds for all reachable states, we can assert that the property is an invariant of every operation, and is established by the initial condition. This strategy can be shown (by induction) to be sound, but it is not complete. A property may hold for all reachable states, but may not be preserved because an operation breaks the property when executed in a state that happens not to be reachable.\r
+\r
+Traces overcome this incompleteness. Suppose, for example, that we want to check the (rather contrived) property that, in every reachable state, if the cache contains an address that isn't dirty, then it agrees with the main memory on at least one address:\r
+\r
+\geekmath fun DirtyProp (s: System) {\\\r
+       some (s.cache.addrs - s.cache.dirty)\\\r
+               => some a: Addr | s.cache.map[a] = s.main.map[a]\\\r
+       }\r
+\r
+We can assert that this property holds in the last state of every trace:\r
+\r
+\geekmath assert {\\\r
+       all t: SystemTrace | with t | DirtyProp (last.state)\\\r
+       }\r
+       \r
+This assertion is valid, even though _DirtyProp_ is not an invariant. A write invoked in a state in which all clean entries but one had non-matching values can result in a state in which there are still clean entries but none has a matching value.\r
+\r
+Finally, refinements are checked by assertions involving abstraction relations. We can assert that a _SystemWrite_ refines a basic _Write_ operation on a simple memory:\r
+\r
+\geekmath assert {\\\r
+       all s,s': System, m,m': Memory, a: Addr, d: Data |\\\r
+               Alpha (s,m) && Alpha (s',m') && SystemWrite (s,s',a,d)\\\r
+               => Write (m,m',a,d)\\\r
+       }\r
+\r
+or that the _Flush_ operation is a no-op when viewed abstractly:\r
+\r
+\geekmath assert {\\\r
+       all s,s': System, m,m': Memory |\\\r
+               Alpha (s,m) && Alpha (s',m') && Flush (s,s')\\\r
+               => m.map = m'.map\\\r
+       }\r
+\r
+Note the form of the equality; _m = m'_ would be wrong, since two distinct memories may have the same mapping, and the abstraction _Alpha_ constrains only the mapping and not the memory atom itself.\r
+\r
+Many of the assertions shown here can be made more succinct by the function shorthand explained in Section 3.7 below. For example, the assertion that a read following a write returns the value just written becomes:\r
+\r
+\geekmath assert {\\\r
+       all s: System, a: Addr, d: Data | \\\r
+               SystemRead (SystemWrite (s,d,a),a) = d\\\r
+       }\r
+\r
+and the assertion that _Flush_ is a no-op becomes:\r
+\r
+\geekmath assert {\\\r
+       all s: System | Alpha (s).map = Alpha (Flush (s)).map\\\r
+       }\r
+\r
+\subsection Polymorphism\r
+\r
+Signatures can be parameterized by signature types. Rather than declaring a linked list whose elements belong to a particular type _Elt_, as above, we would prefer to declare a generic list:\r
+\r
+\geekmath sig List [T] {}\\\r
+sig NonEmptyList [T] extends List [T] {elt: T, rest: List [T]}\r
+\r
+Functions and facts may be parameterized in the same way, so we can define generic operators, such as:\r
+\r
+\geekmath fun first [T] (p: List [T]): T {result = p.elt}\\\r
+fun last [T] (p: List [T]): T {some q: p.*rest | result = q.elt && no q.rest}\\\r
+fun elements [T] (p: List [T]): set T {result = p.*rest.elt}\r
+\r
+In addition, let's define a generic function that determines whether two elements follow one another in a list:\r
+\r
+\geekmath fun follows [T] (p: List[T], a,b: T) {\\\r
+       some x: p.*rest | x.elt = a && x.next.elt = b\\\r
+       }\r
+\r
+To see how a generic signature and operators are used, consider replacing the traces of Section 2.6 with lists of system states. Define a function that determines whether a list is a trace:\r
+\r
+\geekmath fun isTrace (t: List [System]) {\\\r
+       Init (first(t))\\\r
+       all s, s': System | follows (t,s,s') => {\\\r
+               Flush (s,s')\\\r
+               || (some a: Addr | Load (s,s',a))\\\r
+               || (some d: Data, a: Addr | SystemWrite (s,s',d,a))\\\r
+               }\\\r
+       }\r
+\r
+Now our assertion that every reachable system state satisfies _DirtyProp_ can now be written:\r
+\r
+\geekmath assert {\\\r
+       all t: List[System] | isTrace(t) => DirtyProp (last(t))\\\r
+       }\r
+\r
+\subsection    Variants\r
+\r
+To illustrate the flexibility of our notation, we sketch a different formulation of state machines oriented around transitions rather than states.\r
+\r
+Let's introduce a signature representing state transitions of our memory system:\r
+\r
+\geekmath sig SystemTrans {pre,post: System}\\\r
+       {pre.main.addrs = post.main.addrs}\r
+\r
+Declaring the transitions as a signature gives us the opportunity to record properties of all transitions---in this case requiring that the set of addresses of the main memory is fixed.\r
+\r
+Now we introduce a subsignature for the transitions of each operation. For example, the transitions that correspond to load actions are given by:\r
+\r
+\geekmath sig LoadTrans extends SystemTrans {a: Addr}\\\r
+       {Load (pre, post, a)}\r
+#      } {\r
+#      a !in pre.cache.addrs\\\r
+#      post.cache.map = pre.cache.map ++ (a->pre.main.map[a])\\\r
+#      post.main = pre.main\\\r
+#      }\r
+# \r
+# The formula here is actually identical to the one declared above, but with _pre_ and _post_ for # _s_ and _s'_ ; we could in fact replace it by the function application _Load(pre,post,a)_.\r
+\r
+For each invariant, we define a set of states. For the states satisfying the dirty invariant, we might declare\r
+\r
+\geekmath sig DirtyInvStates extends System {}\r
+\r
+along with the fact\r
+\r
+\geekmath fact {DirtyInvStates = {s: System | DirtyInv(s)}}\r
+\r
+To express invariant preservation, it will be handy to declare a function that gives the image of a set of states under a set of transitions:\r
+\r
+\geekmath fun postimage (ss: set System, tt: set SystemTrans): set System {\\\r
+       result = {s: System | some t: tt | t.pre in ss && s = t.post}\\\r
+       }\r
+\r
+so that we can write the assertion like this:\r
+\r
+\geekmath assert {postimage (DirtyInvStates, LoadTrans) in DirtyInvStates}\r
+\r
+For an even more direct formulation of state machine properties, wemight have defined a  transition relation instead:\r
+\r
+\geekmath fun Trans (r: System -> System) {\\\r
+       all s, s' : System | \\\r
+               s->s' in r => Flush (s,s') || ...\\\r
+               }\r
+\r
+Then, using transitive closure, we can express the set of states reachable from an initial state, and assert that this set belongs to the set characterized by some property:\r
+\r
+\geekmath assert {all r: System -> System, s: System |\\\r
+       Init (s) && Trans(r) => s.*r in DirtyPropStates\\\r
+       }\r
+\r
+where _DirtyPropStates_ is defined analogously to _DirtyInvStates_.\r
+\r
+\subsection    Definitions\r
+\r
+Instead of declaring the addresses of a memory along with its mapping, as we did before:\r
+\r
+\geekmath sig Memory {\\\r
+       addrs: set Addr,\\\r
+       map: addrs ->! Data\\\r
+       }\r
+\r
+we could instead have declared the mapping alone:\r
+\r
+\geekmath sig Memory {\\\r
+       map: Addr ->? Data\\\r
+       }\r
+\r
+and then _defined_ the addresses using a subsignature:\r
+\r
+\geekmath sig MemoryWithAddrs extends Memory {\\\r
+       addrs: set Addr}\\\r
+       {addrs = {a: Addr | some a.map}}\r
+       \r
+Now by making the subsignature subsume all memories:\r
+\r
+\geekmath fact {Memory in MemoryWithAddrs}\r
+\r
+we have essentially 'retrofitted' the field. Any formula involving memory atoms now implicitly constrains the _addrs_ field. For example, we can assert that _Read_ has an implicit precondition requiring that the argument be a valid address:\r
+\r
+\geekmath assert {all m: Memory, a: Addr, d: Data | Read (m,d,a) => a in m.addrs}\r
+\r
+even though the specification of _Read_ was written when the field _addrs_ did not even exist.\r
+\r
+\section Semantics\r
+\r
+For completeness, we give an overview of the semantics of the language. The novelties with respect to the original version of Alloy [4] are (1) the idea of organizing relations around basic types as signatures, (2) the treatment of extension as subsetting, and (3) the packaging of formulas in a more explicit (and conventional) style. The semantic basis has been made cleaner, by generalizing relations to arbitrary arity, eliminating 'indexed relations' and the need for a special treatment of sets.\r
+\r
+\subsection Types\r
+\r
+We assume a universe of atoms. The standard notion of a mathematical relation gives us our only composite datatype. The value of an expression will always be a relation---that is, a collection of tuples of atoms. Relations are first order: the elements of a tuple are themselves atoms and never relations.\r
+\r
+The language is strongly typed. We partition the universe into subsets each associated with a _basic_ type, and write (T_1, T_2, ..., T_n) for the type of a relation whose tuples each consist of _n_ atoms, with types T_1, T_2, etc.\r
+\r
+A set is represented semantically as a unary relation, namely a relation whose tuples each contain one atom. A tuple is represented as a singleton relation, namely a relation containing exactly one tuple. A scalar is represented as a unary, singleton relation. We use the terms 'set', 'tuple' and 'scalar' to describe relations with the appropriate properties. Basic types are used only to construct relation types, and every expression that appears in a specification has a relational type. Often we will say informally that an expression has a type _T_ where _T_ is the name of a basic type when more precisely we mean that the expression has the type (_T_).\r
+\r
+So, in contrast to traditional mathematical style, we do not make distinctions amongst the atom _a_, the tuple (_a_), the set {_a_} containing just the atom, or the set {(_a_)} containing the tuple, and represent all of these as the last. This simplifies the semantics and gives a more succinct and uniform syntax.\r
+# Because the language is first order (and has no sets of sets, for example), it requires no coercions, and seems not to cause confusion even for novice specifiers.\r
+\r
+\subsection Expression Operators\r
+\r
+Expressions can be formed using the standard set operators written as ASCII characters: union (+), intersection (&) and difference (-). Some standard relational operators, such as transpose (~) and transitive closure (^), can be applied to expressions that denote binary relations. Relational override (++) has its standard meaning for binary relations but can applied more broadly.\r
+#The type rules and semantics are completely standard. For example, if _e_ has the type (S,T), then ~_e_ has the type (T,S) and denotes the collection of pairs obtained by reversing each pair in _e_; if _p_ and _q_ both have the type (T_1, T_2, ..., T_n), then the union _p+q_, intersection _p_&_q_, and difference _p-q_ also have that type, and denote respectively the relations whose tuples are those that appear in either of _p_ and _q_, both of _p_ and _q_, and _p_ but not _q_.\r
+\r
+There are two special relational operators, dot and arrow. The dot operator is a generalized relational composition. Given expressions $p$ and $q$, the expression $p.q$ contains the tuple\r
+$\angleleft\sep  p\sub<1>, ... p\sub<m-1>, q\sub<2>, ..., q\sub<n>\angleright$\r
+when _p_ contains \r
+@math \langle@sep p_1, ..., p_{m}\rangle,\r
+_q_ contains\r
+@math \langle@sep q_1, ... q_n\rangle,\r
+and\r
+@math p_m = q_1. The last type of _p_ and the first type of _q_ must match, and _m_ + _n_, the sum of the arities of _p_ and _q_, must be three or more so that the result is not degenerate. When _p_ is a set and _q_ is a binary relation, the composition _p.q_ is the standard relational image of _p_ under _q_; when _p_ and _q_ are both binary relations, _p.q_ is standard relational composition. In all of the examples above, the dot operator is used only for relational image.\r
+\r
+The arrow operator is cross product: _p \textarrow q_ is the relation containing the tuple\r
+@math \langle@sep p_1, ..., p_{m}, q_1, ... q_n\rangle\r
+when _p_ contains \r
+@math \langle@sep p_1, ..., p_{m}\rangle,\r
+and _q_ contains\r
+@math \langle@sep q_1, ... q_n\rangle.\r
+In all the examples in this paper, _p_ and _q_ are sets, and _p \textarrow q_ is their standard cross product.\r
+\r
+\subsection Formula Operators\r
+\r
+Elementary formulas are formed from the subset operator, written _in_. Thus _p in q_ is true when every tuple in _p_ is in _q_. The formula _p : q_ has the same meaning, but when _q_ is a set, adds an implicit constraint that _p_ be scalar (ie, a singleton). This constraint is overridden by writing _p: option q_ (which lets _p_ to be empty or a scalar) or _p: set q_ (which eliminates the constraint entirely). Equality is just standard set equality, and is short for a subset constraint in each direction.\r
+\r
+An arrow that appears as the outermost expression operator on the right-hand side of a subset formula can be annotated with _multiplicity markings_: + (one or more), ? (zero or one) and ! (exactly one). The formula\r
+\r
+\geekmath r: S m \textarrow n T\r
+\r
+where _m_ and _n_ are multiplicity markings constrains the relation _r_ to map each atom of _S_ to _n_ atoms of _T_, and to map _m_ atoms of _S_ to each atom of _T_. _S_ and _T_ may themselves be product expressions, but are usually variables denoting sets. For example,\r
+\r
+\geekmath r: S \textarrow ! T\\\r
+r: S ? \textarrow ! T\r
+\r
+make _r_ respectively a total function on _S_ and an injection.\r
+\r
+Larger formulas are obtained using the standard logical connectives: && (and), || (or), ! (not), => (implies), _iff_ (bi-implication). The formula _if b then f else g_ is short for _b_ => _f_ && !_b_ => _g_. Within curly braces, consecutive formulas are implicitly conjoined.\r
+\r
+Quantifications take their usual form:\r
+\r
+\geekmath all x: e | F\r
+\r
+is true when the formula _F_ holds under every binding of the variable _x_ to a member of the set _e_.  In addition to the standard quantifiers,  _all_ (universal) and _some_ (existential), we have _no_, _sole_ and _one_ meaning respectively that there are no values, at most one value, and exactly one value satisfying the formula. For a quantifier _Q_ and expression _e_, the formula _Q e_ is short for _Q x: T | e_ (where _T_ is the type of _e_), so _no e_, for example, says that _e_ is empty.\r
+\r
+The declaration of a quantified formula is itself a formula---an elementary formula in which the left-hand side is a variable. Thus\r
+\r
+\geekmath some x = e | F\r
+\r
+is permitted, and is a useful way to express a _let_ binding. Quantifiers may be higher-order; the formula\r
+\r
+\geekmath all f: s ->! t | F\r
+\r
+is true when _F_ holds for every binding of a total function from _s_ to _t_ to the variable _f_. Our analysis tool cannot currently handle higher-order quantifiers, but many uses of higher-order quantifiers that arise in practice can be eliminated by skolemization.\r
+\r
+Finally, we have relational comprehensions; the expression\r
+\r
+\geekmath {x_1: e_1, x_2: e_2, ... | F}\r
+\r
+constructs a relation of tuples with elements _x_1_, _x_2_, etc., drawn from set expressions _e_1_, _e_2_, etc., whose values satisfy _F_.\r
+\r
+# \subsection Choice of Operator Symbols\r
+# \r
+# The choice of symbols, especially the arrow, may seem unconventional, but results in familiar-# looking formulas. The dot operator generalizes the 'navigation expressions' of Syntropy#  [CD94], now adopted by UML's Object Constraint Language [17], and is intended to be fa# miliar to programmers by resembling object dereferencing. Thus, _x.f_ can be viewed as dere# ferencing the object _x_ with field _f_ when _x_ is a scalar and _f_ is a binary relation. The cho# ice of relational composition rather than function application allows such an expression to be wr# itten without concern for whether _f_ is a function. It also gives a simple and workable treatmen# t of partiality. When _x_ is not in the domain of _f_, _x.f_ is the empty set, and _x.f = y_ will be#  false if _y_ is a scalar.\r
+# \r
+# The arrow notation is designed to allow declarations to be written in a familiar way, but to be # given a simple, first-order interpretation. For example, if _S_ and _T_ denote sets,\r
+# \r
+# \geekmath f: S \textarrow T\r
+# \r
+# declares _f_ to be a binary relation from _S_ to _T_. A conventional interpretation would have # the arrow construct a set of relations---a higher-order notion. Instead, we interpret the arrow # as cross product and the colon as subset, with the same result. The choice of arrow is also # convenient for constructing tuples; when _x_ and _y_ are scalars, the formula# \r
+# \r
+# \geekmath r' = r + (x \textarrow y)\r
+# \r
+# makes _r'_ the relation containing the tuples of _r_, and additionally, a mapping from _x_ to # _y_. # \r
+\subsection Signatures\r
+\r
+A _signature_ declaration introduces a basic type, along with a collection of relations called _fields_. The declaration\r
+\r
+\geekmath sig S {f: E}\r
+\r
+declares a basic type _S_, and a relation _f_. If _E_ has the type (T_1, T_2, ..., T_n), the relation _f_ will have the type (S, T_1, T_2, ..., T_n), and if _x_ has the type _S_, the expression _x.f_ will have the same type as _E_. When there are several fields, field names already declared may appear in expressions on the right-hand side of declarations; in this case, a field _f_ is typed as if it were the expression _this.f_, where _this_ denotes an atom of the signature type (see Section 3.6).\r
+\r
+The meaning of a specification consisting of a collection of signature declarations is an assignment of values to global constants-- the signatures and the fields. For example, the specification\r
+\r
+\geekmath sig Addr {}\\\r
+sig Data {}\\\r
+sig Memory {map: Addr -> Data}\r
+\r
+has 4 constants---the three signatures and one field---with assignments such as:\r
+\r
+\geekmath Addr = {a0, a1}\\\r
+Data = {d0, d1, d2}\\\r
+Memory = {m0, m1}\\\r
+map = {(m0,a0,d0), (m1,a0,d1), (m1,a0,d2)}\r
+\r
+corresponding to a world in which there are 2 addresses, 3 data values and 2 memories, with the first memory (_m0_) mapping the first address (_a0_) to the first data value (_d0_), and the second memory (_m1_) mapping the first address (_a0_) both to the second (_d1_) and third (_d2_) data values.\r
+\r
+A fact is a formula that constrains the constants of the specification, and therefore tends to reduce the set of assignments denoted by the specification. For example,\r
+\r
+\geekmath fact {all m: Memory | all a: Addr | sole m.map[a]}\r
+\r
+rules out the above assignment, since it does not permit a memory (such as _m1_) to map an address (such as _a0_) to more than one data value. \r
+\r
+The meaning of a function is a set of assignments, like the meaning of the specification as a whole, but these include bindings to parameters. For example, the function\r
+\r
+\geekmath fun Read (m: Memory, d: Data, a: Addr) {\\\r
+       d = m.map[a]\\\r
+       }\r
+\r
+has assignments such as:\r
+\r
+\geekmath Addr = {a0, a1}\\\r
+Data = {d0, d1, d2}\\\r
+Memory = {m0, m1}\\\r
+map = {(m0,a0,d1)}\\\r
+m = {m0}\\\r
+d = {d1}\\\r
+a = {a0}\r
+\r
+The assignments of a function representing a state invariant correspond to states satisfying the invariant; the functions of a function representing an operation (such as _Read_) correspond to executions of the operation.\r
+\r
+An assertion is a formula that is claimed to be _valid_: that is, true for every assignment that satisfies the facts of the specification. To check an assertion, one can search for a _counterexample_: an assignment that makes the formula false.\r
+For example, the assertion\r
+\r
+\geekmath assert {\\\r
+       all m,m': Memory, d: Data, a: Addr | Read (m,d,a) => Read (m',d,a)}\r
+\r
+which claims, implausibly, that if a read of memory _m_ returns _d_ at _a_, then so does a read at memory _m'_, has the counterexample\r
+\r
+\geekmath Addr = {a0}\\\r
+Data = {d0,d1}\\\r
+Memory = {m0, m1}\\\r
+map = {(m0,a0,d0), (m1,a0,d1)}\r
+\r
+To find a counterexample, a tool should negate the formula and then skolemize away the bound variables, treating them like the parameters of a function, with values to be determined as part of the assignment. In this case, the assignment might include:\r
+\r
+\geekmath m = {m0}\\\r
+m' = {m1}\\\r
+d = {d0}\\\r
+a = {a0}\r
+\r
+\subsection Extension\r
+\r
+Not every signature declaration introduces a new basic type. A signature declared without an extension clause is a _type signature_, and creates both a basic type and a set constant of the same name. A signature _S_ declared as an extension is a _subsignature_, and creates only a set constant, along with a constraint making it a subset of each _supersignature_ listed in the extension clause. The subsignature takes on the type of the supersignatures, so if there is more than one, they must therefore have the same type, by being direct or indirect subsignatures of the same type signature.\r
+\r
+A field declared in a subsignature is as if declared in the corresponding type signature, with the constraint that the domain of the field is the subsignature. For example,\r
+\r
+\geekmath sig List {}\\\r
+sig NonEmptyList extends List {elt: Elt,rest: List}\r
+\r
+makes _List_ a type signature, and _NonEmptyList_ a subset of _List_. The fields _elt_ and _rest_ map atoms from the type _List_, but are constrained to have domain _NonEmptyList_. Semantically, it would have been equivalent to declare them as fields of _List_, along with facts constraining their domains:\r
+\r
+\geekmath sig List {elt: Elt,rest: List}\\\r
+sig NonEmptyList extends List {}\\\r
+fact {elt.Elt in NonEmptyList}\\\r
+fact {rest.List in NonEmptyList}\r
+\r
+(exploiting our dot notation to write the domain of a relation _r_ from _S_ to _T_ as _r.T_).\r
+\r
+\subsection Overloading and Implicit Prefixing\r
+\r
+Whenever a variable is declared, its type can be easily obtained from its declaration (from the type of the expression on the right-hand side of the declaration), and every variable appearing in an expression is declared in an enclosing scope. The one complication to this rule is the typing of fields.\r
+\r
+For modularity, a signature creates a local namespace. Two fields with the name _f_ appearing in different signatures do not denote the same relational constant. Interpreting an expression therefore depends on first resolving any field names that appear in it. \r
+#We have devised a simple resolution scheme whose details are beyond the scope of this paper.\r
+In an expression of the form _e.f_, the signature to which _f_ belongs is determined according to the type of _e_. To keep the scheme simple, we require that sometimes the specifier resolve the overloading explicitly by writing the field _f_ of signature _S_ as _S$f_. (At the end of the previous section, for example, the reference in the fact to _rest_ should actually be to _List$rest_, since the context does not indicate which signature _rest_ belongs to.)\r
+\r
+In many formulas, a single expression is dereferenced several times with different fields. A couple of language features are designed to allow these formulas to be written more succinctly, and, if used with care, more comprehensibly.  First, we provide two syntactic variants of the dot operator. Both _p_::_q_ and _q_[_p_] are equivalent to _p.q_, but have different precedence: the double colon binds more tightly than the dot, and the square brackets bind more loosely than the dot. Second, we provide a _with_ construct similar to Pascal's that makes dereferencing implicit.\r
+\r
+Consider, for example, the following simplified signature for a trace:\r
+\r
+\geekmath sig Trace {\\\r
+       ticks: set Tick,\\\r
+       first: Tick,\\\r
+       next: Tick -> Tick,\\\r
+       state: Tick -> State\\\r
+       }\r
+\r
+Each trace _t_ has a set of ticks _t.ticks_, a first tick _t.first_, an ordering _t.next_ that maps ticks to ticks, and a relation _t.state_ mapping each tick to a state. For a trace _t_ and tick _k_, the state is _k_.(_t.state_); the square brackets allow this expression to be written instead as _t.state_[_k_]. To constrain _t.ticks_ to be those reachable from _t. first_ we might write:\r
+\r
+\geekmath fact {all t: Trace | (t.first).*(t.next ) = t.ticks}\r
+\r
+Relying on the tighter binding of the double colon, we can eliminate the parentheses:\r
+\r
+\geekmath fact {all t: Trace | t::first.*t::next = t.ticks}\r
+\r
+Using _with_, we can make the _t_ prefixes implicit:\r
+\r
+\geekmath fact {all t: Trace | with t | first.*next = ticks}\r
+\r
+In general, _with e | F_ is like _F_, but with _e_ prefixed wherever appropriate to a field name. Appropriateness is determined by type: _e_ is matched to any field name with which it can be composed using the dot operator.\r
+#Fields that are prefixed using a double colon operator are not automatically prefixed, so one can use _with_ to prefix some fields of a given signature but not others. There is a corresponding _with_ construct for expressions also, so that _with e | E_ is  like the expression _E_, with _e_ prefixed as appropriate.\r
+A fact attached to a signature _S_ is implicitly enclosed by _all this: S | with this |_, and the declarations of a signature are interpreted as constraints as if they had been declared within this scope. Consequently, the declaration of _first_ above should be interpreted as if it were the formula:\r
+\r
+\geekmath all this: Trace | with this | first: ticks\r
+\r
+which is equivalent to\r
+\r
+\geekmath all this: Trace | this.first: this.ticks\r
+\r
+and should be typed accordingly.\r
+# \r
+# So, in the following fuller version of the above signature:\r
+# \r
+# \geekmath sig Trace {\\\r
+#      ticks: set Tick\\\r
+#      first: ticks,\\\r
+#      next: (ticks - first) ->? ticks\\\r
+#      state: ticks ->! State\\\r
+#      } {first.*next = ticks}\r
+# \r
+# the declaration of the field _first_, for example, includes the constraint\r
+# \r
+# \geekmath all this: Trace | with this | first: ticks\r
+# \r
+# which is equivalent to\r
+# \r
+# \geekmath all this: Trace | this.first: this.ticks\r
+\r
+\subsection Function Applications\r
+\r
+A function may be applied by binding its parameters to expressions. The resulting application may be either an expression or a formula, but in both cases the function body is treated as a formula. The formula case is simple: the application is simply short for the body with the formal parameters replaced by the actual expressions (and bound variables renamed where necessary to avoid clashes).\r
+\r
+The expression case is more interesting. The application is treated as a syntactic sugar. Suppose we have a function application expression, _e_ say, of the form\r
+\r
+\geekmath f(a_1, a_2, ..., a_n)\r
+\r
+that appears in an elementary formula _F_. The declaration of the function _f_ must list _n_ + 1 formal arguments, of which the _second_ will be treated as the result. The entire elementary formula is taken to be short for\r
+\r
+\geekmath all result: D | f (a_1, result, a_2, ..., a_n) => F [result/e]\r
+\r
+where _D_ is the right-hand side of the declaration of the missing argument, and _F_ [_result_/_e_] is _F_ with the fresh variable _result_ substituted for the application expression _e_. The application of _f_ in this elaborated formula is now a formula, and is treated simply as an inlining of the formula of _f_.\r
+\r
+#Type checking will thus require that the actual arguments match the formals that are listed first, third, fourth, fifth, etc. (This choice of the second argument, incidentally, is one concession we make to specifying state machines; function applications can be used to model operation invocations in which it is convenient to declare the pre- and post- states as the first and second arguments of the operation.)\r
+#\r
+To see how this works, consider the definition of a function _dom_ that gives the domain of a relation over signature _X_:\r
+\r
+\geekmath fun dom (r: X -> X, d: set X) {d = r.X}\r
+\r
+(We have defined the function monomorphically for a homogeneous relation. In practice, one would define a polymorphic function, but we want to avoid conflating two unrelated issues.) Here is a trivial assertion that applies the function as an expression:\r
+\r
+\geekmath assert {all p: X \textarrow X | (dom (p)).p in X}\r
+\r
+Desugaring the formula, we get\r
+\r
+\geekmath all p: X \textarrow X | all result: set X | dom (p, result) => result.p in X\r
+\r
+and then inlining\r
+\r
+\geekmath all p: X \textarrow X | all result: set X | result = p.X => result.p in X\r
+\r
+This formula can be reduced (by applying a universal form of the One Point Rule) to\r
+\r
+\geekmath all p: X \textarrow X | (p.X).p in X\r
+\r
+which is exactly what would have been obtained had we just replaced the application expression by the expression on the right-hand side of the equality in the function's definition!\r
+#\r
+# If there is more than one application expression in an elementary formula, a fresh quantification is # generated for each. For example,# \r
+# \r
+# \geekmath assert {all p, q: X \textarrow X | dom (p.q) in dom (p)}\r
+# \r
+# becomes\r
+# \r
+# \geekmath all p,q: X \textarrow X | all result1, result2: set X | \\\r
+#              dom (p.q, result1) => dom (p, result2) => result1 in result2\r
+# \r
+# which can again be reduced by inlining and the One Point Rule to \r
+# \r
+# \geekmath all p,q: X \textarrow X | (p.q).X in p.X\r
+\r
+Now let's consider an implicit definition. Suppose we have a signature _X_ with an ordering _lte_, so that _e.lte_ is the set of elements that _e_ is less than or equal to, and a function _min_ that gives the minimum of a set, defined implicitly as the element that is a member of the set, and less than or equal to all members of the set:\r
+\r
+\geekmath sig X {lte: set X}\\\r
+fun min (s: set X, m: option X) {\\\r
+       m in s && s in m.lte\\\r
+       }\r
+\r
+Because the set may be empty, _min_ is partial. Depending on the properties of _lte_ it may also fail to be deterministic. A formula that applies this function\r
+\r
+\geekmath assert {all s: set X | min (s) in s}\r
+\r
+can as before be desugared\r
+\r
+\geekmath all s: set X | all result: option X | min (s, result) => result in s\r
+\r
+and expanded by inlining\r
+\r
+\geekmath all s: set X | all result: option X |\\\r
+       (result in s) && s in result.lte => result in s\r
+\r
+but in this case the One Point Rule is not applicable.\r
+\r
+As a convenience, our language allows the result argument of a function to be declared anonymously in a special position, and given the name _result_. The domain function, for example, can be defined as:\r
+\r
+\geekmath fun dom (r: X -> X): set X {result = r.X}\r
+\r
+How the function is defined has no bearing on how it is used; this definition is entirely equivalent to the one above, and can also be applied as a formula with two arguments.\r
+\r
+\subsection Polymorphism\r
+\r
+Polymorphism is treated as a syntactic shorthand. Lack of space does not permit a full discussion here.\r
+\r
+\section Related Work\r
+\r
+We have shown how a handful of elements can be assembled into a rather simple but flexible notation. The elements themselves are far from novel---indeed, we hope that their familiarity will make the notation easy to learn and use---but their assembly into a coherent whole results in a language rather different from existing specification languages.\r
+\r
+\subsection New Aspects\r
+\r
+The more novel aspects of our work are:\r
+\r
+\point \cdot   _Objectification of state_. Most specification languages represent states as cartesian products of components; in our approach, a state, like a member of any signature, is an individual---a distinct atom with identity. A similar idea is used in the situation calculus [11], whose 'relational fluents' add a situation variable to each time-varying relation. The general idea of objectifying all values is of course the foundation of object-oriented programming languages, and was present in LISP. Interestingly, object-oriented variants of Z (such as [1]) do not objectify schemas. The idea of representing structures in first-order style as atoms is present also in algebraic specifications such as Larch [2], which treat even sets and relations in this manner.\r
+\r
+\point \cdot   _Components as relations_. Interpreting fields of a structure as functions goes back to early work on verification, and is widely used (for example, by Leino and Nelson [10]). We are not aware, however, of specification languages that use this idea, or that flatten fields to relations over atoms.\r
+\r
+\point \cdot   _Extension by global axioms_. The 'facts' of our notation allow the properties of a signature to be extended monotonically. The idea of writing axioms that constrain the members of a set constant declared globally is hardly remarkable, but it appears not to have been widely exploited in specification languages.\r
+\r
+\point \cdot   _Extension by subset_. Treating the extension of a structure as a refinement modelled by subset results in a simple semantics, and melds well with the use of global axioms. Again, this seems to be an unremarkable idea, but one whose power has not been fully recognized.\r
+\r
+\subsection Old Aspects\r
+\r
+The aspects of our work that are directly taken from existing languages are:\r
+\r
+\point \cdot   _Formulas_. The idea of treating invariants, definitions, operations, etc, uniformly as logical formulas is due to Z [14].\r
+\r
+\point \cdot   _Assertions_. Larch [2] provides a variety of constructs for adding intentional redundancy to a specification in order to provide error-detection opportunities. \r
+\r
+\point \cdot   _Parameterized formulas_. The 'functional' style we have adopted, in which all formulas are explicitly parameterized, in contrast to the style of most specification languages, is used also by languages for theorem provers, such as PVS [13]. VDM [8] offers a mechanism called 'operation quotation' in which pre- and post conditions are reused by interpreting them as functions similar to ours.\r
+\r
+\point \cdot   _Parametric Polymorphism_. The idea of parameterizing descriptions by types was developed in the programming languages community, most notably in the context of ML [12].\r
+\r
+\point \cdot   _Implicit Prefixing_. Our 'with' operator is taken from Pascal [9].\r
+\r
+\point \cdot   _Relational operators_. The dot operator, and the treament of scalars as singletons, comes from the earlier version of Alloy [4].\r
+#\r
+#\point \cdot  _Function shorthands_. The idea of desugaring function applications by quantifying over the result is present in Beth's extensionality theorem [Beth].\r
+\r
+\subsection Z's Schema Calculus\r
+\r
+Z has been a strong influence on our work; indeed, this paper may be viewed as an attempt to achieve some of the power and flexibility of Z's schema calculus in a first-order setting. Readers unfamiliar with Z can find an excellent presentation of the schema calculus in [16]. The current definitive reference is [15], although Spivey's manual [14] is more accessible for practioners.\r
+\r
+A _schema_ consists of a collection of variable declarations and a formula constraining the variables. Schemas can be anonymous. When a name has been bound to a schema, it can be used in three different ways, distinguished according to context. First, it can be used as a _declaration_, in which case it introduces its variables into the local scope, constraining them with its formula. Second, where the variables are already in scope, it can be used as a _predicate_, in which case the formula applies and no new declarations are added. Both of these uses are syntactic; the schema can be viewed as a macro.\r
+\r
+In the third use, the schema is semantic. Its name represents a set of _bindings_, each binding being a finite function from variables names to values. The bindings denoted by the schema name are the models of the schema's formula: those bindings of variable names to values that make the formula true.\r
+\r
+How a schema is being applied is not always obvious; in the set comprehension {_S_}, for example, _S_ represents a declaration, so that the expression as a whole denotes the same set of bindings as _S_ itself. Given a binding _b_ for a schema with component variable _x_, the expression _b.x_ denotes the value assigned to _x_ in _b_. Unlike Alloy's dot, this dot is a function application, so for a set of bindings _B_, the expression _B.x_ is not well formed.\r
+\r
+Operations in Z are expressed using the convention that primed variables denote components of the post-state. A mechanism known as _decoration_ allows one to write _S'_ for the schema that is like _S_, but whose variable names have been primed. Many idioms, such as promotion, rely on being able to manipulate the values of a schema's variables in aggregate. To support this, Z provides the theta operator: \theta @sep _S_ is an expression that denotes a binding in which each variable _x_ that belongs to _S_ is bound to a variable of the same name _x_ declared in the local scope. Theta and decoration interact subtly: \theta @sep _S'_ is not a binding of _S'_, but rather binds each variable _x_ of _S_ to a variable _x'_ declared locally. So where we would write _s=s'_ to say that pre- and post-states _s_ and _s'_ are the same, a Z specifier would write \theta @sep _S_ = \theta @sep _S'_. This formula equates each component _x_ of _S_ to its matching component _x'_ of _S'_, because _x_ and _x'_ are the respective values bound to _x_ by \theta @sep _S_ and \theta @sep _S'_ respectively.\r
+\r
+Our 'fact' construct allows the meaning of a signature name to be constrained subsequent to its declaration. A schema, in contrast, is 'closed': a new schema name must be introduced for each additional constraint. This can produce an undesirable proliferation of names for a system's state, but it does make it easier to track down those formulas that affect a schema's meaning.\r
+\r
+The variables of a schema can be renamed, but cannot be replaced by arbitrary expressions (since this would make nonsense of declarations).This requires the introduction of existential quantifiers where in our notation an expression is passed as an actual. On the other hand, when no renaming is needed, it is more succinct.\r
+\r
+Z's sequential composition operator is defined by a rather complicated transformation, and relies on adherence to particular conventions. The schema _P_ @sep \fatsemi @sep _Q_ is obtained by collecting primed variables in _P_ that match unprimed variables in _Q_; renaming these in both _P_ and _Q_ with a new set of variable names; and then existentially quantifying the new names away. For example, to say that a read following a write to the same address yields the value written, we would write:\r
+\r
+\geekmath\r
+all m: Memory, a: Addr, d, d': Data | Read (Write(m,a,d),d') => d = d'\r
+\r
+which is short for\r
+\r
+\geekmath all m: Memory, a: Addr, d, d': Data |\\\r
+       all m': Memory | Write (m,m',a,d) => Read (m,a,d') => d = d'\r
+\r
+In Z, assuming appropriate declarations of a schema _Memory_ and a given type _Data_, the formula would be:\r
+\r
+\geekmath\r
+\forall Memory; Memory'; x!: Data \fatdot Write \fatsemi Read [x!/d!] \implies x! = d!\r
+\r
+which is short for\r
+\r
+\geekmath\r
+\forall Memory; Memory'; x!: Data \fatdot \\\r
+       \exists Memory'' \fatdot \\\r
+               \exists Memory' \fatdot Write \and \theta @sep Memory' = \theta @sep Memory''\\\r
+               \exists Memory'; d!: Data \fatdot \\\r
+                       Read \and \theta @sep Memory = \theta @sep Memory'' \and d! = x!\\\r
+       \implies x! = d!\r
+\r
+The key semantic difference between signatures and schemas is this. A signature is a set of atoms; its fields are relational constants declared in global scope. A schema, on the other hand, denotes a higher-order object: a set of functions from field names to values. Our approach was motivated by the desire to remain first order, so that the analysis we have developed [3] can be applied. Not surprisingly, there is a cost in expressiveness. We cannot express higher-order formulas, most notably those involving preconditions. Suppose we want to assert that our write operation has no implicit precondition. In Z, such an assertion is easily written:\r
+\r
+\geekmath\r
+\forall Memory; a?: Addr \fatdot  \exists Memory'; d!: Data \fatdot Write\r
+\r
+We might attempt to formulate such an assertion in our notation as follows:\r
+\r
+\geekmath assert {\\\r
+       all m: Memory, a: Addr, d: Data | some m': Memory | Write (m,m',d,a)\r
+       }\r
+\r
+Unfortunately, this has counterexamples such as\r
+\r
+\geekmath Addr = {a0}\\\r
+Data = {d0}\\\r
+Memory = {m0, m1}\\\r
+map = {}\r
+\r
+in which the _map_ relation lacks an appropriate tuple. Intuitively, the assertion claims that there is no context in which a write cannot proceed; a legitimate counterexample---but one we certainly did not intend---simply gives a context in which a memory with the appropriate address-value mapping is not available.\r
+\r
+We have focused in this discussion on schemas. It is worth noting that Z is expressive enough to allow a style of structuring almost identical to ours, simply by declaring signatures as given types, fields and functions as global variables, and by writing facts, and the bodies of functions, as axioms. Field names would have to be globally unique, and the resulting specification would likely be less succinct than if expressed in our notation.\r
+\r
+\subsection Phenomenology\r
+\r
+Pamela Zave and Michael Jackson have developed an approach to composing descriptions [18] that objectifies states, events and time intervals, and constrains their properties with global axioms. Objectification allows descriptions to be reduced to a common phenomenology, so that descriptions in different languages, and even in different paradigms can be combined. Michael Jackson has argued separately for the importance of objectification as a means of making a more direct connection between a formal description and the informal world: as he puts it, "domain phenomena are facts about individuals" [7]. It is reassuring that the concerns of language design and tractability of analysis that motivated our notation are not in conflict with sound method, and it seems that our notation would be a good choice for expressing descriptions in the form that Zave and Jackson have proposed.\r
+\r
+\section       Evaluation\r
+\r
+\subsection Merits\r
+\r
+The key motivations of the design of our mechanism have been minimality and flexibility. It is worth noting how this has been achived by the _omission_ of certain features:\r
+\r
+\point \cdot   There is only one form of semantic structuring; our opinion is that adding extra mechanisms, for example to group operations into classes, does not bring enough benefit to merit the additional complexity, and tends to be inflexible. (Our language does provide some namespace control for signature and paragraph names in the style of Java packages, but this is trivial and does not interact with the basic mechanism).\r
+\r
+\point \cdot   There is no subtyping; subsignatures are just subsets of their supersignatures, and have the same type. There are only two types: basic types (for signatures), and relational types (for expressions). Types are not nested.\r
+\r
+\point \cdot   There is only one way that formulas are packaged for reuse. The same function syntax is used for observers, operations, refinement relations, etc. The function shorthand syntax unifies the syntax of both declaration and use for explicit and implicit function definitions.\r
+\r
+\point \cdot   The values of a signature with fields are just like the values of any basic type; there is nothing like Z's notion of a schema binding.\r
+\r
+Our interpretation of a subsignature as a subset of the supersignature appears to be novel as a mechanism for structuring in a specification language. It has three nice consequences:\r
+\r
+\point \cdot   _Elimination of type coercions_. If _x_ belongs to a signature _S_ whose extension _S'_ defines a field _f_, the expression _x.f_ will just denote an empty set if _x_ does not belong to _S'_. Contrast this with the treatment of subclasses in the Object Constraint Language [17], for example, which results in pervasive coercions and often prevents the use of set and relation operators (since elements must be coerced one at a time).\r
+\r
+\point \cdot   _Ease of extension_. Constraints can be added to the subsignature simply by writing a constraint that is universally quantified over elements of that subset.\r
+\r
+\point \cdot   _Definitional extension_. We can declare an extension _S'_ of a signature _S_ with additional fields, relate these fields to the fields declared explicitly for _S_, and then record the fact that _S=S'_ (as illustrated in Section 2.11). The effect is that every atom of _S_ has been extended with appropriately defined fields, which can be accessed whenever an expression denoting such an atom is in scope! We expect to find this idiom especially useful for defining additional fields for visualization purposes.\r
+\r
+\subsection    Deficiencies\r
+\r
+One might wonder whether, having encoded structures using atoms, and having provided quantifiers over those atoms, one can express arbitrary properties of higher-order structures. Unfortunately, but not surprisingly, this is not possible. The catch is that fields are treated in any formulas as global variables that are existentially quantified. To simulate higher-order logic, it would be necessary to allow quantifications over these variables, and since they have relational type, that would imply higher-order quantification. The practical consequence is that properties requiring higher-order logic cannot be expressed. One cannot assert that the precondition of an operation is no stronger than some predicate; one cannot in general specify operations by minimization; and one cannot express certain forms of refinement check. An example of this problem is given in Section 4.3 above. Whether the problem is fundamental or can be partially overcome remains to be seen.\r
+\r
+The treatment of subsignatures as subsets has a nasty consequence. Since a field declared in a subsignature becomes implicitly a field of the supersignature, two subsignatures cannot declare fields of the same name. The extension mechanism is therefore not properly modular, and a specification should use hierarchical structure instead where this matters.\r
+\r
+Modelling a set of states as atoms entails a certain loss of abstraction. In this specification\r
+\r
+\geekmath sig A {}\\\r
+sig S {a: A}\\\r
+fun op (s,s': S) {s.a = s'.a}\r
+\r
+the operation _op_ has executions in which the pre- and post-states are equal (that is, the same atom in _S_), and executions in which only their _a_ components are equal. One might object that this distinction is not observable. Moreover, replacing the formula by _s=s'_ would arguably be an overspecification---a 'bias' in VDM terminology [8]. The situation calculus [11] solves this problem by requiring every operation to produce a state change: _s_ and _s'_ are thus regarded as distinct situations by virtue of occurring at different points in the execution. The dual of this solution is to add an axiom requiring that no two distinct atoms of _S_ may have equal _a_ fields. Either of these solutions is easily imposed in our notation.\r
+\r
+Our treatment of scalars and sets uniformly as relations has raised the concern that the resulting succinctness comes with a loss of clarity and redundancy. Extensive use of the previous version of our language, mostly by inexperienced specifiers, suggests that this is not a problem. The loss of some static checking is more than compensated by the semantic analysis that our tool performs.\r
+\r
+\section Conclusion\r
+\r
+Two simple ideas form the basis of our modularity mechanism: (1) that a structure is just a set of atoms, and its fields are global relations that map those atoms to structure components; and (2) that extensions of a structure are just subsets. Our relational semantics, in which all variables and fields are represented as relations, makes the use of structures simple and succinct, and it ensures that the language as a whole remains first order. For a variety of modelling tasks, we believe that our approach provides a useful balance of expressiveness and tractability.\r
+\r
+\section* Acknowledgments\r
+\r
+The language described here was refined by experience writing specifications, long before an analyzer existed, and by the development of the analyzer tool itself. Mandana Vaziri and Sarfraz Khurshid were our early adopters, and Brian Lin and Joe Cohen helped implement the tool. The paper itself was improved greatly by comments from Mandana and Sarfraz, from Michael Jackson, from Tomi Mannisto, and especially from Pamela Zave, whose suggestions prompted a major rewrite. Jim Woodcock helped us understand Z, and the clarity and simplicity of his own work has been a source of inspiration to us. Our ideas have also been improved by the comments of the members of IFIP working groups 2.3 and 2.9, especially Tony Hoare, Greg Nelson and Rustan Leino. This work was funded in part by ITR grant #0086154 from the National Science Foundation, by a grant from NASA, and by an endowment from Doug and Pat Ross.\r
+\r
+\section* References\r
+\r
+#\ref [CD94]   Steve Cook and John Daniels. Designing Object Systems: Object-Oriented Modelling with Syntropy. Prentice Hall, 1994.\r
+#\r
+\ref [1]       R. Duke, G. Rose and G. Smith. Object-Z: A Specification Language Advocated for the Description of Standards.  SVRC Technical Report 94-45. The Software Verification Research Centre, University of Queensland, Australia.\r
+\r
+\ref [2]       John V. Guttag, James J. Horning, and Andres Modet. Report on the Larch Shared Language: Version 2.3. Technical Report 58, Compaq Systems Research Center, Palo Alto, CA, 1990.\r
+\r
+#\ref [Hal90]  Anthony Hall. Using Z as a Specification Calculus for Object-Oriented Systems. In D. Bjorner, C.A.R. Hoare, and H. Langmaack, eds., VDM and Z: Formal Methods in Software Development, Lecture Notes in Computer Science, Volume 428, pp. 290\96381, Springer-Verlag, New York, 1990.\r
+#\r
+\ref [3]       Daniel Jackson. Automating first-order relational logic. Proc. ACM SIGSOFT Conf. Foundations of Software Engineering. San Diego, November 2000.\r
+\r
+\ref [4]       Daniel Jackson. Alloy: A Lightweight Object Modelling Notation. To appear, ACM Transactions on Software Engineering and Methodology, October 2001.\r
+\r
+\ref [5]       Daniel Jackson, Ian Schechter and Ilya Shlyakhter. Alcoa: the Alloy Constraint Analyzer. Proc. International Conference on Software Engineering, Limerick, Ireland, June 2000.\r
+\r
+\ref [6]       Daniel Jackson and Jeannette Wing. Lightweight Formal Methods. In: H. Saiedian (ed.), An Invitation to Formal Methods. IEEE Computer, 29(4):16-30, April 1996. \r
+\r
+\ref [7]       Michael Jackson. Software Requirements and Specifications: A Lexicon of Practice, Principles and Prejudices. Addison-Wesley, 1995.\r
+\r
+\ref [8]       Cliff Jones. Systematic Software Development Using VDM. Second edition, Prentice Hall, 1990.\r
+\r
+\ref [9]       Kathleen Jensen and Nicklaus Wirth. Pascal: User Manual and Report. Springer-# Verlag, 1974.\r
+\r
+\ref [10]      K. Rustan M. Leino and Greg Nelson. Data abstraction and information hiding . Research Report 160, Compaq Systems Research Center, November 2000.\r
+\r
+\ref [11]      Hector Levesque, Fiora Pirri, and Ray Reiter. Foundations for the Situation Calculus. Linköping Electronic Articles in Computer and Information Science, ISSN 1401-9841, Vol. 3(1998), Nr. 018.\r
+\r
+\ref [12]      Robin Milner, Mads Tofte and Robert Harper. The Definition of Standard ML. MIT Press, 1990.\r
+\r
+\ref [13]      S. Owre, N. Shankar, J. M. Rushby, and D. W. J. Stringer-Calvert. PVS Language Reference. Computer Science Laboratory, SRI International, Menlo Park, CA, September 1999.\r
+\r
+\ref [14]      J. Michael Spivey. The Z Notation: A Reference Manual. Second edition, Prentice Hall, 1992.\r
+\r
+\ref [15]      Ian Toyn et al. Formal Specification---Z Notation---Syntax, Type and Semantics. Consensus Working Draft 2.6 of the Z Standards Panel BSI Panel IST/5/-/19/2 (Z Notation). August 24, 2000.\r
+\r
+\ref [16]      Jim Woodcock and Jim Davies. Using Z: Specification, Refinement and Proof. Prentice Hall, 1996.\r
+\r
+\ref [17]      Jos Warmer and Anneke Kleppe. The Object Constraint Language: Precise Modeling with UML. Addison Wesley, 1999.\r
+\r
+\ref [18]      Pamela Zave and Michael Jackson. Conjunction as Composition. ACM Transactions on Software Engineering and Methodology II(4): 379--411, October 1993.\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/doc/notes.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/doc/notes.txt
new file mode 100755 (executable)
index 0000000..ce232ec
--- /dev/null
@@ -0,0 +1,154 @@
+A. Motivations\r
+A.1    Independence from layout tool\r
+A.2    Ability to produce HTML\r
+A.3    Editable text, email, etc\r
+A.4    Combine compilation and WYSIWYG\r
+A.5    Better automation of cross refs than Frame\r
+A.6    Better typography than TeX\r
+A.7    Ability to use my own PS fonts\r
+A.8    Easy layout of code, which TeX handles badly\r
+\r
+B. Project Plans\r
+B.1    Small initial implementation; iterative extension\r
+B.2 Experiment with JUnit\r
+B.3    Try documentation lite\r
+B.4    Look at conformance issues\r
+\r
+C. Requirements\r
+C.1    Input format\r
+C.1.1  Plain text, platform independent (no Unix/Windows line end problems)\r
+C.1.2  Minimal syntax\r
+C.1.3  Text layout respected for all but EOL, unless //\r
+C.1.4  All keywords introduced by backslash\r
+C.1.5  Kinds of tag\r
+               \section        paragraph tag\r
+               \alpha          special char\r
+               \date                   special\r
+               \bold                   formatting tag  \r
+               kind of tag is resolved by tables loaded from file\r
+C.1.6  Special Tokens\r
+       --, ---, .., ...        dashes and ellipses\r
+       \\              hard line break\r
+       non-breaking hyphen, breaking hyphen, etc?\r
+       en, em space?\r
+       italic correction?\r
+       |                       separator       \r
+       {,}             used for grouping\r
+C.1.6a Printing Characters Used in Special Tokens\r
+       \#,\_,\{,\}     will print as #,_,{,}\r
+       \ is written \backslash\r
+C.1.7  Groupings (obsolete)\r
+       \{x} may replace \x when want to avoid extra space\r
+       eg. \{alpha}_1 to give an alpha with a subscript 1\r
+       but paragraph tags behave in opposite way: consume whitespace that follows, so use \{para} to include whitespace.\r
+C.1.7  Groupings\r
+       abandoned this in favour of simpler scheme with | for separator and {} for logical grouping;\r
+       para tag consumes only first space token, so "\parastyle | hello" to put space before "hello"\r
+C.1.8  Cross References\r
+       \tag{t} marks paragraph with tag t\r
+       \name{s}        makes s the citation string for this para\r
+       \cite{t}        citation of paragraph with tag t\r
+       for autonumbered paras, number is citation string by default\r
+C.1.9  Para breaks\r
+       determined by blank line; mid-line paragraph tag is an error\r
+C.1.10 Spacing\r
+       as given explicitly, except; line breaks and their leading spaces, replaced by single space; first whitespace group (including line break) following paragraph tag.\r
+C.1.11 Italicization\r
+       between underscores\r
+       have this indicate a character style instead? allow override at start of file.\r
+C.1.12 Sub and superscripts (obsolete)\r
+       text_i, text_{abc}\r
+       text^i, text^{abc}\r
+C.1.12 Sub and superscripts\r
+       abandoned _^ scheme because it's more trouble parsing\r
+       may reinstate later\r
+       \sub{...}       puts text between curlies in superscript\r
+C.1.12a        Formatting Tags\r
+       generalize to \bold, \roman, etc\r
+       formatting runs from that point onwards, unless explicit grouping: \bold{abc}def puts abc, but not def in bold.\r
+C.1.13 Comments\r
+# in first column makes line a comment\r
+C.1.14 Quotes\r
+       "hello"\r
+       it's\r
+       '69\r
+C.2    Style File\r
+C.2.1  Next\r
+       specifies default paragraph style order\r
+C.2.2  Character Styles\r
+       assume none for now\r
+C.2.3  Syntax\r
+       In all property files, use property list syntax:\r
+               <style:section><next:indent>...\r
+C.2.4  Autonumbering\r
+C.2.4.1        Star after style name suppresses numbering\r
+               \section*\r
+C.2.4.2        Associate with each style\r
+       series\r
+       level\r
+       separator (comes before extension string for this style's numbering)\r
+       trailer (between number and para)\r
+       leader (before number)\r
+C.2.4.2        Associate a series and a level with each style, eg, <series:A><level:2>\r
+C.2.4.3        Numbering formats:\r
+               0       gives 0,1,2\r
+               1               1,2,3\r
+               a               a,b,c\r
+               A               A,B,C\r
+               i                       i,ii,iii,iv,\r
+               I                       I,II,III,IV\r
+C.2.4.4        Examples\r
+       example:\r
+               <style:section><series:section><level:0><numbering:1><trailer:.\tab>\r
+               <style:subsection><series:section><level:1><numbering:1><separator:.><trailer:\tab>\r
+               <style:subsubsection><series:section><level:3><numbering:a><trailer:\tab>\r
+               gives\r
+               1. First section\r
+               1.1     First subsection\r
+               1.1a    First subsubsection\r
+       example:\r
+               <style:point><leader:\cdot><trailer:\tab>\r
+               gives points preceded by a center dot and a tab\r
+C.2.4.5        Citation\r
+       Numbering string, excluding leader and trailer, becomes default citation string for its para.\r
+\r
+C.3    Stylesheets\r
+At top of file, \stylesheet{filename} sets name of style file\r
+\r
+C.4    Other Features\r
+C.4.1  Wishlist\r
+       Reserved word transformations (eg, bolding)\r
+       Inference rules\r
+C.5    Character File\r
+C.5.1  Must be backend independent\r
+C.5.2  Example\r
+       <name:alpha><font:MathB><index:155>\r
+       \r
+\r
+D.     Design Issues\r
+D.1    General Thoughts\r
+D.1.1  Parsing. Break into tokens consisting of whitespace groups, character (non-whitespace) groups, commands, etc.\r
+D.1.2  Use simple hand-written recursive descent parser\r
+D.1.3  Need to read in style file first so that paragraph style names are recognized.\r
+D.1.4  Build a table and select action by token type\r
+D.1.5  Incorporate trailing space and EOL into single token\r
+D.1.6  Issue: stream or tree based? Probably stream, but have parser recognize close of italics, formattings, etc\r
+D.1.7  For now, don't attempt generic backend. Better to handcraft a backend or two, then generalize.\r
+D.1.8  For references, write out index file and generate warnings for unresolved refs. This allows a single pass.\r
+\r
+D.2    Design\r
+\r
+----------------------------------------------------------------------------------------\r
+Issues\r
+\r
+Grammar must handle\r
+\section*                      generates token parastyle section, numbering suppressed\r
+\sub{...}                      generates tokens begin-sub and end-sub?\r
+quotes?\r
+\r
+\r
+\r
+must have preamble followed by blank line to generate first para\r
+need something to mark end of preamble\r
+how to have action install other actions? will be a comodification.\r
+\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/charmap.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/charmap.txt
new file mode 100755 (executable)
index 0000000..4d81f8f
--- /dev/null
@@ -0,0 +1,22 @@
+# basic characters\r
+<char:linebreak><index:22>\r
+\r
+# dots\r
+<char:period><index:22>\r
+<char:twodotleader><index:22>\r
+<char:ellipsis><index:22>\r
+\r
+# quotes\r
+<char:apostrophe><index:22>\r
+<char:prime><index:22>\r
+<char:opensinglequote><index:22>\r
+<char:closesinglequote><index:22>\r
+<char:opendoublequote><index:22>\r
+<char:closedoublequote><index:22>\r
+\r
+#dashes\r
+<char:hyphen><index:22>\r
+<char:endash><index:22>\r
+<char:emdash><index:22>\r
+\r
+# math symbols
\ No newline at end of file
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/foo-new.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/foo-new.txt
new file mode 100755 (executable)
index 0000000..77a3221
--- /dev/null
@@ -0,0 +1,11 @@
+@title:A Micromodularity Mechanism\r
+@author:Daniel Jackson Ilya Shlyakhter and Manu Sridharan<\n> Laboratory for Computer Science<\n> Massachusetts Institute of Technology<\n> Cambridge Massachusetts USA<\n> dnjmit.edu\r
+@opening:Abstract\r
+@noindent:A simple mechanism for structuring specifications is described. By modelling structures as atoms it  remains entirely first<\#45>order and thus amenable to automatic analysis. And by interpreting fields of structures as relations it allows the same relational operators used in the formula language to be used for dereferencing. An extension feature allows structures to be developed incrementally but requires no textual inclusion nor any notion of subtyping. The paper demonstrates the flexibility of the mechanism by application in a variety of common idioms.\r
+@subsection:A.1        Categories and Subject Descriptors\r
+@noindent:D.2.1 RequirementsSpecifications<\#151>Languages D.2.4 SoftwareProgram Verification<\#151>Formal methods Model checking F.3.1 Specifying and Verifying and Reasoning about Programs<\#151>Assertions Invariants Specification techniques.\r
+@subsection:A.2        General Terms\r
+@noindent:Design Documentation Languages Verification.\r
+@subsection:A.3        Keywords\r
+@noindent:Modeling languages formal specification first<\#45>order logic relational calculus Alloy language Z specification language schema calculus.\r
+@section:B     Introduction
\ No newline at end of file
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/foo-old.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/foo-old.txt
new file mode 100755 (executable)
index 0000000..051edfe
--- /dev/null
@@ -0,0 +1 @@
+@title:A Micromodularity Mechanism\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse-real.index.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse-real.index.txt
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse-real.tag.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse-real.tag.txt
new file mode 100755 (executable)
index 0000000..ce1f41b
--- /dev/null
@@ -0,0 +1,371 @@
+@title:A Micromodularity Mechanism\r
+@section:1     Testing\r
+@noindent:This is gamma: <f"Symbol"><\#103><f$>.<\n> This is Delta: <f"Symbol"><\#68><f$>.<\n> This is oplus: . <f"LucidNewMatSymT"><\#65><f$> <f"Symbol"><\#222><f$> <f"LucidNewMatSymT"><\#65><f$>\r
+@body:This is a subscripted variable: A<-><B>hello<B>there<->. Math mode: <I>x<I> + 2 = <I>y<I>, <I>and<I> && <I>x<I><->2<-> = <I>y<I><->3<-> = <I>x<I><-><I>ijk<I><->\r
+@author:Daniel Jackson, Ilya Shlyakhter and Manu Sridharan<\n> Laboratory for Computer Science<\n> Massachusetts Institute of Technology<\n> Cambridge, Massachusetts, USA<\n> dnj@mit.edu\r
+@opening:Abstract\r
+@noindent:A simple mechanism for structuring specifications is described. By modelling structures as atoms, it  remains entirely first<\#45>order and thus amenable to automatic analysis. And by interpreting fields of structures as relations, it allows the same relational operators used in the formula language to be used for dereferencing. An extension feature allows structures to be developed incrementally, but requires no textual inclusion nor any notion of subtyping. The paper demonstrates the flexibility of the mechanism by application in a variety of common idioms.\r
+@subsection:1.1        Categories and Subject Descriptors\r
+@noindent:D.2.1 Requirements/Specifications<\#151>Languages; D.2.4 Software/Program Verification<\#151>Formal methods, Model checking; F.3.1 Specifying and Verifying and Reasoning about Programs<\#151>Assertions, Invariants, Specification techniques.\r
+@subsection:1.2        General Terms\r
+@noindent:Design; Documentation; Languages; Verification.\r
+@subsection:1.3        Keywords\r
+@noindent:Modeling languages; formal specification; first<\#45>order logic; relational calculus; Alloy language; Z specification language; schema calculus.\r
+@section:2     Introduction\r
+@noindent: I am neither crazy nor a micromaniac.<\n> (A micromaniac is someone obsessed with<\n> reducing things to their smallest possible form.<\n> This word, by the way, is not in the dictionary.)<\n> <\#150><I>Edouard de Pomiane, French Cooking in Ten Minutes, 1930<I>\r
+@noindent:Most specification languages provide mechanisms that allow larger specifications to be built from smaller ones. These mechanisms are often the most complicated part of the language, and present obstacles to analysis. This paper presents a simple mechanism that seems to be expressive enough for a wide variety of uses, without compromising analyzability.\r
+@body:This work is part of a larger project investigating the design of a <\#147>micro modelling language<\#148>. Our premise is that lightweight application of formal methods [6] demands an unusually small and simple language that is amenable to fully automatic semantic analysis. The Alloy language is the result to date of our efforts to design such a language. Based on our experiences with the language [4] and its analyzer [5], we have recently developed a revision of Alloy that overcomes many of its limitations. This paper describes the key feature of the revised language: the <I>signature<I>, a new modularity mechanism.\r
+@body:The mechanism allows our existing analysis scheme [3] to be applied to specifications involving structures. This is not achieved by treating the structuring mechanism as a syntactic sugar, which would limit the power of the notation (ruling out, for example, quantification over structures) and would complicate the analysis tool and make output harder for users to interpret. Because of the mechanism<\#48>s generality, it has also enabled us to simplify the language as a whole, making it more uniform and eliminating some ad hoc elements.\r
+@body:Our mechanism has a variety of applications. It can express inherent structure in the system being modelled, and can be used to organize a specification in which details are added incrementally. It can be used to construct a library of datatypes, or to describe a system as an instantiation of a more general system. And it can express state invariants, transitions, and sequences, despite the lack of any special syntax for state machines.\r
+@body:In this last respect, the new language differs most markedly from its predecessor [4], which provided built<\#45>in notions of state invariants and operations. We now think this was a bad idea, because it made the language cumbersome for problems (such as the analysis of security policies or architectural topology constraints) in which temporal behaviour can be fruitfully ignored, and too inflexible for many problems in which temporal behaviour is important.\r
+@body:Our paper begins by explaining our motivations<\#151>the requirements our mechanism is designed to meet. The mechanism is then presented first informally in a series of examples, and then slightly more rigorously feature<\#45>by<\#45>feature. We discuss related work, especially the schema calculus of Z, and close with a summary of the merits and deficiences of our notation as a whole.\r
+@section:3     Requirements\r
+@noindent:The goal of this work was to find a single structuring mechanism that would support a variety of common specification idioms:\r
+@point:\alpha 3.0.A    <I>States<I>: description of complex state as a collection of named components; incremental description both by hierarchy, in which a complex state becomes a component of a larger state, and by extension, in which new components are added; declaration of invariants and definitions of derived components;\r
+@point:\alpha 3.0.B    <I>Datatypes<I>: separate description of a library of polymorphic datatypes, such as lists, sequences, trees and orders, along with their operators;\r
+@point:\alpha 3.0.C    <I>Transitions<I>: specification of state transitions as operations described implicitly as formulas relating pre<\#45> and post<\#45>state; composition of operations from previously defined invariants and operations; sequential composition of operations; description of traces as sequences of states;\r
+@point:\alpha 3.0.D    <I>Abstractions<I>: description of abstraction relations between state spaces;\r
+@point:\alpha 3.0.E    <I>Assertions<I>: expression of properties intended to be redundant, to be checked by analysis, including: relationships amongst invariants; wellformedness of definitions (eg, that an implicit definition is functional); establishment and preservation of invariants by operations; properties of states reachable along finite traces; and simulation relationships between abstract and concrete versions of an operation.\r
+@noindent:We wanted additionally to meet some more general criteria:\r
+@point:\alpha 3.0.F    <I>Simplicity<I>. The language as a whole should be exceptionally small and simple.\r
+@point:\alpha 3.0.G    <I>Flexibility<I>. Support for the particular idioms of state<\#45>machine specification should not be a straitjacket; the language should not dictate how state machines are expressed, and should not make it hard to describe structures that are not state machines (such as security models and architectural styles).\r
+@point:\alpha 3.0.H    <I>Analyzability<I>. A fully automatic semantic analysis should be possible. In the present work, this has been achieved by requiring that the modularity mechanism be first order, and expressible in the kernel of the existing language.\r
+@noindent:Finally, our language design decisions have been influenced by some principles that we believe contribute to these goals, make the language easier to use, and analysis tools easier to build:\r
+@point:\alpha 3.0.I    <I>Explicitness<I>. The language should be fully explicit, with as few implicit constraints, coercions, etc, as possible.\r
+@point:\alpha 3.0.J    <I>Minimal mathematics<I>. The basic theory of sets and relations should suffice; it should not be necessary to introduce domains, fixed points, infinities or special logical values.\r
+@point:\alpha 3.0.K    <I>Minimal syntax<I>. There should be very few keywords or special symbols, and no need for special typography or layout.\r
+@point:\alpha 3.0.L    <I>Uniformity<I>. A small and general set of constructs should be applied uniformly, independent of context.\r
+@point:\alpha 3.0.M    <I>Lack of novelty<I>. Whenever possible, notions and syntax should follow standard usage of conventional mathematics and programming.\r
+@section:4     Informal Description\r
+@noindent:As a running example, we will specify a simple memory system involving a cache and a main memory. The memory has a fixed set of addresses and associates a data value with each address. The cache, in contrast, associates data values with some subset of addresses that varies over time. The cache is updated by a <\#147>write<\#45>back scheme<\#148>, which means that updates need not be reflected to main memory immediately. The cache may therefore hold a more current value for an address than the main memory; the two are brought into alignment when the address is flushed from the cache and its value is written to main memory.\r
+@subsection:4.1        States\r
+@noindent:We start by declaring the existence of addresses and data values:\r
+@geekmath:sig Addr {}<\n> sig Data {}\r
+@noindent:Each line declares a <I>signature<I>, and introduces a set of atoms: <I>Addr<I> for the set of addresses, and <I>Data<I> for the set of data values. Like <\#145>given types<\#146> in Z, these sets are disjoint from one another, and their atoms are unstructured and uninterpreted. Signature names can be used as expressions denoting sets, but they are also treated as types, so the expression <I>Addr+Data<I>, for example, is ill<\#45>typed, since the union operator (+) requires the types of its operands to match.\r
+@body:The signature declaration\r
+@geekmath:sig Memory {<\n>     addrs: set Addr,<\n>    map: addrs <\#45>! Data<\n>     }\r
+@noindent:likewise declares a set of atoms, <I>Memory<I>, corresponding to the set of all possible memories. In addition, it declares two fields: <I>addrs<I> and <I>map<I> which associate with a memory a set of addresses and a mapping from addresses to data values respectively. Thus, given a memory <I>m<I>, the expression <I>m.addrs<I> will be a set of addresses, <I>m.map<I> will be a relation from addresses to data values. The memory, addresses and data values should be viewed as distinct atoms in their own right; fields don<\#48>t decompose an atom, but rather relate one atom to others. The exclamation mark in the declaration of the field <I>map<I> is a <\#145>multiplicity marking<\#146>: it says that <I>m.map<I> associates exactly one data value with each address in the set <I>m.addrs<I>. The use of <I>addrs<I> rather than <I>Addr<I> on the left side of the arrow indicates that <I>m.map<I> does not associate a data value with an address that is not in the set <I>m.addrs<I>.\r
+@body:In these expressions, the dot is simply relational image. More precisely, when we say that <I>m<I> is a memory, we mean that the expression <I>m<I> denotes a set consisting of a single atom. The field <I>addrs<I> is a relation from <I>Memory<I> to <I>Addr<I>, and <I>m.addrs<I> denotes the image of the singleton set under this relation. So for a set of memories <I>ms<I>, the expression <I>ms.addrs<I> will denote the union of the sets of addresses that belong to the individual memories. Given an address <I>a<I>, the expression <I>a.(m.map)<I> denotes the set of data values associated with address <I>a<I> in memory <I>m<I>, which will either be empty (when the address is not mapped) or a singleton. For convenience, we allow the relational image <I>s.r<I> to be written equivalently as <I>r<I>[<I>s<I>], where [] binds more loosely than dot, so this expression may be written as <I>m.map<I>[<I>a<I>] instead.\r
+@body:Like objects of an object<\#45>oriented language, two distinct atoms can have fields of the same value. Unlike objects, however, atoms are immutable. Each field is fixed, and cannot map an atom to one value at one time and another value at another time. To describe an operation that changes the state of a memory, therefore, we will use two distinct atoms in the set <I>Memory<I> to represent the memory<\#48>s state before and after.\r
+@subsection:4.2        Extension\r
+@noindent:A signature declaration can introduce a set as a subset of one previously declared, in which case we call it a <I>subsignature<I>. In this case, the set does not correspond to a type, but rather its atoms take on the type of the superset. For example, the declaration\r
+@geekmath:sig MainMemory extends Memory {}\r
+@noindent:introduces a set of atoms <I>MainMemory<I> representing main memories, which is constrained to be a subset of the set <I>Memory<I>. Likewise\r
+@geekmath:sig Cache extends Memory {<\n>       dirty: set addrs<\n>    }\r
+@noindent:introduces a set of atoms <I>Cache<I> representing those memories that can be regarded as caches. It also introduces a field <I>dirty<I> that associates with a cache the set of addresses that is dirty; later, we will use this to represent those addresses for which a cache and main memory differ. Because <I>Cache<I> is a subset of <I>Memory<I>, and <I>m.addrs<I> (for any memory <I>m<I>) is a subset of <I>Addr<I>, the field denotes a relation whose type is from <I>Memory<I> to <I>Addr<I>. Expressions such as <I>m.dirty<I> are therefore type<\#45>correct for a memory <I>m<I>, whether or not <I>m<I> is a cache. But since declaration of the field <I>dirty<I> within the signature <I>Cache<I> constrains <I>dirty<I> to be a relation that maps only caches, <I>m.dirty<I> will always denote the empty set when <I>m<I> is not a cache.\r
+@body:This approach avoids introducing a notion of subtyping. Subtypes complicate the language, and tend to make it more difficult to use. In OCL [17], which models extension with subtypes rather than subsets, an expression such as <I>m.dirty<I> would be illegal, and would require a coercion of <I>m<I> to the subtype <I>Cache<I>. Coercions do not fit smoothly into the relational framework; they interfere with the ability to take the image of a set under a relation, for example.  Moreover, subtypes are generally disjoint, whereas our approach allows the sets denoted by subsignatures to overlap. In this case, we<\#48>ll add a constraint (in Section 2.4 below) to ensure that <I>MainMemory<I> and <I>Cache<I> are in fact disjoint.\r
+@body:Declaring <I>Cache<I> and <I>MainMemory<I> as subsignatures of <I>Memory<I> serves to factor out their common properties. Extension can be used for a different purpose, in which a single signature is developed by repeated extensions along a chain. In this case, the supersignatures may not correspond to entities in the domain being modelled, but are simply artifacts of specification<\#151>fragments developed along the way. Z specifications are typically developed in this style.\r
+@subsection:4.3        Hierarchy\r
+@noindent:The signature declaration also supports hierarchical structuring. We can declare a signature for systems each consisting of a cache and a main memory:\r
+@geekmath:sig System {<\n>     cache: Cache,<\n>       main: MainMemory<\n>    }\r
+@noindent:Again, <I>System<I> introduces a set of atoms, and each field represents a relation. The omission of the keyword <I>set<I> indicates that a relation is a total function. So for a system <I>s<I>, the expression <I>s.cache<I> denotes one cache<\#151>that is, a set consisting of a single cache. This is one of very few instances of implicit constraints in our language, which we introduced in order to make declaration syntax conventional.\r
+@body:Since signatures denote sets of atoms, apparently circular references are allowed. Linked lists, for example, may be modelled like this, exactly as they might be implemented in a language like Java:\r
+@geekmath:sig List {}<\n> sig NonEmptyList extends List {elt: Elt, rest: List}  There is no recursion here; the field <I>rest<I> is simply a homogeneous relation of type <I>List<I> to <I>List<I>, with its domain restricted to the subset <I>NonEmptyList<I>.\r
+@subsection:4.4        State Properties\r
+@noindent:Properties of signature atoms are recorded as logical formulas. To indicate that such a property always holds, we package it as a <I>fact<I>. To say that, for any memory system, the addresses in a cache are always addresses within the main memory, we might write:\r
+@geekmath:fact {all s: System | s.cache.addrs in s.main.addrs}\r
+@noindent:or, using a shorthand that allows facts about atoms of a signature to be appended to it:\r
+@geekmath:sig System {cache: Cache, main: MainMemory}<\n>      {cache.addrs in main.addrs}\r
+@noindent:The appended fact is implicitly prefixed by\r
+@geekmath:all this: System | with this |\r
+@noindent:in which the <I>with<I> construct, explained in Sectiom 3.6 below, causes the fields implicitly to be dereferences of the atom <I>this<I>.\r
+@body:A fact can constrain atoms of arbitrary signatures; to say that no main memory is a cache we might write:\r
+@geekmath:fact {no (MainMemory & Cache)}\r
+@noindent:where <I>no e<I> means that the expression <I>e<I> has no elements, and & is intersection.\r
+@body:Most descriptions have more interesting facts. We can express the fact that linked lists are acyclic, for example:\r
+@geekmath:fact {no p: List | p in p. @sep rest}\r
+@noindent:The expression <I> @sep rest<I> denotes the transitive closure of the relation <I>rest<I>, so that <I>p.^rest<I> denotes the set of lists reachable from <I>p<I> by following the field <I>rest<I> once or more. This illustrates a benefit of treating a field as a relation<\#151>that we can apply standard relational operators to it<\#151>and is also an example of an expression hard to write in a language that treats extension as subtyping (since each application of <I>rest<I> would require its own coercion).\r
+@body:Often we want to define a property without imposing it as a permanent constraint. In that case, we declare it as a <I>function<I>. Here, for example, is the invariant that the cache lines not marked as dirty are consistent with main memory:\r
+@geekmath:fun DirtyInv (s: System) {<\n>       all a !: s.cache.dirty | s.cache.map[a] = s.main.map[a]<\n>     }  (The exclamation mark negates an operator, so the quantification is over all addresses that are <I>not<I> dirty.) Packaging this as a function that can be applied to a particular system, rather than as a fact for all systems, will allow us to express assertions about preservation of the invariant (Section 2.8).\r
+@noindent:By default, a function returns a boolean value<\#151>the value of the formula in its body. The value of <I>DirtyInv(s)<I> for a system <I>s<I> is therefore true or false. A function may return non<\#45>boolean values. We might, for example, define the set of bad addresses to be those for which the cache and main memory differ:\r
+@geekmath:fun BadAddrs (s: System): set Addr {<\n>     result = {a: Addr | s.cache.map[a] != s.main.map[a]}<\n>        }\r
+@noindent:and then write our invariant like this:\r
+@geekmath:fun DirtyInv (s: System) {BadAddrs(s) in s.cache.dirty}\r
+@noindent:In this case, <I>BadAddrs(s)<I> denotes a set of addresses, and is short for the expression on the right<\#45>hand side of the equality in the definition of the function <I>BadAddrs<I>. The use of the function application as an expression does not in fact depend on the function being defined explicitly. Had we written\r
+@geekmath:fun BadAddrs (s: System): set Addr {<\n>     all a: Addr | a in result iff s.cache.map[a] != s.main.map[a]<\n>       }  the application would still be legal; details are explained in Section 3.7. \r
+@subsection:4.5        Operations\r
+@noindent:Following Z, we can specify operations as formulas that constrain pre<\#45> and post<\#45>states. An operation may be packaged as a single function (or as two functions if we want to separate pre<\#45> and post<\#45>conditions in the style of VDM or Larch).\r
+@body:The action of writing a data value to an address in memory might be specified like this:\r
+@geekmath:fun Write (m,m<\#48>: Memory, d: Data, a: Addr) {<\n>        m<\#48>.map = m.map ++ (a<\#45>d)<\n>   }\r
+@noindent:The formula in the body of the function relates <I>m<I>, the value of the memory before, to <I>m<\#48><I>, the value after. These identifers are just formal arguments, so the choice of names is not significant. Moreover, the prime mark plays no special role akin to decoration in Z<\#151>it<\#48>s a character like any other. The operator ++ is relational override, and the arrow forms a cross product. As mentioned above, scalars are represented as singleton sets, so there is no distinction between a tuple and a relation. The arrows in the expressions <I>a<\#45><I>d here and <I>addrs<\#45><I>Data in the declaration of the <I>map<I> field of <I>Memory<I> are one and the same.  The action of reading a data value can likewise be specified as a function, although since it has no side<\#45>effect we omit the <I>m<\#48><I> parameter:\r
+@geekmath:fun Read (m: Memory, d: Data, a: Addr) {<\n>         d = m.map[a]<\n>        }  Actions on the system as a whole can be specified using these primitive operations; in Z, this idiom is called <\#145>promotion<\#146>. A read on the system is equivalent to reading the cache:\r
+@geekmath:fun SystemRead (s: System, d: Data, a: Addr) {<\n>   Read (s.cache, d, a)<\n>        }\r
+@noindent:The <I>Read<I> operation has an implicit precondition. Since the data parameter <I>d<I> is constrained (implicitly by its declaration) to be scalar<\#151>that is, a singleton set<\#151>the relation <I>m.map<I> must include a mapping for the address parameter <I>a<I>, since otherwise the expression <I>m.map[a]<I> will evaluate to the empty set, and the formula will not be satisfiable. This precondition is inherited by <I>SystemRead<I>. If the address <I>a<I> is not in the cache, the operation cannot proceed, and it will be necessary first to load the data from main memory. It is convenient to specify this action as a distinct operation:\r
+@geekmath:fun Load (s,s<\#48>: System, a: Addr) {<\n>  a !in s.cache.addrs<\n>         s<\#48>.cache.map = s.cache.map + (a<\#45>s.main.map[a])<\n>    s<\#48>.main = s.main<\n>       }\r
+@noindent:The + operator is just set union (in this case, of two binary relations, the second consisting of a single tuple). A write on the system involves a write to the cache, and setting the dirty bit. Again, this can be specified using a primitive memory operation:\r
+@geekmath:fun SystemWrite (s,s<\#48>: System, d: Data, a: Addr) {<\n>  Write (s.cache, s<\#48>.cache, d, a)<\n>        s<\#48>.cache.dirty = s.cache.dirty + a<\n>     s<\#48>.main = s.main<\n>       }\r
+@noindent:A cache has much smaller capacity than main memory, so it will occasionally be necessary (prior to loading or writing) to flush lines from the cache back to main memory. We specify flushing as a non<\#45>deterministic operation that picks some subset of the cache addrs and writes them back to main memory:\r
+@geekmath:fun Flush (s,s<\#48>: System) {<\n>  some x: set s.cache.addrs {<\n>                 s<\#48>.cache.map = s<\#48>.cache.map <\#45> (x<\#45>Data)<\n>          s<\#48>.cache.dirty = s.cache.dirty <\#45> x<\n>                s<\#48>.main.map = s.main.map ++ <\n>                   {a: x, d: Data | d = s.cache.map[a]}<\n>                }\r
+@noindent:The <\#45> operator is set difference; note that it is applied to sets of addresses (in the third line) and to binary relations (in the second). The comprehension expression creates a relation of pairs <I>a<I><\#45><I>d<I> satisfying the condition.\r
+@body:Finally, it is often useful to specify the initial conditions of a system. To say that the cache initially has no addresses, we might write a function imposing this condition on a memory system:\r
+@geekmath:fun Init (s: System) {no s.cache.addrs}\r
+@subsection:4.6        Traces\r
+@noindent:To support analyses of behaviours consisting of sequences of states, we declare two signatures, for ticks of a clock and traces of states:\r
+@geekmath:sig Tick {}<\n> sig SystemTrace {<\n>        ticks: set Tick,<\n>    first, last: ticks,<\n>         next: (ticks <\#45> last) !<\#45>! (ticks <\#45> first)<\n>     state: ticks <\#45>! System}<\n>        {<\n>   first.*next = ticks<\n>         Init (first.state)<\n>  all t: ticks <\#45> last | <\n>                 some s = t.state, s<\#48> = t.next.state |<\n>                  Flush (s,s<\#48>)<\n>                   || (some a: Addr | Load (s,s<\#48>,a))<\n>                      || (some d: Data, a: Addr | SystemWrite (s,s<\#48>,d,a))<\n>    }\r
+@noindent:Each trace consists of a set of <I>ticks<I>, a <I>first<I> and <I>last<I> tick, an ordering relation <I>next<I> (whose declaration makes it a bijection from all ticks except the last to all ticks except the first), and a relation <I>state<I> that maps each tick to a system state.\r
+@body:The fact appended to the signature states first a generic property of traces: that the ticks of a trace are those reachable from the first tick. It then imposes the constraints of the operations on the states in the trace. The initial condition is required to hold in the first state. Any subsequent pair of states is constrained to be related by one of the three side<\#45>effecting operations. The existential quantifier plays the role of a <I>let<I> binding, allowing <I>s<I> and <I>s<\#48><I> in place of <I>t.state<I> and <I>t.next.state<I>, representing the state for tick <I>t<I> and the state for its successor <I>t.next<I>. Note that this formulation precludes stuttering; we could admit it simply by adding the disjunct <I>s<I>=<I>s<\#48><I> allowing a transition that corresponds to no operation occurring.\r
+@body:Bear in mind that this fact is a constraint on all atoms in the set <I>SystemTrace<I>. As a free standing fact, the second line of the fact<\#151>the initial condition<\#151> would have been written:\r
+@geekmath:fact {all x: SystemTrace | Init ((x.first).(x.state))}\r
+@subsection:4.7        Abstraction\r
+@noindent:Abstraction relationships are easily expressed using our function syntax. To show that our memory system refines a simple memory without a cache, we define an abstraction function <I>Alpha<I> saying that a system corresponds to a memory that is like the system<\#48>s memory, overwritten by the entries of the system<\#48>s cache:\r
+@geekmath:fun Alpha (s: System, m: Memory) {<\n>       m.map = s.main.map ++ s.cache.map<\n>   }  As another example, if our linked list were to represent a set, we might define the set corresponding to a given list as that containing the elements reachable from the start:\r
+@geekmath:fun ListAlpha (p: List, s: set Elt) {<\n>    s = p.*rest.elt<\n>     }\r
+@subsection:4.8        Assertions\r
+@noindent:Theorems about a specification are packaged as <I>assertions<I>. An assertion is simply a formula that is intended to hold. A tool can check an assertion by searching for a counterexample<\#151>that is, a model of the formula<\#48>s negation.\r
+@body:The simplest kinds of assertion record consequences of state properties. For example,\r
+@geekmath:assert {<\n>         all s: System | DirtyInv (s) && no s.cache.dirty<\n>            = s.cache.map in s.main.map<\n>         }\r
+@noindent:asserts that if the dirtiness invariant holds,and there are no dirty addresses, then the mapping of addresses to data in the cache is a subset of the mapping in the main memory.\r
+@body:An assertion can express consequences of operations. For example,\r
+@geekmath:assert {<\n>         all s: System, d: Data, a: Addr |<\n>           SystemRead (s,d,a) = a in s.cache.addrs<\n>     }\r
+@noindent:embodies the claim made above that <I>SystemRead<I> has an implicit precondition; it asserts that whenever <I>SystemRead<I> occurs for an address, that address must be in the cache beforehand. An assertion can likewise identify a consequence in the post<\#45>state; this assertion\r
+@geekmath:assert {<\n>         all s,s<\#48>: System, d: Data, a: Addr |<\n>           SystemWrite (s,s<\#48>,d,a) = s<\#48>.cache.map[a] = d<\n>      }  says that after a <I>SystemWrite<I>, the data value appears in the cache at the given address.  Preservation of an invariant by an operation is easily recorded as an assertion. To check that our dirtiness invariant is preserved when writes occur, we would assert\r
+@geekmath:assert {<\n>         all s,s<\#48>: System, d: Data, a: Addr |<\n>           SystemWrite (s,s<\#48>,d,a) && DirtyInv (s) = DirtyInv (s<\#48>)<\n>    }\r
+@noindent:Invariant preservation is not the only consequence of an operation that we would like to check that relates pre<\#45> and post<\#45>states. We might, for example, want to check that operations on the memory system do not change the set of addresses of the main memory. For the <I>Flush<I> operation, for example, the assertion would be\r
+@geekmath:assert {<\n>         all s,s<\#48>: System | Flush(s,s<\#48>) = s.main.addrs = s<\#48>.main.addrs<\n>        }  which holds only because the cache addresses are guaranteed to be a subset of the main memory addresses (by the fact associated with the <I>System<I> signature).\r
+@noindent:The effect of a sequence of operations can be expressed by quantifying appropriately over states. For example,  assert {<\n>         all s, s<\#48>: System, a: Addr, d,d<\#48>: Data | <\n>                 SystemWrite (s,s<\#48>,d,a) && SystemRead (s<\#48>,d<\#48>,a) = d = d<\#48><\n>         }\r
+@noindent:says that when a write is followed by a read of the same address, the read returns the data value just written.\r
+@body:To check that a property holds for all reachable states, we can assert that the property is an invariant of every operation, and is established by the initial condition. This strategy can be shown (by induction) to be sound, but it is not complete. A property may hold for all reachable states, but may not be preserved because an operation breaks the property when executed in a state that happens not to be reachable.\r
+@body:Traces overcome this incompleteness. Suppose, for example, that we want to check the (rather contrived) property that, in every reachable state, if the cache contains an address that isn<\#48>t dirty, then it agrees with the main memory on at least one address:\r
+@geekmath:fun DirtyProp (s: System) {<\n>      some (s.cache.addrs <\#45> s.cache.dirty)<\n>           = some a: Addr | s.cache.map[a] = s.main.map[a]<\n>     }\r
+@noindent:We can assert that this property holds in the last state of every trace:\r
+@geekmath:assert {<\n>         all t: SystemTrace | with t | DirtyProp (last.state)<\n>        }  This assertion is valid, even though <I>DirtyProp<I> is not an invariant. A write invoked in a state in which all clean entries but one had non<\#45>matching values can result in a state in which there are still clean entries but none has a matching value.\r
+@noindent:Finally, refinements are checked by assertions involving abstraction relations. We can assert that a <I>SystemWrite<I> refines a basic <I>Write<I> operation on a simple memory:\r
+@geekmath:assert {<\n>         all s,s<\#48>: System, m,m<\#48>: Memory, a: Addr, d: Data |<\n>                Alpha (s,m) && Alpha (s<\#48>,m<\#48>) && SystemWrite (s,s<\#48>,a,d)<\n>               = Write (m,m<\#48>,a,d)<\n>     }\r
+@noindent:or that the <I>Flush<I> operation is a no<\#45>op when viewed abstractly:\r
+@geekmath:assert {<\n>         all s,s<\#48>: System, m,m<\#48>: Memory |<\n>          Alpha (s,m) && Alpha (s<\#48>,m<\#48>) && Flush (s,s<\#48>)<\n>                 = m.map = m<\#48>.map<\n>       }\r
+@noindent:Note the form of the equality; <I>m = m<\#48><I> would be wrong, since two distinct memories may have the same mapping, and the abstraction <I>Alpha<I> constrains only the mapping and not the memory atom itself.\r
+@body:Many of the assertions shown here can be made more succinct by the function shorthand explained in Section 3.7 below. For example, the assertion that a read following a write returns the value just written becomes:\r
+@geekmath:assert {<\n>         all s: System, a: Addr, d: Data | <\n>          SystemRead (SystemWrite (s,d,a),a) = d<\n>      }\r
+@noindent:and the assertion that <I>Flush<I> is a no<\#45>op becomes:\r
+@geekmath:assert {<\n>         all s: System | Alpha (s).map = Alpha (Flush (s)).map<\n>       }\r
+@subsection:4.9        Polymorphism\r
+@noindent:Signatures can be parameterized by signature types. Rather than declaring a linked list whose elements belong to a particular type <I>Elt<I>, as above, we would prefer to declare a generic list:\r
+@geekmath:sig List [T] {}<\n> sig NonEmptyList [T] extends List [T] {elt: T, rest: List [T]}\r
+@noindent:Functions and facts may be parameterized in the same way, so we can define generic operators, such as:\r
+@geekmath:fun first [T] (p: List [T]): T {result = p.elt}<\n> fun last [T] (p: List [T]): T {some q: p.*rest | result = q.elt && no q.rest}<\n> fun elements [T] (p: List [T]): set T {result = p.*rest.elt}\r
+@noindent:In addition, let<\#48>s define a generic function that determines whether two elements follow one another in a list:\r
+@geekmath:fun follows [T] (p: List[T], a,b: T) {<\n>   some x: p.*rest | x.elt = a && x.next.elt = b<\n>       }\r
+@noindent:To see how a generic signature and operators are used, consider replacing the traces of Section 2.6 with lists of system states. Define a function that determines whether a list is a trace:\r
+@geekmath:fun isTrace (t: List [System]) {<\n>         Init (first(t))<\n>     all s, s<\#48>: System | follows (t,s,s<\#48>) = {<\n>          Flush (s,s<\#48>)<\n>           || (some a: Addr | Load (s,s<\#48>,a))<\n>              || (some d: Data, a: Addr | SystemWrite (s,s<\#48>,d,a))<\n>            }<\n>   }\r
+@noindent:Now our assertion that every reachable system state satisfies <I>DirtyProp<I> can now be written:\r
+@geekmath:assert {<\n>         all t: List[System] | isTrace(t) = DirtyProp (last(t))<\n>      }\r
+@subsection:4.10       Variants\r
+@noindent:To illustrate the flexibility of our notation, we sketch a different formulation of state machines oriented around transitions rather than states.\r
+@body:Let<\#48>s introduce a signature representing state transitions of our memory system:\r
+@geekmath:sig SystemTrans {pre,post: System}<\n>       {pre.main.addrs = post.main.addrs}\r
+@noindent:Declaring the transitions as a signature gives us the opportunity to record properties of all transitions<\#151>in this case requiring that the set of addresses of the main memory is fixed.\r
+@body:Now we introduce a subsignature for the transitions of each operation. For example, the transitions that correspond to load actions are given by:\r
+@geekmath:sig LoadTrans extends SystemTrans {a: Addr}<\n>      {Load (pre, post, a)} \r
+@noindent:For each invariant, we define a set of states. For the states satisfying the dirty invariant, we might declare\r
+@geekmath:sig DirtyInvStates extends System {}\r
+@noindent:along with the fact\r
+@geekmath:fact {DirtyInvStates = {s: System | DirtyInv(s)}}\r
+@noindent:To express invariant preservation, it will be handy to declare a function that gives the image of a set of states under a set of transitions:\r
+@geekmath:fun postimage (ss: set System, tt: set SystemTrans): set System {<\n>        result = {s: System | some t: tt | t.pre in ss && s = t.post}<\n>       }\r
+@noindent:so that we can write the assertion like this:\r
+@geekmath:assert {postimage (DirtyInvStates, LoadTrans) in DirtyInvStates}\r
+@noindent:For an even more direct formulation of state machine properties, wemight have defined a  transition relation instead:\r
+@geekmath:fun Trans (r: System <\#45> System) {<\n>    all s, s<\#48> : System | <\n>          s<\#45>s<\#48> in r = Flush (s,s<\#48>) || <\#133><\n>          }\r
+@noindent:Then, using transitive closure, we can express the set of states reachable from an initial state, and assert that this set belongs to the set characterized by some property:\r
+@geekmath:assert {all r: System <\#45> System, s: System |<\n>         Init (s) && Trans(r) = s.*r in DirtyPropStates<\n>      }\r
+@noindent:where <I>DirtyPropStates<I> is defined analogously to <I>DirtyInvStates<I>.\r
+@subsection:4.11       Definitions\r
+@noindent:Instead of declaring the addresses of a memory along with its mapping, as we did before:\r
+@geekmath:sig Memory {<\n>     addrs: set Addr,<\n>    map: addrs <\#45>! Data<\n>     }\r
+@noindent:we could instead have declared the mapping alone:\r
+@geekmath:sig Memory {<\n>     map: Addr <\#45>? Data<\n>      }\r
+@noindent:and then <I>defined<I> the addresses using a subsignature:\r
+@geekmath:sig MemoryWithAddrs extends Memory {<\n>     addrs: set Addr}<\n>    {addrs = {a: Addr | some a.map}}  Now by making the subsignature subsume all memories:\r
+@geekmath:fact {Memory in MemoryWithAddrs}\r
+@noindent:we have essentially <\#145>retrofitted<\#146> the field. Any formula involving memory atoms now implicitly constrains the <I>addrs<I> field. For example, we can assert that <I>Read<I> has an implicit precondition requiring that the argument be a valid address:\r
+@geekmath:assert {all m: Memory, a: Addr, d: Data | Read (m,d,a) = a in m.addrs}\r
+@noindent:even though the specification of <I>Read<I> was written when the field <I>addrs<I> did not even exist.\r
+@section:5     Semantics\r
+@noindent:For completeness, we give an overview of the semantics of the language. The novelties with respect to the original version of Alloy [4] are (1) the idea of organizing relations around basic types as signatures, (2) the treatment of extension as subsetting, and (3) the packaging of formulas in a more explicit (and conventional) style. The semantic basis has been made cleaner, by generalizing relations to arbitrary arity, eliminating <\#145>indexed relations<\#146> and the need for a special treatment of sets.\r
+@subsection:5.1        Types\r
+@noindent:We assume a universe of atoms. The standard notion of a mathematical relation gives us our only composite datatype. The value of an expression will always be a relation<\#151>that is, a collection of tuples of atoms. Relations are first order: the elements of a tuple are themselves atoms and never relations.\r
+@body:The language is strongly typed. We partition the universe into subsets each associated with a <I>basic<I> type, and write (T<I>1, T<I>2, <\#133>, T<I>n) for the type of a relation whose tuples each consist of <I>n<I> atoms, with types T<I>1, T<I>2, etc.\r
+@body:A set is represented semantically as a unary relation, namely a relation whose tuples each contain one atom. A tuple is represented as a singleton relation, namely a relation containing exactly one tuple. A scalar is represented as a unary, singleton relation. We use the terms <\#145>set<\#146>, <\#145>tuple<\#146> and <\#145>scalar<\#146> to describe relations with the appropriate properties. Basic types are used only to construct relation types, and every expression that appears in a specification has a relational type. Often we will say informally that an expression has a type <I>T<I> where <I>T<I> is the name of a basic type when more precisely we mean that the expression has the type (<I>T<I>).\r
+@body:So, in contrast to traditional mathematical style, we do not make distinctions amongst the atom <I>a<I>, the tuple (<I>a<I>), the set {<I>a<I>} containing just the atom, or the set {(<I>a<I>)} containing the tuple, and represent all of these as the last. This simplifies the semantics and gives a more succinct and uniform syntax. \r
+@subsection:5.2        Expression Operators\r
+@noindent:Expressions can be formed using the standard set operators written as ASCII characters: union (+), intersection (&) and difference (<\#45>). Some standard relational operators, such as transpose (~) and transitive closure (^), can be applied to expressions that denote binary relations. Relational override (++) has its standard meaning for binary relations but can applied more broadly. \r
+@body:There are two special relational operators, dot and arrow. The dot operator is a generalized relational composition. Given expressions <I>p<I> and <I>q<I>, the expression <I>p<I>.<I>q<I> contains the tuple <f"Symbol"><\#225><f$><I>p<I><->1<->, <\#133> <I>p<I><-><I>m<I><\#45>1<->, <I>q<I><->2<->, <\#133>, <I>q<I><-><I>n<I><-><f"Symbol"><\#241><f$> when <I>p<I> contains @math @sep p<I>1, <\#133>, p<I>{m}, <I>q<I> contains @math @sep q<I>1, <\#133> q<I>n, and @math p<I>m = q<I>1. The last type of <I>p<I> and the first type of <I>q<I> must match, and <I>m<I> + <I>n<I>, the sum of the arities of <I>p<I> and <I>q<I>, must be three or more so that the result is not degenerate. When <I>p<I> is a set and <I>q<I> is a binary relation, the composition <I>p.q<I> is the standard relational image of <I>p<I> under <I>q<I>; when <I>p<I> and <I>q<I> are both binary relations, <I>p.q<I> is standard relational composition. In all of the examples above, the dot operator is used only for relational image.\r
+@body:The arrow operator is cross product: <I>p  q<I> is the relation containing the tuple @math @sep p<I>1, <\#133>, p<I>{m}, q<I>1, <\#133> q<I>n when <I>p<I> contains @math @sep p<I>1, <\#133>, p<I>{m}, and <I>q<I> contains @math @sep q<I>1, <\#133> q<I>n. In all the examples in this paper, <I>p<I> and <I>q<I> are sets, and <I>p  q<I> is their standard cross product.\r
+@subsection:5.3        Formula Operators\r
+@noindent:Elementary formulas are formed from the subset operator, written <I>in<I>. Thus <I>p in q<I> is true when every tuple in <I>p<I> is in <I>q<I>. The formula <I>p : q<I> has the same meaning, but when <I>q<I> is a set, adds an implicit constraint that <I>p<I> be scalar (ie, a singleton). This constraint is overridden by writing <I>p: option q<I> (which lets <I>p<I> to be empty or a scalar) or <I>p: set q<I> (which eliminates the constraint entirely). Equality is just standard set equality, and is short for a subset constraint in each direction.\r
+@body:An arrow that appears as the outermost expression operator on the right<\#45>hand side of a subset formula can be annotated with <I>multiplicity markings<I>: + (one or more), ? (zero or one) and ! (exactly one). The formula\r
+@geekmath:r: S m  n T\r
+@noindent:where <I>m<I> and <I>n<I> are multiplicity markings constrains the relation <I>r<I> to map each atom of <I>S<I> to <I>n<I> atoms of <I>T<I>, and to map <I>m<I> atoms of <I>S<I> to each atom of <I>T<I>. <I>S<I> and <I>T<I> may themselves be product expressions, but are usually variables denoting sets. For example,\r
+@geekmath:r: S  ! T<\n> r: S ?  ! T\r
+@noindent:make <I>r<I> respectively a total function on <I>S<I> and an injection.\r
+@body:Larger formulas are obtained using the standard logical connectives: && (and), || (or), ! (not), =<I> (implies), iff<I> (bi<\#45>implication). The formula <I>if b then f else g<I> is short for <I>b<I> =<I> f<I> && !<I>b<I> =<I> g<I>. Within curly braces, consecutive formulas are implicitly conjoined.\r
+@body:Quantifications take their usual form:\r
+@geekmath:all x: e | F\r
+@noindent:is true when the formula <I>F<I> holds under every binding of the variable <I>x<I> to a member of the set <I>e<I>.  In addition to the standard quantifiers,  <I>all<I> (universal) and <I>some<I> (existential), we have <I>no<I>, <I>sole<I> and <I>one<I> meaning respectively that there are no values, at most one value, and exactly one value satisfying the formula. For a quantifier <I>Q<I> and expression <I>e<I>, the formula <I>Q e<I> is short for <I>Q x: T | e<I> (where <I>T<I> is the type of <I>e<I>), so <I>no e<I>, for example, says that <I>e<I> is empty.\r
+@body:The declaration of a quantified formula is itself a formula<\#151>an elementary formula in which the left<\#45>hand side is a variable. Thus\r
+@geekmath:some x = e | F\r
+@noindent:is permitted, and is a useful way to express a <I>let<I> binding. Quantifiers may be higher<\#45>order; the formula\r
+@geekmath:all f: s <\#45><I>! t | F\r
+@noindent:is true when F<I> holds for every binding of a total function from <I>s<I> to <I>t<I> to the variable <I>f<I>. Our analysis tool cannot currently handle higher<\#45>order quantifiers, but many uses of higher<\#45>order quantifiers that arise in practice can be eliminated by skolemization.\r
+@body:Finally, we have relational comprehensions; the expression\r
+@geekmath:{x<I>1: e<I>1, x<I>2: e<I>2, <\#133> | F}\r
+@noindent:constructs a relation of tuples with elements <I>x<I>1<I>, <I>x<I>2<I>, etc., drawn from set expressions <I>e<I>1<I>, <I>e<I>2<I>, etc., whose values satisfy <I>F<I>.\r
+@body:Signatures\r
+@noindent:A <I>signature<I> declaration introduces a basic type, along with a collection of relations called <I>fields<I>. The declaration\r
+@geekmath:sig S {f: E}\r
+@noindent:declares a basic type <I>S<I>, and a relation <I>f<I>. If <I>E<I> has the type (T<I>1, T<I>2, <\#133>, T<I>n), the relation <I>f<I> will have the type (S, T<I>1, T<I>2, <\#133>, T<I>n), and if <I>x<I> has the type <I>S<I>, the expression <I>x.f<I> will have the same type as <I>E<I>. When there are several fields, field names already declared may appear in expressions on the right<\#45>hand side of declarations; in this case, a field <I>f<I> is typed as if it were the expression <I>this.f<I>, where <I>this<I> denotes an atom of the signature type (see Section 3.6).\r
+@body:The meaning of a specification consisting of a collection of signature declarations is an assignment of values to global constants<\#150> the signatures and the fields. For example, the specification\r
+@geekmath:sig Addr {}<\n> sig Data {}<\n> sig Memory {map: Addr <\#45><I> Data}\r
+@noindent:has 4 constants<\#151>the three signatures and one field<\#151>with assignments such as:\r
+@geekmath:Addr = {a0, a1}<\n> Data = {d0, d1, d2}<\n> Memory = {m0, m1}<\n> map = {(m0,a0,d0), (m1,a0,d1), (m1,a0,d2)}\r
+@noindent:corresponding to a world in which there are 2 addresses, 3 data values and 2 memories, with the first memory (m0<I>) mapping the first address (<I>a0<I>) to the first data value (<I>d0<I>), and the second memory (<I>m1<I>) mapping the first address (<I>a0<I>) both to the second (<I>d1<I>) and third (<I>d2<I>) data values.\r
+@body:A fact is a formula that constrains the constants of the specification, and therefore tends to reduce the set of assignments denoted by the specification. For example,\r
+@geekmath:fact {all m: Memory | all a: Addr | sole m.map[a]}\r
+@noindent:rules out the above assignment, since it does not permit a memory (such as <I>m1<I>) to map an address (such as <I>a0<I>) to more than one data value.  The meaning of a function is a set of assignments, like the meaning of the specification as a whole, but these include bindings to parameters. For example, the function\r
+@geekmath:fun Read (m: Memory, d: Data, a: Addr) {<\n>         d = m.map[a]<\n>        }\r
+@noindent:has assignments such as:\r
+@geekmath:Addr = {a0, a1}<\n> Data = {d0, d1, d2}<\n> Memory = {m0, m1}<\n> map = {(m0,a0,d1)}<\n> m = {m0}<\n> d = {d1}<\n> a = {a0}\r
+@noindent:The assignments of a function representing a state invariant correspond to states satisfying the invariant; the functions of a function representing an operation (such as <I>Read<I>) correspond to executions of the operation.\r
+@body:An assertion is a formula that is claimed to be <I>valid<I>: that is, true for every assignment that satisfies the facts of the specification. To check an assertion, one can search for a <I>counterexample<I>: an assignment that makes the formula false. For example, the assertion\r
+@geekmath:assert {<\n>         all m,m<\#48>: Memory, d: Data, a: Addr | Read (m,d,a) =<I> Read (m<\#48>,d,a)}\r
+@noindent:which claims, implausibly, that if a read of memory m<I> returns <I>d<I> at <I>a<I>, then so does a read at memory <I>m<\#48><I>, has the counterexample\r
+@geekmath:Addr = {a0}<\n> Data = {d0,d1}<\n> Memory = {m0, m1}<\n> map = {(m0,a0,d0), (m1,a0,d1)}\r
+@noindent:To find a counterexample, a tool should negate the formula and then skolemize away the bound variables, treating them like the parameters of a function, with values to be determined as part of the assignment. In this case, the assignment might include:\r
+@geekmath:m = {m0}<\n> m<\#48> = {m1}<\n> d = {d0}<\n> a = {a0}\r
+@subsection:5.4        Extension\r
+@noindent:Not every signature declaration introduces a new basic type. A signature declared without an extension clause is a <I>type signature<I>, and creates both a basic type and a set constant of the same name. A signature <I>S<I> declared as an extension is a <I>subsignature<I>, and creates only a set constant, along with a constraint making it a subset of each <I>supersignature<I> listed in the extension clause. The subsignature takes on the type of the supersignatures, so if there is more than one, they must therefore have the same type, by being direct or indirect subsignatures of the same type signature.\r
+@body:A field declared in a subsignature is as if declared in the corresponding type signature, with the constraint that the domain of the field is the subsignature. For example,\r
+@geekmath:sig List {}<\n> sig NonEmptyList extends List {elt: Elt,rest: List}\r
+@noindent:makes <I>List<I> a type signature, and <I>NonEmptyList<I> a subset of <I>List<I>. The fields <I>elt<I> and <I>rest<I> map atoms from the type <I>List<I>, but are constrained to have domain <I>NonEmptyList<I>. Semantically, it would have been equivalent to declare them as fields of <I>List<I>, along with facts constraining their domains:\r
+@geekmath:sig List {elt: Elt,rest: List}<\n> sig NonEmptyList extends List {}<\n> fact {elt.Elt in NonEmptyList}<\n> fact {rest.List in NonEmptyList}\r
+@noindent:(exploiting our dot notation to write the domain of a relation <I>r<I> from <I>S<I> to <I>T<I> as <I>r.T<I>).\r
+@subsection:5.5        Overloading and Implicit Prefixing\r
+@noindent:Whenever a variable is declared, its type can be easily obtained from its declaration (from the type of the expression on the right<\#45>hand side of the declaration), and every variable appearing in an expression is declared in an enclosing scope. The one complication to this rule is the typing of fields.\r
+@body:For modularity, a signature creates a local namespace. Two fields with the name <I>f<I> appearing in different signatures do not denote the same relational constant. Interpreting an expression therefore depends on first resolving any field names that appear in it. #We have devised a simple resolution scheme whose details are beyond the scope of this paper. In an expression of the form <I>e.f<I>, the signature to which <I>f<I> belongs is determined according to the type of <I>e<I>. To keep the scheme simple, we require that sometimes the specifier resolve the overloading explicitly by writing the field <I>f<I> of signature <I>S<I> as <I>S<I>f<I><I>. (<I>At<I> <I>the<I> <I>end<I> <I>of<I> <I>the<I> <I>previous<I> <I>section<I>, <I>for<I> <I>example<I>, <I>the<I> <I>reference<I> <I>in<I> <I>the<I> <I>fact<I> <I>to<I> <I><I>rest<I><I> <I>should<I> <I>actually<I> <I>be<I> <I>to<I> <I><I>List<I>rest<I>, since the context does not indicate which signature <I>rest<I> belongs to.)\r
+@body:In many formulas, a single expression is dereferenced several times with different fields. A couple of language features are designed to allow these formulas to be written more succinctly, and, if used with care, more comprehensibly.  First, we provide two syntactic variants of the dot operator. Both <I>p<I>::<I>q<I> and <I>q<I>[<I>p<I>] are equivalent to <I>p.q<I>, but have different precedence: the double colon binds more tightly than the dot, and the square brackets bind more loosely than the dot. Second, we provide a <I>with<I> construct similar to Pascal<\#48>s that makes dereferencing implicit.\r
+@body:Consider, for example, the following simplified signature for a trace:\r
+@geekmath:sig Trace {<\n>      ticks: set Tick,<\n>    first: Tick,<\n>        next: Tick <\#45><I> Tick,<\n>  state: Tick <\#45> State<\n>    }\r
+@noindent:Each trace t<I> has a set of ticks <I>t.ticks<I>, a first tick <I>t.first<I>, an ordering <I>t.next<I> that maps ticks to ticks, and a relation <I>t.state<I> mapping each tick to a state. For a trace <I>t<I> and tick <I>k<I>, the state is <I>k<I>.(<I>t.state<I>); the square brackets allow this expression to be written instead as <I>t.state<I>[<I>k<I>]. To constrain <I>t.ticks<I> to be those reachable from <I>t. first<I> we might write:\r
+@geekmath:fact {all t: Trace | (t.first).*(t.next ) = t.ticks}\r
+@noindent:Relying on the tighter binding of the double colon, we can eliminate the parentheses:\r
+@geekmath:fact {all t: Trace | t::first.*t::next = t.ticks}\r
+@noindent:Using <I>with<I>, we can make the <I>t<I> prefixes implicit:\r
+@geekmath:fact {all t: Trace | with t | first.*next = ticks}\r
+@noindent:In general, <I>with e | F<I> is like <I>F<I>, but with <I>e<I> prefixed wherever appropriate to a field name. Appropriateness is determined by type: <I>e<I> is matched to any field name with which it can be composed using the dot operator. A fact attached to a signature <I>S<I> is implicitly enclosed by <I>all this: S | with this |<I>, and the declarations of a signature are interpreted as constraints as if they had been declared within this scope. Consequently, the declaration of <I>first<I> above should be interpreted as if it were the formula:\r
+@geekmath:all this: Trace | with this | first: ticks\r
+@noindent:which is equivalent to\r
+@geekmath:all this: Trace | this.first: this.ticks\r
+@noindent:and should be typed accordingly. \r
+@subsection:5.6        Function Applications\r
+@noindent:A function may be applied by binding its parameters to expressions. The resulting application may be either an expression or a formula, but in both cases the function body is treated as a formula. The formula case is simple: the application is simply short for the body with the formal parameters replaced by the actual expressions (and bound variables renamed where necessary to avoid clashes).\r
+@body:The expression case is more interesting. The application is treated as a syntactic sugar. Suppose we have a function application expression, <I>e<I> say, of the form\r
+@geekmath:f(a<I>1, a<I>2, <\#133>, a<I>n)\r
+@noindent:that appears in an elementary formula <I>F<I>. The declaration of the function <I>f<I> must list <I>n<I> + 1 formal arguments, of which the <I>second<I> will be treated as the result. The entire elementary formula is taken to be short for\r
+@geekmath:all result: D | f (a<I>1, result, a<I>2, <\#133>, a<I>n) =<I> F [result/e]\r
+@noindent:where D<I> is the right<\#45>hand side of the declaration of the missing argument, and <I>F<I> [<I>result<I>/<I>e<I>] is <I>F<I> with the fresh variable <I>result<I> substituted for the application expression <I>e<I>. The application of <I>f<I> in this elaborated formula is now a formula, and is treated simply as an inlining of the formula of <I>f<I>.\r
+@body:To see how this works, consider the definition of a function <I>dom<I> that gives the domain of a relation over signature <I>X<I>:\r
+@geekmath:fun dom (r: X <\#45><I> X, d: set X) {d = r.X}\r
+@noindent:(We have defined the function monomorphically for a homogeneous relation. In practice, one would define a polymorphic function, but we want to avoid conflating two unrelated issues.) Here is a trivial assertion that applies the function as an expression:\r
+@geekmath:assert {all p: X  X | (dom (p)).p in X}\r
+@noindent:Desugaring the formula, we get\r
+@geekmath:all p: X  X | all result: set X | dom (p, result) = result.p in X\r
+@noindent:and then inlining\r
+@geekmath:all p: X  X | all result: set X | result = p.X = result.p in X\r
+@noindent:This formula can be reduced (by applying a universal form of the One Point Rule) to\r
+@geekmath:all p: X  X | (p.X).p in X\r
+@noindent:which is exactly what would have been obtained had we just replaced the application expression by the expression on the right<\#45>hand side of the equality in the function<\#48>s definition! \r
+@body:Now let<\#48>s consider an implicit definition. Suppose we have a signature X<I> with an ordering <I>lte<I>, so that <I>e.lte<I> is the set of elements that <I>e<I> is less than or equal to, and a function <I>min<I> that gives the minimum of a set, defined implicitly as the element that is a member of the set, and less than or equal to all members of the set:\r
+@geekmath:sig X {lte: set X}<\n> fun min (s: set X, m: option X) {<\n>         m in s && s in m.lte<\n>        }\r
+@noindent:Because the set may be empty, <I>min<I> is partial. Depending on the properties of <I>lte<I> it may also fail to be deterministic. A formula that applies this function\r
+@geekmath:assert {all s: set X | min (s) in s}\r
+@noindent:can as before be desugared\r
+@geekmath:all s: set X | all result: option X | min (s, result) =<I> result in s\r
+@noindent:and expanded by inlining\r
+@geekmath:all s: set X | all result: option X |<\n>    (result in s) && s in result.lte = result in s\r
+@noindent:but in this case the One Point Rule is not applicable.\r
+@body:As a convenience, our language allows the result argument of a function to be declared anonymously in a special position, and given the name result<I>. The domain function, for example, can be defined as:\r
+@geekmath:fun dom (r: X <\#45><I> X): set X {result = r.X}\r
+@noindent:How the function is defined has no bearing on how it is used; this definition is entirely equivalent to the one above, and can also be applied as a formula with two arguments.\r
+@subsection:5.7        Polymorphism\r
+@noindent:Polymorphism is treated as a syntactic shorthand. Lack of space does not permit a full discussion here.\r
+@section:6     Related Work\r
+@noindent:We have shown how a handful of elements can be assembled into a rather simple but flexible notation. The elements themselves are far from novel<\#151>indeed, we hope that their familiarity will make the notation easy to learn and use<\#151>but their assembly into a coherent whole results in a language rather different from existing specification languages.\r
+@subsection:6.1        New Aspects\r
+@noindent:The more novel aspects of our work are:\r
+@point:\alpha 6.1.A    Objectification of state<I>. Most specification languages represent states as cartesian products of components; in our approach, a state, like a member of any signature, is an individual<\#151>a distinct atom with identity. A similar idea is used in the situation calculus [11], whose <\#145>relational fluents<\#146> add a situation variable to each time<\#45>varying relation. The general idea of objectifying all values is of course the foundation of object<\#45>oriented programming languages, and was present in LISP. Interestingly, object<\#45>oriented variants of Z (such as [1]) do not objectify schemas. The idea of representing structures in first<\#45>order style as atoms is present also in algebraic specifications such as Larch [2], which treat even sets and relations in this manner.\r
+@point:\alpha 6.1.B    <I>Components as relations<I>. Interpreting fields of a structure as functions goes back to early work on verification, and is widely used (for example, by Leino and Nelson [10]). We are not aware, however, of specification languages that use this idea, or that flatten fields to relations over atoms.\r
+@point:\alpha 6.1.C    <I>Extension by global axioms<I>. The <\#145>facts<\#146> of our notation allow the properties of a signature to be extended monotonically. The idea of writing axioms that constrain the members of a set constant declared globally is hardly remarkable, but it appears not to have been widely exploited in specification languages.\r
+@point:\alpha 6.1.D    <I>Extension by subset<I>. Treating the extension of a structure as a refinement modelled by subset results in a simple semantics, and melds well with the use of global axioms. Again, this seems to be an unremarkable idea, but one whose power has not been fully recognized.\r
+@subsection:6.2        Old Aspects\r
+@noindent:The aspects of our work that are directly taken from existing languages are:\r
+@point:\alpha 6.2.A    <I>Formulas<I>. The idea of treating invariants, definitions, operations, etc, uniformly as logical formulas is due to Z [14].\r
+@point:\alpha 6.2.B    <I>Assertions<I>. Larch [2] provides a variety of constructs for adding intentional redundancy to a specification in order to provide error<\#45>detection opportunities.       <I>Parameterized formulas<I>. The <\#145>functional<\#146> style we have adopted, in which all formulas are explicitly parameterized, in contrast to the style of most specification languages, is used also by languages for theorem provers, such as PVS [13]. VDM [8] offers a mechanism called <\#145>operation quotation<\#146> in which pre<\#45> and post conditions are reused by interpreting them as functions similar to ours.\r
+@point:\alpha 6.2.C    <I>Parametric Polymorphism<I>. The idea of parameterizing descriptions by types was developed in the programming languages community, most notably in the context of ML [12].\r
+@point:\alpha 6.2.D    <I>Implicit Prefixing<I>. Our <\#145>with<\#146> operator is taken from Pascal [9].\r
+@point:\alpha 6.2.E    <I>Relational operators<I>. The dot operator, and the treament of scalars as singletons, comes from the earlier version of Alloy [4]. \r
+@subsection:6.3        Z<\#48>s Schema Calculus\r
+@noindent:Z has been a strong influence on our work; indeed, this paper may be viewed as an attempt to achieve some of the power and flexibility of Z<\#48>s schema calculus in a first<\#45>order setting. Readers unfamiliar with Z can find an excellent presentation of the schema calculus in [16]. The current definitive reference is [15], although Spivey<\#48>s manual [14] is more accessible for practioners.\r
+@body:A <I>schema<I> consists of a collection of variable declarations and a formula constraining the variables. Schemas can be anonymous. When a name has been bound to a schema, it can be used in three different ways, distinguished according to context. First, it can be used as a <I>declaration<I>, in which case it introduces its variables into the local scope, constraining them with its formula. Second, where the variables are already in scope, it can be used as a <I>predicate<I>, in which case the formula applies and no new declarations are added. Both of these uses are syntactic; the schema can be viewed as a macro.\r
+@body:In the third use, the schema is semantic. Its name represents a set of <I>bindings<I>, each binding being a finite function from variables names to values. The bindings denoted by the schema name are the models of the schema<\#48>s formula: those bindings of variable names to values that make the formula true.\r
+@body:How a schema is being applied is not always obvious; in the set comprehension {<I>S<I>}, for example, <I>S<I> represents a declaration, so that the expression as a whole denotes the same set of bindings as <I>S<I> itself. Given a binding <I>b<I> for a schema with component variable <I>x<I>, the expression <I>b.x<I> denotes the value assigned to <I>x<I> in <I>b<I>. Unlike Alloy<\#48>s dot, this dot is a function application, so for a set of bindings <I>B<I>, the expression <I>B.x<I> is not well formed.\r
+@body:Operations in Z are expressed using the convention that primed variables denote components of the post<\#45>state. A mechanism known as <I>decoration<I> allows one to write <I>S<\#48><I> for the schema that is like <I>S<I>, but whose variable names have been primed. Many idioms, such as promotion, rely on being able to manipulate the values of a schema<\#48>s variables in aggregate. To support this, Z provides the theta operator: <f"Symbol"><\#113><f$> @sep <I>S<I> is an expression that denotes a binding in which each variable <I>x<I> that belongs to <I>S<I> is bound to a variable of the same name <I>x<I> declared in the local scope. Theta and decoration interact subtly: <f"Symbol"><\#113><f$> @sep <I>S<\#48><I> is not a binding of <I>S<\#48><I>, but rather binds each variable <I>x<I> of <I>S<I> to a variable <I>x<\#48><I> declared locally. So where we would write <I>s=s<\#48><I> to say that pre<\#45> and post<\#45>states <I>s<I> and <I>s<\#48><I> are the same, a Z specifier would write <f"Symbol"><\#113><f$> @sep <I>S<I> = <f"Symbol"><\#113><f$> @sep <I>S<\#48><I>. This formula equates each component <I>x<I> of <I>S<I> to its matching component <I>x<\#48><I> of <I>S<\#48><I>, because <I>x<I> and <I>x<\#48><I> are the respective values bound to <I>x<I> by <f"Symbol"><\#113><f$> @sep <I>S<I> and <f"Symbol"><\#113><f$> @sep <I>S<\#48><I> respectively.\r
+@body:Our <\#145>fact<\#146> construct allows the meaning of a signature name to be constrained subsequent to its declaration. A schema, in contrast, is <\#145>closed<\#146>: a new schema name must be introduced for each additional constraint. This can produce an undesirable proliferation of names for a system<\#48>s state, but it does make it easier to track down those formulas that affect a schema<\#48>s meaning.\r
+@body:The variables of a schema can be renamed, but cannot be replaced by arbitrary expressions (since this would make nonsense of declarations).This requires the introduction of existential quantifiers where in our notation an expression is passed as an actual. On the other hand, when no renaming is needed, it is more succinct.\r
+@body:Z<\#48>s sequential composition operator is defined by a rather complicated transformation, and relies on adherence to particular conventions. The schema <I>P<I> @sep  @sep <I>Q<I> is obtained by collecting primed variables in <I>P<I> that match unprimed variables in <I>Q<I>; renaming these in both <I>P<I> and <I>Q<I> with a new set of variable names; and then existentially quantifying the new names away. For example, to say that a read following a write to the same address yields the value written, we would write:\r
+@geekmath:all m: Memory, a: Addr, d, d<\#48>: Data | Read (Write(m,a,d),d<\#48>) =<I> d = d<\#48>\r
+@noindent:which is short for\r
+@geekmath:all m: Memory, a: Addr, d, d<\#48>: Data |<\n>       all m<\#48>: Memory | Write (m,m<\#48>,a,d) = Read (m,a,d<\#48>) = d = d<\#48>\r
+@noindent:In Z, assuming appropriate declarations of a schema Memory<I> and a given type <I>Data<I>, the formula would be:\r
+@geekmath: Memory; Memory<\#48>; x!: Data  Write  Read [x!/d!]  x! = d!\r
+@noindent:which is short for\r
+@geekmath: Memory; Memory<\#48>; x!: Data  <\n>         Memory<\#48><\#145>  <\n>               Memory<\#146>  Write  <f"Symbol"><\#113><f$> @sep Memory<\#48> = <f"Symbol"><\#113><f$> @sep Memory<\#48><\#145><\n>            Memory<\#146>; d!: Data  <\n>                  Read  <f"Symbol"><\#113><f$> @sep Memory = <f"Symbol"><\#113><f$> @sep Memory<\#48><\#145>  d! = x!<\n>          x! = d!\r
+@noindent:The key semantic difference between signatures and schemas is this. A signature is a set of atoms; its fields are relational constants declared in global scope. A schema, on the other hand, denotes a higher<\#45>order object: a set of functions from field names to values. Our approach was motivated by the desire to remain first order, so that the analysis we have developed [3] can be applied. Not surprisingly, there is a cost in expressiveness. We cannot express higher<\#45>order formulas, most notably those involving preconditions. Suppose we want to assert that our write operation has no implicit precondition. In Z, such an assertion is easily written:\r
+@geekmath: Memory; a?: Addr    Memory<\#48>; d!: Data  Write\r
+@noindent:We might attempt to formulate such an assertion in our notation as follows:\r
+@geekmath:assert {<\n>         all m: Memory, a: Addr, d: Data | some m<\#48>: Memory | Write (m,m<\#48>,d,a)  }\r
+@noindent:Unfortunately, this has counterexamples such as\r
+@geekmath:Addr = {a0}<\n> Data = {d0}<\n> Memory = {m0, m1}<\n> map = {}\r
+@noindent:in which the <I>map<I> relation lacks an appropriate tuple. Intuitively, the assertion claims that there is no context in which a write cannot proceed; a legitimate counterexample<\#151>but one we certainly did not intend<\#151>simply gives a context in which a memory with the appropriate address<\#45>value mapping is not available.\r
+@body:We have focused in this discussion on schemas. It is worth noting that Z is expressive enough to allow a style of structuring almost identical to ours, simply by declaring signatures as given types, fields and functions as global variables, and by writing facts, and the bodies of functions, as axioms. Field names would have to be globally unique, and the resulting specification would likely be less succinct than if expressed in our notation.\r
+@subsection:6.4        Phenomenology\r
+@noindent:Pamela Zave and Michael Jackson have developed an approach to composing descriptions [18] that objectifies states, events and time intervals, and constrains their properties with global axioms. Objectification allows descriptions to be reduced to a common phenomenology, so that descriptions in different languages, and even in different paradigms can be combined. Michael Jackson has argued separately for the importance of objectification as a means of making a more direct connection between a formal description and the informal world: as he puts it, <\#147>domain phenomena are facts about individuals<\#148> [7]. It is reassuring that the concerns of language design and tractability of analysis that motivated our notation are not in conflict with sound method, and it seems that our notation would be a good choice for expressing descriptions in the form that Zave and Jackson have proposed.\r
+@section:7     Evaluation\r
+@subsection:7.1        Merits\r
+@noindent:The key motivations of the design of our mechanism have been minimality and flexibility. It is worth noting how this has been achived by the <I>omission<I> of certain features:\r
+@point:\alpha 7.1.A    There is only one form of semantic structuring; our opinion is that adding extra mechanisms, for example to group operations into classes, does not bring enough benefit to merit the additional complexity, and tends to be inflexible. (Our language does provide some namespace control for signature and paragraph names in the style of Java packages, but this is trivial and does not interact with the basic mechanism).\r
+@point:\alpha 7.1.B    There is no subtyping; subsignatures are just subsets of their supersignatures, and have the same type. There are only two types: basic types (for signatures), and relational types (for expressions). Types are not nested.\r
+@point:\alpha 7.1.C    There is only one way that formulas are packaged for reuse. The same function syntax is used for observers, operations, refinement relations, etc. The function shorthand syntax unifies the syntax of both declaration and use for explicit and implicit function definitions.\r
+@point:\alpha 7.1.D    The values of a signature with fields are just like the values of any basic type; there is nothing like Z<\#48>s notion of a schema binding.\r
+@noindent:Our interpretation of a subsignature as a subset of the supersignature appears to be novel as a mechanism for structuring in a specification language. It has three nice consequences:\r
+@point:\alpha 7.1.E    <I>Elimination of type coercions<I>. If <I>x<I> belongs to a signature <I>S<I> whose extension <I>S<\#48><I> defines a field <I>f<I>, the expression <I>x.f<I> will just denote an empty set if <I>x<I> does not belong to <I>S<\#48><I>. Contrast this with the treatment of subclasses in the Object Constraint Language [17], for example, which results in pervasive coercions and often prevents the use of set and relation operators (since elements must be coerced one at a time).\r
+@point:\alpha 7.1.F    <I>Ease of extension<I>. Constraints can be added to the subsignature simply by writing a constraint that is universally quantified over elements of that subset.\r
+@point:\alpha 7.1.G    <I>Definitional extension<I>. We can declare an extension <I>S<\#48><I> of a signature <I>S<I> with additional fields, relate these fields to the fields declared explicitly for <I>S<I>, and then record the fact that <I>S=S<\#48><I> (as illustrated in Section 2.11). The effect is that every atom of <I>S<I> has been extended with appropriately defined fields, which can be accessed whenever an expression denoting such an atom is in scope! We expect to find this idiom especially useful for defining additional fields for visualization purposes.\r
+@subsection:7.2        Deficiencies\r
+@noindent:One might wonder whether, having encoded structures using atoms, and having provided quantifiers over those atoms, one can express arbitrary properties of higher<\#45>order structures. Unfortunately, but not surprisingly, this is not possible. The catch is that fields are treated in any formulas as global variables that are existentially quantified. To simulate higher<\#45>order logic, it would be necessary to allow quantifications over these variables, and since they have relational type, that would imply higher<\#45>order quantification. The practical consequence is that properties requiring higher<\#45>order logic cannot be expressed. One cannot assert that the precondition of an operation is no stronger than some predicate; one cannot in general specify operations by minimization; and one cannot express certain forms of refinement check. An example of this problem is given in Section 4.3 above. Whether the problem is fundamental or can be partially overcome remains to be seen.\r
+@body:The treatment of subsignatures as subsets has a nasty consequence. Since a field declared in a subsignature becomes implicitly a field of the supersignature, two subsignatures cannot declare fields of the same name. The extension mechanism is therefore not properly modular, and a specification should use hierarchical structure instead where this matters.\r
+@body:Modelling a set of states as atoms entails a certain loss of abstraction. In this specification\r
+@geekmath:sig A {}<\n> sig S {a: A}<\n> fun op (s,s<\#48>: S) {s.a = s<\#48>.a}\r
+@noindent:the operation <I>op<I> has executions in which the pre<\#45> and post<\#45>states are equal (that is, the same atom in <I>S<I>), and executions in which only their <I>a<I> components are equal. One might object that this distinction is not observable. Moreover, replacing the formula by <I>s=s<\#48><I> would arguably be an overspecification<\#151>a <\#145>bias<\#146> in VDM terminology [8]. The situation calculus [11] solves this problem by requiring every operation to produce a state change: <I>s<I> and <I>s<\#48><I> are thus regarded as distinct situations by virtue of occurring at different points in the execution. The dual of this solution is to add an axiom requiring that no two distinct atoms of <I>S<I> may have equal <I>a<I> fields. Either of these solutions is easily imposed in our notation.\r
+@body:Our treatment of scalars and sets uniformly as relations has raised the concern that the resulting succinctness comes with a loss of clarity and redundancy. Extensive use of the previous version of our language, mostly by inexperienced specifiers, suggests that this is not a problem. The loss of some static checking is more than compensated by the semantic analysis that our tool performs.\r
+@section:8     Conclusion\r
+@noindent:Two simple ideas form the basis of our modularity mechanism: (1) that a structure is just a set of atoms, and its fields are global relations that map those atoms to structure components; and (2) that extensions of a structure are just subsets. Our relational semantics, in which all variables and fields are represented as relations, makes the use of structures simple and succinct, and it ensures that the language as a whole remains first order. For a variety of modelling tasks, we believe that our approach provides a useful balance of expressiveness and tractability.\r
+@section:9     Acknowledgments\r
+@noindent:The language described here was refined by experience writing specifications, long before an analyzer existed, and by the development of the analyzer tool itself. Mandana Vaziri and Sarfraz Khurshid were our early adopters, and Brian Lin and Joe Cohen helped implement the tool. The paper itself was improved greatly by comments from Mandana and Sarfraz, from Michael Jackson, from Tomi Mannisto, and especially from Pamela Zave, whose suggestions prompted a major rewrite. Jim Woodcock helped us understand Z, and the clarity and simplicity of his own work has been a source of inspiration to us. Our ideas have also been improved by the comments of the members of IFIP working groups 2.3 and 2.9, especially Tony Hoare, Greg Nelson and Rustan Leino. This work was funded in part by ITR grant #0086154 from the National Science Foundation, by a grant from NASA, and by an endowment from Doug and Pat Ross.\r
+@section:10    References\r
+@noindent:[1]  R. Duke, G. Rose and G. Smith. Object<\#45>Z: A Specification Language Advocated for the Description of Standards.  SVRC Technical Report 94<\#45>45. The Software Verification Research Centre, University of Queensland, Australia.\r
+@ref:[2]       John V. Guttag, James J. Horning, and Andres Modet. Report on the Larch Shared Language: Version 2.3. Technical Report 58, Compaq Systems Research Center, Palo Alto, CA, 1990.\r
+@ref:[3]       Daniel Jackson. Automating first<\#45>order relational logic. Proc. ACM SIGSOFT Conf. Foundations of Software Engineering. San Diego, November 2000.\r
+@ref:[4]       Daniel Jackson. Alloy: A Lightweight Object Modelling Notation. To appear, ACM Transactions on Software Engineering and Methodology, October 2001.\r
+@ref:[5]       Daniel Jackson, Ian Schechter and Ilya Shlyakhter. Alcoa: the Alloy Constraint Analyzer. Proc. International Conference on Software Engineering, Limerick, Ireland, June 2000.\r
+@ref:[6]       Daniel Jackson and Jeannette Wing. Lightweight Formal Methods. In: H. Saiedian (ed.), An Invitation to Formal Methods. IEEE Computer, 29(4):16<\#45>30, April 1996.  [7]        Michael Jackson. Software Requirements and Specifications: A Lexicon of Practice, Principles and Prejudices. Addison<\#45>Wesley, 1995.\r
+@ref:[8]       Cliff Jones. Systematic Software Development Using VDM. Second edition, Prentice Hall, 1990.\r
+@ref:[9]       Kathleen Jensen and Nicklaus Wirth. Pascal: User Manual and Report. Springer<\#45># Verlag, 1974.\r
+@ref:[10]      K. Rustan M. Leino and Greg Nelson. Data abstraction and information hiding . Research Report 160, Compaq Systems Research Center, November 2000.\r
+@ref:[11]      Hector Levesque, Fiora Pirri, and Ray Reiter. Foundations for the Situation Calculus. Linköping Electronic Articles in Computer and Information Science, ISSN 1401<\#45>9841, Vol. 3(1998), Nr. 018.\r
+@ref:[12]      Robin Milner, Mads Tofte and Robert Harper. The Definition of Standard ML. MIT Press, 1990.\r
+@ref:[13]      S. Owre, N. Shankar, J. M. Rushby, and D. W. J. Stringer<\#45>Calvert. PVS Language Reference. Computer Science Laboratory, SRI International, Menlo Park, CA, September 1999.\r
+@ref:[14]      J. Michael Spivey. The Z Notation: A Reference Manual. Second edition, Prentice Hall, 1992.\r
+@ref:[15]      Ian Toyn et al. Formal Specification<\#151>Z Notation<\#151>Syntax, Type and Semantics. Consensus Working Draft 2.6 of the Z Standards Panel BSI Panel IST/5/<\#45>/19/2 (Z Notation). August 24, 2000.\r
+@ref:[16]      Jim Woodcock and Jim Davies. Using Z: Specification, Refinement and Proof. Prentice Hall, 1996.\r
+@ref:[17]      Jos Warmer and Anneke Kleppe. The Object Constraint Language: Precise Modeling with UML. Addison Wesley, 1999.\r
+@ref:[18]      Pamela Zave and Michael Jackson. Conjunction as Composition. ACM Transactions on Software Engineering and Methodology II(4): 379<\#150>411, October 1993. 
\ No newline at end of file
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse-real.tag.txt.xtg b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse-real.tag.txt.xtg
new file mode 100755 (executable)
index 0000000..90947f5
--- /dev/null
@@ -0,0 +1 @@
+@title:A Micromodularity Mechanism
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse-real.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse-real.txt
new file mode 100755 (executable)
index 0000000..a9db1cc
--- /dev/null
@@ -0,0 +1,1056 @@
+\preamble\r
+\loadchars{k:\Research\Tagger\maps\standard-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathsym-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathit-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathext-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\symbol-charmap.txt}\r
+\loadstyles{k:\Research\Tagger\examples\styles.txt}\r
+\r
+\title A Micromodularity Mechanism\r
+\r
+\section Testing\r
+\r
+This is gamma: \gamma.\\\r
+This is Delta: \Delta.\\\r
+This is oplus: \oplus.\r
+\scriptA \arrowdblright \scriptA\r
+\r
+This is a subscripted variable: A\sub<\bold<hello>\italics<there>>.\r
+Math mode: $x + 2 = y, and && x\sub<2> = y\sub<3> = x\sub<ijk>$\r
+\r
+\author Daniel Jackson, Ilya Shlyakhter and Manu Sridharan\\\r
+Laboratory for Computer Science\\\r
+Massachusetts Institute of Technology\\\r
+Cambridge, Massachusetts, USA\\\r
+dnj@mit.edu\r
+\r
+\opening Abstract\r
+\r
+A simple mechanism for structuring specifications is described. By modelling structures as atoms, it  remains entirely first-order and thus amenable to automatic analysis. And by interpreting fields of structures as relations, it allows the same relational operators used in the formula language to be used for dereferencing. An extension feature allows structures to be developed incrementally, but requires no textual inclusion nor any notion of subtyping. The paper demonstrates the flexibility of the mechanism by application in a variety of common idioms.\r
+\r
+\subsection* Categories and Subject Descriptors\r
+\r
+D.2.1 Requirements/Specifications---Languages; D.2.4 Software/Program Verification---Formal methods, Model checking; F.3.1 Specifying and Verifying and Reasoning about Programs---Assertions, Invariants, Specification techniques.\r
+\r
+\subsection* General Terms\r
+\r
+Design; Documentation; Languages; Verification.\r
+\r
+\subsection* Keywords\r
+\r
+Modeling languages; formal specification; first-order logic; relational calculus; Alloy language; Z specification language; schema calculus.\r
+\r
+\section* Introduction\r
+\r
+\quote I am neither crazy nor a micromaniac.\\\r
+(A micromaniac is someone obsessed with\\\r
+reducing things to their smallest possible form.\\\r
+This word, by the way, is not in the dictionary.)\\\r
+--_Edouard de Pomiane, French Cooking in Ten Minutes, 1930_\r
+\r
+\noindent Most specification languages provide mechanisms that allow larger specifications to be built from smaller ones. These mechanisms are often the most complicated part of the language, and present obstacles to analysis. This paper presents a simple mechanism that seems to be expressive enough for a wide variety of uses, without compromising analyzability.\r
+\r
+This work is part of a larger project investigating the design of a "micro modelling language". Our premise is that lightweight application of formal methods [6] demands an unusually small and simple language that is amenable to fully automatic semantic analysis. The Alloy language is the result to date of our efforts to design such a language. Based on our experiences with the language [4] and its analyzer [5], we have recently developed a revision of Alloy that overcomes many of its limitations. This paper describes the key feature of the revised language: the _signature_, a new modularity mechanism.\r
+\r
+The mechanism allows our existing analysis scheme [3] to be applied to specifications involving structures. This is not achieved by treating the structuring mechanism as a syntactic sugar, which would limit the power of the notation (ruling out, for example, quantification over structures) and would complicate the analysis tool and make output harder for users to interpret. Because of the mechanism's generality, it has also enabled us to simplify the language as a whole, making it more uniform and eliminating some ad hoc elements.\r
+\r
+Our mechanism has a variety of applications. It can express inherent structure in the system being modelled, and can be used to organize a specification in which details are added incrementally. It can be used to construct a library of datatypes, or to describe a system as an instantiation of a more general system. And it can express state invariants, transitions, and sequences, despite the lack of any special syntax for state machines.\r
+\r
+In this last respect, the new language differs most markedly from its predecessor [4], which provided built-in notions of state invariants and operations. We now think this was a bad idea, because it made the language cumbersome for problems (such as the analysis of security policies or architectural topology constraints) in which temporal behaviour can be fruitfully ignored, and too inflexible for many problems in which temporal behaviour is important.\r
+\r
+#Because the notation as a whole is small, simple and analyzable, and free of bias towards any particular domain of application, it may be suitable as an intermediate language. A tool for architectural design, for example, might translate a more domain-specific notation into our language, allowing analyses that such tools do not currently support (such as automatic generation of sample configurations from style rules, and checking of consistency).\r
+#\r
+Our paper begins by explaining our motivations---the requirements our mechanism is designed to meet. The mechanism is then presented first informally in a series of examples, and then slightly more rigorously feature-by-feature. We discuss related work, especially the schema calculus of Z, and close with a summary of the merits and deficiences of our notation as a whole.\r
+\r
+\section Requirements\r
+\r
+The goal of this work was to find a single structuring mechanism that would support a variety of common specification idioms:\r
+\r
+\point \cdot   _States_: description of complex state as a collection of named components; incremental description both by hierarchy, in which a complex state becomes a component of a larger state, and by extension, in which new components are added; declaration of invariants and definitions of derived components;\r
+\r
+\point \cdot   _Datatypes_: separate description of a library of polymorphic datatypes, such as lists, sequences, trees and orders, along with their operators;\r
+\r
+\point \cdot   _Transitions_: specification of state transitions as operations described implicitly as formulas relating pre- and post-state; composition of operations from previously defined invariants and operations; sequential composition of operations; description of traces as sequences of states;\r
+\r
+\point \cdot   _Abstractions_: description of abstraction relations between state spaces;\r
+\r
+\point \cdot   _Assertions_: expression of properties intended to be redundant, to be checked by analysis, including: relationships amongst invariants; wellformedness of definitions (eg, that an implicit definition is functional); establishment and preservation of invariants by operations; properties of states reachable along finite traces; and simulation relationships between abstract and concrete versions of an operation.\r
+\r
+\noindent We wanted additionally to meet some more general criteria:\r
+\r
+\point \cdot   _Simplicity_. The language as a whole should be exceptionally small and simple.\r
+\r
+\point \cdot   _Flexibility_. Support for the particular idioms of state-machine specification should not be a straitjacket; the language should not dictate how state machines are expressed, and should not make it hard to describe structures that are not state machines (such as security models and architectural styles).\r
+\r
+\point \cdot   _Analyzability_. A fully automatic semantic analysis should be possible. In the present work, this has been achieved by requiring that the modularity mechanism be first order, and expressible in the kernel of the existing language.\r
+\r
+\noindent Finally, our language design decisions have been influenced by some principles that we believe contribute to these goals, make the language easier to use, and analysis tools easier to build:\r
+\r
+\point \cdot   _Explicitness_. The language should be fully explicit, with as few implicit constraints, coercions, etc, as possible.\r
+\r
+\point \cdot   _Minimal mathematics_. The basic theory of sets and relations should suffice; it should not be necessary to introduce domains, fixed points, infinities or special logical values.\r
+\r
+\point \cdot   _Minimal syntax_. There should be very few keywords or special symbols, and no need for special typography or layout.\r
+\r
+\point \cdot   _Uniformity_. A small and general set of constructs should be applied uniformly, independent of context.\r
+\r
+\point \cdot   _Lack of novelty_. Whenever possible, notions and syntax should follow standard usage of conventional mathematics and programming.\r
+\r
+\section Informal Description\r
+\r
+As a running example, we will specify a simple memory system involving a cache and a main memory. The memory has a fixed set of addresses and associates a data value with each address. The cache, in contrast, associates data values with some subset of addresses that varies over time. The cache is updated by a "write-back scheme", which means that updates need not be reflected to main memory immediately. The cache may therefore hold a more current value for an address than the main memory; the two are brought into alignment when the address is flushed from the cache and its value is written to main memory.\r
+\r
+\subsection States\r
+\r
+We start by declaring the existence of addresses and data values:\r
+\r
+\geekmath sig Addr {}\\\r
+sig Data {}\r
+\r
+Each line declares a _signature_, and introduces a set of atoms: _Addr_ for the set of addresses, and _Data_ for the set of data values. Like 'given types' in Z, these sets are disjoint from one another, and their atoms are unstructured and uninterpreted. Signature names can be used as expressions denoting sets, but they are also treated as types, so the expression _Addr+Data_, for example, is ill-typed, since the union operator (+) requires the types of its operands to match.\r
+\r
+The signature declaration\r
+\r
+\geekmath sig Memory {\\\r
+       addrs: set Addr,\\\r
+       map: addrs ->! Data\\\r
+       }\r
+\r
+likewise declares a set of atoms, _Memory_, corresponding to the set of all possible memories. In addition, it declares two fields: _addrs_ and _map_ which associate with a memory a set of addresses and a mapping from addresses to data values respectively. Thus, given a memory _m_, the expression _m.addrs_ will be a set of addresses, _m.map_ will be a relation from addresses to data values. The memory, addresses and data values should be viewed as distinct atoms in their own right; fields don't decompose an atom, but rather relate one atom to others. The exclamation mark in the declaration of the field _map_ is a 'multiplicity marking': it says that _m.map_ associates exactly one data value with each address in the set _m.addrs_. The use of _addrs_ rather than _Addr_ on the left side of the arrow indicates that _m.map_ does not associate a data value with an address that is not in the set _m.addrs_.\r
+\r
+In these expressions, the dot is simply relational image. More precisely, when we say that _m_ is a memory, we mean that the expression _m_ denotes a set consisting of a single atom. The field _addrs_ is a relation from _Memory_ to _Addr_, and _m.addrs_ denotes the image of the singleton set under this relation. So for a set of memories _ms_, the expression _ms.addrs_ will denote the union of the sets of addresses that belong to the individual memories. Given an address _a_, the expression _a.(m.map)_ denotes the set of data values associated with address _a_ in memory _m_, which will either be empty (when the address is not mapped) or a singleton. For convenience, we allow the relational image _s.r_ to be written equivalently as _r_[_s_], where [] binds more loosely than dot, so this expression may be written as _m.map_[_a_] instead.\r
+\r
+Like objects of an object-oriented language, two distinct atoms can have fields of the same value. Unlike objects, however, atoms are immutable. Each field is fixed, and cannot map an atom to one value at one time and another value at another time. To describe an operation that changes the state of a memory, therefore, we will use two distinct atoms in the set _Memory_ to represent the memory's state before and after.\r
+\r
+\subsection Extension\r
+\r
+A signature declaration can introduce a set as a subset of one previously declared, in which case we call it a _subsignature_. In this case, the set does not correspond to a type, but rather its atoms take on the type of the superset. For example, the declaration\r
+\r
+\geekmath sig MainMemory extends Memory {}\r
+\r
+introduces a set of atoms _MainMemory_ representing main memories, which is constrained to be a subset of the set _Memory_. Likewise\r
+\r
+\geekmath sig Cache extends Memory {\\\r
+       dirty: set addrs\\\r
+       }\r
+\r
+introduces a set of atoms _Cache_ representing those memories that can be regarded as caches. It also introduces a field _dirty_ that associates with a cache the set of addresses that is dirty; later, we will use this to represent those addresses for which a cache and main memory differ. Because _Cache_ is a subset of _Memory_, and _m.addrs_ (for any memory _m_) is a subset of _Addr_, the field denotes a relation whose type is from _Memory_ to _Addr_. Expressions such as _m.dirty_ are therefore type-correct for a memory _m_, whether or not _m_ is a cache. But since declaration of the field _dirty_ within the signature _Cache_ constrains _dirty_ to be a relation that maps only caches, _m.dirty_ will always denote the empty set when _m_ is not a cache.\r
+\r
+This approach avoids introducing a notion of subtyping. Subtypes complicate the language, and tend to make it more difficult to use. In OCL [17], which models extension with subtypes rather than subsets, an expression such as _m.dirty_ would be illegal, and would require a coercion of _m_ to the subtype _Cache_. Coercions do not fit smoothly into the relational framework; they interfere with the ability to take the image of a set under a relation, for example.  Moreover, subtypes are generally disjoint, whereas our approach allows the sets denoted by subsignatures to overlap. In this case, we'll add a constraint (in Section 2.4 below) to ensure that _MainMemory_ and _Cache_ are in fact disjoint.\r
+\r
+Declaring _Cache_ and _MainMemory_ as subsignatures of _Memory_ serves to factor out their common properties. Extension can be used for a different purpose, in which a single signature is developed by repeated extensions along a chain. In this case, the supersignatures may not correspond to entities in the domain being modelled, but are simply artifacts of specification---fragments developed along the way. Z specifications are typically developed in this style.\r
+\r
+\subsection Hierarchy\r
+\r
+The signature declaration also supports hierarchical structuring. We can declare a signature for systems each consisting of a cache and a main memory:\r
+\r
+\geekmath sig System {\\\r
+       cache: Cache,\\\r
+       main: MainMemory\\\r
+       }\r
+\r
+Again, _System_ introduces a set of atoms, and each field represents a relation. The omission of the keyword _set_ indicates that a relation is a total function. So for a system _s_, the expression _s.cache_ denotes one cache---that is, a set consisting of a single cache. This is one of very few instances of implicit constraints in our language, which we introduced in order to make declaration syntax conventional.\r
+\r
+Since signatures denote sets of atoms, apparently circular references are allowed. Linked lists, for example, may be modelled like this, exactly as they might be implemented in a language like Java:\r
+\r
+\geekmath sig List {}\\\r
+sig NonEmptyList extends List {elt: Elt, rest: List}\r
+       \r
+There is no recursion here; the field _rest_ is simply a homogeneous relation of type _List_ to _List_, with its domain restricted to the subset _NonEmptyList_.\r
+\r
+\subsection State Properties\r
+\r
+Properties of signature atoms are recorded as logical formulas. To indicate that such a property always holds, we package it as a _fact_. To say that, for any memory system, the addresses in a cache are always addresses within the main memory, we might write:\r
+\r
+\geekmath fact {all s: System | s.cache.addrs in s.main.addrs}\r
+\r
+or, using a shorthand that allows facts about atoms of a signature to be appended to it:\r
+\r
+\geekmath sig System {cache: Cache, main: MainMemory}\\\r
+       {cache.addrs in main.addrs}\r
+\r
+The appended fact is implicitly prefixed by\r
+\r
+\geekmath all this: System | with this |\r
+\r
+in which the _with_ construct, explained in Sectiom 3.6 below, causes the fields implicitly to be dereferences of the atom _this_.\r
+\r
+A fact can constrain atoms of arbitrary signatures; to say that no main memory is a cache we might write:\r
+\r
+\geekmath fact {no (MainMemory & Cache)}\r
+\r
+where _no e_ means that the expression _e_ has no elements, and & is intersection.\r
+\r
+#Again, this is common enough that we provide a shorthand. Declaring a subsignature as _disjoint_ indicates that it shares no atoms with any other subsignatures of the same supersignature. So the fact can be replaced by changing our declaration of _MainMemory_ to:\r
+#\r
+#\geekmath disjoint sig MainMemory extends Memory {}\r
+#\r
+Most descriptions have more interesting facts. We can express the fact that linked lists are acyclic, for example:\r
+\r
+\geekmath fact {no p: List | p in p.\hat @sep rest}\r
+\r
+The expression _\hat @sep rest_ denotes the transitive closure of the relation _rest_, so that _p.^rest_ denotes the set of lists reachable from _p_ by following the field _rest_ once or more. This illustrates a benefit of treating a field as a relation---that we can apply standard relational operators to it---and is also an example of an expression hard to write in a language that treats extension as subtyping (since each application of _rest_ would require its own coercion).\r
+\r
+Often we want to define a property without imposing it as a permanent constraint. In that case, we declare it as a _function_. Here, for example, is the invariant that the cache lines not marked as dirty are consistent with main memory:\r
+\r
+\geekmath fun DirtyInv (s: System) {\\\r
+       all a !: s.cache.dirty | s.cache.map[a] = s.main.map[a]\\\r
+       }\r
+       \r
+(The exclamation mark negates an operator, so the quantification is over all addresses that are _not_ dirty.) Packaging this as a function that can be applied to a particular system, rather than as a fact for all systems, will allow us to express assertions about preservation of the invariant (Section 2.8).\r
+\r
+By default, a function returns a boolean value---the value of the formula in its body. The value of _DirtyInv(s)_ for a system _s_ is therefore true or false. A function may return non-boolean values. We might, for example, define the set of bad addresses to be those for which the cache and main memory differ:\r
+\r
+\geekmath fun BadAddrs (s: System): set Addr {\\\r
+       result = {a: Addr | s.cache.map[a] != s.main.map[a]}\\\r
+       }\r
+\r
+and then write our invariant like this:\r
+\r
+\geekmath fun DirtyInv (s: System) {BadAddrs(s) in s.cache.dirty}\r
+\r
+In this case, _BadAddrs(s)_ denotes a set of addresses, and is short for the expression on the right-hand side of the equality in the definition of the function _BadAddrs_. The use of the function application as an expression does not in fact depend on the function being defined explicitly. Had we written\r
+\r
+\geekmath fun BadAddrs (s: System): set Addr {\\\r
+       all a: Addr | a in result iff s.cache.map[a] != s.main.map[a]\\\r
+       }\r
+       \r
+the application would still be legal; details are explained in Section 3.7.\r
+# \r
+# \geekmath BadAddrs(s) in s.cache.dirty\r
+# \r
+# would be treated as short for \r
+# \r
+# \geekmath all result: set Addr |\\\r
+#      (all a: Addr | a in result iff  s.cache.map[a] != s.main.map[a])\\\r
+#      => result in s.cache.dirty\r
+# \r
+# This desugaring is explained in more detail in Section 99 below.\r
+\r
+\subsection Operations\r
+\r
+Following Z, we can specify operations as formulas that constrain pre- and post-states. An operation may be packaged as a single function (or as two functions if we want to separate pre- and post-conditions in the style of VDM or Larch).\r
+\r
+The action of writing a data value to an address in memory might be specified like this:\r
+\r
+\geekmath fun Write (m,m': Memory, d: Data, a: Addr) {\\\r
+       m'.map = m.map ++ (a->d)\\\r
+       }\r
+\r
+The formula in the body of the function relates _m_, the value of the memory before, to _m'_, the value after. These identifers are just formal arguments, so the choice of names is not significant. Moreover, the prime mark plays no special role akin to decoration in Z---it's a character like any other. The operator ++ is relational override, and the arrow forms a cross product. As mentioned above, scalars are represented as singleton sets, so there is no distinction between a tuple and a relation. The arrows in the expressions _a->d_ here and _addrs->Data_ in the declaration of the _map_ field of _Memory_ are one and the same. \r
+\r
+The action of reading a data value can likewise be specified as a function, although since it has no side-effect we omit the _m'_ parameter:\r
+\r
+\geekmath fun Read (m: Memory, d: Data, a: Addr) {\\\r
+       d = m.map[a]\\\r
+       }\r
+       \r
+Actions on the system as a whole can be specified using these primitive operations; in Z, this idiom is called 'promotion'. A read on the system is equivalent to reading the cache:\r
+\r
+\geekmath fun SystemRead (s: System, d: Data, a: Addr) {\\\r
+       Read (s.cache, d, a)\\\r
+       }\r
+\r
+The _Read_ operation has an implicit precondition. Since the data parameter _d_ is constrained (implicitly by its declaration) to be scalar---that is, a singleton set---the relation _m.map_ must include a mapping for the address parameter _a_, since otherwise the expression _m.map[a]_ will evaluate to the empty set, and the formula will not be satisfiable. This precondition is inherited by _SystemRead_. If the address _a_ is not in the cache, the operation cannot proceed, and it will be necessary first to load the data from main memory. It is convenient to specify this action as a distinct operation:\r
+\r
+\geekmath fun Load (s,s': System, a: Addr) {\\\r
+       a !in s.cache.addrs\\\r
+       s'.cache.map = s.cache.map + (a->s.main.map[a])\\\r
+       s'.main = s.main\\\r
+       }\r
+\r
+The + operator is just set union (in this case, of two binary relations, the second consisting of a single tuple). A write on the system involves a write to the cache, and setting the dirty bit. Again, this can be specified using a primitive memory operation:\r
+\r
+\geekmath fun SystemWrite (s,s': System, d: Data, a: Addr) {\\\r
+       Write (s.cache, s'.cache, d, a)\\\r
+       s'.cache.dirty = s.cache.dirty + a\\\r
+       s'.main = s.main\\\r
+       }\r
+\r
+A cache has much smaller capacity than main memory, so it will occasionally be necessary (prior to loading or writing) to flush lines from the cache back to main memory. We specify flushing as a non-deterministic operation that picks some subset of the cache addrs and writes them back to main memory:\r
+\r
+\geekmath fun Flush (s,s': System) {\\\r
+       some x: set s.cache.addrs {\\\r
+               s'.cache.map = s'.cache.map - (x->Data)\\\r
+               s'.cache.dirty = s.cache.dirty - x\\\r
+               s'.main.map = s.main.map ++ \\\r
+                       {a: x, d: Data | d = s.cache.map[a]}\\\r
+               }\r
+\r
+The - operator is set difference; note that it is applied to sets of addresses (in the third line) and to binary relations (in the second). The comprehension expression creates a relation of pairs _a_->_d_ satisfying the condition.\r
+\r
+Finally, it is often useful to specify the initial conditions of a system. To say that the cache initially has no addresses, we might write a function imposing this condition on a memory system:\r
+\r
+\geekmath fun Init (s: System) {no s.cache.addrs}\r
+\r
+\subsection Traces\r
+\r
+To support analyses of behaviours consisting of sequences of states, we declare two signatures, for ticks of a clock and traces of states:\r
+\r
+\geekmath sig Tick {}\\\r
+sig SystemTrace {\\\r
+       ticks: set Tick,\\\r
+       first, last: ticks,\\\r
+       next: (ticks - last) !->! (ticks - first)\\\r
+       state: ticks ->! System}\\\r
+       {\\\r
+       first.*next = ticks\\\r
+       Init (first.state)\\\r
+       all t: ticks - last | \\\r
+               some s = t.state, s' = t.next.state |\\\r
+                       Flush (s,s')\\\r
+                       || (some a: Addr | Load (s,s',a))\\\r
+                       || (some d: Data, a: Addr | SystemWrite (s,s',d,a))\\\r
+       }\r
+\r
+Each trace consists of a set of _ticks_, a _first_ and _last_ tick, an ordering relation _next_ (whose declaration makes it a bijection from all ticks except the last to all ticks except the first), and a relation _state_ that maps each tick to a system state.\r
+\r
+The fact appended to the signature states first a generic property of traces: that the ticks of a trace are those reachable from the first tick. It then imposes the constraints of the operations on the states in the trace. The initial condition is required to hold in the first state. Any subsequent pair of states is constrained to be related by one of the three side-effecting operations. The existential quantifier plays the role of a _let_ binding, allowing _s_ and _s'_ in place of _t.state_ and _t.next.state_, representing the state for tick _t_ and the state for its successor _t.next_. Note that this formulation precludes stuttering; we could admit it simply by adding the disjunct _s_=_s'_ allowing a transition that corresponds to no operation occurring.\r
+\r
+Bear in mind that this fact is a constraint on all atoms in the set _SystemTrace_. As a free standing fact, the second line of the fact---the initial condition--- would have been written:\r
+\r
+\geekmath fact {all x: SystemTrace | Init ((x.first).(x.state))}\r
+\r
+\subsection Abstraction\r
+\r
+Abstraction relationships are easily expressed using our function syntax. To show that our memory system refines a simple memory without a cache, we define an abstraction function _Alpha_ saying that a system corresponds to a memory that is like the system's memory, overwritten by the entries of the system's cache:\r
+\r
+\geekmath fun Alpha (s: System, m: Memory) {\\\r
+       m.map = s.main.map ++ s.cache.map\\\r
+       }\r
+       \r
+As another example, if our linked list were to represent a set, we might define the set corresponding to a given list as that containing the elements reachable from the start:\r
+\r
+\geekmath fun ListAlpha (p: List, s: set Elt) {\\\r
+       s = p.*rest.elt\\\r
+       }\r
+\r
+\subsection Assertions\r
+\r
+Theorems about a specification are packaged as _assertions_. An assertion is simply a formula that is intended to hold. A tool can check an assertion by searching for a counterexample---that is, a model of the formula's negation.\r
+\r
+The simplest kinds of assertion record consequences of state properties. For example,\r
+\r
+\geekmath assert {\\\r
+       all s: System | DirtyInv (s) && no s.cache.dirty\\\r
+               => s.cache.map in s.main.map\\\r
+       }\r
+\r
+asserts that if the dirtiness invariant holds,and there are no dirty addresses, then the mapping of addresses to data in the cache is a subset of the mapping in the main memory.\r
+\r
+An assertion can express consequences of operations. For example,\r
+\r
+\geekmath assert {\\\r
+       all s: System, d: Data, a: Addr |\\\r
+               SystemRead (s,d,a) => a in s.cache.addrs\\\r
+       }\r
+\r
+embodies the claim made above that _SystemRead_ has an implicit precondition; it asserts that whenever _SystemRead_ occurs for an address, that address must be in the cache beforehand. An assertion can likewise identify a consequence in the post-state; this assertion\r
+\r
+\geekmath assert {\\\r
+       all s,s': System, d: Data, a: Addr |\\\r
+               SystemWrite (s,s',d,a) => s'.cache.map[a] = d\\\r
+       }\r
+       \r
+says that after a _SystemWrite_, the data value appears in the cache at the given address. \r
+\r
+Preservation of an invariant by an operation is easily recorded as an assertion. To check that our dirtiness invariant is preserved when writes occur, we would assert\r
+\r
+\geekmath assert {\\\r
+       all s,s': System, d: Data, a: Addr |\\\r
+               SystemWrite (s,s',d,a) && DirtyInv (s) => DirtyInv (s')\\\r
+       }\r
+\r
+Invariant preservation is not the only consequence of an operation that we would like to check that relates pre- and post-states. We might, for example, want to check that operations on the memory system do not change the set of addresses of the main memory. For the _Flush_ operation, for example, the assertion would be\r
+\r
+\geekmath assert {\\\r
+       all s,s': System | Flush(s,s') => s.main.addrs = s'.main.addrs\\\r
+       }\r
+       \r
+which holds only because the cache addresses are guaranteed to be a subset of the main memory addresses (by the fact associated with the _System_ signature).\r
+\r
+The effect of a sequence of operations can be expressed by quantifying appropriately over states. For example, \r
+\r
+\geekmath assert {\\\r
+       all s, s': System, a: Addr, d,d': Data | \\\r
+               SystemWrite (s,s',d,a) && SystemRead (s',d',a) => d = d'\\\r
+       }\r
+\r
+says that when a write is followed by a read of the same address, the read returns the data value just written.\r
+\r
+To check that a property holds for all reachable states, we can assert that the property is an invariant of every operation, and is established by the initial condition. This strategy can be shown (by induction) to be sound, but it is not complete. A property may hold for all reachable states, but may not be preserved because an operation breaks the property when executed in a state that happens not to be reachable.\r
+\r
+Traces overcome this incompleteness. Suppose, for example, that we want to check the (rather contrived) property that, in every reachable state, if the cache contains an address that isn't dirty, then it agrees with the main memory on at least one address:\r
+\r
+\geekmath fun DirtyProp (s: System) {\\\r
+       some (s.cache.addrs - s.cache.dirty)\\\r
+               => some a: Addr | s.cache.map[a] = s.main.map[a]\\\r
+       }\r
+\r
+We can assert that this property holds in the last state of every trace:\r
+\r
+\geekmath assert {\\\r
+       all t: SystemTrace | with t | DirtyProp (last.state)\\\r
+       }\r
+       \r
+This assertion is valid, even though _DirtyProp_ is not an invariant. A write invoked in a state in which all clean entries but one had non-matching values can result in a state in which there are still clean entries but none has a matching value.\r
+\r
+Finally, refinements are checked by assertions involving abstraction relations. We can assert that a _SystemWrite_ refines a basic _Write_ operation on a simple memory:\r
+\r
+\geekmath assert {\\\r
+       all s,s': System, m,m': Memory, a: Addr, d: Data |\\\r
+               Alpha (s,m) && Alpha (s',m') && SystemWrite (s,s',a,d)\\\r
+               => Write (m,m',a,d)\\\r
+       }\r
+\r
+or that the _Flush_ operation is a no-op when viewed abstractly:\r
+\r
+\geekmath assert {\\\r
+       all s,s': System, m,m': Memory |\\\r
+               Alpha (s,m) && Alpha (s',m') && Flush (s,s')\\\r
+               => m.map = m'.map\\\r
+       }\r
+\r
+Note the form of the equality; _m = m'_ would be wrong, since two distinct memories may have the same mapping, and the abstraction _Alpha_ constrains only the mapping and not the memory atom itself.\r
+\r
+Many of the assertions shown here can be made more succinct by the function shorthand explained in Section 3.7 below. For example, the assertion that a read following a write returns the value just written becomes:\r
+\r
+\geekmath assert {\\\r
+       all s: System, a: Addr, d: Data | \\\r
+               SystemRead (SystemWrite (s,d,a),a) = d\\\r
+       }\r
+\r
+and the assertion that _Flush_ is a no-op becomes:\r
+\r
+\geekmath assert {\\\r
+       all s: System | Alpha (s).map = Alpha (Flush (s)).map\\\r
+       }\r
+\r
+\subsection Polymorphism\r
+\r
+Signatures can be parameterized by signature types. Rather than declaring a linked list whose elements belong to a particular type _Elt_, as above, we would prefer to declare a generic list:\r
+\r
+\geekmath sig List [T] {}\\\r
+sig NonEmptyList [T] extends List [T] {elt: T, rest: List [T]}\r
+\r
+Functions and facts may be parameterized in the same way, so we can define generic operators, such as:\r
+\r
+\geekmath fun first [T] (p: List [T]): T {result = p.elt}\\\r
+fun last [T] (p: List [T]): T {some q: p.*rest | result = q.elt && no q.rest}\\\r
+fun elements [T] (p: List [T]): set T {result = p.*rest.elt}\r
+\r
+In addition, let's define a generic function that determines whether two elements follow one another in a list:\r
+\r
+\geekmath fun follows [T] (p: List[T], a,b: T) {\\\r
+       some x: p.*rest | x.elt = a && x.next.elt = b\\\r
+       }\r
+\r
+To see how a generic signature and operators are used, consider replacing the traces of Section 2.6 with lists of system states. Define a function that determines whether a list is a trace:\r
+\r
+\geekmath fun isTrace (t: List [System]) {\\\r
+       Init (first(t))\\\r
+       all s, s': System | follows (t,s,s') => {\\\r
+               Flush (s,s')\\\r
+               || (some a: Addr | Load (s,s',a))\\\r
+               || (some d: Data, a: Addr | SystemWrite (s,s',d,a))\\\r
+               }\\\r
+       }\r
+\r
+Now our assertion that every reachable system state satisfies _DirtyProp_ can now be written:\r
+\r
+\geekmath assert {\\\r
+       all t: List[System] | isTrace(t) => DirtyProp (last(t))\\\r
+       }\r
+\r
+\subsection    Variants\r
+\r
+To illustrate the flexibility of our notation, we sketch a different formulation of state machines oriented around transitions rather than states.\r
+\r
+Let's introduce a signature representing state transitions of our memory system:\r
+\r
+\geekmath sig SystemTrans {pre,post: System}\\\r
+       {pre.main.addrs = post.main.addrs}\r
+\r
+Declaring the transitions as a signature gives us the opportunity to record properties of all transitions---in this case requiring that the set of addresses of the main memory is fixed.\r
+\r
+Now we introduce a subsignature for the transitions of each operation. For example, the transitions that correspond to load actions are given by:\r
+\r
+\geekmath sig LoadTrans extends SystemTrans {a: Addr}\\\r
+       {Load (pre, post, a)}\r
+#      } {\r
+#      a !in pre.cache.addrs\\\r
+#      post.cache.map = pre.cache.map ++ (a->pre.main.map[a])\\\r
+#      post.main = pre.main\\\r
+#      }\r
+# \r
+# The formula here is actually identical to the one declared above, but with _pre_ and _post_ for # _s_ and _s'_ ; we could in fact replace it by the function application _Load(pre,post,a)_.\r
+\r
+For each invariant, we define a set of states. For the states satisfying the dirty invariant, we might declare\r
+\r
+\geekmath sig DirtyInvStates extends System {}\r
+\r
+along with the fact\r
+\r
+\geekmath fact {DirtyInvStates = {s: System | DirtyInv(s)}}\r
+\r
+To express invariant preservation, it will be handy to declare a function that gives the image of a set of states under a set of transitions:\r
+\r
+\geekmath fun postimage (ss: set System, tt: set SystemTrans): set System {\\\r
+       result = {s: System | some t: tt | t.pre in ss && s = t.post}\\\r
+       }\r
+\r
+so that we can write the assertion like this:\r
+\r
+\geekmath assert {postimage (DirtyInvStates, LoadTrans) in DirtyInvStates}\r
+\r
+For an even more direct formulation of state machine properties, wemight have defined a  transition relation instead:\r
+\r
+\geekmath fun Trans (r: System -> System) {\\\r
+       all s, s' : System | \\\r
+               s->s' in r => Flush (s,s') || ...\\\r
+               }\r
+\r
+Then, using transitive closure, we can express the set of states reachable from an initial state, and assert that this set belongs to the set characterized by some property:\r
+\r
+\geekmath assert {all r: System -> System, s: System |\\\r
+       Init (s) && Trans(r) => s.*r in DirtyPropStates\\\r
+       }\r
+\r
+where _DirtyPropStates_ is defined analogously to _DirtyInvStates_.\r
+\r
+\subsection    Definitions\r
+\r
+Instead of declaring the addresses of a memory along with its mapping, as we did before:\r
+\r
+\geekmath sig Memory {\\\r
+       addrs: set Addr,\\\r
+       map: addrs ->! Data\\\r
+       }\r
+\r
+we could instead have declared the mapping alone:\r
+\r
+\geekmath sig Memory {\\\r
+       map: Addr ->? Data\\\r
+       }\r
+\r
+and then _defined_ the addresses using a subsignature:\r
+\r
+\geekmath sig MemoryWithAddrs extends Memory {\\\r
+       addrs: set Addr}\\\r
+       {addrs = {a: Addr | some a.map}}\r
+       \r
+Now by making the subsignature subsume all memories:\r
+\r
+\geekmath fact {Memory in MemoryWithAddrs}\r
+\r
+we have essentially 'retrofitted' the field. Any formula involving memory atoms now implicitly constrains the _addrs_ field. For example, we can assert that _Read_ has an implicit precondition requiring that the argument be a valid address:\r
+\r
+\geekmath assert {all m: Memory, a: Addr, d: Data | Read (m,d,a) => a in m.addrs}\r
+\r
+even though the specification of _Read_ was written when the field _addrs_ did not even exist.\r
+\r
+\section Semantics\r
+\r
+For completeness, we give an overview of the semantics of the language. The novelties with respect to the original version of Alloy [4] are (1) the idea of organizing relations around basic types as signatures, (2) the treatment of extension as subsetting, and (3) the packaging of formulas in a more explicit (and conventional) style. The semantic basis has been made cleaner, by generalizing relations to arbitrary arity, eliminating 'indexed relations' and the need for a special treatment of sets.\r
+\r
+\subsection Types\r
+\r
+We assume a universe of atoms. The standard notion of a mathematical relation gives us our only composite datatype. The value of an expression will always be a relation---that is, a collection of tuples of atoms. Relations are first order: the elements of a tuple are themselves atoms and never relations.\r
+\r
+The language is strongly typed. We partition the universe into subsets each associated with a _basic_ type, and write (T_1, T_2, ..., T_n) for the type of a relation whose tuples each consist of _n_ atoms, with types T_1, T_2, etc.\r
+\r
+A set is represented semantically as a unary relation, namely a relation whose tuples each contain one atom. A tuple is represented as a singleton relation, namely a relation containing exactly one tuple. A scalar is represented as a unary, singleton relation. We use the terms 'set', 'tuple' and 'scalar' to describe relations with the appropriate properties. Basic types are used only to construct relation types, and every expression that appears in a specification has a relational type. Often we will say informally that an expression has a type _T_ where _T_ is the name of a basic type when more precisely we mean that the expression has the type (_T_).\r
+\r
+So, in contrast to traditional mathematical style, we do not make distinctions amongst the atom _a_, the tuple (_a_), the set {_a_} containing just the atom, or the set {(_a_)} containing the tuple, and represent all of these as the last. This simplifies the semantics and gives a more succinct and uniform syntax.\r
+# Because the language is first order (and has no sets of sets, for example), it requires no coercions, and seems not to cause confusion even for novice specifiers.\r
+\r
+\subsection Expression Operators\r
+\r
+Expressions can be formed using the standard set operators written as ASCII characters: union (+), intersection (&) and difference (-). Some standard relational operators, such as transpose (~) and transitive closure (^), can be applied to expressions that denote binary relations. Relational override (++) has its standard meaning for binary relations but can applied more broadly.\r
+#The type rules and semantics are completely standard. For example, if _e_ has the type (S,T), then ~_e_ has the type (T,S) and denotes the collection of pairs obtained by reversing each pair in _e_; if _p_ and _q_ both have the type (T_1, T_2, ..., T_n), then the union _p+q_, intersection _p_&_q_, and difference _p-q_ also have that type, and denote respectively the relations whose tuples are those that appear in either of _p_ and _q_, both of _p_ and _q_, and _p_ but not _q_.\r
+\r
+There are two special relational operators, dot and arrow. The dot operator is a generalized relational composition. Given expressions $p$ and $q$, the expression $p.q$ contains the tuple\r
+$\angleleft\sep  p\sub<1>, ... p\sub<m-1>, q\sub<2>, ..., q\sub<n>\angleright$\r
+when _p_ contains \r
+@math \langle@sep p_1, ..., p_{m}\rangle,\r
+_q_ contains\r
+@math \langle@sep q_1, ... q_n\rangle,\r
+and\r
+@math p_m = q_1. The last type of _p_ and the first type of _q_ must match, and _m_ + _n_, the sum of the arities of _p_ and _q_, must be three or more so that the result is not degenerate. When _p_ is a set and _q_ is a binary relation, the composition _p.q_ is the standard relational image of _p_ under _q_; when _p_ and _q_ are both binary relations, _p.q_ is standard relational composition. In all of the examples above, the dot operator is used only for relational image.\r
+\r
+The arrow operator is cross product: _p \textarrow q_ is the relation containing the tuple\r
+@math \langle@sep p_1, ..., p_{m}, q_1, ... q_n\rangle\r
+when _p_ contains \r
+@math \langle@sep p_1, ..., p_{m}\rangle,\r
+and _q_ contains\r
+@math \langle@sep q_1, ... q_n\rangle.\r
+In all the examples in this paper, _p_ and _q_ are sets, and _p \textarrow q_ is their standard cross product.\r
+\r
+\subsection Formula Operators\r
+\r
+Elementary formulas are formed from the subset operator, written _in_. Thus _p in q_ is true when every tuple in _p_ is in _q_. The formula _p : q_ has the same meaning, but when _q_ is a set, adds an implicit constraint that _p_ be scalar (ie, a singleton). This constraint is overridden by writing _p: option q_ (which lets _p_ to be empty or a scalar) or _p: set q_ (which eliminates the constraint entirely). Equality is just standard set equality, and is short for a subset constraint in each direction.\r
+\r
+An arrow that appears as the outermost expression operator on the right-hand side of a subset formula can be annotated with _multiplicity markings_: + (one or more), ? (zero or one) and ! (exactly one). The formula\r
+\r
+\geekmath r: S m \textarrow n T\r
+\r
+where _m_ and _n_ are multiplicity markings constrains the relation _r_ to map each atom of _S_ to _n_ atoms of _T_, and to map _m_ atoms of _S_ to each atom of _T_. _S_ and _T_ may themselves be product expressions, but are usually variables denoting sets. For example,\r
+\r
+\geekmath r: S \textarrow ! T\\\r
+r: S ? \textarrow ! T\r
+\r
+make _r_ respectively a total function on _S_ and an injection.\r
+\r
+Larger formulas are obtained using the standard logical connectives: && (and), || (or), ! (not), => (implies), _iff_ (bi-implication). The formula _if b then f else g_ is short for _b_ => _f_ && !_b_ => _g_. Within curly braces, consecutive formulas are implicitly conjoined.\r
+\r
+Quantifications take their usual form:\r
+\r
+\geekmath all x: e | F\r
+\r
+is true when the formula _F_ holds under every binding of the variable _x_ to a member of the set _e_.  In addition to the standard quantifiers,  _all_ (universal) and _some_ (existential), we have _no_, _sole_ and _one_ meaning respectively that there are no values, at most one value, and exactly one value satisfying the formula. For a quantifier _Q_ and expression _e_, the formula _Q e_ is short for _Q x: T | e_ (where _T_ is the type of _e_), so _no e_, for example, says that _e_ is empty.\r
+\r
+The declaration of a quantified formula is itself a formula---an elementary formula in which the left-hand side is a variable. Thus\r
+\r
+\geekmath some x = e | F\r
+\r
+is permitted, and is a useful way to express a _let_ binding. Quantifiers may be higher-order; the formula\r
+\r
+\geekmath all f: s ->! t | F\r
+\r
+is true when _F_ holds for every binding of a total function from _s_ to _t_ to the variable _f_. Our analysis tool cannot currently handle higher-order quantifiers, but many uses of higher-order quantifiers that arise in practice can be eliminated by skolemization.\r
+\r
+Finally, we have relational comprehensions; the expression\r
+\r
+\geekmath {x_1: e_1, x_2: e_2, ... | F}\r
+\r
+constructs a relation of tuples with elements _x_1_, _x_2_, etc., drawn from set expressions _e_1_, _e_2_, etc., whose values satisfy _F_.\r
+\r
+# \subsection Choice of Operator Symbols\r
+# \r
+# The choice of symbols, especially the arrow, may seem unconventional, but results in familiar-# looking formulas. The dot operator generalizes the 'navigation expressions' of Syntropy#  [CD94], now adopted by UML's Object Constraint Language [17], and is intended to be fa# miliar to programmers by resembling object dereferencing. Thus, _x.f_ can be viewed as dere# ferencing the object _x_ with field _f_ when _x_ is a scalar and _f_ is a binary relation. The cho# ice of relational composition rather than function application allows such an expression to be wr# itten without concern for whether _f_ is a function. It also gives a simple and workable treatmen# t of partiality. When _x_ is not in the domain of _f_, _x.f_ is the empty set, and _x.f = y_ will be#  false if _y_ is a scalar.\r
+# \r
+# The arrow notation is designed to allow declarations to be written in a familiar way, but to be # given a simple, first-order interpretation. For example, if _S_ and _T_ denote sets,\r
+# \r
+# \geekmath f: S \textarrow T\r
+# \r
+# declares _f_ to be a binary relation from _S_ to _T_. A conventional interpretation would have # the arrow construct a set of relations---a higher-order notion. Instead, we interpret the arrow # as cross product and the colon as subset, with the same result. The choice of arrow is also # convenient for constructing tuples; when _x_ and _y_ are scalars, the formula# \r
+# \r
+# \geekmath r' = r + (x \textarrow y)\r
+# \r
+# makes _r'_ the relation containing the tuples of _r_, and additionally, a mapping from _x_ to # _y_. # \r
+\subsection Signatures\r
+\r
+A _signature_ declaration introduces a basic type, along with a collection of relations called _fields_. The declaration\r
+\r
+\geekmath sig S {f: E}\r
+\r
+declares a basic type _S_, and a relation _f_. If _E_ has the type (T_1, T_2, ..., T_n), the relation _f_ will have the type (S, T_1, T_2, ..., T_n), and if _x_ has the type _S_, the expression _x.f_ will have the same type as _E_. When there are several fields, field names already declared may appear in expressions on the right-hand side of declarations; in this case, a field _f_ is typed as if it were the expression _this.f_, where _this_ denotes an atom of the signature type (see Section 3.6).\r
+\r
+The meaning of a specification consisting of a collection of signature declarations is an assignment of values to global constants-- the signatures and the fields. For example, the specification\r
+\r
+\geekmath sig Addr {}\\\r
+sig Data {}\\\r
+sig Memory {map: Addr -> Data}\r
+\r
+has 4 constants---the three signatures and one field---with assignments such as:\r
+\r
+\geekmath Addr = {a0, a1}\\\r
+Data = {d0, d1, d2}\\\r
+Memory = {m0, m1}\\\r
+map = {(m0,a0,d0), (m1,a0,d1), (m1,a0,d2)}\r
+\r
+corresponding to a world in which there are 2 addresses, 3 data values and 2 memories, with the first memory (_m0_) mapping the first address (_a0_) to the first data value (_d0_), and the second memory (_m1_) mapping the first address (_a0_) both to the second (_d1_) and third (_d2_) data values.\r
+\r
+A fact is a formula that constrains the constants of the specification, and therefore tends to reduce the set of assignments denoted by the specification. For example,\r
+\r
+\geekmath fact {all m: Memory | all a: Addr | sole m.map[a]}\r
+\r
+rules out the above assignment, since it does not permit a memory (such as _m1_) to map an address (such as _a0_) to more than one data value. \r
+\r
+The meaning of a function is a set of assignments, like the meaning of the specification as a whole, but these include bindings to parameters. For example, the function\r
+\r
+\geekmath fun Read (m: Memory, d: Data, a: Addr) {\\\r
+       d = m.map[a]\\\r
+       }\r
+\r
+has assignments such as:\r
+\r
+\geekmath Addr = {a0, a1}\\\r
+Data = {d0, d1, d2}\\\r
+Memory = {m0, m1}\\\r
+map = {(m0,a0,d1)}\\\r
+m = {m0}\\\r
+d = {d1}\\\r
+a = {a0}\r
+\r
+The assignments of a function representing a state invariant correspond to states satisfying the invariant; the functions of a function representing an operation (such as _Read_) correspond to executions of the operation.\r
+\r
+An assertion is a formula that is claimed to be _valid_: that is, true for every assignment that satisfies the facts of the specification. To check an assertion, one can search for a _counterexample_: an assignment that makes the formula false.\r
+For example, the assertion\r
+\r
+\geekmath assert {\\\r
+       all m,m': Memory, d: Data, a: Addr | Read (m,d,a) => Read (m',d,a)}\r
+\r
+which claims, implausibly, that if a read of memory _m_ returns _d_ at _a_, then so does a read at memory _m'_, has the counterexample\r
+\r
+\geekmath Addr = {a0}\\\r
+Data = {d0,d1}\\\r
+Memory = {m0, m1}\\\r
+map = {(m0,a0,d0), (m1,a0,d1)}\r
+\r
+To find a counterexample, a tool should negate the formula and then skolemize away the bound variables, treating them like the parameters of a function, with values to be determined as part of the assignment. In this case, the assignment might include:\r
+\r
+\geekmath m = {m0}\\\r
+m' = {m1}\\\r
+d = {d0}\\\r
+a = {a0}\r
+\r
+\subsection Extension\r
+\r
+Not every signature declaration introduces a new basic type. A signature declared without an extension clause is a _type signature_, and creates both a basic type and a set constant of the same name. A signature _S_ declared as an extension is a _subsignature_, and creates only a set constant, along with a constraint making it a subset of each _supersignature_ listed in the extension clause. The subsignature takes on the type of the supersignatures, so if there is more than one, they must therefore have the same type, by being direct or indirect subsignatures of the same type signature.\r
+\r
+A field declared in a subsignature is as if declared in the corresponding type signature, with the constraint that the domain of the field is the subsignature. For example,\r
+\r
+\geekmath sig List {}\\\r
+sig NonEmptyList extends List {elt: Elt,rest: List}\r
+\r
+makes _List_ a type signature, and _NonEmptyList_ a subset of _List_. The fields _elt_ and _rest_ map atoms from the type _List_, but are constrained to have domain _NonEmptyList_. Semantically, it would have been equivalent to declare them as fields of _List_, along with facts constraining their domains:\r
+\r
+\geekmath sig List {elt: Elt,rest: List}\\\r
+sig NonEmptyList extends List {}\\\r
+fact {elt.Elt in NonEmptyList}\\\r
+fact {rest.List in NonEmptyList}\r
+\r
+(exploiting our dot notation to write the domain of a relation _r_ from _S_ to _T_ as _r.T_).\r
+\r
+\subsection Overloading and Implicit Prefixing\r
+\r
+Whenever a variable is declared, its type can be easily obtained from its declaration (from the type of the expression on the right-hand side of the declaration), and every variable appearing in an expression is declared in an enclosing scope. The one complication to this rule is the typing of fields.\r
+\r
+For modularity, a signature creates a local namespace. Two fields with the name _f_ appearing in different signatures do not denote the same relational constant. Interpreting an expression therefore depends on first resolving any field names that appear in it. \r
+#We have devised a simple resolution scheme whose details are beyond the scope of this paper.\r
+In an expression of the form _e.f_, the signature to which _f_ belongs is determined according to the type of _e_. To keep the scheme simple, we require that sometimes the specifier resolve the overloading explicitly by writing the field _f_ of signature _S_ as _S$f_. (At the end of the previous section, for example, the reference in the fact to _rest_ should actually be to _List$rest_, since the context does not indicate which signature _rest_ belongs to.)\r
+\r
+In many formulas, a single expression is dereferenced several times with different fields. A couple of language features are designed to allow these formulas to be written more succinctly, and, if used with care, more comprehensibly.  First, we provide two syntactic variants of the dot operator. Both _p_::_q_ and _q_[_p_] are equivalent to _p.q_, but have different precedence: the double colon binds more tightly than the dot, and the square brackets bind more loosely than the dot. Second, we provide a _with_ construct similar to Pascal's that makes dereferencing implicit.\r
+\r
+Consider, for example, the following simplified signature for a trace:\r
+\r
+\geekmath sig Trace {\\\r
+       ticks: set Tick,\\\r
+       first: Tick,\\\r
+       next: Tick -> Tick,\\\r
+       state: Tick -> State\\\r
+       }\r
+\r
+Each trace _t_ has a set of ticks _t.ticks_, a first tick _t.first_, an ordering _t.next_ that maps ticks to ticks, and a relation _t.state_ mapping each tick to a state. For a trace _t_ and tick _k_, the state is _k_.(_t.state_); the square brackets allow this expression to be written instead as _t.state_[_k_]. To constrain _t.ticks_ to be those reachable from _t. first_ we might write:\r
+\r
+\geekmath fact {all t: Trace | (t.first).*(t.next ) = t.ticks}\r
+\r
+Relying on the tighter binding of the double colon, we can eliminate the parentheses:\r
+\r
+\geekmath fact {all t: Trace | t::first.*t::next = t.ticks}\r
+\r
+Using _with_, we can make the _t_ prefixes implicit:\r
+\r
+\geekmath fact {all t: Trace | with t | first.*next = ticks}\r
+\r
+In general, _with e | F_ is like _F_, but with _e_ prefixed wherever appropriate to a field name. Appropriateness is determined by type: _e_ is matched to any field name with which it can be composed using the dot operator.\r
+#Fields that are prefixed using a double colon operator are not automatically prefixed, so one can use _with_ to prefix some fields of a given signature but not others. There is a corresponding _with_ construct for expressions also, so that _with e | E_ is  like the expression _E_, with _e_ prefixed as appropriate.\r
+A fact attached to a signature _S_ is implicitly enclosed by _all this: S | with this |_, and the declarations of a signature are interpreted as constraints as if they had been declared within this scope. Consequently, the declaration of _first_ above should be interpreted as if it were the formula:\r
+\r
+\geekmath all this: Trace | with this | first: ticks\r
+\r
+which is equivalent to\r
+\r
+\geekmath all this: Trace | this.first: this.ticks\r
+\r
+and should be typed accordingly.\r
+# \r
+# So, in the following fuller version of the above signature:\r
+# \r
+# \geekmath sig Trace {\\\r
+#      ticks: set Tick\\\r
+#      first: ticks,\\\r
+#      next: (ticks - first) ->? ticks\\\r
+#      state: ticks ->! State\\\r
+#      } {first.*next = ticks}\r
+# \r
+# the declaration of the field _first_, for example, includes the constraint\r
+# \r
+# \geekmath all this: Trace | with this | first: ticks\r
+# \r
+# which is equivalent to\r
+# \r
+# \geekmath all this: Trace | this.first: this.ticks\r
+\r
+\subsection Function Applications\r
+\r
+A function may be applied by binding its parameters to expressions. The resulting application may be either an expression or a formula, but in both cases the function body is treated as a formula. The formula case is simple: the application is simply short for the body with the formal parameters replaced by the actual expressions (and bound variables renamed where necessary to avoid clashes).\r
+\r
+The expression case is more interesting. The application is treated as a syntactic sugar. Suppose we have a function application expression, _e_ say, of the form\r
+\r
+\geekmath f(a_1, a_2, ..., a_n)\r
+\r
+that appears in an elementary formula _F_. The declaration of the function _f_ must list _n_ + 1 formal arguments, of which the _second_ will be treated as the result. The entire elementary formula is taken to be short for\r
+\r
+\geekmath all result: D | f (a_1, result, a_2, ..., a_n) => F [result/e]\r
+\r
+where _D_ is the right-hand side of the declaration of the missing argument, and _F_ [_result_/_e_] is _F_ with the fresh variable _result_ substituted for the application expression _e_. The application of _f_ in this elaborated formula is now a formula, and is treated simply as an inlining of the formula of _f_.\r
+\r
+#Type checking will thus require that the actual arguments match the formals that are listed first, third, fourth, fifth, etc. (This choice of the second argument, incidentally, is one concession we make to specifying state machines; function applications can be used to model operation invocations in which it is convenient to declare the pre- and post- states as the first and second arguments of the operation.)\r
+#\r
+To see how this works, consider the definition of a function _dom_ that gives the domain of a relation over signature _X_:\r
+\r
+\geekmath fun dom (r: X -> X, d: set X) {d = r.X}\r
+\r
+(We have defined the function monomorphically for a homogeneous relation. In practice, one would define a polymorphic function, but we want to avoid conflating two unrelated issues.) Here is a trivial assertion that applies the function as an expression:\r
+\r
+\geekmath assert {all p: X \textarrow X | (dom (p)).p in X}\r
+\r
+Desugaring the formula, we get\r
+\r
+\geekmath all p: X \textarrow X | all result: set X | dom (p, result) => result.p in X\r
+\r
+and then inlining\r
+\r
+\geekmath all p: X \textarrow X | all result: set X | result = p.X => result.p in X\r
+\r
+This formula can be reduced (by applying a universal form of the One Point Rule) to\r
+\r
+\geekmath all p: X \textarrow X | (p.X).p in X\r
+\r
+which is exactly what would have been obtained had we just replaced the application expression by the expression on the right-hand side of the equality in the function's definition!\r
+#\r
+# If there is more than one application expression in an elementary formula, a fresh quantification is # generated for each. For example,# \r
+# \r
+# \geekmath assert {all p, q: X \textarrow X | dom (p.q) in dom (p)}\r
+# \r
+# becomes\r
+# \r
+# \geekmath all p,q: X \textarrow X | all result1, result2: set X | \\\r
+#              dom (p.q, result1) => dom (p, result2) => result1 in result2\r
+# \r
+# which can again be reduced by inlining and the One Point Rule to \r
+# \r
+# \geekmath all p,q: X \textarrow X | (p.q).X in p.X\r
+\r
+Now let's consider an implicit definition. Suppose we have a signature _X_ with an ordering _lte_, so that _e.lte_ is the set of elements that _e_ is less than or equal to, and a function _min_ that gives the minimum of a set, defined implicitly as the element that is a member of the set, and less than or equal to all members of the set:\r
+\r
+\geekmath sig X {lte: set X}\\\r
+fun min (s: set X, m: option X) {\\\r
+       m in s && s in m.lte\\\r
+       }\r
+\r
+Because the set may be empty, _min_ is partial. Depending on the properties of _lte_ it may also fail to be deterministic. A formula that applies this function\r
+\r
+\geekmath assert {all s: set X | min (s) in s}\r
+\r
+can as before be desugared\r
+\r
+\geekmath all s: set X | all result: option X | min (s, result) => result in s\r
+\r
+and expanded by inlining\r
+\r
+\geekmath all s: set X | all result: option X |\\\r
+       (result in s) && s in result.lte => result in s\r
+\r
+but in this case the One Point Rule is not applicable.\r
+\r
+As a convenience, our language allows the result argument of a function to be declared anonymously in a special position, and given the name _result_. The domain function, for example, can be defined as:\r
+\r
+\geekmath fun dom (r: X -> X): set X {result = r.X}\r
+\r
+How the function is defined has no bearing on how it is used; this definition is entirely equivalent to the one above, and can also be applied as a formula with two arguments.\r
+\r
+\subsection Polymorphism\r
+\r
+Polymorphism is treated as a syntactic shorthand. Lack of space does not permit a full discussion here.\r
+\r
+\section Related Work\r
+\r
+We have shown how a handful of elements can be assembled into a rather simple but flexible notation. The elements themselves are far from novel---indeed, we hope that their familiarity will make the notation easy to learn and use---but their assembly into a coherent whole results in a language rather different from existing specification languages.\r
+\r
+\subsection New Aspects\r
+\r
+The more novel aspects of our work are:\r
+\r
+\point \cdot   _Objectification of state_. Most specification languages represent states as cartesian products of components; in our approach, a state, like a member of any signature, is an individual---a distinct atom with identity. A similar idea is used in the situation calculus [11], whose 'relational fluents' add a situation variable to each time-varying relation. The general idea of objectifying all values is of course the foundation of object-oriented programming languages, and was present in LISP. Interestingly, object-oriented variants of Z (such as [1]) do not objectify schemas. The idea of representing structures in first-order style as atoms is present also in algebraic specifications such as Larch [2], which treat even sets and relations in this manner.\r
+\r
+\point \cdot   _Components as relations_. Interpreting fields of a structure as functions goes back to early work on verification, and is widely used (for example, by Leino and Nelson [10]). We are not aware, however, of specification languages that use this idea, or that flatten fields to relations over atoms.\r
+\r
+\point \cdot   _Extension by global axioms_. The 'facts' of our notation allow the properties of a signature to be extended monotonically. The idea of writing axioms that constrain the members of a set constant declared globally is hardly remarkable, but it appears not to have been widely exploited in specification languages.\r
+\r
+\point \cdot   _Extension by subset_. Treating the extension of a structure as a refinement modelled by subset results in a simple semantics, and melds well with the use of global axioms. Again, this seems to be an unremarkable idea, but one whose power has not been fully recognized.\r
+\r
+\subsection Old Aspects\r
+\r
+The aspects of our work that are directly taken from existing languages are:\r
+\r
+\point \cdot   _Formulas_. The idea of treating invariants, definitions, operations, etc, uniformly as logical formulas is due to Z [14].\r
+\r
+\point \cdot   _Assertions_. Larch [2] provides a variety of constructs for adding intentional redundancy to a specification in order to provide error-detection opportunities. \r
+\r
+\point \cdot   _Parameterized formulas_. The 'functional' style we have adopted, in which all formulas are explicitly parameterized, in contrast to the style of most specification languages, is used also by languages for theorem provers, such as PVS [13]. VDM [8] offers a mechanism called 'operation quotation' in which pre- and post conditions are reused by interpreting them as functions similar to ours.\r
+\r
+\point \cdot   _Parametric Polymorphism_. The idea of parameterizing descriptions by types was developed in the programming languages community, most notably in the context of ML [12].\r
+\r
+\point \cdot   _Implicit Prefixing_. Our 'with' operator is taken from Pascal [9].\r
+\r
+\point \cdot   _Relational operators_. The dot operator, and the treament of scalars as singletons, comes from the earlier version of Alloy [4].\r
+#\r
+#\point \cdot  _Function shorthands_. The idea of desugaring function applications by quantifying over the result is present in Beth's extensionality theorem [Beth].\r
+\r
+\subsection Z's Schema Calculus\r
+\r
+Z has been a strong influence on our work; indeed, this paper may be viewed as an attempt to achieve some of the power and flexibility of Z's schema calculus in a first-order setting. Readers unfamiliar with Z can find an excellent presentation of the schema calculus in [16]. The current definitive reference is [15], although Spivey's manual [14] is more accessible for practioners.\r
+\r
+A _schema_ consists of a collection of variable declarations and a formula constraining the variables. Schemas can be anonymous. When a name has been bound to a schema, it can be used in three different ways, distinguished according to context. First, it can be used as a _declaration_, in which case it introduces its variables into the local scope, constraining them with its formula. Second, where the variables are already in scope, it can be used as a _predicate_, in which case the formula applies and no new declarations are added. Both of these uses are syntactic; the schema can be viewed as a macro.\r
+\r
+In the third use, the schema is semantic. Its name represents a set of _bindings_, each binding being a finite function from variables names to values. The bindings denoted by the schema name are the models of the schema's formula: those bindings of variable names to values that make the formula true.\r
+\r
+How a schema is being applied is not always obvious; in the set comprehension {_S_}, for example, _S_ represents a declaration, so that the expression as a whole denotes the same set of bindings as _S_ itself. Given a binding _b_ for a schema with component variable _x_, the expression _b.x_ denotes the value assigned to _x_ in _b_. Unlike Alloy's dot, this dot is a function application, so for a set of bindings _B_, the expression _B.x_ is not well formed.\r
+\r
+Operations in Z are expressed using the convention that primed variables denote components of the post-state. A mechanism known as _decoration_ allows one to write _S'_ for the schema that is like _S_, but whose variable names have been primed. Many idioms, such as promotion, rely on being able to manipulate the values of a schema's variables in aggregate. To support this, Z provides the theta operator: \theta @sep _S_ is an expression that denotes a binding in which each variable _x_ that belongs to _S_ is bound to a variable of the same name _x_ declared in the local scope. Theta and decoration interact subtly: \theta @sep _S'_ is not a binding of _S'_, but rather binds each variable _x_ of _S_ to a variable _x'_ declared locally. So where we would write _s=s'_ to say that pre- and post-states _s_ and _s'_ are the same, a Z specifier would write \theta @sep _S_ = \theta @sep _S'_. This formula equates each component _x_ of _S_ to its matching component _x'_ of _S'_, because _x_ and _x'_ are the respective values bound to _x_ by \theta @sep _S_ and \theta @sep _S'_ respectively.\r
+\r
+Our 'fact' construct allows the meaning of a signature name to be constrained subsequent to its declaration. A schema, in contrast, is 'closed': a new schema name must be introduced for each additional constraint. This can produce an undesirable proliferation of names for a system's state, but it does make it easier to track down those formulas that affect a schema's meaning.\r
+\r
+The variables of a schema can be renamed, but cannot be replaced by arbitrary expressions (since this would make nonsense of declarations).This requires the introduction of existential quantifiers where in our notation an expression is passed as an actual. On the other hand, when no renaming is needed, it is more succinct.\r
+\r
+Z's sequential composition operator is defined by a rather complicated transformation, and relies on adherence to particular conventions. The schema _P_ @sep \fatsemi @sep _Q_ is obtained by collecting primed variables in _P_ that match unprimed variables in _Q_; renaming these in both _P_ and _Q_ with a new set of variable names; and then existentially quantifying the new names away. For example, to say that a read following a write to the same address yields the value written, we would write:\r
+\r
+\geekmath\r
+all m: Memory, a: Addr, d, d': Data | Read (Write(m,a,d),d') => d = d'\r
+\r
+which is short for\r
+\r
+\geekmath all m: Memory, a: Addr, d, d': Data |\\\r
+       all m': Memory | Write (m,m',a,d) => Read (m,a,d') => d = d'\r
+\r
+In Z, assuming appropriate declarations of a schema _Memory_ and a given type _Data_, the formula would be:\r
+\r
+\geekmath\r
+\forall Memory; Memory'; x!: Data \fatdot Write \fatsemi Read [x!/d!] \implies x! = d!\r
+\r
+which is short for\r
+\r
+\geekmath\r
+\forall Memory; Memory'; x!: Data \fatdot \\\r
+       \exists Memory'' \fatdot \\\r
+               \exists Memory' \fatdot Write \and \theta @sep Memory' = \theta @sep Memory''\\\r
+               \exists Memory'; d!: Data \fatdot \\\r
+                       Read \and \theta @sep Memory = \theta @sep Memory'' \and d! = x!\\\r
+       \implies x! = d!\r
+\r
+The key semantic difference between signatures and schemas is this. A signature is a set of atoms; its fields are relational constants declared in global scope. A schema, on the other hand, denotes a higher-order object: a set of functions from field names to values. Our approach was motivated by the desire to remain first order, so that the analysis we have developed [3] can be applied. Not surprisingly, there is a cost in expressiveness. We cannot express higher-order formulas, most notably those involving preconditions. Suppose we want to assert that our write operation has no implicit precondition. In Z, such an assertion is easily written:\r
+\r
+\geekmath\r
+\forall Memory; a?: Addr \fatdot  \exists Memory'; d!: Data \fatdot Write\r
+\r
+We might attempt to formulate such an assertion in our notation as follows:\r
+\r
+\geekmath assert {\\\r
+       all m: Memory, a: Addr, d: Data | some m': Memory | Write (m,m',d,a)\r
+       }\r
+\r
+Unfortunately, this has counterexamples such as\r
+\r
+\geekmath Addr = {a0}\\\r
+Data = {d0}\\\r
+Memory = {m0, m1}\\\r
+map = {}\r
+\r
+in which the _map_ relation lacks an appropriate tuple. Intuitively, the assertion claims that there is no context in which a write cannot proceed; a legitimate counterexample---but one we certainly did not intend---simply gives a context in which a memory with the appropriate address-value mapping is not available.\r
+\r
+We have focused in this discussion on schemas. It is worth noting that Z is expressive enough to allow a style of structuring almost identical to ours, simply by declaring signatures as given types, fields and functions as global variables, and by writing facts, and the bodies of functions, as axioms. Field names would have to be globally unique, and the resulting specification would likely be less succinct than if expressed in our notation.\r
+\r
+\subsection Phenomenology\r
+\r
+Pamela Zave and Michael Jackson have developed an approach to composing descriptions [18] that objectifies states, events and time intervals, and constrains their properties with global axioms. Objectification allows descriptions to be reduced to a common phenomenology, so that descriptions in different languages, and even in different paradigms can be combined. Michael Jackson has argued separately for the importance of objectification as a means of making a more direct connection between a formal description and the informal world: as he puts it, "domain phenomena are facts about individuals" [7]. It is reassuring that the concerns of language design and tractability of analysis that motivated our notation are not in conflict with sound method, and it seems that our notation would be a good choice for expressing descriptions in the form that Zave and Jackson have proposed.\r
+\r
+\section       Evaluation\r
+\r
+\subsection Merits\r
+\r
+The key motivations of the design of our mechanism have been minimality and flexibility. It is worth noting how this has been achived by the _omission_ of certain features:\r
+\r
+\point \cdot   There is only one form of semantic structuring; our opinion is that adding extra mechanisms, for example to group operations into classes, does not bring enough benefit to merit the additional complexity, and tends to be inflexible. (Our language does provide some namespace control for signature and paragraph names in the style of Java packages, but this is trivial and does not interact with the basic mechanism).\r
+\r
+\point \cdot   There is no subtyping; subsignatures are just subsets of their supersignatures, and have the same type. There are only two types: basic types (for signatures), and relational types (for expressions). Types are not nested.\r
+\r
+\point \cdot   There is only one way that formulas are packaged for reuse. The same function syntax is used for observers, operations, refinement relations, etc. The function shorthand syntax unifies the syntax of both declaration and use for explicit and implicit function definitions.\r
+\r
+\point \cdot   The values of a signature with fields are just like the values of any basic type; there is nothing like Z's notion of a schema binding.\r
+\r
+Our interpretation of a subsignature as a subset of the supersignature appears to be novel as a mechanism for structuring in a specification language. It has three nice consequences:\r
+\r
+\point \cdot   _Elimination of type coercions_. If _x_ belongs to a signature _S_ whose extension _S'_ defines a field _f_, the expression _x.f_ will just denote an empty set if _x_ does not belong to _S'_. Contrast this with the treatment of subclasses in the Object Constraint Language [17], for example, which results in pervasive coercions and often prevents the use of set and relation operators (since elements must be coerced one at a time).\r
+\r
+\point \cdot   _Ease of extension_. Constraints can be added to the subsignature simply by writing a constraint that is universally quantified over elements of that subset.\r
+\r
+\point \cdot   _Definitional extension_. We can declare an extension _S'_ of a signature _S_ with additional fields, relate these fields to the fields declared explicitly for _S_, and then record the fact that _S=S'_ (as illustrated in Section 2.11). The effect is that every atom of _S_ has been extended with appropriately defined fields, which can be accessed whenever an expression denoting such an atom is in scope! We expect to find this idiom especially useful for defining additional fields for visualization purposes.\r
+\r
+\subsection    Deficiencies\r
+\r
+One might wonder whether, having encoded structures using atoms, and having provided quantifiers over those atoms, one can express arbitrary properties of higher-order structures. Unfortunately, but not surprisingly, this is not possible. The catch is that fields are treated in any formulas as global variables that are existentially quantified. To simulate higher-order logic, it would be necessary to allow quantifications over these variables, and since they have relational type, that would imply higher-order quantification. The practical consequence is that properties requiring higher-order logic cannot be expressed. One cannot assert that the precondition of an operation is no stronger than some predicate; one cannot in general specify operations by minimization; and one cannot express certain forms of refinement check. An example of this problem is given in Section 4.3 above. Whether the problem is fundamental or can be partially overcome remains to be seen.\r
+\r
+The treatment of subsignatures as subsets has a nasty consequence. Since a field declared in a subsignature becomes implicitly a field of the supersignature, two subsignatures cannot declare fields of the same name. The extension mechanism is therefore not properly modular, and a specification should use hierarchical structure instead where this matters.\r
+\r
+Modelling a set of states as atoms entails a certain loss of abstraction. In this specification\r
+\r
+\geekmath sig A {}\\\r
+sig S {a: A}\\\r
+fun op (s,s': S) {s.a = s'.a}\r
+\r
+the operation _op_ has executions in which the pre- and post-states are equal (that is, the same atom in _S_), and executions in which only their _a_ components are equal. One might object that this distinction is not observable. Moreover, replacing the formula by _s=s'_ would arguably be an overspecification---a 'bias' in VDM terminology [8]. The situation calculus [11] solves this problem by requiring every operation to produce a state change: _s_ and _s'_ are thus regarded as distinct situations by virtue of occurring at different points in the execution. The dual of this solution is to add an axiom requiring that no two distinct atoms of _S_ may have equal _a_ fields. Either of these solutions is easily imposed in our notation.\r
+\r
+Our treatment of scalars and sets uniformly as relations has raised the concern that the resulting succinctness comes with a loss of clarity and redundancy. Extensive use of the previous version of our language, mostly by inexperienced specifiers, suggests that this is not a problem. The loss of some static checking is more than compensated by the semantic analysis that our tool performs.\r
+\r
+\section Conclusion\r
+\r
+Two simple ideas form the basis of our modularity mechanism: (1) that a structure is just a set of atoms, and its fields are global relations that map those atoms to structure components; and (2) that extensions of a structure are just subsets. Our relational semantics, in which all variables and fields are represented as relations, makes the use of structures simple and succinct, and it ensures that the language as a whole remains first order. For a variety of modelling tasks, we believe that our approach provides a useful balance of expressiveness and tractability.\r
+\r
+\section* Acknowledgments\r
+\r
+The language described here was refined by experience writing specifications, long before an analyzer existed, and by the development of the analyzer tool itself. Mandana Vaziri and Sarfraz Khurshid were our early adopters, and Brian Lin and Joe Cohen helped implement the tool. The paper itself was improved greatly by comments from Mandana and Sarfraz, from Michael Jackson, from Tomi Mannisto, and especially from Pamela Zave, whose suggestions prompted a major rewrite. Jim Woodcock helped us understand Z, and the clarity and simplicity of his own work has been a source of inspiration to us. Our ideas have also been improved by the comments of the members of IFIP working groups 2.3 and 2.9, especially Tony Hoare, Greg Nelson and Rustan Leino. This work was funded in part by ITR grant #0086154 from the National Science Foundation, by a grant from NASA, and by an endowment from Doug and Pat Ross.\r
+\r
+\section* References\r
+\r
+#\ref [CD94]   Steve Cook and John Daniels. Designing Object Systems: Object-Oriented Modelling with Syntropy. Prentice Hall, 1994.\r
+#\r
+\ref [1]       R. Duke, G. Rose and G. Smith. Object-Z: A Specification Language Advocated for the Description of Standards.  SVRC Technical Report 94-45. The Software Verification Research Centre, University of Queensland, Australia.\r
+\r
+\ref [2]       John V. Guttag, James J. Horning, and Andres Modet. Report on the Larch Shared Language: Version 2.3. Technical Report 58, Compaq Systems Research Center, Palo Alto, CA, 1990.\r
+\r
+#\ref [Hal90]  Anthony Hall. Using Z as a Specification Calculus for Object-Oriented Systems. In D. Bjorner, C.A.R. Hoare, and H. Langmaack, eds., VDM and Z: Formal Methods in Software Development, Lecture Notes in Computer Science, Volume 428, pp. 290\96381, Springer-Verlag, New York, 1990.\r
+#\r
+\ref [3]       Daniel Jackson. Automating first-order relational logic. Proc. ACM SIGSOFT Conf. Foundations of Software Engineering. San Diego, November 2000.\r
+\r
+\ref [4]       Daniel Jackson. Alloy: A Lightweight Object Modelling Notation. To appear, ACM Transactions on Software Engineering and Methodology, October 2001.\r
+\r
+\ref [5]       Daniel Jackson, Ian Schechter and Ilya Shlyakhter. Alcoa: the Alloy Constraint Analyzer. Proc. International Conference on Software Engineering, Limerick, Ireland, June 2000.\r
+\r
+\ref [6]       Daniel Jackson and Jeannette Wing. Lightweight Formal Methods. In: H. Saiedian (ed.), An Invitation to Formal Methods. IEEE Computer, 29(4):16-30, April 1996. \r
+\r
+\ref [7]       Michael Jackson. Software Requirements and Specifications: A Lexicon of Practice, Principles and Prejudices. Addison-Wesley, 1995.\r
+\r
+\ref [8]       Cliff Jones. Systematic Software Development Using VDM. Second edition, Prentice Hall, 1990.\r
+\r
+\ref [9]       Kathleen Jensen and Nicklaus Wirth. Pascal: User Manual and Report. Springer-# Verlag, 1974.\r
+\r
+\ref [10]      K. Rustan M. Leino and Greg Nelson. Data abstraction and information hiding . Research Report 160, Compaq Systems Research Center, November 2000.\r
+\r
+\ref [11]      Hector Levesque, Fiora Pirri, and Ray Reiter. Foundations for the Situation Calculus. Linköping Electronic Articles in Computer and Information Science, ISSN 1401-9841, Vol. 3(1998), Nr. 018.\r
+\r
+\ref [12]      Robin Milner, Mads Tofte and Robert Harper. The Definition of Standard ML. MIT Press, 1990.\r
+\r
+\ref [13]      S. Owre, N. Shankar, J. M. Rushby, and D. W. J. Stringer-Calvert. PVS Language Reference. Computer Science Laboratory, SRI International, Menlo Park, CA, September 1999.\r
+\r
+\ref [14]      J. Michael Spivey. The Z Notation: A Reference Manual. Second edition, Prentice Hall, 1992.\r
+\r
+\ref [15]      Ian Toyn et al. Formal Specification---Z Notation---Syntax, Type and Semantics. Consensus Working Draft 2.6 of the Z Standards Panel BSI Panel IST/5/-/19/2 (Z Notation). August 24, 2000.\r
+\r
+\ref [16]      Jim Woodcock and Jim Davies. Using Z: Specification, Refinement and Proof. Prentice Hall, 1996.\r
+\r
+\ref [17]      Jos Warmer and Anneke Kleppe. The Object Constraint Language: Precise Modeling with UML. Addison Wesley, 1999.\r
+\r
+\ref [18]      Pamela Zave and Michael Jackson. Conjunction as Composition. ACM Transactions on Software Engineering and Methodology II(4): 379--411, October 1993.\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse.index.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse.index.txt
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse.qxd b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse.qxd
new file mode 100755 (executable)
index 0000000..3d31912
Binary files /dev/null and b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse.qxd differ
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse.tag.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse.tag.txt
new file mode 100755 (executable)
index 0000000..8d5ec1c
--- /dev/null
@@ -0,0 +1,29 @@
+@title:A Micromodularity Mechanism
+@author:Daniel Jackson Ilya Shlyakhter and Manu Sridharan<\n> Laboratory for Computer Science<\n> Massachusetts Institute of Technology<\n> Cambridge Massachusetts USA<\n> dnjmit.edu
+@title:A Micromodularity Mechanism for <f""><\#161><f$> <f""><\#177><f$>  floor left big <f""><\#165><f$> .  Daniel Jackson
+@section:B     Introduction
+@noindent:hello there.
+@subsection:B.1        First sub
+@subsection:B.2        First sub
+@noindent:
+@subsection:B.3        First sub
+@section:C     Introduction
+@noindent:hello there.
+@subsection:C.1        First sub
+@subsection:C.2        First sub
+@subsubsection:C.2.a   First subsub
+@subsubsection:C.2.b   First subsub
+@subsubsection:C.2.c   First subsub
+@subsubsection:C.2.d   First subsub
+@subsubsection:C.2.e   First subsub
+@subsubsection:C.2.f   First subsub
+@subsubsection:C.2.g   First subsub
+@noindent:
+@subsection:C.3        First sub
+@author:Daniel Jackson123 Ilya Shlyakhter and Manu Sridharan<\n>
+@section:D     
+@noindent:Laboratory for Computer Science<\n> dnjmit.edu
+@opening:Abstract
+@noindent:Hello <\#133> and here  A simple mechanism. The paper demonstrates the flexibility of the mechanism by application in a variety of common idioms.
+@body:<\#147>I really love this <\#145>quote<\#146> kind of thing <\#150> said Ian<\#48>s mother who always primed x<\#48> in <\#146>69.<\#148> Categories and Subject Descriptors
+@noindent:D.2.1 RequirementsSpecifications<\#151>Languages Assertions Invariants Specification techniques. This is an ellipsis<\#133>And there you go
\ No newline at end of file
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/fse.txt
new file mode 100755 (executable)
index 0000000..ce70c8f
--- /dev/null
@@ -0,0 +1,73 @@
+\preamble\r
+\loadchars{k:\Research\Tagger\maps\standard-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathsym-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathit-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathext-charmap.txt}\r
+\loadstyles{k:\Research\Tagger\examples\styles.txt}\r
+\r
+\title A Micromodularity Mechanism\r
+\r
+\author Daniel Jackson, Ilya Shlyakhter and Manu Sridharan\\\r
+Laboratory for Computer Science\\\r
+Massachusetts Institute of Technology\\\r
+Cambridge, Massachusetts, USA\\\r
+dnj@mit.edu\r
+\r
+\title A Micromodularity Mechanism for \Gamma \delta \r
+\r
+floor left big: \floorleftbig . \r
+\r
+Daniel Jackson\r
+\r
+\section Introduction\r
+\r
+hello there.\r
+\r
+\subsection First sub\r
+\r
+\subsection First sub\r
+\r
+\r
+\subsection First sub\r
+\r
+\section Introduction\r
+\r
+hello there.\r
+\r
+\subsection First sub\r
+\r
+\subsection First sub\r
+\r
+\subsubsection First subsub\r
+\r
+\subsubsection First subsub\r
+\r
+\subsubsection First subsub\r
+\r
+\subsubsection First subsub\r
+\r
+\subsubsection First subsub\r
+\r
+\subsubsection First subsub\r
+\r
+\subsubsection First subsub\r
+\r
+\r
+\subsection First sub\r
+\r
+\author       Daniel Jackson123, Ilya Shlyakhter and Manu Sridharan\\\r
+\r
+# comment here!\r
+\r
+Laboratory for Computer Science\\\r
+dnj@mit.edu\r
+\r
+\opening Abstract\r
+\r
+Hello ... and here .. \r
+A simple mechanism. The paper demonstrates the flexibility of the mechanism by application in a variety of common idioms.\r
+\r
+"I really love this 'quote' kind of thing -- said Ian's mother, who always primed x' in '69."\r
+\subsection* Categories and Subject Descriptors\r
+\r
+D.2.1 Requirements/Specifications---Languages; Assertions, Invariants, Specification techniques. This is an ellipsis...And there you go!
\ No newline at end of file
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/styles.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/styles.txt
new file mode 100755 (executable)
index 0000000..55aaf72
--- /dev/null
@@ -0,0 +1,11 @@
+<style:title><next:author>\r
+<style:author><next:section>\r
+<style:section><next:noindent><counter:1><separator:.><trailer:        >\r
+<style:opening><next:noindent>\r
+<style:noindent><next:body>\r
+<style:body><next:body>\r
+<style:subsection><next:noindent><parent:section><counter:1><separator:.><trailer:     >\r
+<style:subsubsection><next:noindent><parent:subsection><counter:a><separator:.><trailer:       >\r
+<style:geekmath><next:noindent>\r
+<style:point><next:noindent><counter:A><leader:\alpha >\r
+<style:ref><next:ref>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/symbols.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/symbols.txt
new file mode 100755 (executable)
index 0000000..9b89caf
--- /dev/null
@@ -0,0 +1,530 @@
+# character map for Lucida Math Italic font\r
+\r
+<char:Gamma><font:LucidNewMatItaT><index:161>\r
+<char:Delta><font:LucidNewMatItaT><index:162>\r
+<char:Theta><font:LucidNewMatItaT><index:163>\r
+<char:Lambda><font:LucidNewMatItaT><index:164>\r
+<char:Xi><font:LucidNewMatItaT><index:165>\r
+<char:Pi><font:LucidNewMatItaT><index:166>\r
+<char:Sigma><font:LucidNewMatItaT><index:167>\r
+<char:Upsilon><font:LucidNewMatItaT><index:7>\r
+<char:Phi><font:LucidNewMatItaT><index:169>\r
+<char:Psi><font:LucidNewMatItaT><index:170>\r
+<char:Omega><font:LucidNewMatItaT><index:173>\r
+<char:alpha><font:LucidNewMatItaT><index:174>\r
+<char:beta><font:LucidNewMatItaT><index:175>\r
+<char:gamma><font:LucidNewMatItaT><index:176>\r
+<char:delta><font:LucidNewMatItaT><index:177>\r
+<char:epsilon1><font:LucidNewMatItaT><index:178>\r
+<char:zeta><font:LucidNewMatItaT><index:179>\r
+<char:eta><font:LucidNewMatItaT><index:180>\r
+<char:theta><font:LucidNewMatItaT><index:181>\r
+<char:iota><font:LucidNewMatItaT><index:182>\r
+<char:kappa><font:LucidNewMatItaT><index:183>\r
+<char:lambda><font:LucidNewMatItaT><index:184>\r
+<char:mu><font:LucidNewMatItaT><index:185>\r
+<char:nu><font:LucidNewMatItaT><index:186>\r
+<char:xi><font:LucidNewMatItaT><index:187>\r
+<char:pi><font:LucidNewMatItaT><index:188>\r
+<char:rho><font:LucidNewMatItaT><index:189>\r
+<char:sigma><font:LucidNewMatItaT><index:190>\r
+<char:tau><font:LucidNewMatItaT><index:191>\r
+<char:upsilon><font:LucidNewMatItaT><index:192>\r
+<char:phi><font:LucidNewMatItaT><index:193>\r
+<char:chi><font:LucidNewMatItaT><index:194>\r
+<char:psi><font:LucidNewMatItaT><index:195>\r
+<char:tie><font:LucidNewMatItaT><index:196>\r
+<char:omega><font:LucidNewMatItaT><index:33>\r
+<char:epsilon><font:LucidNewMatItaT><index:34>\r
+<char:theta1><font:LucidNewMatItaT><index:35>\r
+<char:pi1><font:LucidNewMatItaT><index:36>\r
+<char:rho1><font:LucidNewMatItaT><index:37>\r
+<char:sigma1><font:LucidNewMatItaT><index:38>\r
+<char:phi1><font:LucidNewMatItaT><index:39>\r
+<char:arrowlefttophalf><font:LucidNewMatItaT><index:40>\r
+<char:arrowleftbothalf><font:LucidNewMatItaT><index:41>\r
+<char:arrowrighttophalf><font:LucidNewMatItaT><index:42>\r
+<char:arrowrightbothalf><font:LucidNewMatItaT><index:43>\r
+<char:arrowhookleft><font:LucidNewMatItaT><index:44>\r
+<char:arrowhookright><font:LucidNewMatItaT><index:45>\r
+<char:triangleright><font:LucidNewMatItaT><index:46>\r
+<char:triangleleft><font:LucidNewMatItaT><index:47>\r
+<char:period><font:LucidNewMatItaT><index:58>\r
+<char:comma><font:LucidNewMatItaT><index:59>\r
+<char:less><font:LucidNewMatItaT><index:60>\r
+<char:slash><font:LucidNewMatItaT><index:61>\r
+<char:greater><font:LucidNewMatItaT><index:62>\r
+<char:star><font:LucidNewMatItaT><index:63>\r
+<char:partialdiff><font:LucidNewMatItaT><index:64>\r
+<char:flat><font:LucidNewMatItaT><index:91>\r
+<char:natural><font:LucidNewMatItaT><index:92>\r
+<char:sharp><font:LucidNewMatItaT><index:93>\r
+<char:slurbelow><font:LucidNewMatItaT><index:94>\r
+<char:slurabove><font:LucidNewMatItaT><index:95>\r
+<char:lscript><font:LucidNewMatItaT><index:96>\r
+<char:dotlessi><font:LucidNewMatItaT><index:123>\r
+<char:dotlessj><font:LucidNewMatItaT><index:124>\r
+<char:weierstrass><font:LucidNewMatItaT><index:125>\r
+<char:vector><font:LucidNewMatItaT><index:126>\r
+\r
+\r
+# mathematical characters for Lucida New Math Symbol font\r
+\r
+<char:minus><font:LucidNewMatSymT><index:161>\r
+<char:periodcentered><font:LucidNewMatSymT><index:162>\r
+<char:multiply><font:LucidNewMatSymT><index:163>\r
+<char:asteriskmath><font:LucidNewMatSymT><index:164>\r
+<char:divide><font:LucidNewMatSymT><index:165>\r
+<char:diamondmath><font:LucidNewMatSymT><index:166>\r
+<char:plusminus><font:LucidNewMatSymT><index:167>\r
+<char:minusplus><font:LucidNewMatSymT><index:168>\r
+<char:circleplus><font:LucidNewMatSymT><index:169>\r
+<char:circleminus><font:LucidNewMatSymT><index:170>\r
+<char:circlemultiply><font:LucidNewMatSymT><index:173>\r
+<char:circledivide><font:LucidNewMatSymT><index:174>\r
+<char:circledot><font:LucidNewMatSymT><index:175>\r
+<char:circlecopyrt><font:LucidNewMatSymT><index:176>\r
+<char:openbullet><font:LucidNewMatSymT><index:177>\r
+<char:bullet><font:LucidNewMatSymT><index:178>\r
+<char:equivasymptotic><font:LucidNewMatSymT><index:179>\r
+<char:equivalence><font:LucidNewMatSymT><index:180>\r
+<char:reflexsubset><font:LucidNewMatSymT><index:181>\r
+<char:reflexsuperset><font:LucidNewMatSymT><index:182>\r
+<char:lessequal><font:LucidNewMatSymT><index:183>\r
+<char:greaterequal><font:LucidNewMatSymT><index:184>\r
+<char:precedesequal><font:LucidNewMatSymT><index:185>\r
+<char:followsequal><font:LucidNewMatSymT><index:186>\r
+<char:similar><font:LucidNewMatSymT><index:187>\r
+<char:approxequal><font:LucidNewMatSymT><index:188>\r
+<char:propersubset><font:LucidNewMatSymT><index:189>\r
+<char:propersuperset><font:LucidNewMatSymT><index:190>\r
+<char:lessmuch><font:LucidNewMatSymT><index:191>\r
+<char:greatermuch><font:LucidNewMatSymT><index:192>\r
+<char:precedes><font:LucidNewMatSymT><index:193>\r
+<char:follows><font:LucidNewMatSymT><index:194>\r
+<char:arrowleft><font:LucidNewMatSymT><index:195>\r
+<char:spade><font:LucidNewMatSymT><index:196>\r
+<char:arrowright><font:LucidNewMatSymT><index:33>\r
+<char:arrowup><font:LucidNewMatSymT><index:34>\r
+<char:arrowdown><font:LucidNewMatSymT><index:35>\r
+<char:arrowboth><font:LucidNewMatSymT><index:36>\r
+<char:arrownortheast><font:LucidNewMatSymT><index:37>\r
+<char:arrowsoutheast><font:LucidNewMatSymT><index:38>\r
+<char:similarequal><font:LucidNewMatSymT><index:39>\r
+<char:arrowdblleft><font:LucidNewMatSymT><index:40>\r
+<char:arrowdblright><font:LucidNewMatSymT><index:41>\r
+<char:arrowdblup><font:LucidNewMatSymT><index:42>\r
+<char:arrowdbldown><font:LucidNewMatSymT><index:43>\r
+<char:arrowdblboth><font:LucidNewMatSymT><index:44>\r
+<char:arrownorthwest><font:LucidNewMatSymT><index:45>\r
+<char:arrowsouthwest><font:LucidNewMatSymT><index:46>\r
+<char:proportional><font:LucidNewMatSymT><index:47>\r
+<char:prime><font:LucidNewMatSymT><index:48>\r
+<char:infinity><font:LucidNewMatSymT><index:49>\r
+<char:element><font:LucidNewMatSymT><index:50>\r
+<char:owner><font:LucidNewMatSymT><index:51>\r
+<char:triangle><font:LucidNewMatSymT><index:52>\r
+<char:triangleinv><font:LucidNewMatSymT><index:53>\r
+<char:negationslash><font:LucidNewMatSymT><index:54>\r
+<char:mapsto><font:LucidNewMatSymT><index:55>\r
+<char:universal><font:LucidNewMatSymT><index:56>\r
+<char:existential><font:LucidNewMatSymT><index:57>\r
+<char:logicalnot><font:LucidNewMatSymT><index:58>\r
+<char:emptyset><font:LucidNewMatSymT><index:59>\r
+<char:Rfractur><font:LucidNewMatSymT><index:60>\r
+<char:Ifractur><font:LucidNewMatSymT><index:61>\r
+<char:latticetop><font:LucidNewMatSymT><index:62>\r
+<char:perpendicular><font:LucidNewMatSymT><index:63>\r
+<char:aleph><font:LucidNewMatSymT><index:64>\r
+<char:scriptA><font:LucidNewMatSymT><index:65>\r
+<char:scriptB><font:LucidNewMatSymT><index:66>\r
+<char:scriptC><font:LucidNewMatSymT><index:67>\r
+<char:scriptD><font:LucidNewMatSymT><index:68>\r
+<char:scriptE><font:LucidNewMatSymT><index:69>\r
+<char:scriptF><font:LucidNewMatSymT><index:70>\r
+<char:scriptG><font:LucidNewMatSymT><index:71>\r
+<char:scriptH><font:LucidNewMatSymT><index:72>\r
+<char:scriptI><font:LucidNewMatSymT><index:73>\r
+<char:scriptJ><font:LucidNewMatSymT><index:74>\r
+<char:scriptK><font:LucidNewMatSymT><index:75>\r
+<char:scriptL><font:LucidNewMatSymT><index:76>\r
+<char:scriptM><font:LucidNewMatSymT><index:77>\r
+<char:scriptN><font:LucidNewMatSymT><index:78>\r
+<char:scriptO><font:LucidNewMatSymT><index:79>\r
+<char:scriptP><font:LucidNewMatSymT><index:80>\r
+<char:scriptQ><font:LucidNewMatSymT><index:81>\r
+<char:scriptR><font:LucidNewMatSymT><index:82>\r
+<char:scriptS><font:LucidNewMatSymT><index:83>\r
+<char:scriptT><font:LucidNewMatSymT><index:84>\r
+<char:scriptU><font:LucidNewMatSymT><index:85>\r
+<char:scriptV><font:LucidNewMatSymT><index:86>\r
+<char:scriptW><font:LucidNewMatSymT><index:87>\r
+<char:scriptX><font:LucidNewMatSymT><index:88>\r
+<char:scriptY><font:LucidNewMatSymT><index:89>\r
+<char:scriptZ><font:LucidNewMatSymT><index:90>\r
+<char:union><font:LucidNewMatSymT><index:91>\r
+<char:intersection><font:LucidNewMatSymT><index:92>\r
+<char:unionmulti><font:LucidNewMatSymT><index:93>\r
+<char:logicaland><font:LucidNewMatSymT><index:94>\r
+<char:logicalor><font:LucidNewMatSymT><index:95>\r
+<char:turnstileleft><font:LucidNewMatSymT><index:96>\r
+<char:turnstileright><font:LucidNewMatSymT><index:97>\r
+<char:floorleft><font:LucidNewMatSymT><index:98>\r
+<char:floorright><font:LucidNewMatSymT><index:99>\r
+<char:ceilingleft><font:LucidNewMatSymT><index:100>\r
+<char:ceilingright><font:LucidNewMatSymT><index:101>\r
+<char:braceleft><font:LucidNewMatSymT><index:102>\r
+<char:braceright><font:LucidNewMatSymT><index:103>\r
+<char:angbracketleft><font:LucidNewMatSymT><index:104>\r
+<char:angbracketright><font:LucidNewMatSymT><index:105>\r
+<char:bar><font:LucidNewMatSymT><index:106>\r
+<char:bardbl><font:LucidNewMatSymT><index:107>\r
+<char:arrowbothv><font:LucidNewMatSymT><index:108>\r
+<char:arrowdblbothv><font:LucidNewMatSymT><index:109>\r
+<char:backslash><font:LucidNewMatSymT><index:110>\r
+<char:wreathproduct><font:LucidNewMatSymT><index:111>\r
+<char:radical><font:LucidNewMatSymT><index:112>\r
+<char:coproduct><font:LucidNewMatSymT><index:113>\r
+<char:nabla><font:LucidNewMatSymT><index:114>\r
+<char:integral><font:LucidNewMatSymT><index:115>\r
+<char:unionsq><font:LucidNewMatSymT><index:116>\r
+<char:intersectionsq><font:LucidNewMatSymT><index:117>\r
+<char:subsetsqequal><font:LucidNewMatSymT><index:118>\r
+<char:supersetsqequal><font:LucidNewMatSymT><index:119>\r
+<char:section><font:LucidNewMatSymT><index:120>\r
+<char:dagger><font:LucidNewMatSymT><index:121>\r
+<char:daggerdbl><font:LucidNewMatSymT><index:122>\r
+<char:paragraph><font:LucidNewMatSymT><index:123>\r
+<char:club><font:LucidNewMatSymT><index:124>\r
+<char:diamond><font:LucidNewMatSymT><index:125>\r
+<char:heart><font:LucidNewMatSymT><index:126>\r
+\r
+\r
+\r
+# character map for Symbol font\r
+\r
+<char:Symbol><font:Symbol><index:for>\r
+<char:space><font:Symbol><index:32>\r
+<char:exclam><font:Symbol><index:33>\r
+<char:universal><font:Symbol><index:34>\r
+<char:numbersign><font:Symbol><index:35>\r
+<char:existential><font:Symbol><index:36>\r
+<char:percent><font:Symbol><index:37>\r
+<char:ampersand><font:Symbol><index:38>\r
+<char:suchthat><font:Symbol><index:39>\r
+<char:parenleft><font:Symbol><index:40>\r
+<char:parenright><font:Symbol><index:41>\r
+<char:asteriskmath><font:Symbol><index:42>\r
+<char:plus><font:Symbol><index:43>\r
+<char:comma><font:Symbol><index:44>\r
+<char:minus><font:Symbol><index:45>\r
+<char:period><font:Symbol><index:46>\r
+<char:slash><font:Symbol><index:47>\r
+<char:zero><font:Symbol><index:48>\r
+<char:one><font:Symbol><index:49>\r
+<char:two><font:Symbol><index:50>\r
+<char:three><font:Symbol><index:51>\r
+<char:four><font:Symbol><index:52>\r
+<char:five><font:Symbol><index:53>\r
+<char:six><font:Symbol><index:54>\r
+<char:seven><font:Symbol><index:55>\r
+<char:eight><font:Symbol><index:56>\r
+<char:nine><font:Symbol><index:57>\r
+<char:colon><font:Symbol><index:58>\r
+<char:semicolon><font:Symbol><index:59>\r
+<char:less><font:Symbol><index:60>\r
+<char:equal><font:Symbol><index:61>\r
+<char:greater><font:Symbol><index:62>\r
+<char:question><font:Symbol><index:63>\r
+<char:congruent><font:Symbol><index:64>\r
+<char:Alpha><font:Symbol><index:65>\r
+<char:Beta><font:Symbol><index:66>\r
+<char:Chi><font:Symbol><index:67>\r
+<char:Delta><font:Symbol><index:68>\r
+<char:Epsilon><font:Symbol><index:69>\r
+<char:Phi><font:Symbol><index:70>\r
+<char:Gamma><font:Symbol><index:71>\r
+<char:Eta><font:Symbol><index:72>\r
+<char:Iota><font:Symbol><index:73>\r
+<char:theta1><font:Symbol><index:74>\r
+<char:Kappa><font:Symbol><index:75>\r
+<char:Lambda><font:Symbol><index:76>\r
+<char:Mu><font:Symbol><index:77>\r
+<char:Nu><font:Symbol><index:78>\r
+<char:Omicron><font:Symbol><index:79>\r
+<char:Pi><font:Symbol><index:80>\r
+<char:Theta><font:Symbol><index:81>\r
+<char:Rho><font:Symbol><index:82>\r
+<char:Sigma><font:Symbol><index:83>\r
+<char:Tau><font:Symbol><index:84>\r
+<char:Upsilon><font:Symbol><index:85>\r
+<char:sigma1><font:Symbol><index:86>\r
+<char:Omega><font:Symbol><index:87>\r
+<char:Xi><font:Symbol><index:88>\r
+<char:Psi><font:Symbol><index:89>\r
+<char:Zeta><font:Symbol><index:90>\r
+<char:bracketleft><font:Symbol><index:91>\r
+<char:therefore><font:Symbol><index:92>\r
+<char:bracketright><font:Symbol><index:93>\r
+<char:perpendicular><font:Symbol><index:94>\r
+<char:underscore><font:Symbol><index:95>\r
+<char:radicalex><font:Symbol><index:96>\r
+<char:alpha><font:Symbol><index:97>\r
+<char:beta><font:Symbol><index:98>\r
+<char:chi><font:Symbol><index:99>\r
+<char:delta><font:Symbol><index:100>\r
+<char:epsilon><font:Symbol><index:101>\r
+<char:phi><font:Symbol><index:102>\r
+<char:gamma><font:Symbol><index:103>\r
+<char:eta><font:Symbol><index:104>\r
+<char:iota><font:Symbol><index:105>\r
+<char:phi1><font:Symbol><index:106>\r
+<char:kappa><font:Symbol><index:107>\r
+<char:lambda><font:Symbol><index:108>\r
+<char:mu><font:Symbol><index:109>\r
+<char:nu><font:Symbol><index:110>\r
+<char:omicron><font:Symbol><index:111>\r
+<char:pi><font:Symbol><index:112>\r
+<char:theta><font:Symbol><index:113>\r
+<char:rho><font:Symbol><index:114>\r
+<char:sigma><font:Symbol><index:115>\r
+<char:tau><font:Symbol><index:116>\r
+<char:upsilon><font:Symbol><index:117>\r
+<char:omega1><font:Symbol><index:118>\r
+<char:omega><font:Symbol><index:119>\r
+<char:xi><font:Symbol><index:120>\r
+<char:psi><font:Symbol><index:121>\r
+<char:zeta><font:Symbol><index:122>\r
+<char:braceleft><font:Symbol><index:123>\r
+<char:bar><font:Symbol><index:124>\r
+<char:braceright><font:Symbol><index:125>\r
+<char:similar><font:Symbol><index:126>\r
+<char:Euro><font:Symbol><index:160>\r
+<char:Upsilon1><font:Symbol><index:161>\r
+<char:minute><font:Symbol><index:162>\r
+<char:lessequal><font:Symbol><index:163>\r
+<char:fraction><font:Symbol><index:164>\r
+<char:infinity><font:Symbol><index:165>\r
+<char:florin><font:Symbol><index:166>\r
+<char:club><font:Symbol><index:167>\r
+<char:diamond><font:Symbol><index:168>\r
+<char:heart><font:Symbol><index:169>\r
+<char:spade><font:Symbol><index:170>\r
+<char:arrowboth><font:Symbol><index:171>\r
+<char:arrowleft><font:Symbol><index:172>\r
+<char:arrowup><font:Symbol><index:173>\r
+<char:arrowright><font:Symbol><index:174>\r
+<char:arrowdown><font:Symbol><index:175>\r
+<char:degree><font:Symbol><index:176>\r
+<char:plusminus><font:Symbol><index:177>\r
+<char:second><font:Symbol><index:178>\r
+<char:greaterequal><font:Symbol><index:179>\r
+<char:multiply><font:Symbol><index:180>\r
+<char:proportional><font:Symbol><index:181>\r
+<char:partialdiff><font:Symbol><index:182>\r
+<char:bullet><font:Symbol><index:183>\r
+<char:divide><font:Symbol><index:184>\r
+<char:notequal><font:Symbol><index:185>\r
+<char:equivalence><font:Symbol><index:186>\r
+<char:approxequal><font:Symbol><index:187>\r
+\r
+# seems to be a quarter fraction\r
+# <char:ellipsis><font:Symbol><index:188>\r
+\r
+<char:arrowvertex><font:Symbol><index:189>\r
+<char:arrowhorizex><font:Symbol><index:190>\r
+<char:carriagereturn><font:Symbol><index:191>\r
+<char:aleph><font:Symbol><index:192>\r
+<char:Ifraktur><font:Symbol><index:193>\r
+<char:Rfraktur><font:Symbol><index:194>\r
+<char:weierstrass><font:Symbol><index:195>\r
+<char:circlemultiply><font:Symbol><index:196>\r
+<char:circleplus><font:Symbol><index:197>\r
+<char:emptyset><font:Symbol><index:198>\r
+<char:intersection><font:Symbol><index:199>\r
+<char:union><font:Symbol><index:200>\r
+<char:propersuperset><font:Symbol><index:201>\r
+<char:reflexsuperset><font:Symbol><index:202>\r
+<char:notsubset><font:Symbol><index:203>\r
+<char:propersubset><font:Symbol><index:204>\r
+<char:reflexsubset><font:Symbol><index:205>\r
+<char:element><font:Symbol><index:206>\r
+<char:notelement><font:Symbol><index:207>\r
+<char:angle><font:Symbol><index:208>\r
+<char:gradient><font:Symbol><index:209>\r
+<char:registerserif><font:Symbol><index:210>\r
+<char:copyrightserif><font:Symbol><index:211>\r
+<char:trademarkserif><font:Symbol><index:212>\r
+<char:product><font:Symbol><index:213>\r
+<char:radical><font:Symbol><index:214>\r
+<char:dotmath><font:Symbol><index:215>\r
+<char:logicalnot><font:Symbol><index:216>\r
+<char:logicaland><font:Symbol><index:217>\r
+<char:logicalor><font:Symbol><index:218>\r
+<char:arrowdblboth><font:Symbol><index:219>\r
+<char:arrowdblleft><font:Symbol><index:220>\r
+<char:arrowdblup><font:Symbol><index:221>\r
+<char:arrowdblright><font:Symbol><index:222>\r
+<char:arrowdbldown><font:Symbol><index:223>\r
+<char:lozenge><font:Symbol><index:224>\r
+<char:angleleft><font:Symbol><index:225>\r
+<char:registersans><font:Symbol><index:226>\r
+<char:copyrightsans><font:Symbol><index:227>\r
+<char:trademarksans><font:Symbol><index:228>\r
+<char:summation><font:Symbol><index:229>\r
+<char:parenlefttp><font:Symbol><index:230>\r
+<char:parenleftex><font:Symbol><index:231>\r
+<char:parenleftbt><font:Symbol><index:232>\r
+<char:bracketlefttp><font:Symbol><index:233>\r
+<char:bracketleftex><font:Symbol><index:234>\r
+<char:bracketleftbt><font:Symbol><index:235>\r
+<char:bracelefttp><font:Symbol><index:236>\r
+<char:braceleftmid><font:Symbol><index:237>\r
+<char:braceleftbt><font:Symbol><index:238>\r
+<char:braceex><font:Symbol><index:239>\r
+<char:angleright><font:Symbol><index:241>\r
+<char:integral><font:Symbol><index:242>\r
+<char:integraltp><font:Symbol><index:243>\r
+<char:integralex><font:Symbol><index:244>\r
+<char:integralbt><font:Symbol><index:245>\r
+<char:parenrighttp><font:Symbol><index:246>\r
+<char:parenrightex><font:Symbol><index:247>\r
+<char:parenrightbt><font:Symbol><index:248>\r
+<char:bracketrighttp><font:Symbol><index:249>\r
+<char:bracketrightex><font:Symbol><index:250>\r
+<char:bracketrightbt><font:Symbol><index:251>\r
+<char:bracerighttp><font:Symbol><index:252>\r
+<char:bracerightmid><font:Symbol><index:253>\r
+<char:bracerightbt><font:Symbol><index:254>\r
+\r
+\r
+# character map for Lucida New Math Extended font\r
+\r
+<char:parenleftbig><font:LucidNewMatExtT><index:161>\r
+<char:parenrightbig><font:LucidNewMatExtT><index:162>\r
+<char:bracketleftbig><font:LucidNewMatExtT><index:163>\r
+<char:bracketrightbig><font:LucidNewMatExtT><index:164>\r
+<char:floorleftbig><font:LucidNewMatExtT><index:165>\r
+<char:floorrightbig><font:LucidNewMatExtT><index:166>\r
+<char:ceilingleftbig><font:LucidNewMatExtT><index:167>\r
+<char:ceilingrightbig><font:LucidNewMatExtT><index:168>\r
+<char:braceleftbig><font:LucidNewMatExtT><index:169>\r
+<char:bracerightbig><font:LucidNewMatExtT><index:170>\r
+<char:angbracketleftbig><font:LucidNewMatExtT><index:173>\r
+<char:angbracketrightbig><font:LucidNewMatExtT><index:174>\r
+<char:vextendsingle><font:LucidNewMatExtT><index:175>\r
+<char:vextenddouble><font:LucidNewMatExtT><index:176>\r
+<char:slashbig><font:LucidNewMatExtT><index:177>\r
+<char:backslashbig><font:LucidNewMatExtT><index:178>\r
+<char:parenleftBig><font:LucidNewMatExtT><index:179>\r
+<char:parenrightBig><font:LucidNewMatExtT><index:180>\r
+<char:parenleftbigg><font:LucidNewMatExtT><index:181>\r
+<char:parenrightbigg><font:LucidNewMatExtT><index:182>\r
+<char:bracketleftbigg><font:LucidNewMatExtT><index:183>\r
+<char:bracketrightbigg><font:LucidNewMatExtT><index:184>\r
+<char:floorleftbigg><font:LucidNewMatExtT><index:185>\r
+<char:floorrightbigg><font:LucidNewMatExtT><index:186>\r
+<char:ceilingleftbigg><font:LucidNewMatExtT><index:187>\r
+<char:ceilingrightbigg><font:LucidNewMatExtT><index:188>\r
+<char:braceleftbigg><font:LucidNewMatExtT><index:189>\r
+<char:bracerightbigg><font:LucidNewMatExtT><index:190>\r
+<char:angbracketleftbigg><font:LucidNewMatExtT><index:28>\r
+<char:angbracketrightbigg><font:LucidNewMatExtT><index:29>\r
+<char:slashbigg><font:LucidNewMatExtT><index:193>\r
+<char:backslashbigg><font:LucidNewMatExtT><index:194>\r
+<char:parenleftBigg><font:LucidNewMatExtT><index:195>\r
+<char:parenrightBigg><font:LucidNewMatExtT><index:33>\r
+<char:bracketleftBigg><font:LucidNewMatExtT><index:34>\r
+<char:bracketrightBigg><font:LucidNewMatExtT><index:35>\r
+<char:floorleftBigg><font:LucidNewMatExtT><index:36>\r
+<char:floorrightBigg><font:LucidNewMatExtT><index:37>\r
+<char:ceilingleftBigg><font:LucidNewMatExtT><index:38>\r
+<char:ceilingrightBigg><font:LucidNewMatExtT><index:39>\r
+<char:braceleftBigg><font:LucidNewMatExtT><index:40>\r
+<char:bracerightBigg><font:LucidNewMatExtT><index:41>\r
+<char:angbracketleftBigg><font:LucidNewMatExtT><index:42>\r
+<char:angbracketrightBigg><font:LucidNewMatExtT><index:43>\r
+<char:slashBigg><font:LucidNewMatExtT><index:44>\r
+<char:backslashBigg><font:LucidNewMatExtT><index:45>\r
+<char:slashBig><font:LucidNewMatExtT><index:46>\r
+<char:backslashBig><font:LucidNewMatExtT><index:47>\r
+<char:parenlefttp><font:LucidNewMatExtT><index:48>\r
+<char:parenrighttp><font:LucidNewMatExtT><index:49>\r
+<char:bracketlefttp><font:LucidNewMatExtT><index:50>\r
+<char:bracketrighttp><font:LucidNewMatExtT><index:51>\r
+<char:bracketleftbt><font:LucidNewMatExtT><index:52>\r
+<char:bracketrightbt><font:LucidNewMatExtT><index:53>\r
+<char:bracketleftex><font:LucidNewMatExtT><index:54>\r
+<char:bracketrightex><font:LucidNewMatExtT><index:55>\r
+<char:bracelefttp><font:LucidNewMatExtT><index:56>\r
+<char:bracerighttp><font:LucidNewMatExtT><index:57>\r
+<char:braceleftbt><font:LucidNewMatExtT><index:58>\r
+<char:bracerightbt><font:LucidNewMatExtT><index:59>\r
+<char:braceleftmid><font:LucidNewMatExtT><index:60>\r
+<char:bracerightmid><font:LucidNewMatExtT><index:61>\r
+<char:braceex><font:LucidNewMatExtT><index:62>\r
+<char:arrowvertex><font:LucidNewMatExtT><index:63>\r
+<char:parenleftbt><font:LucidNewMatExtT><index:64>\r
+<char:parenrightbt><font:LucidNewMatExtT><index:65>\r
+<char:parenleftex><font:LucidNewMatExtT><index:66>\r
+<char:parenrightex><font:LucidNewMatExtT><index:67>\r
+<char:angbracketleftBig><font:LucidNewMatExtT><index:68>\r
+<char:angbracketrightBig><font:LucidNewMatExtT><index:69>\r
+<char:unionsqtext><font:LucidNewMatExtT><index:70>\r
+<char:unionsqdisplay><font:LucidNewMatExtT><index:71>\r
+<char:contintegraltext><font:LucidNewMatExtT><index:72>\r
+<char:contintegraldisplay><font:LucidNewMatExtT><index:73>\r
+<char:circledottext><font:LucidNewMatExtT><index:74>\r
+<char:circledotdisplay><font:LucidNewMatExtT><index:75>\r
+<char:circleplustext><font:LucidNewMatExtT><index:76>\r
+<char:circleplusdisplay><font:LucidNewMatExtT><index:77>\r
+<char:circlemultiplytext><font:LucidNewMatExtT><index:78>\r
+<char:circlemultiplydisplay><font:LucidNewMatExtT><index:79>\r
+<char:summationtext><font:LucidNewMatExtT><index:80>\r
+<char:producttext><font:LucidNewMatExtT><index:81>\r
+<char:integraltext><font:LucidNewMatExtT><index:82>\r
+<char:uniontext><font:LucidNewMatExtT><index:83>\r
+<char:intersectiontext><font:LucidNewMatExtT><index:84>\r
+<char:unionmultitext><font:LucidNewMatExtT><index:85>\r
+<char:logicalandtext><font:LucidNewMatExtT><index:86>\r
+<char:logicalortext><font:LucidNewMatExtT><index:87>\r
+<char:summationdisplay><font:LucidNewMatExtT><index:88>\r
+<char:productdisplay><font:LucidNewMatExtT><index:89>\r
+<char:integraldisplay><font:LucidNewMatExtT><index:90>\r
+<char:uniondisplay><font:LucidNewMatExtT><index:91>\r
+<char:intersectiondisplay><font:LucidNewMatExtT><index:92>\r
+<char:unionmultidisplay><font:LucidNewMatExtT><index:93>\r
+<char:logicalanddisplay><font:LucidNewMatExtT><index:94>\r
+<char:logicalordisplay><font:LucidNewMatExtT><index:95>\r
+<char:coproducttext><font:LucidNewMatExtT><index:96>\r
+<char:coproductdisplay><font:LucidNewMatExtT><index:97>\r
+<char:hatwide><font:LucidNewMatExtT><index:98>\r
+<char:hatwider><font:LucidNewMatExtT><index:99>\r
+<char:hatwidest><font:LucidNewMatExtT><index:100>\r
+<char:tildewide><font:LucidNewMatExtT><index:101>\r
+<char:tildewider><font:LucidNewMatExtT><index:102>\r
+<char:tildewidest><font:LucidNewMatExtT><index:103>\r
+<char:bracketleftBig><font:LucidNewMatExtT><index:104>\r
+<char:bracketrightBig><font:LucidNewMatExtT><index:105>\r
+<char:floorleftBig><font:LucidNewMatExtT><index:106>\r
+<char:floorrightBig><font:LucidNewMatExtT><index:107>\r
+<char:ceilingleftBig><font:LucidNewMatExtT><index:108>\r
+<char:ceilingrightBig><font:LucidNewMatExtT><index:109>\r
+<char:braceleftBig><font:LucidNewMatExtT><index:110>\r
+<char:bracerightBig><font:LucidNewMatExtT><index:111>\r
+<char:radicalbig><font:LucidNewMatExtT><index:112>\r
+<char:radicalBig><font:LucidNewMatExtT><index:113>\r
+<char:radicalbigg><font:LucidNewMatExtT><index:114>\r
+<char:radicalBigg><font:LucidNewMatExtT><index:115>\r
+<char:radicalbt><font:LucidNewMatExtT><index:116>\r
+<char:radicalvertex><font:LucidNewMatExtT><index:117>\r
+<char:radicaltp><font:LucidNewMatExtT><index:118>\r
+<char:arrowvertexdbl><font:LucidNewMatExtT><index:119>\r
+<char:arrowtp><font:LucidNewMatExtT><index:120>\r
+<char:arrowbt><font:LucidNewMatExtT><index:121>\r
+<char:bracehtipdownleft><font:LucidNewMatExtT><index:122>\r
+<char:bracehtipdownright><font:LucidNewMatExtT><index:123>\r
+<char:bracehtipupleft><font:LucidNewMatExtT><index:124>\r
+<char:bracehtipupright><font:LucidNewMatExtT><index:125>\r
+<char:arrowdbltp><font:LucidNewMatExtT><index:126>\r
+<char:arrowdblbt><font:LucidNewMatExtT><index:196>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/test.index.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/test.index.txt
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/test.tag.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/test.tag.txt
new file mode 100755 (executable)
index 0000000..5cf4de3
--- /dev/null
@@ -0,0 +1 @@
+ A Micromodularity Mechanism A Micromodularity Mechanism 
\ No newline at end of file
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/examples/test.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/examples/test.txt
new file mode 100755 (executable)
index 0000000..e58bee7
--- /dev/null
@@ -0,0 +1,10 @@
+\preamble\r
+\loadchars{k:\Research\Tagger\maps\standard-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathsym-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathit-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathext-charmap.txt}\r
+\loadstyles{k:\Research\Tagger\examples\styles.txt}\r
+\r
+\title A Micromodularity Mechanism\r
+\r
+\title A Micromodularity Mechanism\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/charmap.pdf b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/charmap.pdf
new file mode 100755 (executable)
index 0000000..eb501ec
Binary files /dev/null and b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/charmap.pdf differ
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/charmaps-display.tag.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/charmaps-display.tag.txt
new file mode 100755 (executable)
index 0000000..b5060d7
--- /dev/null
@@ -0,0 +1,13 @@
+@section:1     Standard Charmap\r
+@noindent:<f"Symbol"><\#32><f$>        space   <\n> <f"Symbol"><\#33><f$>      exclam  <\n> <f""><\#34><f$>    quotedbl        <\n> <f"Symbol"><\#35><f$>      numbersign      <\n> <f""><\#36><f$>    dollar  <\n> <f"Symbol"><\#37><f$>      percent <\n> <f"Symbol"><\#38><f$>      ampersand       <\n> <f""><\#39><f$>    quotesingle     <\n> <f"Symbol"><\#40><f$>      parenleft       <\n> <f"Symbol"><\#41><f$>      parenright      <\n> <f""><\#42><f$>    asterisk        <\n> <f"Symbol"><\#43><f$>      plus    <\n> <f"Symbol"><\#44><f$>      comma   <\n> <f""><\#45><f$>    hyphen  <\n> <f"Symbol"><\#46><f$>      period  <\n> <f"Symbol"><\#47><f$>      slash   <\n> <f"Symbol"><\#48><f$>      zero    <\n> <f"Symbol"><\#49><f$>      one     <\n> <f"Symbol"><\#50><f$>      two     <\n> <f"Symbol"><\#51><f$>      three   <\n> <f"Symbol"><\#52><f$>      four    <\n> <f"Symbol"><\#53><f$>      five    <\n> <f"Symbol"><\#54><f$>      six     <\n> <f"Symbol"><\#55><f$>      seven   <\n> <f"Symbol"><\#56><f$>      eight   <\n> <f"Symbol"><\#57><f$>      nine    <\n> <f"Symbol"><\#58><f$>      colon   <\n> <f"Symbol"><\#59><f$>      semicolon       <\n> <f"Symbol"><\#60><f$>      less    <\n> <f"Symbol"><\#61><f$>      equal   <\n> <f"Symbol"><\#62><f$>      greater <\n> <f"Symbol"><\#63><f$>      question        <\n> <f""><\#64><f$>    at      <\n> <f""><\#65><f$>    A       <\n> <f""><\#66><f$>    B       <\n> <f""><\#67><f$>    C       <\n> <f""><\#68><f$>    D       <\n> <f""><\#69><f$>    E       <\n> <f""><\#70><f$>    F       <\n> <f""><\#71><f$>    G       <\n> <f""><\#72><f$>    H       <\n> <f""><\#73><f$>    I       <\n> <f""><\#74><f$>    J       <\n> <f""><\#75><f$>    K       <\n> <f""><\#76><f$>    L       <\n> <f""><\#77><f$>    M       <\n> <f""><\#78><f$>    N       <\n> <f""><\#79><f$>    O       <\n> <f""><\#80><f$>    P       <\n> <f""><\#81><f$>    Q       <\n> <f""><\#82><f$>    R       <\n> <f""><\#83><f$>    S       <\n> <f""><\#84><f$>    T       <\n> <f""><\#85><f$>    U       <\n> <f""><\#86><f$>    V       <\n> <f""><\#87><f$>    W       <\n> <f""><\#88><f$>    X       <\n> <f""><\#89><f$>    Y       <\n> <f""><\#90><f$>    Z       <\n> <f"Symbol"><\#91><f$>      bracketleft     <\n> <f"LucidNewMatSymT"><\#110><f$>    backslash       <\n> <f"Symbol"><\#93><f$>      bracketright    <\n> <f""><\#94><f$>    asciicircum     <\n> <f"Symbol"><\#95><f$>      underscore      <\n> <f""><\#96><f$>    grave   <\n> <f""><\#97><f$>    a       <\n> <f""><\#98><f$>    b       <\n> <f""><\#99><f$>    c       <\n> <f""><\#100><f$>   d       <\n> <f""><\#101><f$>   e       <\n> <f""><\#102><f$>   f       <\n> <f""><\#103><f$>   g       <\n> <f""><\#104><f$>   h       <\n> <f""><\#105><f$>   i       <\n> <f""><\#106><f$>   j       <\n> <f""><\#107><f$>   k       <\n> <f""><\#108><f$>   l       <\n> <f""><\#109><f$>   m       <\n> <f""><\#110><f$>   n       <\n> <f""><\#111><f$>   o       <\n> <f""><\#112><f$>   p       <\n> <f""><\#113><f$>   q       <\n> <f""><\#114><f$>   r       <\n> <f""><\#115><f$>   s       <\n> <f""><\#116><f$>   t       <\n> <f""><\#117><f$>   u       <\n> <f""><\#118><f$>   v       <\n> <f""><\#119><f$>   w       <\n> <f""><\#120><f$>   x       <\n> <f""><\#121><f$>   y       <\n> <f""><\#122><f$>   z       <\n> <f"Symbol"><\#123><f$>     braceleft       <\n> <f"Symbol"><\#124><f$>     bar     <\n> <f"Symbol"><\#125><f$>     braceright      <\n> <f""><\#126><f$>   asciitilde      <\n> <f""><\#128><f$>   euro    <\n> <f""><\#130><f$>   quotesinglbase  <\n> <f"Symbol"><\#166><f$>     florin  <\n> <f""><\#132><f$>   quotedblbase    <\n> <f""><\#133><f$>   ellipsis        <\n> <f"LucidNewMatSymT"><\#121><f$>    dagger  <\n> <f"LucidNewMatSymT"><\#122><f$>    daggerdbl       <\n> <f""><\#136><f$>   circumflex      <\n> <f""><\#137><f$>   perthousand     <\n> <f""><\#138><f$>   Scaron  <\n> <f""><\#139><f$>   guilsinglleft   <\n> <f""><\#140><f$>   OE      <\n> <f""><\#142><f$>   Zcaron  <\n> <f""><\#145><f$>   quoteleft       <\n> <f""><\#146><f$>   quoteright      <\n> <f""><\#147><f$>   quotedblleft    <\n> <f""><\#148><f$>   quotedblright   <\n> <f"Symbol"><\#183><f$>     bullet  <\n> <f""><\#150><f$>   endash  <\n> <f""><\#151><f$>   emdash  <\n> <f""><\#152><f$>   tilde   <\n> <f""><\#153><f$>   trademark       <\n> <f""><\#154><f$>   scaron  <\n> <f""><\#155><f$>   guilsinglright  <\n> <f""><\#156><f$>   oe      <\n> <f""><\#158><f$>   zcaron  <\n> <f""><\#159><f$>   Ydieresis       <\n> <f""><\#160><f$>   nbspace <\n> <f""><\#161><f$>   exclamdown      <\n> <f""><\#162><f$>   cent    <\n> <f""><\#163><f$>   sterling        <\n> <f""><\#164><f$>   currency        <\n> <f""><\#165><f$>   yen     <\n> <f""><\#166><f$>   brokenbar       <\n> section    <\n> <f""><\#168><f$>   dieresis        <\n> <f""><\#169><f$>   copyright       <\n> <f""><\#170><f$>   ordfeminine     <\n> <f""><\#171><f$>   guillemotleft   <\n> <f"Symbol"><\#216><f$>     logicalnot      <\n> <f""><\#173><f$>   sfthyphen       <\n> <f""><\#174><f$>   registered      <\n> <f""><\#175><f$>   macron  <\n> <f"Symbol"><\#176><f$>     degree  <\n> <f"Symbol"><\#177><f$>     plusminus       <\n> <f""><\#178><f$>   twosuperior     <\n> <f""><\#179><f$>   threesuperior   <\n> <f""><\#180><f$>   acute   <\n> <f"Symbol"><\#109><f$>     mu      <\n> <f"LucidNewMatSymT"><\#123><f$>    paragraph       <\n> <f"LucidNewMatSymT"><\#162><f$>    periodcentered  <\n> <f""><\#184><f$>   cedilla <\n> <f""><\#185><f$>   onesuperior     <\n> <f""><\#186><f$>   ordmasculine    <\n> <f""><\#187><f$>   guillemotright  <\n> <f""><\#188><f$>   onequarter      <\n> <f""><\#189><f$>   onehalf <\n> <f""><\#190><f$>   threequarters   <\n> <f""><\#191><f$>   questiondown    <\n> <f""><\#192><f$>   Agrave  <\n> <f""><\#193><f$>   Aacute  <\n> <f""><\#194><f$>   Acircumflex     <\n> <f""><\#195><f$>   Atilde  <\n> <f""><\#196><f$>   Adieresis       <\n> <f""><\#197><f$>   Aring   <\n> <f""><\#198><f$>   AE      <\n> <f""><\#199><f$>   Ccedilla        <\n> <f""><\#200><f$>   Egrave  <\n> <f""><\#201><f$>   Eacute  <\n> <f""><\#202><f$>   Ecircumflex     <\n> <f""><\#203><f$>   Edieresis       <\n> <f""><\#204><f$>   Igrave  <\n> <f""><\#205><f$>   Iacute  <\n> <f""><\#206><f$>   Icircumflex     <\n> <f""><\#207><f$>   Idieresis       <\n> <f""><\#208><f$>   Eth     <\n> <f""><\#209><f$>   Ntilde  <\n> <f""><\#210><f$>   Ograve  <\n> <f""><\#211><f$>   Oacute  <\n> <f""><\#212><f$>   Ocircumflex     <\n> <f""><\#213><f$>   Otilde  <\n> <f""><\#214><f$>   Odieresis       <\n> <f"Symbol"><\#180><f$>     multiply        <\n> <f""><\#216><f$>   Oslash  <\n> <f""><\#217><f$>   Ugrave  <\n> <f""><\#218><f$>   Uacute  <\n> <f""><\#219><f$>   Ucircumflex     <\n> <f""><\#220><f$>   Udieresis       <\n> <f""><\#221><f$>   Yacute  <\n> <f""><\#222><f$>   Thorn   <\n> <f""><\#223><f$>   germandbls      <\n> <f""><\#224><f$>   agrave  <\n> <f""><\#225><f$>   aacute  <\n> <f""><\#226><f$>   acircumflex     <\n> <f""><\#227><f$>   atilde  <\n> <f""><\#228><f$>   adieresis       <\n> <f""><\#229><f$>   aring   <\n> <f""><\#230><f$>   ae      <\n> <f""><\#231><f$>   ccedilla        <\n> <f""><\#232><f$>   egrave  <\n> <f""><\#233><f$>   eacute  <\n> <f""><\#234><f$>   ecircumflex     <\n> <f""><\#235><f$>   edieresis       <\n> <f""><\#236><f$>   igrave  <\n> <f""><\#237><f$>   iacute  <\n> <f""><\#238><f$>   icircumflex     <\n> <f""><\#239><f$>   idieresis       <\n> <f""><\#240><f$>   eth     <\n> <f""><\#241><f$>   ntilde  <\n> <f""><\#242><f$>   ograve  <\n> <f""><\#243><f$>   oacute  <\n> <f""><\#244><f$>   ocircumflex     <\n> <f""><\#245><f$>   otilde  <\n> <f""><\#246><f$>   odieresis       <\n> <f"Symbol"><\#184><f$>     divide  <\n> <f""><\#248><f$>   oslash  <\n> <f""><\#249><f$>   ugrave  <\n> <f""><\#250><f$>   uacute  <\n> <f""><\#251><f$>   ucircumflex     <\n> <f""><\#252><f$>   udieresis       <\n> <f""><\#253><f$>   yacute  <\n> <f""><\#254><f$>   thorn   <\n> <f""><\#255><f$>   ydieresis       <\n>\r
+@section:2     Symbol Charmap\r
+@noindent:<f"Symbol"><\#32><f$>        space   Symbol<\n> <f"Symbol"><\#33><f$>        exclam  Symbol<\n> <f"Symbol"><\#34><f$>        universal       Symbol<\n> <f"Symbol"><\#35><f$>        numbersign      Symbol<\n> <f"Symbol"><\#36><f$>        existential     Symbol<\n> <f"Symbol"><\#37><f$>        percent Symbol<\n> <f"Symbol"><\#38><f$>        ampersand       Symbol<\n> <f"Symbol"><\#39><f$>        suchthat        Symbol<\n> <f"Symbol"><\#40><f$>        parenleft       Symbol<\n> <f"Symbol"><\#41><f$>        parenright      Symbol<\n> <f"Symbol"><\#42><f$>        asteriskmath    Symbol<\n> <f"Symbol"><\#43><f$>        plus    Symbol<\n> <f"Symbol"><\#44><f$>        comma   Symbol<\n> <f"Symbol"><\#45><f$>        minus   Symbol<\n> <f"Symbol"><\#46><f$>        period  Symbol<\n> <f"Symbol"><\#47><f$>        slash   Symbol<\n> <f"Symbol"><\#48><f$>        zero    Symbol<\n> <f"Symbol"><\#49><f$>        one     Symbol<\n> <f"Symbol"><\#50><f$>        two     Symbol<\n> <f"Symbol"><\#51><f$>        three   Symbol<\n> <f"Symbol"><\#52><f$>        four    Symbol<\n> <f"Symbol"><\#53><f$>        five    Symbol<\n> <f"Symbol"><\#54><f$>        six     Symbol<\n> <f"Symbol"><\#55><f$>        seven   Symbol<\n> <f"Symbol"><\#56><f$>        eight   Symbol<\n> <f"Symbol"><\#57><f$>        nine    Symbol<\n> <f"Symbol"><\#58><f$>        colon   Symbol<\n> <f"Symbol"><\#59><f$>        semicolon       Symbol<\n> <f"Symbol"><\#60><f$>        less    Symbol<\n> <f"Symbol"><\#61><f$>        equal   Symbol<\n> <f"Symbol"><\#62><f$>        greater Symbol<\n> <f"Symbol"><\#63><f$>        question        Symbol<\n> <f"Symbol"><\#64><f$>        congruent       Symbol<\n> <f"Symbol"><\#65><f$>        Alpha   Symbol<\n> <f"Symbol"><\#66><f$>        Beta    Symbol<\n> <f"Symbol"><\#67><f$>        Chi     Symbol<\n> <f"Symbol"><\#68><f$>        Delta   Symbol<\n> <f"Symbol"><\#69><f$>        Epsilon Symbol<\n> <f"Symbol"><\#70><f$>        Phi     Symbol<\n> <f"Symbol"><\#71><f$>        Gamma   Symbol<\n> <f"Symbol"><\#72><f$>        Eta     Symbol<\n> <f"Symbol"><\#73><f$>        Iota    Symbol<\n> <f"Symbol"><\#74><f$>        theta1  Symbol<\n> <f"Symbol"><\#75><f$>        Kappa   Symbol<\n> <f"Symbol"><\#76><f$>        Lambda  Symbol<\n> <f"Symbol"><\#77><f$>        Mu      Symbol<\n> <f"Symbol"><\#78><f$>        Nu      Symbol<\n> <f"Symbol"><\#79><f$>        Omicron Symbol<\n> <f"Symbol"><\#80><f$>        Pi      Symbol<\n> <f"Symbol"><\#81><f$>        Theta   Symbol<\n> <f"Symbol"><\#82><f$>        Rho     Symbol<\n> <f"Symbol"><\#83><f$>        Sigma   Symbol<\n> <f"Symbol"><\#84><f$>        Tau     Symbol<\n> <f"Symbol"><\#85><f$>        Upsilon Symbol<\n> <f"Symbol"><\#86><f$>        sigma1  Symbol<\n> <f"Symbol"><\#87><f$>        Omega   Symbol<\n> <f"Symbol"><\#88><f$>        Xi      Symbol<\n> <f"Symbol"><\#89><f$>        Psi     Symbol<\n> <f"Symbol"><\#90><f$>        Zeta    Symbol<\n> <f"Symbol"><\#91><f$>        bracketleft     Symbol<\n> <f"Symbol"><\#92><f$>        therefore       Symbol<\n> <f"Symbol"><\#93><f$>        bracketright    Symbol<\n> <f"Symbol"><\#94><f$>        perpendicular   Symbol<\n> <f"Symbol"><\#95><f$>        underscore      Symbol<\n> <f"Symbol"><\#96><f$>        radicalex       Symbol<\n> <f"Symbol"><\#97><f$>        alpha   Symbol<\n> <f"Symbol"><\#98><f$>        beta    Symbol<\n> <f"Symbol"><\#99><f$>        chi     Symbol<\n> <f"Symbol"><\#100><f$>       delta   Symbol<\n> <f"Symbol"><\#101><f$>       epsilon Symbol<\n> <f"Symbol"><\#102><f$>       phi     Symbol<\n> <f"Symbol"><\#103><f$>       gamma   Symbol<\n> <f"Symbol"><\#104><f$>       eta     Symbol<\n> <f"Symbol"><\#105><f$>       iota    Symbol<\n> <f"Symbol"><\#106><f$>       phi1    Symbol<\n> <f"Symbol"><\#107><f$>       kappa   Symbol<\n> <f"Symbol"><\#108><f$>       lambda  Symbol<\n> <f"Symbol"><\#109><f$>       mu      Symbol<\n> <f"Symbol"><\#110><f$>       nu      Symbol<\n> <f"Symbol"><\#111><f$>       omicron Symbol<\n> <f"Symbol"><\#112><f$>       pi      Symbol<\n> <f"Symbol"><\#113><f$>       theta   Symbol<\n> <f"Symbol"><\#114><f$>       rho     Symbol<\n> <f"Symbol"><\#115><f$>       sigma   Symbol<\n> <f"Symbol"><\#116><f$>       tau     Symbol<\n> <f"Symbol"><\#117><f$>       upsilon Symbol<\n> <f"Symbol"><\#118><f$>       omega1  Symbol<\n> <f"Symbol"><\#119><f$>       omega   Symbol<\n> <f"Symbol"><\#120><f$>       xi      Symbol<\n> <f"Symbol"><\#121><f$>       psi     Symbol<\n> <f"Symbol"><\#122><f$>       zeta    Symbol<\n> <f"Symbol"><\#123><f$>       braceleft       Symbol<\n> <f"Symbol"><\#124><f$>       bar     Symbol<\n> <f"Symbol"><\#125><f$>       braceright      Symbol<\n> <f"Symbol"><\#126><f$>       similar Symbol<\n> <f"Symbol"><\#160><f$>       Euro    Symbol<\n> <f"Symbol"><\#161><f$>       Upsilon1        Symbol<\n> <f"Symbol"><\#162><f$>       minute  Symbol<\n> <f"Symbol"><\#163><f$>       lessequal       Symbol<\n> <f"Symbol"><\#164><f$>       fraction        Symbol<\n> <f"Symbol"><\#165><f$>       infinity        Symbol<\n> <f"Symbol"><\#166><f$>       florin  Symbol<\n> <f"Symbol"><\#167><f$>       club    Symbol<\n> <f"Symbol"><\#168><f$>       diamond Symbol<\n> <f"Symbol"><\#169><f$>       heart   Symbol<\n> <f"Symbol"><\#170><f$>       spade   Symbol<\n> <f"Symbol"><\#171><f$>       arrowboth       Symbol<\n> <f"Symbol"><\#172><f$>       arrowleft       Symbol<\n> <f"Symbol"><\#173><f$>       arrowup Symbol<\n> <f"Symbol"><\#174><f$>       arrowright      Symbol<\n> <f"Symbol"><\#175><f$>       arrowdown       Symbol<\n> <f"Symbol"><\#176><f$>       degree  Symbol<\n> <f"Symbol"><\#177><f$>       plusminus       Symbol<\n> <f"Symbol"><\#178><f$>       second  Symbol<\n> <f"Symbol"><\#179><f$>       greaterequal    Symbol<\n> <f"Symbol"><\#180><f$>       multiply        Symbol<\n> <f"Symbol"><\#181><f$>       proportional    Symbol<\n> <f"Symbol"><\#182><f$>       partialdiff     Symbol<\n> <f"Symbol"><\#183><f$>       bullet  Symbol<\n> <f"Symbol"><\#184><f$>       divide  Symbol<\n> <f"Symbol"><\#185><f$>       notequal        Symbol<\n> <f"Symbol"><\#186><f$>       equivalence     Symbol<\n> <f"Symbol"><\#187><f$>       approxequal     Symbol<\n> <f"Symbol"><\#189><f$>       arrowvertex     Symbol<\n> <f"Symbol"><\#190><f$>       arrowhorizex    Symbol<\n> <f"Symbol"><\#191><f$>       carriagereturn  Symbol<\n> <f"Symbol"><\#192><f$>       aleph   Symbol<\n> <f"Symbol"><\#193><f$>       Ifraktur        Symbol<\n> <f"Symbol"><\#194><f$>       Rfraktur        Symbol<\n> <f"Symbol"><\#195><f$>       weierstrass     Symbol<\n> <f"Symbol"><\#196><f$>       circlemultiply  Symbol<\n> <f"Symbol"><\#197><f$>       circleplus      Symbol<\n> <f"Symbol"><\#198><f$>       emptyset        Symbol<\n> <f"Symbol"><\#199><f$>       intersection    Symbol<\n> <f"Symbol"><\#200><f$>       union   Symbol<\n> <f"Symbol"><\#201><f$>       propersuperset  Symbol<\n> <f"Symbol"><\#202><f$>       reflexsuperset  Symbol<\n> <f"Symbol"><\#203><f$>       notsubset       Symbol<\n> <f"Symbol"><\#204><f$>       propersubset    Symbol<\n> <f"Symbol"><\#205><f$>       reflexsubset    Symbol<\n> <f"Symbol"><\#206><f$>       element Symbol<\n> <f"Symbol"><\#207><f$>       notelement      Symbol<\n> <f"Symbol"><\#208><f$>       angle   Symbol<\n> <f"Symbol"><\#209><f$>       gradient        Symbol<\n> <f"Symbol"><\#210><f$>       registerserif   Symbol<\n> <f"Symbol"><\#211><f$>       copyrightserif  Symbol<\n> <f"Symbol"><\#212><f$>       trademarkserif  Symbol<\n> <f"Symbol"><\#213><f$>       product Symbol<\n> <f"Symbol"><\#214><f$>       radical Symbol<\n> <f"Symbol"><\#215><f$>       dotmath Symbol<\n> <f"Symbol"><\#216><f$>       logicalnot      Symbol<\n> <f"Symbol"><\#217><f$>       logicaland      Symbol<\n> <f"Symbol"><\#218><f$>       logicalor       Symbol<\n> <f"Symbol"><\#219><f$>       arrowdblboth    Symbol<\n> <f"Symbol"><\#220><f$>       arrowdblleft    Symbol<\n> <f"Symbol"><\#221><f$>       arrowdblup      Symbol<\n> <f"Symbol"><\#222><f$>       arrowdblright   Symbol<\n> <f"Symbol"><\#223><f$>       arrowdbldown    Symbol<\n> <f"Symbol"><\#224><f$>       lozenge Symbol<\n> <f"Symbol"><\#225><f$>       angleleft       Symbol<\n> <f"Symbol"><\#226><f$>       registersans    Symbol<\n> <f"Symbol"><\#227><f$>       copyrightsans   Symbol<\n> <f"Symbol"><\#228><f$>       trademarksans   Symbol<\n> <f"Symbol"><\#229><f$>       summation       Symbol<\n> <f"Symbol"><\#230><f$>       parenlefttp     Symbol<\n> <f"Symbol"><\#231><f$>       parenleftex     Symbol<\n> <f"Symbol"><\#232><f$>       parenleftbt     Symbol<\n> <f"Symbol"><\#233><f$>       bracketlefttp   Symbol<\n> <f"Symbol"><\#234><f$>       bracketleftex   Symbol<\n> <f"Symbol"><\#235><f$>       bracketleftbt   Symbol<\n> <f"Symbol"><\#236><f$>       bracelefttp     Symbol<\n> <f"Symbol"><\#237><f$>       braceleftmid    Symbol<\n> <f"Symbol"><\#238><f$>       braceleftbt     Symbol<\n> <f"Symbol"><\#239><f$>       braceex Symbol<\n> <f"Symbol"><\#241><f$>       angleright      Symbol<\n> <f"Symbol"><\#242><f$>       integral        Symbol<\n> <f"Symbol"><\#243><f$>       integraltp      Symbol<\n> <f"Symbol"><\#244><f$>       integralex      Symbol<\n> <f"Symbol"><\#245><f$>       integralbt      Symbol<\n> <f"Symbol"><\#246><f$>       parenrighttp    Symbol<\n> <f"Symbol"><\#247><f$>       parenrightex    Symbol<\n> <f"Symbol"><\#248><f$>       parenrightbt    Symbol<\n> <f"Symbol"><\#249><f$>       bracketrighttp  Symbol<\n> <f"Symbol"><\#250><f$>       bracketrightex  Symbol<\n> <f"Symbol"><\#251><f$>       bracketrightbt  Symbol<\n> <f"Symbol"><\#252><f$>       bracerighttp    Symbol<\n> <f"Symbol"><\#253><f$>       bracerightmid   Symbol<\n> <f"Symbol"><\#254><f$>       bracerightbt    Symbol<\n>\r
+@body:\r
+@section:3     Lucida Math Italic Charmap\r
+@noindent:<f"Symbol"><\#71><f$>        Gamma   LucidNewMatItaT<\n> <f"Symbol"><\#68><f$>       Delta   LucidNewMatItaT<\n> <f"Symbol"><\#81><f$>       Theta   LucidNewMatItaT<\n> <f"Symbol"><\#76><f$>       Lambda  LucidNewMatItaT<\n> <f"Symbol"><\#88><f$>       Xi      LucidNewMatItaT<\n> <f"Symbol"><\#80><f$>       Pi      LucidNewMatItaT<\n> <f"Symbol"><\#83><f$>       Sigma   LucidNewMatItaT<\n> <f"Symbol"><\#85><f$>       Upsilon LucidNewMatItaT<\n> <f"Symbol"><\#70><f$>       Phi     LucidNewMatItaT<\n> <f"Symbol"><\#89><f$>       Psi     LucidNewMatItaT<\n> <f"Symbol"><\#87><f$>       Omega   LucidNewMatItaT<\n> <f"Symbol"><\#97><f$>       alpha   LucidNewMatItaT<\n> <f"Symbol"><\#98><f$>       beta    LucidNewMatItaT<\n> <f"Symbol"><\#103><f$>      gamma   LucidNewMatItaT<\n> <f"Symbol"><\#100><f$>      delta   LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#178><f$>     epsilon1        LucidNewMatItaT<\n> <f"Symbol"><\#122><f$>      zeta    LucidNewMatItaT<\n> <f"Symbol"><\#104><f$>      eta     LucidNewMatItaT<\n> <f"Symbol"><\#113><f$>      theta   LucidNewMatItaT<\n> <f"Symbol"><\#105><f$>      iota    LucidNewMatItaT<\n> <f"Symbol"><\#107><f$>      kappa   LucidNewMatItaT<\n> <f"Symbol"><\#108><f$>      lambda  LucidNewMatItaT<\n> <f"Symbol"><\#109><f$>      mu      LucidNewMatItaT<\n> <f"Symbol"><\#110><f$>      nu      LucidNewMatItaT<\n> <f"Symbol"><\#120><f$>      xi      LucidNewMatItaT<\n> <f"Symbol"><\#112><f$>      pi      LucidNewMatItaT<\n> <f"Symbol"><\#114><f$>      rho     LucidNewMatItaT<\n> <f"Symbol"><\#115><f$>      sigma   LucidNewMatItaT<\n> <f"Symbol"><\#116><f$>      tau     LucidNewMatItaT<\n> <f"Symbol"><\#117><f$>      upsilon LucidNewMatItaT<\n> <f"Symbol"><\#102><f$>      phi     LucidNewMatItaT<\n> <f"Symbol"><\#99><f$>       chi     LucidNewMatItaT<\n> <f"Symbol"><\#121><f$>      psi     LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#196><f$>     tie     LucidNewMatItaT<\n> <f"Symbol"><\#119><f$>      omega   LucidNewMatItaT<\n> <f"Symbol"><\#101><f$>      epsilon LucidNewMatItaT<\n> <f"Symbol"><\#74><f$>       theta1  LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#36><f$>      pi1     LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#37><f$>      rho1    LucidNewMatItaT<\n> <f"Symbol"><\#86><f$>       sigma1  LucidNewMatItaT<\n> <f"Symbol"><\#106><f$>      phi1    LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#40><f$>      arrowlefttophalf        LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#41><f$>      arrowleftbothalf        LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#42><f$>      arrowrighttophalf       LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#43><f$>      arrowrightbothalf       LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#44><f$>      arrowhookleft   LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#45><f$>      arrowhookright  LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#46><f$>      triangleright   LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#47><f$>      triangleleft    LucidNewMatItaT<\n> <f"Symbol"><\#46><f$>       period  LucidNewMatItaT<\n> <f"Symbol"><\#44><f$>       comma   LucidNewMatItaT<\n> <f"Symbol"><\#60><f$>       less    LucidNewMatItaT<\n> <f"Symbol"><\#47><f$>       slash   LucidNewMatItaT<\n> <f"Symbol"><\#62><f$>       greater LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#63><f$>      star    LucidNewMatItaT<\n> <f"Symbol"><\#182><f$>      partialdiff     LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#91><f$>      flat    LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#92><f$>      natural LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#93><f$>      sharp   LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#94><f$>      slurbelow       LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#95><f$>      slurabove       LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#96><f$>      lscript LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#123><f$>     dotlessi        LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#124><f$>     dotlessj        LucidNewMatItaT<\n> <f"Symbol"><\#195><f$>      weierstrass     LucidNewMatItaT<\n> <f"LucidNewMatItaT"><\#126><f$>     vector  LucidNewMatItaT<\n>\r
+@section:4     Lucida Math Symbol Charmap\r
+@noindent:<f"Symbol"><\#45><f$>        minus   LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#162><f$>     periodcentered  LucidNewMatSymT<\n> <f"Symbol"><\#180><f$>      multiply        LucidNewMatSymT<\n> <f"Symbol"><\#42><f$>       asteriskmath    LucidNewMatSymT<\n> <f"Symbol"><\#184><f$>      divide  LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#166><f$>     diamondmath     LucidNewMatSymT<\n> <f"Symbol"><\#177><f$>      plusminus       LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#168><f$>     minusplus       LucidNewMatSymT<\n> <f"Symbol"><\#197><f$>      circleplus      LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#170><f$>     circleminus     LucidNewMatSymT<\n> <f"Symbol"><\#196><f$>      circlemultiply  LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#174><f$>     circledivide    LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#175><f$>     circledot       LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#176><f$>     circlecopyrt    LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#177><f$>     openbullet      LucidNewMatSymT<\n> <f"Symbol"><\#183><f$>      bullet  LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#179><f$>     equivasymptotic LucidNewMatSymT<\n> <f"Symbol"><\#186><f$>      equivalence     LucidNewMatSymT<\n> <f"Symbol"><\#205><f$>      reflexsubset    LucidNewMatSymT<\n> <f"Symbol"><\#202><f$>      reflexsuperset  LucidNewMatSymT<\n> <f"Symbol"><\#163><f$>      lessequal       LucidNewMatSymT<\n> <f"Symbol"><\#179><f$>      greaterequal    LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#185><f$>     precedesequal   LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#186><f$>     followsequal    LucidNewMatSymT<\n> <f"Symbol"><\#126><f$>      similar LucidNewMatSymT<\n> <f"Symbol"><\#187><f$>      approxequal     LucidNewMatSymT<\n> <f"Symbol"><\#204><f$>      propersubset    LucidNewMatSymT<\n> <f"Symbol"><\#201><f$>      propersuperset  LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#191><f$>     lessmuch        LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#192><f$>     greatermuch     LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#193><f$>     precedes        LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#194><f$>     follows LucidNewMatSymT<\n> <f"Symbol"><\#172><f$>      arrowleft       LucidNewMatSymT<\n> <f"Symbol"><\#170><f$>      spade   LucidNewMatSymT<\n> <f"Symbol"><\#174><f$>      arrowright      LucidNewMatSymT<\n> <f"Symbol"><\#173><f$>      arrowup LucidNewMatSymT<\n> <f"Symbol"><\#175><f$>      arrowdown       LucidNewMatSymT<\n> <f"Symbol"><\#171><f$>      arrowboth       LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#37><f$>      arrownortheast  LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#38><f$>      arrowsoutheast  LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#39><f$>      similarequal    LucidNewMatSymT<\n> <f"Symbol"><\#220><f$>      arrowdblleft    LucidNewMatSymT<\n> <f"Symbol"><\#222><f$>      arrowdblright   LucidNewMatSymT<\n> <f"Symbol"><\#221><f$>      arrowdblup      LucidNewMatSymT<\n> <f"Symbol"><\#223><f$>      arrowdbldown    LucidNewMatSymT<\n> <f"Symbol"><\#219><f$>      arrowdblboth    LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#45><f$>      arrownorthwest  LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#46><f$>      arrowsouthwest  LucidNewMatSymT<\n> <f"Symbol"><\#181><f$>      proportional    LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#48><f$>      prime   LucidNewMatSymT<\n> <f"Symbol"><\#165><f$>      infinity        LucidNewMatSymT<\n> <f"Symbol"><\#206><f$>      element LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#51><f$>      owner   LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#52><f$>      triangle        LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#53><f$>      triangleinv     LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#54><f$>      negationslash   LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#55><f$>      mapsto  LucidNewMatSymT<\n> <f"Symbol"><\#34><f$>       universal       LucidNewMatSymT<\n> <f"Symbol"><\#36><f$>       existential     LucidNewMatSymT<\n> <f"Symbol"><\#216><f$>      logicalnot      LucidNewMatSymT<\n> <f"Symbol"><\#198><f$>      emptyset        LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#60><f$>      Rfractur        LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#61><f$>      Ifractur        LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#62><f$>      latticetop      LucidNewMatSymT<\n> <f"Symbol"><\#94><f$>       perpendicular   LucidNewMatSymT<\n> <f"Symbol"><\#192><f$>      aleph   LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#65><f$>      scriptA LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#66><f$>      scriptB LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#67><f$>      scriptC LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#68><f$>      scriptD LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#69><f$>      scriptE LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#70><f$>      scriptF LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#71><f$>      scriptG LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#72><f$>      scriptH LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#73><f$>      scriptI LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#74><f$>      scriptJ LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#75><f$>      scriptK LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#76><f$>      scriptL LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#77><f$>      scriptM LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#78><f$>      scriptN LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#79><f$>      scriptO LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#80><f$>      scriptP LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#81><f$>      scriptQ LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#82><f$>      scriptR LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#83><f$>      scriptS LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#84><f$>      scriptT LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#85><f$>      scriptU LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#86><f$>      scriptV LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#87><f$>      scriptW LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#88><f$>      scriptX LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#89><f$>      scriptY LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#90><f$>      scriptZ LucidNewMatSymT<\n> <f"Symbol"><\#200><f$>      union   LucidNewMatSymT<\n> <f"Symbol"><\#199><f$>      intersection    LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#93><f$>      unionmulti      LucidNewMatSymT<\n> <f"Symbol"><\#217><f$>      logicaland      LucidNewMatSymT<\n> <f"Symbol"><\#218><f$>      logicalor       LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#96><f$>      turnstileleft   LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#97><f$>      turnstileright  LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#98><f$>      floorleft       LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#99><f$>      floorright      LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#100><f$>     ceilingleft     LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#101><f$>     ceilingright    LucidNewMatSymT<\n> <f"Symbol"><\#123><f$>      braceleft       LucidNewMatSymT<\n> <f"Symbol"><\#125><f$>      braceright      LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#104><f$>     angbracketleft  LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#105><f$>     angbracketright LucidNewMatSymT<\n> <f"Symbol"><\#124><f$>      bar     LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#107><f$>     bardbl  LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#108><f$>     arrowbothv      LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#109><f$>     arrowdblbothv   LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#110><f$>     backslash       LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#111><f$>     wreathproduct   LucidNewMatSymT<\n> <f"Symbol"><\#214><f$>      radical LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#113><f$>     coproduct       LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#114><f$>     nabla   LucidNewMatSymT<\n> <f"Symbol"><\#242><f$>      integral        LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#116><f$>     unionsq LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#117><f$>     intersectionsq  LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#118><f$>     subsetsqequal   LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#119><f$>     supersetsqequal LucidNewMatSymT<\n> section     LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#121><f$>     dagger  LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#122><f$>     daggerdbl       LucidNewMatSymT<\n> <f"LucidNewMatSymT"><\#123><f$>     paragraph       LucidNewMatSymT<\n> <f"Symbol"><\#167><f$>      club    LucidNewMatSymT<\n> <f"Symbol"><\#168><f$>      diamond LucidNewMatSymT<\n> <f"Symbol"><\#169><f$>      heart   LucidNewMatSymT<\n>\r
+@section:5     Lucida Math Extended Charmap\r
+@noindent:<f"LucidNewMatExtT"><\#161><f$>      parenleftbig    LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#162><f$>     parenrightbig   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#163><f$>     bracketleftbig  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#164><f$>     bracketrightbig LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#165><f$>     floorleftbig    LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#166><f$>     floorrightbig   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#167><f$>     ceilingleftbig  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#168><f$>     ceilingrightbig LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#169><f$>     braceleftbig    LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#170><f$>     bracerightbig   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#173><f$>     angbracketleftbig       LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#174><f$>     angbracketrightbig      LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#175><f$>     vextendsingle   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#176><f$>     vextenddouble   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#177><f$>     slashbig        LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#178><f$>     backslashbig    LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#179><f$>     parenleftBig    LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#180><f$>     parenrightBig   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#181><f$>     parenleftbigg   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#182><f$>     parenrightbigg  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#183><f$>     bracketleftbigg LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#184><f$>     bracketrightbigg        LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#185><f$>     floorleftbigg   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#186><f$>     floorrightbigg  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#187><f$>     ceilingleftbigg LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#188><f$>     ceilingrightbigg        LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#189><f$>     braceleftbigg   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#190><f$>     bracerightbigg  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#28><f$>      angbracketleftbigg      LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#29><f$>      angbracketrightbigg     LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#193><f$>     slashbigg       LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#194><f$>     backslashbigg   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#195><f$>     parenleftBigg   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#33><f$>      parenrightBigg  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#34><f$>      bracketleftBigg LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#35><f$>      bracketrightBigg        LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#36><f$>      floorleftBigg   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#37><f$>      floorrightBigg  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#38><f$>      ceilingleftBigg LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#39><f$>      ceilingrightBigg        LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#40><f$>      braceleftBigg   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#41><f$>      bracerightBigg  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#42><f$>      angbracketleftBigg      LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#43><f$>      angbracketrightBigg     LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#44><f$>      slashBigg       LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#45><f$>      backslashBigg   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#46><f$>      slashBig        LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#47><f$>      backslashBig    LucidNewMatExtT<\n> <f"Symbol"><\#230><f$>      parenlefttp     LucidNewMatExtT<\n> <f"Symbol"><\#246><f$>      parenrighttp    LucidNewMatExtT<\n> <f"Symbol"><\#233><f$>      bracketlefttp   LucidNewMatExtT<\n> <f"Symbol"><\#249><f$>      bracketrighttp  LucidNewMatExtT<\n> <f"Symbol"><\#235><f$>      bracketleftbt   LucidNewMatExtT<\n> <f"Symbol"><\#251><f$>      bracketrightbt  LucidNewMatExtT<\n> <f"Symbol"><\#234><f$>      bracketleftex   LucidNewMatExtT<\n> <f"Symbol"><\#250><f$>      bracketrightex  LucidNewMatExtT<\n> <f"Symbol"><\#236><f$>      bracelefttp     LucidNewMatExtT<\n> <f"Symbol"><\#252><f$>      bracerighttp    LucidNewMatExtT<\n> <f"Symbol"><\#238><f$>      braceleftbt     LucidNewMatExtT<\n> <f"Symbol"><\#254><f$>      bracerightbt    LucidNewMatExtT<\n> <f"Symbol"><\#237><f$>      braceleftmid    LucidNewMatExtT<\n> <f"Symbol"><\#253><f$>      bracerightmid   LucidNewMatExtT<\n> <f"Symbol"><\#239><f$>      braceex LucidNewMatExtT<\n> <f"Symbol"><\#189><f$>      arrowvertex     LucidNewMatExtT<\n> <f"Symbol"><\#232><f$>      parenleftbt     LucidNewMatExtT<\n> <f"Symbol"><\#248><f$>      parenrightbt    LucidNewMatExtT<\n> <f"Symbol"><\#231><f$>      parenleftex     LucidNewMatExtT<\n> <f"Symbol"><\#247><f$>      parenrightex    LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#68><f$>      angbracketleftBig       LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#69><f$>      angbracketrightBig      LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#70><f$>      unionsqtext     LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#71><f$>      unionsqdisplay  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#72><f$>      contintegraltext        LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#73><f$>      contintegraldisplay     LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#74><f$>      circledottext   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#75><f$>      circledotdisplay        LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#76><f$>      circleplustext  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#77><f$>      circleplusdisplay       LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#78><f$>      circlemultiplytext      LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#79><f$>      circlemultiplydisplay   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#80><f$>      summationtext   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#81><f$>      producttext     LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#82><f$>      integraltext    LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#83><f$>      uniontext       LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#84><f$>      intersectiontext        LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#85><f$>      unionmultitext  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#86><f$>      logicalandtext  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#87><f$>      logicalortext   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#88><f$>      summationdisplay        LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#89><f$>      productdisplay  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#90><f$>      integraldisplay LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#91><f$>      uniondisplay    LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#92><f$>      intersectiondisplay     LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#93><f$>      unionmultidisplay       LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#94><f$>      logicalanddisplay       LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#95><f$>      logicalordisplay        LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#96><f$>      coproducttext   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#97><f$>      coproductdisplay        LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#98><f$>      hatwide LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#99><f$>      hatwider        LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#100><f$>     hatwidest       LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#101><f$>     tildewide       LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#102><f$>     tildewider      LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#103><f$>     tildewidest     LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#104><f$>     bracketleftBig  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#105><f$>     bracketrightBig LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#106><f$>     floorleftBig    LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#107><f$>     floorrightBig   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#108><f$>     ceilingleftBig  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#109><f$>     ceilingrightBig LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#110><f$>     braceleftBig    LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#111><f$>     bracerightBig   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#112><f$>     radicalbig      LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#113><f$>     radicalBig      LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#114><f$>     radicalbigg     LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#115><f$>     radicalBigg     LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#116><f$>     radicalbt       LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#117><f$>     radicalvertex   LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#118><f$>     radicaltp       LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#119><f$>     arrowvertexdbl  LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#120><f$>     arrowtp LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#121><f$>     arrowbt LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#122><f$>     bracehtipdownleft       LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#123><f$>     bracehtipdownright      LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#124><f$>     bracehtipupleft LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#125><f$>     bracehtipupright        LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#126><f$>     arrowdbltp      LucidNewMatExtT<\n> <f"LucidNewMatExtT"><\#196><f$>     arrowdblbt      LucidNewMatExtT<\n>\r
+@body:\r
+@body:
\ No newline at end of file
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/charmaps-display.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/charmaps-display.txt
new file mode 100755 (executable)
index 0000000..9bb1843
--- /dev/null
@@ -0,0 +1,753 @@
+\preamble\r
+\loadchars{k:\Research\Tagger\maps\standard-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathsym-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathit-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathext-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\symbol-charmap.txt}\r
+\loadstyles{k:\Research\Tagger\examples\styles.txt}\r
+\r
+\section Standard Charmap\r
+\r
+\space space   \\\r
+\exclam        exclam  \\\r
+\quotedbl      quotedbl        \\\r
+\numbersign    numbersign      \\\r
+\dollar        dollar  \\\r
+\percent       percent \\\r
+\ampersand     ampersand       \\\r
+\quotesingle   quotesingle     \\\r
+\parenleft     parenleft       \\\r
+\parenright    parenright      \\\r
+\asterisk      asterisk        \\\r
+\plus  plus    \\\r
+\comma comma   \\\r
+\hyphen        hyphen  \\\r
+\period        period  \\\r
+\slash slash   \\\r
+\zero  zero    \\\r
+\one   one     \\\r
+\two   two     \\\r
+\three three   \\\r
+\four  four    \\\r
+\five  five    \\\r
+\six   six     \\\r
+\seven seven   \\\r
+\eight eight   \\\r
+\nine  nine    \\\r
+\colon colon   \\\r
+\semicolon     semicolon       \\\r
+\less  less    \\\r
+\equal equal   \\\r
+\greater       greater \\\r
+\question      question        \\\r
+\at    at      \\\r
+\A     A       \\\r
+\B     B       \\\r
+\C     C       \\\r
+\D     D       \\\r
+\E     E       \\\r
+\F     F       \\\r
+\G     G       \\\r
+\H     H       \\\r
+\I     I       \\\r
+\J     J       \\\r
+\K     K       \\\r
+\L     L       \\\r
+\M     M       \\\r
+\N     N       \\\r
+\O     O       \\\r
+\P     P       \\\r
+\Q     Q       \\\r
+\R     R       \\\r
+\S     S       \\\r
+\T     T       \\\r
+\U     U       \\\r
+\V     V       \\\r
+\W     W       \\\r
+\X     X       \\\r
+\Y     Y       \\\r
+\Z     Z       \\\r
+\bracketleft   bracketleft     \\\r
+\backslash     backslash       \\\r
+\bracketright  bracketright    \\\r
+\asciicircum   asciicircum     \\\r
+\underscore    underscore      \\\r
+\grave grave   \\\r
+\a     a       \\\r
+\b     b       \\\r
+\c     c       \\\r
+\d     d       \\\r
+\e     e       \\\r
+\f     f       \\\r
+\g     g       \\\r
+\h     h       \\\r
+\i     i       \\\r
+\j     j       \\\r
+\k     k       \\\r
+\l     l       \\\r
+\m     m       \\\r
+\n     n       \\\r
+\o     o       \\\r
+\p     p       \\\r
+\q     q       \\\r
+\r     r       \\\r
+\s     s       \\\r
+\t     t       \\\r
+\u     u       \\\r
+\v     v       \\\r
+\w     w       \\\r
+\x     x       \\\r
+\y     y       \\\r
+\z     z       \\\r
+\braceleft     braceleft       \\\r
+\bar   bar     \\\r
+\braceright    braceright      \\\r
+\asciitilde    asciitilde      \\\r
+\euro  euro    \\\r
+\quotesinglbase        quotesinglbase  \\\r
+\florin        florin  \\\r
+\quotedblbase  quotedblbase    \\\r
+\ellipsis      ellipsis        \\\r
+\dagger        dagger  \\\r
+\daggerdbl     daggerdbl       \\\r
+\circumflex    circumflex      \\\r
+\perthousand   perthousand     \\\r
+\Scaron        Scaron  \\\r
+\guilsinglleft guilsinglleft   \\\r
+\OE    OE      \\\r
+\Zcaron        Zcaron  \\\r
+\quoteleft     quoteleft       \\\r
+\quoteright    quoteright      \\\r
+\quotedblleft  quotedblleft    \\\r
+\quotedblright quotedblright   \\\r
+\bullet        bullet  \\\r
+\endash        endash  \\\r
+\emdash        emdash  \\\r
+\tilde tilde   \\\r
+\trademark     trademark       \\\r
+\scaron        scaron  \\\r
+\guilsinglright        guilsinglright  \\\r
+\oe    oe      \\\r
+\zcaron        zcaron  \\\r
+\Ydieresis     Ydieresis       \\\r
+\nbspace       nbspace \\\r
+\exclamdown    exclamdown      \\\r
+\cent  cent    \\\r
+\sterling      sterling        \\\r
+\currency      currency        \\\r
+\yen   yen     \\\r
+\brokenbar     brokenbar       \\\r
+\section       section \\\r
+\dieresis      dieresis        \\\r
+\copyright     copyright       \\\r
+\ordfeminine   ordfeminine     \\\r
+\guillemotleft guillemotleft   \\\r
+\logicalnot    logicalnot      \\\r
+\sfthyphen     sfthyphen       \\\r
+\registered    registered      \\\r
+\macron        macron  \\\r
+\degree        degree  \\\r
+\plusminus     plusminus       \\\r
+\twosuperior   twosuperior     \\\r
+\threesuperior threesuperior   \\\r
+\acute acute   \\\r
+\mu    mu      \\\r
+\paragraph     paragraph       \\\r
+\periodcentered        periodcentered  \\\r
+\cedilla       cedilla \\\r
+\onesuperior   onesuperior     \\\r
+\ordmasculine  ordmasculine    \\\r
+\guillemotright        guillemotright  \\\r
+\onequarter    onequarter      \\\r
+\onehalf       onehalf \\\r
+\threequarters threequarters   \\\r
+\questiondown  questiondown    \\\r
+\Agrave        Agrave  \\\r
+\Aacute        Aacute  \\\r
+\Acircumflex   Acircumflex     \\\r
+\Atilde        Atilde  \\\r
+\Adieresis     Adieresis       \\\r
+\Aring Aring   \\\r
+\AE    AE      \\\r
+\Ccedilla      Ccedilla        \\\r
+\Egrave        Egrave  \\\r
+\Eacute        Eacute  \\\r
+\Ecircumflex   Ecircumflex     \\\r
+\Edieresis     Edieresis       \\\r
+\Igrave        Igrave  \\\r
+\Iacute        Iacute  \\\r
+\Icircumflex   Icircumflex     \\\r
+\Idieresis     Idieresis       \\\r
+\Eth   Eth     \\\r
+\Ntilde        Ntilde  \\\r
+\Ograve        Ograve  \\\r
+\Oacute        Oacute  \\\r
+\Ocircumflex   Ocircumflex     \\\r
+\Otilde        Otilde  \\\r
+\Odieresis     Odieresis       \\\r
+\multiply      multiply        \\\r
+\Oslash        Oslash  \\\r
+\Ugrave        Ugrave  \\\r
+\Uacute        Uacute  \\\r
+\Ucircumflex   Ucircumflex     \\\r
+\Udieresis     Udieresis       \\\r
+\Yacute        Yacute  \\\r
+\Thorn Thorn   \\\r
+\germandbls    germandbls      \\\r
+\agrave        agrave  \\\r
+\aacute        aacute  \\\r
+\acircumflex   acircumflex     \\\r
+\atilde        atilde  \\\r
+\adieresis     adieresis       \\\r
+\aring aring   \\\r
+\ae    ae      \\\r
+\ccedilla      ccedilla        \\\r
+\egrave        egrave  \\\r
+\eacute        eacute  \\\r
+\ecircumflex   ecircumflex     \\\r
+\edieresis     edieresis       \\\r
+\igrave        igrave  \\\r
+\iacute        iacute  \\\r
+\icircumflex   icircumflex     \\\r
+\idieresis     idieresis       \\\r
+\eth   eth     \\\r
+\ntilde        ntilde  \\\r
+\ograve        ograve  \\\r
+\oacute        oacute  \\\r
+\ocircumflex   ocircumflex     \\\r
+\otilde        otilde  \\\r
+\odieresis     odieresis       \\\r
+\divide        divide  \\\r
+\oslash        oslash  \\\r
+\ugrave        ugrave  \\\r
+\uacute        uacute  \\\r
+\ucircumflex   ucircumflex     \\\r
+\udieresis     udieresis       \\\r
+\yacute        yacute  \\\r
+\thorn thorn   \\\r
+\ydieresis     ydieresis       \\\r
+\r
+\section Symbol Charmap\r
+\r
+\space space   Symbol\\\r
+\exclam        exclam  Symbol\\\r
+\universal     universal       Symbol\\\r
+\numbersign    numbersign      Symbol\\\r
+\existential   existential     Symbol\\\r
+\percent       percent Symbol\\\r
+\ampersand     ampersand       Symbol\\\r
+\suchthat      suchthat        Symbol\\\r
+\parenleft     parenleft       Symbol\\\r
+\parenright    parenright      Symbol\\\r
+\asteriskmath  asteriskmath    Symbol\\\r
+\plus  plus    Symbol\\\r
+\comma comma   Symbol\\\r
+\minus minus   Symbol\\\r
+\period        period  Symbol\\\r
+\slash slash   Symbol\\\r
+\zero  zero    Symbol\\\r
+\one   one     Symbol\\\r
+\two   two     Symbol\\\r
+\three three   Symbol\\\r
+\four  four    Symbol\\\r
+\five  five    Symbol\\\r
+\six   six     Symbol\\\r
+\seven seven   Symbol\\\r
+\eight eight   Symbol\\\r
+\nine  nine    Symbol\\\r
+\colon colon   Symbol\\\r
+\semicolon     semicolon       Symbol\\\r
+\less  less    Symbol\\\r
+\equal equal   Symbol\\\r
+\greater       greater Symbol\\\r
+\question      question        Symbol\\\r
+\congruent     congruent       Symbol\\\r
+\Alpha Alpha   Symbol\\\r
+\Beta  Beta    Symbol\\\r
+\Chi   Chi     Symbol\\\r
+\Delta Delta   Symbol\\\r
+\Epsilon       Epsilon Symbol\\\r
+\Phi   Phi     Symbol\\\r
+\Gamma Gamma   Symbol\\\r
+\Eta   Eta     Symbol\\\r
+\Iota  Iota    Symbol\\\r
+\theta1        theta1  Symbol\\\r
+\Kappa Kappa   Symbol\\\r
+\Lambda        Lambda  Symbol\\\r
+\Mu    Mu      Symbol\\\r
+\Nu    Nu      Symbol\\\r
+\Omicron       Omicron Symbol\\\r
+\Pi    Pi      Symbol\\\r
+\Theta Theta   Symbol\\\r
+\Rho   Rho     Symbol\\\r
+\Sigma Sigma   Symbol\\\r
+\Tau   Tau     Symbol\\\r
+\Upsilon       Upsilon Symbol\\\r
+\sigma1        sigma1  Symbol\\\r
+\Omega Omega   Symbol\\\r
+\Xi    Xi      Symbol\\\r
+\Psi   Psi     Symbol\\\r
+\Zeta  Zeta    Symbol\\\r
+\bracketleft   bracketleft     Symbol\\\r
+\therefore     therefore       Symbol\\\r
+\bracketright  bracketright    Symbol\\\r
+\perpendicular perpendicular   Symbol\\\r
+\underscore    underscore      Symbol\\\r
+\radicalex     radicalex       Symbol\\\r
+\alpha alpha   Symbol\\\r
+\beta  beta    Symbol\\\r
+\chi   chi     Symbol\\\r
+\delta delta   Symbol\\\r
+\epsilon       epsilon Symbol\\\r
+\phi   phi     Symbol\\\r
+\gamma gamma   Symbol\\\r
+\eta   eta     Symbol\\\r
+\iota  iota    Symbol\\\r
+\phi1  phi1    Symbol\\\r
+\kappa kappa   Symbol\\\r
+\lambda        lambda  Symbol\\\r
+\mu    mu      Symbol\\\r
+\nu    nu      Symbol\\\r
+\omicron       omicron Symbol\\\r
+\pi    pi      Symbol\\\r
+\theta theta   Symbol\\\r
+\rho   rho     Symbol\\\r
+\sigma sigma   Symbol\\\r
+\tau   tau     Symbol\\\r
+\upsilon       upsilon Symbol\\\r
+\omega1        omega1  Symbol\\\r
+\omega omega   Symbol\\\r
+\xi    xi      Symbol\\\r
+\psi   psi     Symbol\\\r
+\zeta  zeta    Symbol\\\r
+\braceleft     braceleft       Symbol\\\r
+\bar   bar     Symbol\\\r
+\braceright    braceright      Symbol\\\r
+\similar       similar Symbol\\\r
+\Euro  Euro    Symbol\\\r
+\Upsilon1      Upsilon1        Symbol\\\r
+\minute        minute  Symbol\\\r
+\lessequal     lessequal       Symbol\\\r
+\fraction      fraction        Symbol\\\r
+\infinity      infinity        Symbol\\\r
+\florin        florin  Symbol\\\r
+\club  club    Symbol\\\r
+\diamond       diamond Symbol\\\r
+\heart heart   Symbol\\\r
+\spade spade   Symbol\\\r
+\arrowboth     arrowboth       Symbol\\\r
+\arrowleft     arrowleft       Symbol\\\r
+\arrowup       arrowup Symbol\\\r
+\arrowright    arrowright      Symbol\\\r
+\arrowdown     arrowdown       Symbol\\\r
+\degree        degree  Symbol\\\r
+\plusminus     plusminus       Symbol\\\r
+\second        second  Symbol\\\r
+\greaterequal  greaterequal    Symbol\\\r
+\multiply      multiply        Symbol\\\r
+\proportional  proportional    Symbol\\\r
+\partialdiff   partialdiff     Symbol\\\r
+\bullet        bullet  Symbol\\\r
+\divide        divide  Symbol\\\r
+\notequal      notequal        Symbol\\\r
+\equivalence   equivalence     Symbol\\\r
+\approxequal   approxequal     Symbol\\\r
+\arrowvertex   arrowvertex     Symbol\\\r
+\arrowhorizex  arrowhorizex    Symbol\\\r
+\carriagereturn        carriagereturn  Symbol\\\r
+\aleph aleph   Symbol\\\r
+\Ifraktur      Ifraktur        Symbol\\\r
+\Rfraktur      Rfraktur        Symbol\\\r
+\weierstrass   weierstrass     Symbol\\\r
+\circlemultiply        circlemultiply  Symbol\\\r
+\circleplus    circleplus      Symbol\\\r
+\emptyset      emptyset        Symbol\\\r
+\intersection  intersection    Symbol\\\r
+\union union   Symbol\\\r
+\propersuperset        propersuperset  Symbol\\\r
+\reflexsuperset        reflexsuperset  Symbol\\\r
+\notsubset     notsubset       Symbol\\\r
+\propersubset  propersubset    Symbol\\\r
+\reflexsubset  reflexsubset    Symbol\\\r
+\element       element Symbol\\\r
+\notelement    notelement      Symbol\\\r
+\angle angle   Symbol\\\r
+\gradient      gradient        Symbol\\\r
+\registerserif registerserif   Symbol\\\r
+\copyrightserif        copyrightserif  Symbol\\\r
+\trademarkserif        trademarkserif  Symbol\\\r
+\product       product Symbol\\\r
+\radical       radical Symbol\\\r
+\dotmath       dotmath Symbol\\\r
+\logicalnot    logicalnot      Symbol\\\r
+\logicaland    logicaland      Symbol\\\r
+\logicalor     logicalor       Symbol\\\r
+\arrowdblboth  arrowdblboth    Symbol\\\r
+\arrowdblleft  arrowdblleft    Symbol\\\r
+\arrowdblup    arrowdblup      Symbol\\\r
+\arrowdblright arrowdblright   Symbol\\\r
+\arrowdbldown  arrowdbldown    Symbol\\\r
+\lozenge       lozenge Symbol\\\r
+\angleleft     angleleft       Symbol\\\r
+\registersans  registersans    Symbol\\\r
+\copyrightsans copyrightsans   Symbol\\\r
+\trademarksans trademarksans   Symbol\\\r
+\summation     summation       Symbol\\\r
+\parenlefttp   parenlefttp     Symbol\\\r
+\parenleftex   parenleftex     Symbol\\\r
+\parenleftbt   parenleftbt     Symbol\\\r
+\bracketlefttp bracketlefttp   Symbol\\\r
+\bracketleftex bracketleftex   Symbol\\\r
+\bracketleftbt bracketleftbt   Symbol\\\r
+\bracelefttp   bracelefttp     Symbol\\\r
+\braceleftmid  braceleftmid    Symbol\\\r
+\braceleftbt   braceleftbt     Symbol\\\r
+\braceex       braceex Symbol\\\r
+\angleright    angleright      Symbol\\\r
+\integral      integral        Symbol\\\r
+\integraltp    integraltp      Symbol\\\r
+\integralex    integralex      Symbol\\\r
+\integralbt    integralbt      Symbol\\\r
+\parenrighttp  parenrighttp    Symbol\\\r
+\parenrightex  parenrightex    Symbol\\\r
+\parenrightbt  parenrightbt    Symbol\\\r
+\bracketrighttp        bracketrighttp  Symbol\\\r
+\bracketrightex        bracketrightex  Symbol\\\r
+\bracketrightbt        bracketrightbt  Symbol\\\r
+\bracerighttp  bracerighttp    Symbol\\\r
+\bracerightmid bracerightmid   Symbol\\\r
+\bracerightbt  bracerightbt    Symbol\\\r
+\r
+\r
+\section Lucida Math Italic Charmap\r
+\r
+\Gamma Gamma   LucidNewMatItaT\\\r
+\Delta Delta   LucidNewMatItaT\\\r
+\Theta Theta   LucidNewMatItaT\\\r
+\Lambda        Lambda  LucidNewMatItaT\\\r
+\Xi    Xi      LucidNewMatItaT\\\r
+\Pi    Pi      LucidNewMatItaT\\\r
+\Sigma Sigma   LucidNewMatItaT\\\r
+\Upsilon       Upsilon LucidNewMatItaT\\\r
+\Phi   Phi     LucidNewMatItaT\\\r
+\Psi   Psi     LucidNewMatItaT\\\r
+\Omega Omega   LucidNewMatItaT\\\r
+\alpha alpha   LucidNewMatItaT\\\r
+\beta  beta    LucidNewMatItaT\\\r
+\gamma gamma   LucidNewMatItaT\\\r
+\delta delta   LucidNewMatItaT\\\r
+\epsilon1      epsilon1        LucidNewMatItaT\\\r
+\zeta  zeta    LucidNewMatItaT\\\r
+\eta   eta     LucidNewMatItaT\\\r
+\theta theta   LucidNewMatItaT\\\r
+\iota  iota    LucidNewMatItaT\\\r
+\kappa kappa   LucidNewMatItaT\\\r
+\lambda        lambda  LucidNewMatItaT\\\r
+\mu    mu      LucidNewMatItaT\\\r
+\nu    nu      LucidNewMatItaT\\\r
+\xi    xi      LucidNewMatItaT\\\r
+\pi    pi      LucidNewMatItaT\\\r
+\rho   rho     LucidNewMatItaT\\\r
+\sigma sigma   LucidNewMatItaT\\\r
+\tau   tau     LucidNewMatItaT\\\r
+\upsilon       upsilon LucidNewMatItaT\\\r
+\phi   phi     LucidNewMatItaT\\\r
+\chi   chi     LucidNewMatItaT\\\r
+\psi   psi     LucidNewMatItaT\\\r
+\tie   tie     LucidNewMatItaT\\\r
+\omega omega   LucidNewMatItaT\\\r
+\epsilon       epsilon LucidNewMatItaT\\\r
+\theta1        theta1  LucidNewMatItaT\\\r
+\pi1   pi1     LucidNewMatItaT\\\r
+\rho1  rho1    LucidNewMatItaT\\\r
+\sigma1        sigma1  LucidNewMatItaT\\\r
+\phi1  phi1    LucidNewMatItaT\\\r
+\arrowlefttophalf      arrowlefttophalf        LucidNewMatItaT\\\r
+\arrowleftbothalf      arrowleftbothalf        LucidNewMatItaT\\\r
+\arrowrighttophalf     arrowrighttophalf       LucidNewMatItaT\\\r
+\arrowrightbothalf     arrowrightbothalf       LucidNewMatItaT\\\r
+\arrowhookleft arrowhookleft   LucidNewMatItaT\\\r
+\arrowhookright        arrowhookright  LucidNewMatItaT\\\r
+\triangleright triangleright   LucidNewMatItaT\\\r
+\triangleleft  triangleleft    LucidNewMatItaT\\\r
+\period        period  LucidNewMatItaT\\\r
+\comma comma   LucidNewMatItaT\\\r
+\less  less    LucidNewMatItaT\\\r
+\slash slash   LucidNewMatItaT\\\r
+\greater       greater LucidNewMatItaT\\\r
+\star  star    LucidNewMatItaT\\\r
+\partialdiff   partialdiff     LucidNewMatItaT\\\r
+\flat  flat    LucidNewMatItaT\\\r
+\natural       natural LucidNewMatItaT\\\r
+\sharp sharp   LucidNewMatItaT\\\r
+\slurbelow     slurbelow       LucidNewMatItaT\\\r
+\slurabove     slurabove       LucidNewMatItaT\\\r
+\lscript       lscript LucidNewMatItaT\\\r
+\dotlessi      dotlessi        LucidNewMatItaT\\\r
+\dotlessj      dotlessj        LucidNewMatItaT\\\r
+\weierstrass   weierstrass     LucidNewMatItaT\\\r
+\vector        vector  LucidNewMatItaT\\\r
+\r
+\section Lucida Math Symbol Charmap\r
+\r
+\minus minus   LucidNewMatSymT\\\r
+\periodcentered        periodcentered  LucidNewMatSymT\\\r
+\multiply      multiply        LucidNewMatSymT\\\r
+\asteriskmath  asteriskmath    LucidNewMatSymT\\\r
+\divide        divide  LucidNewMatSymT\\\r
+\diamondmath   diamondmath     LucidNewMatSymT\\\r
+\plusminus     plusminus       LucidNewMatSymT\\\r
+\minusplus     minusplus       LucidNewMatSymT\\\r
+\circleplus    circleplus      LucidNewMatSymT\\\r
+\circleminus   circleminus     LucidNewMatSymT\\\r
+\circlemultiply        circlemultiply  LucidNewMatSymT\\\r
+\circledivide  circledivide    LucidNewMatSymT\\\r
+\circledot     circledot       LucidNewMatSymT\\\r
+\circlecopyrt  circlecopyrt    LucidNewMatSymT\\\r
+\openbullet    openbullet      LucidNewMatSymT\\\r
+\bullet        bullet  LucidNewMatSymT\\\r
+\equivasymptotic       equivasymptotic LucidNewMatSymT\\\r
+\equivalence   equivalence     LucidNewMatSymT\\\r
+\reflexsubset  reflexsubset    LucidNewMatSymT\\\r
+\reflexsuperset        reflexsuperset  LucidNewMatSymT\\\r
+\lessequal     lessequal       LucidNewMatSymT\\\r
+\greaterequal  greaterequal    LucidNewMatSymT\\\r
+\precedesequal precedesequal   LucidNewMatSymT\\\r
+\followsequal  followsequal    LucidNewMatSymT\\\r
+\similar       similar LucidNewMatSymT\\\r
+\approxequal   approxequal     LucidNewMatSymT\\\r
+\propersubset  propersubset    LucidNewMatSymT\\\r
+\propersuperset        propersuperset  LucidNewMatSymT\\\r
+\lessmuch      lessmuch        LucidNewMatSymT\\\r
+\greatermuch   greatermuch     LucidNewMatSymT\\\r
+\precedes      precedes        LucidNewMatSymT\\\r
+\follows       follows LucidNewMatSymT\\\r
+\arrowleft     arrowleft       LucidNewMatSymT\\\r
+\spade spade   LucidNewMatSymT\\\r
+\arrowright    arrowright      LucidNewMatSymT\\\r
+\arrowup       arrowup LucidNewMatSymT\\\r
+\arrowdown     arrowdown       LucidNewMatSymT\\\r
+\arrowboth     arrowboth       LucidNewMatSymT\\\r
+\arrownortheast        arrownortheast  LucidNewMatSymT\\\r
+\arrowsoutheast        arrowsoutheast  LucidNewMatSymT\\\r
+\similarequal  similarequal    LucidNewMatSymT\\\r
+\arrowdblleft  arrowdblleft    LucidNewMatSymT\\\r
+\arrowdblright arrowdblright   LucidNewMatSymT\\\r
+\arrowdblup    arrowdblup      LucidNewMatSymT\\\r
+\arrowdbldown  arrowdbldown    LucidNewMatSymT\\\r
+\arrowdblboth  arrowdblboth    LucidNewMatSymT\\\r
+\arrownorthwest        arrownorthwest  LucidNewMatSymT\\\r
+\arrowsouthwest        arrowsouthwest  LucidNewMatSymT\\\r
+\proportional  proportional    LucidNewMatSymT\\\r
+\prime prime   LucidNewMatSymT\\\r
+\infinity      infinity        LucidNewMatSymT\\\r
+\element       element LucidNewMatSymT\\\r
+\owner owner   LucidNewMatSymT\\\r
+\triangle      triangle        LucidNewMatSymT\\\r
+\triangleinv   triangleinv     LucidNewMatSymT\\\r
+\negationslash negationslash   LucidNewMatSymT\\\r
+\mapsto        mapsto  LucidNewMatSymT\\\r
+\universal     universal       LucidNewMatSymT\\\r
+\existential   existential     LucidNewMatSymT\\\r
+\logicalnot    logicalnot      LucidNewMatSymT\\\r
+\emptyset      emptyset        LucidNewMatSymT\\\r
+\Rfractur      Rfractur        LucidNewMatSymT\\\r
+\Ifractur      Ifractur        LucidNewMatSymT\\\r
+\latticetop    latticetop      LucidNewMatSymT\\\r
+\perpendicular perpendicular   LucidNewMatSymT\\\r
+\aleph aleph   LucidNewMatSymT\\\r
+\scriptA       scriptA LucidNewMatSymT\\\r
+\scriptB       scriptB LucidNewMatSymT\\\r
+\scriptC       scriptC LucidNewMatSymT\\\r
+\scriptD       scriptD LucidNewMatSymT\\\r
+\scriptE       scriptE LucidNewMatSymT\\\r
+\scriptF       scriptF LucidNewMatSymT\\\r
+\scriptG       scriptG LucidNewMatSymT\\\r
+\scriptH       scriptH LucidNewMatSymT\\\r
+\scriptI       scriptI LucidNewMatSymT\\\r
+\scriptJ       scriptJ LucidNewMatSymT\\\r
+\scriptK       scriptK LucidNewMatSymT\\\r
+\scriptL       scriptL LucidNewMatSymT\\\r
+\scriptM       scriptM LucidNewMatSymT\\\r
+\scriptN       scriptN LucidNewMatSymT\\\r
+\scriptO       scriptO LucidNewMatSymT\\\r
+\scriptP       scriptP LucidNewMatSymT\\\r
+\scriptQ       scriptQ LucidNewMatSymT\\\r
+\scriptR       scriptR LucidNewMatSymT\\\r
+\scriptS       scriptS LucidNewMatSymT\\\r
+\scriptT       scriptT LucidNewMatSymT\\\r
+\scriptU       scriptU LucidNewMatSymT\\\r
+\scriptV       scriptV LucidNewMatSymT\\\r
+\scriptW       scriptW LucidNewMatSymT\\\r
+\scriptX       scriptX LucidNewMatSymT\\\r
+\scriptY       scriptY LucidNewMatSymT\\\r
+\scriptZ       scriptZ LucidNewMatSymT\\\r
+\union union   LucidNewMatSymT\\\r
+\intersection  intersection    LucidNewMatSymT\\\r
+\unionmulti    unionmulti      LucidNewMatSymT\\\r
+\logicaland    logicaland      LucidNewMatSymT\\\r
+\logicalor     logicalor       LucidNewMatSymT\\\r
+\turnstileleft turnstileleft   LucidNewMatSymT\\\r
+\turnstileright        turnstileright  LucidNewMatSymT\\\r
+\floorleft     floorleft       LucidNewMatSymT\\\r
+\floorright    floorright      LucidNewMatSymT\\\r
+\ceilingleft   ceilingleft     LucidNewMatSymT\\\r
+\ceilingright  ceilingright    LucidNewMatSymT\\\r
+\braceleft     braceleft       LucidNewMatSymT\\\r
+\braceright    braceright      LucidNewMatSymT\\\r
+\angbracketleft        angbracketleft  LucidNewMatSymT\\\r
+\angbracketright       angbracketright LucidNewMatSymT\\\r
+\bar   bar     LucidNewMatSymT\\\r
+\bardbl        bardbl  LucidNewMatSymT\\\r
+\arrowbothv    arrowbothv      LucidNewMatSymT\\\r
+\arrowdblbothv arrowdblbothv   LucidNewMatSymT\\\r
+\backslash     backslash       LucidNewMatSymT\\\r
+\wreathproduct wreathproduct   LucidNewMatSymT\\\r
+\radical       radical LucidNewMatSymT\\\r
+\coproduct     coproduct       LucidNewMatSymT\\\r
+\nabla nabla   LucidNewMatSymT\\\r
+\integral      integral        LucidNewMatSymT\\\r
+\unionsq       unionsq LucidNewMatSymT\\\r
+\intersectionsq        intersectionsq  LucidNewMatSymT\\\r
+\subsetsqequal subsetsqequal   LucidNewMatSymT\\\r
+\supersetsqequal       supersetsqequal LucidNewMatSymT\\\r
+\section       section LucidNewMatSymT\\\r
+\dagger        dagger  LucidNewMatSymT\\\r
+\daggerdbl     daggerdbl       LucidNewMatSymT\\\r
+\paragraph     paragraph       LucidNewMatSymT\\\r
+\club  club    LucidNewMatSymT\\\r
+\diamond       diamond LucidNewMatSymT\\\r
+\heart heart   LucidNewMatSymT\\\r
+\r
+\section Lucida Math Extended Charmap\r
+\r
+\parenleftbig  parenleftbig    LucidNewMatExtT\\\r
+\parenrightbig parenrightbig   LucidNewMatExtT\\\r
+\bracketleftbig        bracketleftbig  LucidNewMatExtT\\\r
+\bracketrightbig       bracketrightbig LucidNewMatExtT\\\r
+\floorleftbig  floorleftbig    LucidNewMatExtT\\\r
+\floorrightbig floorrightbig   LucidNewMatExtT\\\r
+\ceilingleftbig        ceilingleftbig  LucidNewMatExtT\\\r
+\ceilingrightbig       ceilingrightbig LucidNewMatExtT\\\r
+\braceleftbig  braceleftbig    LucidNewMatExtT\\\r
+\bracerightbig bracerightbig   LucidNewMatExtT\\\r
+\angbracketleftbig     angbracketleftbig       LucidNewMatExtT\\\r
+\angbracketrightbig    angbracketrightbig      LucidNewMatExtT\\\r
+\vextendsingle vextendsingle   LucidNewMatExtT\\\r
+\vextenddouble vextenddouble   LucidNewMatExtT\\\r
+\slashbig      slashbig        LucidNewMatExtT\\\r
+\backslashbig  backslashbig    LucidNewMatExtT\\\r
+\parenleftBig  parenleftBig    LucidNewMatExtT\\\r
+\parenrightBig parenrightBig   LucidNewMatExtT\\\r
+\parenleftbigg parenleftbigg   LucidNewMatExtT\\\r
+\parenrightbigg        parenrightbigg  LucidNewMatExtT\\\r
+\bracketleftbigg       bracketleftbigg LucidNewMatExtT\\\r
+\bracketrightbigg      bracketrightbigg        LucidNewMatExtT\\\r
+\floorleftbigg floorleftbigg   LucidNewMatExtT\\\r
+\floorrightbigg        floorrightbigg  LucidNewMatExtT\\\r
+\ceilingleftbigg       ceilingleftbigg LucidNewMatExtT\\\r
+\ceilingrightbigg      ceilingrightbigg        LucidNewMatExtT\\\r
+\braceleftbigg braceleftbigg   LucidNewMatExtT\\\r
+\bracerightbigg        bracerightbigg  LucidNewMatExtT\\\r
+\angbracketleftbigg    angbracketleftbigg      LucidNewMatExtT\\\r
+\angbracketrightbigg   angbracketrightbigg     LucidNewMatExtT\\\r
+\slashbigg     slashbigg       LucidNewMatExtT\\\r
+\backslashbigg backslashbigg   LucidNewMatExtT\\\r
+\parenleftBigg parenleftBigg   LucidNewMatExtT\\\r
+\parenrightBigg        parenrightBigg  LucidNewMatExtT\\\r
+\bracketleftBigg       bracketleftBigg LucidNewMatExtT\\\r
+\bracketrightBigg      bracketrightBigg        LucidNewMatExtT\\\r
+\floorleftBigg floorleftBigg   LucidNewMatExtT\\\r
+\floorrightBigg        floorrightBigg  LucidNewMatExtT\\\r
+\ceilingleftBigg       ceilingleftBigg LucidNewMatExtT\\\r
+\ceilingrightBigg      ceilingrightBigg        LucidNewMatExtT\\\r
+\braceleftBigg braceleftBigg   LucidNewMatExtT\\\r
+\bracerightBigg        bracerightBigg  LucidNewMatExtT\\\r
+\angbracketleftBigg    angbracketleftBigg      LucidNewMatExtT\\\r
+\angbracketrightBigg   angbracketrightBigg     LucidNewMatExtT\\\r
+\slashBigg     slashBigg       LucidNewMatExtT\\\r
+\backslashBigg backslashBigg   LucidNewMatExtT\\\r
+\slashBig      slashBig        LucidNewMatExtT\\\r
+\backslashBig  backslashBig    LucidNewMatExtT\\\r
+\parenlefttp   parenlefttp     LucidNewMatExtT\\\r
+\parenrighttp  parenrighttp    LucidNewMatExtT\\\r
+\bracketlefttp bracketlefttp   LucidNewMatExtT\\\r
+\bracketrighttp        bracketrighttp  LucidNewMatExtT\\\r
+\bracketleftbt bracketleftbt   LucidNewMatExtT\\\r
+\bracketrightbt        bracketrightbt  LucidNewMatExtT\\\r
+\bracketleftex bracketleftex   LucidNewMatExtT\\\r
+\bracketrightex        bracketrightex  LucidNewMatExtT\\\r
+\bracelefttp   bracelefttp     LucidNewMatExtT\\\r
+\bracerighttp  bracerighttp    LucidNewMatExtT\\\r
+\braceleftbt   braceleftbt     LucidNewMatExtT\\\r
+\bracerightbt  bracerightbt    LucidNewMatExtT\\\r
+\braceleftmid  braceleftmid    LucidNewMatExtT\\\r
+\bracerightmid bracerightmid   LucidNewMatExtT\\\r
+\braceex       braceex LucidNewMatExtT\\\r
+\arrowvertex   arrowvertex     LucidNewMatExtT\\\r
+\parenleftbt   parenleftbt     LucidNewMatExtT\\\r
+\parenrightbt  parenrightbt    LucidNewMatExtT\\\r
+\parenleftex   parenleftex     LucidNewMatExtT\\\r
+\parenrightex  parenrightex    LucidNewMatExtT\\\r
+\angbracketleftBig     angbracketleftBig       LucidNewMatExtT\\\r
+\angbracketrightBig    angbracketrightBig      LucidNewMatExtT\\\r
+\unionsqtext   unionsqtext     LucidNewMatExtT\\\r
+\unionsqdisplay        unionsqdisplay  LucidNewMatExtT\\\r
+\contintegraltext      contintegraltext        LucidNewMatExtT\\\r
+\contintegraldisplay   contintegraldisplay     LucidNewMatExtT\\\r
+\circledottext circledottext   LucidNewMatExtT\\\r
+\circledotdisplay      circledotdisplay        LucidNewMatExtT\\\r
+\circleplustext        circleplustext  LucidNewMatExtT\\\r
+\circleplusdisplay     circleplusdisplay       LucidNewMatExtT\\\r
+\circlemultiplytext    circlemultiplytext      LucidNewMatExtT\\\r
+\circlemultiplydisplay circlemultiplydisplay   LucidNewMatExtT\\\r
+\summationtext summationtext   LucidNewMatExtT\\\r
+\producttext   producttext     LucidNewMatExtT\\\r
+\integraltext  integraltext    LucidNewMatExtT\\\r
+\uniontext     uniontext       LucidNewMatExtT\\\r
+\intersectiontext      intersectiontext        LucidNewMatExtT\\\r
+\unionmultitext        unionmultitext  LucidNewMatExtT\\\r
+\logicalandtext        logicalandtext  LucidNewMatExtT\\\r
+\logicalortext logicalortext   LucidNewMatExtT\\\r
+\summationdisplay      summationdisplay        LucidNewMatExtT\\\r
+\productdisplay        productdisplay  LucidNewMatExtT\\\r
+\integraldisplay       integraldisplay LucidNewMatExtT\\\r
+\uniondisplay  uniondisplay    LucidNewMatExtT\\\r
+\intersectiondisplay   intersectiondisplay     LucidNewMatExtT\\\r
+\unionmultidisplay     unionmultidisplay       LucidNewMatExtT\\\r
+\logicalanddisplay     logicalanddisplay       LucidNewMatExtT\\\r
+\logicalordisplay      logicalordisplay        LucidNewMatExtT\\\r
+\coproducttext coproducttext   LucidNewMatExtT\\\r
+\coproductdisplay      coproductdisplay        LucidNewMatExtT\\\r
+\hatwide       hatwide LucidNewMatExtT\\\r
+\hatwider      hatwider        LucidNewMatExtT\\\r
+\hatwidest     hatwidest       LucidNewMatExtT\\\r
+\tildewide     tildewide       LucidNewMatExtT\\\r
+\tildewider    tildewider      LucidNewMatExtT\\\r
+\tildewidest   tildewidest     LucidNewMatExtT\\\r
+\bracketleftBig        bracketleftBig  LucidNewMatExtT\\\r
+\bracketrightBig       bracketrightBig LucidNewMatExtT\\\r
+\floorleftBig  floorleftBig    LucidNewMatExtT\\\r
+\floorrightBig floorrightBig   LucidNewMatExtT\\\r
+\ceilingleftBig        ceilingleftBig  LucidNewMatExtT\\\r
+\ceilingrightBig       ceilingrightBig LucidNewMatExtT\\\r
+\braceleftBig  braceleftBig    LucidNewMatExtT\\\r
+\bracerightBig bracerightBig   LucidNewMatExtT\\\r
+\radicalbig    radicalbig      LucidNewMatExtT\\\r
+\radicalBig    radicalBig      LucidNewMatExtT\\\r
+\radicalbigg   radicalbigg     LucidNewMatExtT\\\r
+\radicalBigg   radicalBigg     LucidNewMatExtT\\\r
+\radicalbt     radicalbt       LucidNewMatExtT\\\r
+\radicalvertex radicalvertex   LucidNewMatExtT\\\r
+\radicaltp     radicaltp       LucidNewMatExtT\\\r
+\arrowvertexdbl        arrowvertexdbl  LucidNewMatExtT\\\r
+\arrowtp       arrowtp LucidNewMatExtT\\\r
+\arrowbt       arrowbt LucidNewMatExtT\\\r
+\bracehtipdownleft     bracehtipdownleft       LucidNewMatExtT\\\r
+\bracehtipdownright    bracehtipdownright      LucidNewMatExtT\\\r
+\bracehtipupleft       bracehtipupleft LucidNewMatExtT\\\r
+\bracehtipupright      bracehtipupright        LucidNewMatExtT\\\r
+\arrowdbltp    arrowdbltp      LucidNewMatExtT\\\r
+\arrowdblbt    arrowdblbt      LucidNewMatExtT\\\r
+\r
+\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/lucmatext-charmap.processed.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/lucmatext-charmap.processed.txt
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/lucmathext-charmap.processed.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/lucmathext-charmap.processed.txt
new file mode 100755 (executable)
index 0000000..23f5f29
--- /dev/null
@@ -0,0 +1,128 @@
+\parenleftbig  parenleftbig    LucidNewMatExtT\\\r
+\parenrightbig parenrightbig   LucidNewMatExtT\\\r
+\bracketleftbig        bracketleftbig  LucidNewMatExtT\\\r
+\bracketrightbig       bracketrightbig LucidNewMatExtT\\\r
+\floorleftbig  floorleftbig    LucidNewMatExtT\\\r
+\floorrightbig floorrightbig   LucidNewMatExtT\\\r
+\ceilingleftbig        ceilingleftbig  LucidNewMatExtT\\\r
+\ceilingrightbig       ceilingrightbig LucidNewMatExtT\\\r
+\braceleftbig  braceleftbig    LucidNewMatExtT\\\r
+\bracerightbig bracerightbig   LucidNewMatExtT\\\r
+\angbracketleftbig     angbracketleftbig       LucidNewMatExtT\\\r
+\angbracketrightbig    angbracketrightbig      LucidNewMatExtT\\\r
+\vextendsingle vextendsingle   LucidNewMatExtT\\\r
+\vextenddouble vextenddouble   LucidNewMatExtT\\\r
+\slashbig      slashbig        LucidNewMatExtT\\\r
+\backslashbig  backslashbig    LucidNewMatExtT\\\r
+\parenleftBig  parenleftBig    LucidNewMatExtT\\\r
+\parenrightBig parenrightBig   LucidNewMatExtT\\\r
+\parenleftbigg parenleftbigg   LucidNewMatExtT\\\r
+\parenrightbigg        parenrightbigg  LucidNewMatExtT\\\r
+\bracketleftbigg       bracketleftbigg LucidNewMatExtT\\\r
+\bracketrightbigg      bracketrightbigg        LucidNewMatExtT\\\r
+\floorleftbigg floorleftbigg   LucidNewMatExtT\\\r
+\floorrightbigg        floorrightbigg  LucidNewMatExtT\\\r
+\ceilingleftbigg       ceilingleftbigg LucidNewMatExtT\\\r
+\ceilingrightbigg      ceilingrightbigg        LucidNewMatExtT\\\r
+\braceleftbigg braceleftbigg   LucidNewMatExtT\\\r
+\bracerightbigg        bracerightbigg  LucidNewMatExtT\\\r
+\angbracketleftbigg    angbracketleftbigg      LucidNewMatExtT\\\r
+\angbracketrightbigg   angbracketrightbigg     LucidNewMatExtT\\\r
+\slashbigg     slashbigg       LucidNewMatExtT\\\r
+\backslashbigg backslashbigg   LucidNewMatExtT\\\r
+\parenleftBigg parenleftBigg   LucidNewMatExtT\\\r
+\parenrightBigg        parenrightBigg  LucidNewMatExtT\\\r
+\bracketleftBigg       bracketleftBigg LucidNewMatExtT\\\r
+\bracketrightBigg      bracketrightBigg        LucidNewMatExtT\\\r
+\floorleftBigg floorleftBigg   LucidNewMatExtT\\\r
+\floorrightBigg        floorrightBigg  LucidNewMatExtT\\\r
+\ceilingleftBigg       ceilingleftBigg LucidNewMatExtT\\\r
+\ceilingrightBigg      ceilingrightBigg        LucidNewMatExtT\\\r
+\braceleftBigg braceleftBigg   LucidNewMatExtT\\\r
+\bracerightBigg        bracerightBigg  LucidNewMatExtT\\\r
+\angbracketleftBigg    angbracketleftBigg      LucidNewMatExtT\\\r
+\angbracketrightBigg   angbracketrightBigg     LucidNewMatExtT\\\r
+\slashBigg     slashBigg       LucidNewMatExtT\\\r
+\backslashBigg backslashBigg   LucidNewMatExtT\\\r
+\slashBig      slashBig        LucidNewMatExtT\\\r
+\backslashBig  backslashBig    LucidNewMatExtT\\\r
+\parenlefttp   parenlefttp     LucidNewMatExtT\\\r
+\parenrighttp  parenrighttp    LucidNewMatExtT\\\r
+\bracketlefttp bracketlefttp   LucidNewMatExtT\\\r
+\bracketrighttp        bracketrighttp  LucidNewMatExtT\\\r
+\bracketleftbt bracketleftbt   LucidNewMatExtT\\\r
+\bracketrightbt        bracketrightbt  LucidNewMatExtT\\\r
+\bracketleftex bracketleftex   LucidNewMatExtT\\\r
+\bracketrightex        bracketrightex  LucidNewMatExtT\\\r
+\bracelefttp   bracelefttp     LucidNewMatExtT\\\r
+\bracerighttp  bracerighttp    LucidNewMatExtT\\\r
+\braceleftbt   braceleftbt     LucidNewMatExtT\\\r
+\bracerightbt  bracerightbt    LucidNewMatExtT\\\r
+\braceleftmid  braceleftmid    LucidNewMatExtT\\\r
+\bracerightmid bracerightmid   LucidNewMatExtT\\\r
+\braceex       braceex LucidNewMatExtT\\\r
+\arrowvertex   arrowvertex     LucidNewMatExtT\\\r
+\parenleftbt   parenleftbt     LucidNewMatExtT\\\r
+\parenrightbt  parenrightbt    LucidNewMatExtT\\\r
+\parenleftex   parenleftex     LucidNewMatExtT\\\r
+\parenrightex  parenrightex    LucidNewMatExtT\\\r
+\angbracketleftBig     angbracketleftBig       LucidNewMatExtT\\\r
+\angbracketrightBig    angbracketrightBig      LucidNewMatExtT\\\r
+\unionsqtext   unionsqtext     LucidNewMatExtT\\\r
+\unionsqdisplay        unionsqdisplay  LucidNewMatExtT\\\r
+\contintegraltext      contintegraltext        LucidNewMatExtT\\\r
+\contintegraldisplay   contintegraldisplay     LucidNewMatExtT\\\r
+\circledottext circledottext   LucidNewMatExtT\\\r
+\circledotdisplay      circledotdisplay        LucidNewMatExtT\\\r
+\circleplustext        circleplustext  LucidNewMatExtT\\\r
+\circleplusdisplay     circleplusdisplay       LucidNewMatExtT\\\r
+\circlemultiplytext    circlemultiplytext      LucidNewMatExtT\\\r
+\circlemultiplydisplay circlemultiplydisplay   LucidNewMatExtT\\\r
+\summationtext summationtext   LucidNewMatExtT\\\r
+\producttext   producttext     LucidNewMatExtT\\\r
+\integraltext  integraltext    LucidNewMatExtT\\\r
+\uniontext     uniontext       LucidNewMatExtT\\\r
+\intersectiontext      intersectiontext        LucidNewMatExtT\\\r
+\unionmultitext        unionmultitext  LucidNewMatExtT\\\r
+\logicalandtext        logicalandtext  LucidNewMatExtT\\\r
+\logicalortext logicalortext   LucidNewMatExtT\\\r
+\summationdisplay      summationdisplay        LucidNewMatExtT\\\r
+\productdisplay        productdisplay  LucidNewMatExtT\\\r
+\integraldisplay       integraldisplay LucidNewMatExtT\\\r
+\uniondisplay  uniondisplay    LucidNewMatExtT\\\r
+\intersectiondisplay   intersectiondisplay     LucidNewMatExtT\\\r
+\unionmultidisplay     unionmultidisplay       LucidNewMatExtT\\\r
+\logicalanddisplay     logicalanddisplay       LucidNewMatExtT\\\r
+\logicalordisplay      logicalordisplay        LucidNewMatExtT\\\r
+\coproducttext coproducttext   LucidNewMatExtT\\\r
+\coproductdisplay      coproductdisplay        LucidNewMatExtT\\\r
+\hatwide       hatwide LucidNewMatExtT\\\r
+\hatwider      hatwider        LucidNewMatExtT\\\r
+\hatwidest     hatwidest       LucidNewMatExtT\\\r
+\tildewide     tildewide       LucidNewMatExtT\\\r
+\tildewider    tildewider      LucidNewMatExtT\\\r
+\tildewidest   tildewidest     LucidNewMatExtT\\\r
+\bracketleftBig        bracketleftBig  LucidNewMatExtT\\\r
+\bracketrightBig       bracketrightBig LucidNewMatExtT\\\r
+\floorleftBig  floorleftBig    LucidNewMatExtT\\\r
+\floorrightBig floorrightBig   LucidNewMatExtT\\\r
+\ceilingleftBig        ceilingleftBig  LucidNewMatExtT\\\r
+\ceilingrightBig       ceilingrightBig LucidNewMatExtT\\\r
+\braceleftBig  braceleftBig    LucidNewMatExtT\\\r
+\bracerightBig bracerightBig   LucidNewMatExtT\\\r
+\radicalbig    radicalbig      LucidNewMatExtT\\\r
+\radicalBig    radicalBig      LucidNewMatExtT\\\r
+\radicalbigg   radicalbigg     LucidNewMatExtT\\\r
+\radicalBigg   radicalBigg     LucidNewMatExtT\\\r
+\radicalbt     radicalbt       LucidNewMatExtT\\\r
+\radicalvertex radicalvertex   LucidNewMatExtT\\\r
+\radicaltp     radicaltp       LucidNewMatExtT\\\r
+\arrowvertexdbl        arrowvertexdbl  LucidNewMatExtT\\\r
+\arrowtp       arrowtp LucidNewMatExtT\\\r
+\arrowbt       arrowbt LucidNewMatExtT\\\r
+\bracehtipdownleft     bracehtipdownleft       LucidNewMatExtT\\\r
+\bracehtipdownright    bracehtipdownright      LucidNewMatExtT\\\r
+\bracehtipupleft       bracehtipupleft LucidNewMatExtT\\\r
+\bracehtipupright      bracehtipupright        LucidNewMatExtT\\\r
+\arrowdbltp    arrowdbltp      LucidNewMatExtT\\\r
+\arrowdblbt    arrowdblbt      LucidNewMatExtT\\\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/lucmathit-charmap.processed.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/lucmathit-charmap.processed.txt
new file mode 100755 (executable)
index 0000000..63b3999
--- /dev/null
@@ -0,0 +1,66 @@
+\Gamma Gamma   LucidNewMatItaT\r
+\Delta Delta   LucidNewMatItaT\r
+\Theta Theta   LucidNewMatItaT\r
+\Lambda        Lambda  LucidNewMatItaT\r
+\Xi    Xi      LucidNewMatItaT\r
+\Pi    Pi      LucidNewMatItaT\r
+\Sigma Sigma   LucidNewMatItaT\r
+\Upsilon       Upsilon LucidNewMatItaT\r
+\Phi   Phi     LucidNewMatItaT\r
+\Psi   Psi     LucidNewMatItaT\r
+\Omega Omega   LucidNewMatItaT\r
+\alpha alpha   LucidNewMatItaT\r
+\beta  beta    LucidNewMatItaT\r
+\gamma gamma   LucidNewMatItaT\r
+\delta delta   LucidNewMatItaT\r
+\epsilon1      epsilon1        LucidNewMatItaT\r
+\zeta  zeta    LucidNewMatItaT\r
+\eta   eta     LucidNewMatItaT\r
+\theta theta   LucidNewMatItaT\r
+\iota  iota    LucidNewMatItaT\r
+\kappa kappa   LucidNewMatItaT\r
+\lambda        lambda  LucidNewMatItaT\r
+\mu    mu      LucidNewMatItaT\r
+\nu    nu      LucidNewMatItaT\r
+\xi    xi      LucidNewMatItaT\r
+\pi    pi      LucidNewMatItaT\r
+\rho   rho     LucidNewMatItaT\r
+\sigma sigma   LucidNewMatItaT\r
+\tau   tau     LucidNewMatItaT\r
+\upsilon       upsilon LucidNewMatItaT\r
+\phi   phi     LucidNewMatItaT\r
+\chi   chi     LucidNewMatItaT\r
+\psi   psi     LucidNewMatItaT\r
+\tie   tie     LucidNewMatItaT\r
+\omega omega   LucidNewMatItaT\r
+\epsilon       epsilon LucidNewMatItaT\r
+\theta1        theta1  LucidNewMatItaT\r
+\pi1   pi1     LucidNewMatItaT\r
+\rho1  rho1    LucidNewMatItaT\r
+\sigma1        sigma1  LucidNewMatItaT\r
+\phi1  phi1    LucidNewMatItaT\r
+\arrowlefttophalf      arrowlefttophalf        LucidNewMatItaT\r
+\arrowleftbothalf      arrowleftbothalf        LucidNewMatItaT\r
+\arrowrighttophalf     arrowrighttophalf       LucidNewMatItaT\r
+\arrowrightbothalf     arrowrightbothalf       LucidNewMatItaT\r
+\arrowhookleft arrowhookleft   LucidNewMatItaT\r
+\arrowhookright        arrowhookright  LucidNewMatItaT\r
+\triangleright triangleright   LucidNewMatItaT\r
+\triangleleft  triangleleft    LucidNewMatItaT\r
+\period        period  LucidNewMatItaT\r
+\comma comma   LucidNewMatItaT\r
+\less  less    LucidNewMatItaT\r
+\slash slash   LucidNewMatItaT\r
+\greater       greater LucidNewMatItaT\r
+\star  star    LucidNewMatItaT\r
+\partialdiff   partialdiff     LucidNewMatItaT\r
+\flat  flat    LucidNewMatItaT\r
+\natural       natural LucidNewMatItaT\r
+\sharp sharp   LucidNewMatItaT\r
+\slurbelow     slurbelow       LucidNewMatItaT\r
+\slurabove     slurabove       LucidNewMatItaT\r
+\lscript       lscript LucidNewMatItaT\r
+\dotlessi      dotlessi        LucidNewMatItaT\r
+\dotlessj      dotlessj        LucidNewMatItaT\r
+\weierstrass   weierstrass     LucidNewMatItaT\r
+\vector        vector  LucidNewMatItaT\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/lucmathsym-charmap.processed.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/lucmathsym-charmap.processed.txt
new file mode 100755 (executable)
index 0000000..2b9c733
--- /dev/null
@@ -0,0 +1,128 @@
+\minus minus   LucidNewMatSymT\r
+\periodcentered        periodcentered  LucidNewMatSymT\r
+\multiply      multiply        LucidNewMatSymT\r
+\asteriskmath  asteriskmath    LucidNewMatSymT\r
+\divide        divide  LucidNewMatSymT\r
+\diamondmath   diamondmath     LucidNewMatSymT\r
+\plusminus     plusminus       LucidNewMatSymT\r
+\minusplus     minusplus       LucidNewMatSymT\r
+\circleplus    circleplus      LucidNewMatSymT\r
+\circleminus   circleminus     LucidNewMatSymT\r
+\circlemultiply        circlemultiply  LucidNewMatSymT\r
+\circledivide  circledivide    LucidNewMatSymT\r
+\circledot     circledot       LucidNewMatSymT\r
+\circlecopyrt  circlecopyrt    LucidNewMatSymT\r
+\openbullet    openbullet      LucidNewMatSymT\r
+\bullet        bullet  LucidNewMatSymT\r
+\equivasymptotic       equivasymptotic LucidNewMatSymT\r
+\equivalence   equivalence     LucidNewMatSymT\r
+\reflexsubset  reflexsubset    LucidNewMatSymT\r
+\reflexsuperset        reflexsuperset  LucidNewMatSymT\r
+\lessequal     lessequal       LucidNewMatSymT\r
+\greaterequal  greaterequal    LucidNewMatSymT\r
+\precedesequal precedesequal   LucidNewMatSymT\r
+\followsequal  followsequal    LucidNewMatSymT\r
+\similar       similar LucidNewMatSymT\r
+\approxequal   approxequal     LucidNewMatSymT\r
+\propersubset  propersubset    LucidNewMatSymT\r
+\propersuperset        propersuperset  LucidNewMatSymT\r
+\lessmuch      lessmuch        LucidNewMatSymT\r
+\greatermuch   greatermuch     LucidNewMatSymT\r
+\precedes      precedes        LucidNewMatSymT\r
+\follows       follows LucidNewMatSymT\r
+\arrowleft     arrowleft       LucidNewMatSymT\r
+\spade spade   LucidNewMatSymT\r
+\arrowright    arrowright      LucidNewMatSymT\r
+\arrowup       arrowup LucidNewMatSymT\r
+\arrowdown     arrowdown       LucidNewMatSymT\r
+\arrowboth     arrowboth       LucidNewMatSymT\r
+\arrownortheast        arrownortheast  LucidNewMatSymT\r
+\arrowsoutheast        arrowsoutheast  LucidNewMatSymT\r
+\similarequal  similarequal    LucidNewMatSymT\r
+\arrowdblleft  arrowdblleft    LucidNewMatSymT\r
+\arrowdblright arrowdblright   LucidNewMatSymT\r
+\arrowdblup    arrowdblup      LucidNewMatSymT\r
+\arrowdbldown  arrowdbldown    LucidNewMatSymT\r
+\arrowdblboth  arrowdblboth    LucidNewMatSymT\r
+\arrownorthwest        arrownorthwest  LucidNewMatSymT\r
+\arrowsouthwest        arrowsouthwest  LucidNewMatSymT\r
+\proportional  proportional    LucidNewMatSymT\r
+\prime prime   LucidNewMatSymT\r
+\infinity      infinity        LucidNewMatSymT\r
+\element       element LucidNewMatSymT\r
+\owner owner   LucidNewMatSymT\r
+\triangle      triangle        LucidNewMatSymT\r
+\triangleinv   triangleinv     LucidNewMatSymT\r
+\negationslash negationslash   LucidNewMatSymT\r
+\mapsto        mapsto  LucidNewMatSymT\r
+\universal     universal       LucidNewMatSymT\r
+\existential   existential     LucidNewMatSymT\r
+\logicalnot    logicalnot      LucidNewMatSymT\r
+\emptyset      emptyset        LucidNewMatSymT\r
+\Rfractur      Rfractur        LucidNewMatSymT\r
+\Ifractur      Ifractur        LucidNewMatSymT\r
+\latticetop    latticetop      LucidNewMatSymT\r
+\perpendicular perpendicular   LucidNewMatSymT\r
+\aleph aleph   LucidNewMatSymT\r
+\scriptA       scriptA LucidNewMatSymT\r
+\scriptB       scriptB LucidNewMatSymT\r
+\scriptC       scriptC LucidNewMatSymT\r
+\scriptD       scriptD LucidNewMatSymT\r
+\scriptE       scriptE LucidNewMatSymT\r
+\scriptF       scriptF LucidNewMatSymT\r
+\scriptG       scriptG LucidNewMatSymT\r
+\scriptH       scriptH LucidNewMatSymT\r
+\scriptI       scriptI LucidNewMatSymT\r
+\scriptJ       scriptJ LucidNewMatSymT\r
+\scriptK       scriptK LucidNewMatSymT\r
+\scriptL       scriptL LucidNewMatSymT\r
+\scriptM       scriptM LucidNewMatSymT\r
+\scriptN       scriptN LucidNewMatSymT\r
+\scriptO       scriptO LucidNewMatSymT\r
+\scriptP       scriptP LucidNewMatSymT\r
+\scriptQ       scriptQ LucidNewMatSymT\r
+\scriptR       scriptR LucidNewMatSymT\r
+\scriptS       scriptS LucidNewMatSymT\r
+\scriptT       scriptT LucidNewMatSymT\r
+\scriptU       scriptU LucidNewMatSymT\r
+\scriptV       scriptV LucidNewMatSymT\r
+\scriptW       scriptW LucidNewMatSymT\r
+\scriptX       scriptX LucidNewMatSymT\r
+\scriptY       scriptY LucidNewMatSymT\r
+\scriptZ       scriptZ LucidNewMatSymT\r
+\union union   LucidNewMatSymT\r
+\intersection  intersection    LucidNewMatSymT\r
+\unionmulti    unionmulti      LucidNewMatSymT\r
+\logicaland    logicaland      LucidNewMatSymT\r
+\logicalor     logicalor       LucidNewMatSymT\r
+\turnstileleft turnstileleft   LucidNewMatSymT\r
+\turnstileright        turnstileright  LucidNewMatSymT\r
+\floorleft     floorleft       LucidNewMatSymT\r
+\floorright    floorright      LucidNewMatSymT\r
+\ceilingleft   ceilingleft     LucidNewMatSymT\r
+\ceilingright  ceilingright    LucidNewMatSymT\r
+\braceleft     braceleft       LucidNewMatSymT\r
+\braceright    braceright      LucidNewMatSymT\r
+\angbracketleft        angbracketleft  LucidNewMatSymT\r
+\angbracketright       angbracketright LucidNewMatSymT\r
+\bar   bar     LucidNewMatSymT\r
+\bardbl        bardbl  LucidNewMatSymT\r
+\arrowbothv    arrowbothv      LucidNewMatSymT\r
+\arrowdblbothv arrowdblbothv   LucidNewMatSymT\r
+\backslash     backslash       LucidNewMatSymT\r
+\wreathproduct wreathproduct   LucidNewMatSymT\r
+\radical       radical LucidNewMatSymT\r
+\coproduct     coproduct       LucidNewMatSymT\r
+\nabla nabla   LucidNewMatSymT\r
+\integral      integral        LucidNewMatSymT\r
+\unionsq       unionsq LucidNewMatSymT\r
+\intersectionsq        intersectionsq  LucidNewMatSymT\r
+\subsetsqequal subsetsqequal   LucidNewMatSymT\r
+\supersetsqequal       supersetsqequal LucidNewMatSymT\r
+\section       section LucidNewMatSymT\r
+\dagger        dagger  LucidNewMatSymT\r
+\daggerdbl     daggerdbl       LucidNewMatSymT\r
+\paragraph     paragraph       LucidNewMatSymT\r
+\club  club    LucidNewMatSymT\r
+\diamond       diamond LucidNewMatSymT\r
+\heart heart   LucidNewMatSymT\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/standard-charmap.processed.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/standard-charmap.processed.txt
new file mode 100755 (executable)
index 0000000..e26df1c
--- /dev/null
@@ -0,0 +1,218 @@
+\space space   \r
+\exclam        exclam  \r
+\quotedbl      quotedbl        \r
+\numbersign    numbersign      \r
+\dollar        dollar  \r
+\percent       percent \r
+\ampersand     ampersand       \r
+\quotesingle   quotesingle     \r
+\parenleft     parenleft       \r
+\parenright    parenright      \r
+\asterisk      asterisk        \r
+\plus  plus    \r
+\comma comma   \r
+\hyphen        hyphen  \r
+\period        period  \r
+\slash slash   \r
+\zero  zero    \r
+\one   one     \r
+\two   two     \r
+\three three   \r
+\four  four    \r
+\five  five    \r
+\six   six     \r
+\seven seven   \r
+\eight eight   \r
+\nine  nine    \r
+\colon colon   \r
+\semicolon     semicolon       \r
+\less  less    \r
+\equal equal   \r
+\greater       greater \r
+\question      question        \r
+\at    at      \r
+\A     A       \r
+\B     B       \r
+\C     C       \r
+\D     D       \r
+\E     E       \r
+\F     F       \r
+\G     G       \r
+\H     H       \r
+\I     I       \r
+\J     J       \r
+\K     K       \r
+\L     L       \r
+\M     M       \r
+\N     N       \r
+\O     O       \r
+\P     P       \r
+\Q     Q       \r
+\R     R       \r
+\S     S       \r
+\T     T       \r
+\U     U       \r
+\V     V       \r
+\W     W       \r
+\X     X       \r
+\Y     Y       \r
+\Z     Z       \r
+\bracketleft   bracketleft     \r
+\backslash     backslash       \r
+\bracketright  bracketright    \r
+\asciicircum   asciicircum     \r
+\underscore    underscore      \r
+\grave grave   \r
+\a     a       \r
+\b     b       \r
+\c     c       \r
+\d     d       \r
+\e     e       \r
+\f     f       \r
+\g     g       \r
+\h     h       \r
+\i     i       \r
+\j     j       \r
+\k     k       \r
+\l     l       \r
+\m     m       \r
+\n     n       \r
+\o     o       \r
+\p     p       \r
+\q     q       \r
+\r     r       \r
+\s     s       \r
+\t     t       \r
+\u     u       \r
+\v     v       \r
+\w     w       \r
+\x     x       \r
+\y     y       \r
+\z     z       \r
+\braceleft     braceleft       \r
+\bar   bar     \r
+\braceright    braceright      \r
+\asciitilde    asciitilde      \r
+\euro  euro    \r
+\quotesinglbase        quotesinglbase  \r
+\florin        florin  \r
+\quotedblbase  quotedblbase    \r
+\ellipsis      ellipsis        \r
+\dagger        dagger  \r
+\daggerdbl     daggerdbl       \r
+\circumflex    circumflex      \r
+\perthousand   perthousand     \r
+\Scaron        Scaron  \r
+\guilsinglleft guilsinglleft   \r
+\OE    OE      \r
+\Zcaron        Zcaron  \r
+\quoteleft     quoteleft       \r
+\quoteright    quoteright      \r
+\quotedblleft  quotedblleft    \r
+\quotedblright quotedblright   \r
+\bullet        bullet  \r
+\endash        endash  \r
+\emdash        emdash  \r
+\tilde tilde   \r
+\trademark     trademark       \r
+\scaron        scaron  \r
+\guilsinglright        guilsinglright  \r
+\oe    oe      \r
+\zcaron        zcaron  \r
+\Ydieresis     Ydieresis       \r
+\nbspace       nbspace \r
+\exclamdown    exclamdown      \r
+\cent  cent    \r
+\sterling      sterling        \r
+\currency      currency        \r
+\yen   yen     \r
+\brokenbar     brokenbar       \r
+\section       section \r
+\dieresis      dieresis        \r
+\copyright     copyright       \r
+\ordfeminine   ordfeminine     \r
+\guillemotleft guillemotleft   \r
+\logicalnot    logicalnot      \r
+\sfthyphen     sfthyphen       \r
+\registered    registered      \r
+\macron        macron  \r
+\degree        degree  \r
+\plusminus     plusminus       \r
+\twosuperior   twosuperior     \r
+\threesuperior threesuperior   \r
+\acute acute   \r
+\mu    mu      \r
+\paragraph     paragraph       \r
+\periodcentered        periodcentered  \r
+\cedilla       cedilla \r
+\onesuperior   onesuperior     \r
+\ordmasculine  ordmasculine    \r
+\guillemotright        guillemotright  \r
+\onequarter    onequarter      \r
+\onehalf       onehalf \r
+\threequarters threequarters   \r
+\questiondown  questiondown    \r
+\Agrave        Agrave  \r
+\Aacute        Aacute  \r
+\Acircumflex   Acircumflex     \r
+\Atilde        Atilde  \r
+\Adieresis     Adieresis       \r
+\Aring Aring   \r
+\AE    AE      \r
+\Ccedilla      Ccedilla        \r
+\Egrave        Egrave  \r
+\Eacute        Eacute  \r
+\Ecircumflex   Ecircumflex     \r
+\Edieresis     Edieresis       \r
+\Igrave        Igrave  \r
+\Iacute        Iacute  \r
+\Icircumflex   Icircumflex     \r
+\Idieresis     Idieresis       \r
+\Eth   Eth     \r
+\Ntilde        Ntilde  \r
+\Ograve        Ograve  \r
+\Oacute        Oacute  \r
+\Ocircumflex   Ocircumflex     \r
+\Otilde        Otilde  \r
+\Odieresis     Odieresis       \r
+\multiply      multiply        \r
+\Oslash        Oslash  \r
+\Ugrave        Ugrave  \r
+\Uacute        Uacute  \r
+\Ucircumflex   Ucircumflex     \r
+\Udieresis     Udieresis       \r
+\Yacute        Yacute  \r
+\Thorn Thorn   \r
+\germandbls    germandbls      \r
+\agrave        agrave  \r
+\aacute        aacute  \r
+\acircumflex   acircumflex     \r
+\atilde        atilde  \r
+\adieresis     adieresis       \r
+\aring aring   \r
+\ae    ae      \r
+\ccedilla      ccedilla        \r
+\egrave        egrave  \r
+\eacute        eacute  \r
+\ecircumflex   ecircumflex     \r
+\edieresis     edieresis       \r
+\igrave        igrave  \r
+\iacute        iacute  \r
+\icircumflex   icircumflex     \r
+\idieresis     idieresis       \r
+\eth   eth     \r
+\ntilde        ntilde  \r
+\ograve        ograve  \r
+\oacute        oacute  \r
+\ocircumflex   ocircumflex     \r
+\otilde        otilde  \r
+\odieresis     odieresis       \r
+\divide        divide  \r
+\oslash        oslash  \r
+\ugrave        ugrave  \r
+\uacute        uacute  \r
+\ucircumflex   ucircumflex     \r
+\udieresis     udieresis       \r
+\yacute        yacute  \r
+\thorn thorn   \r
+\ydieresis     ydieresis       \r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/symbol-charmap.processed.index.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/symbol-charmap.processed.index.txt
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/symbol-charmap.processed.tag.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/symbol-charmap.processed.tag.txt
new file mode 100755 (executable)
index 0000000..ade4f6f
--- /dev/null
@@ -0,0 +1 @@
+@body:<f"Symbol"><\#32><f$>    space   Symbol<\n> <f"Symbol"><\#33><f$>        exclam  Symbol<\n> <f"Symbol"><\#34><f$>        universal       Symbol<\n> <f"Symbol"><\#35><f$>        numbersign      Symbol<\n> <f"Symbol"><\#36><f$>        existential     Symbol<\n> <f"Symbol"><\#37><f$>        percent Symbol<\n> <f"Symbol"><\#38><f$>        ampersand       Symbol<\n> <f"Symbol"><\#39><f$>        suchthat        Symbol<\n> <f"Symbol"><\#40><f$>        parenleft       Symbol<\n> <f"Symbol"><\#41><f$>        parenright      Symbol<\n> <f"Symbol"><\#42><f$>        asteriskmath    Symbol<\n> <f"Symbol"><\#43><f$>        plus    Symbol<\n> <f"Symbol"><\#44><f$>        comma   Symbol<\n> <f"Symbol"><\#45><f$>        minus   Symbol<\n> <f"Symbol"><\#46><f$>        period  Symbol<\n> <f"Symbol"><\#47><f$>        slash   Symbol<\n> <f"Symbol"><\#48><f$>        zero    Symbol<\n> <f"Symbol"><\#49><f$>        one     Symbol<\n> <f"Symbol"><\#50><f$>        two     Symbol<\n> <f"Symbol"><\#51><f$>        three   Symbol<\n> <f"Symbol"><\#52><f$>        four    Symbol<\n> <f"Symbol"><\#53><f$>        five    Symbol<\n> <f"Symbol"><\#54><f$>        six     Symbol<\n> <f"Symbol"><\#55><f$>        seven   Symbol<\n> <f"Symbol"><\#56><f$>        eight   Symbol<\n> <f"Symbol"><\#57><f$>        nine    Symbol<\n> <f"Symbol"><\#58><f$>        colon   Symbol<\n> <f"Symbol"><\#59><f$>        semicolon       Symbol<\n> <f"Symbol"><\#60><f$>        less    Symbol<\n> <f"Symbol"><\#61><f$>        equal   Symbol<\n> <f"Symbol"><\#62><f$>        greater Symbol<\n> <f"Symbol"><\#63><f$>        question        Symbol<\n> <f"Symbol"><\#64><f$>        congruent       Symbol<\n> <f"Symbol"><\#65><f$>        Alpha   Symbol<\n> <f"Symbol"><\#66><f$>        Beta    Symbol<\n> <f"Symbol"><\#67><f$>        Chi     Symbol<\n> <f"Symbol"><\#68><f$>        Delta   Symbol<\n> <f"Symbol"><\#69><f$>        Epsilon Symbol<\n> <f"Symbol"><\#70><f$>        Phi     Symbol<\n> <f"Symbol"><\#71><f$>        Gamma   Symbol<\n> <f"Symbol"><\#72><f$>        Eta     Symbol<\n> <f"Symbol"><\#73><f$>        Iota    Symbol<\n> <f"Symbol"><\#74><f$>        theta1  Symbol<\n> <f"Symbol"><\#75><f$>        Kappa   Symbol<\n> <f"Symbol"><\#76><f$>        Lambda  Symbol<\n> <f"Symbol"><\#77><f$>        Mu      Symbol<\n> <f"Symbol"><\#78><f$>        Nu      Symbol<\n> <f"Symbol"><\#79><f$>        Omicron Symbol<\n> <f"Symbol"><\#80><f$>        Pi      Symbol<\n> <f"Symbol"><\#81><f$>        Theta   Symbol<\n> <f"Symbol"><\#82><f$>        Rho     Symbol<\n> <f"Symbol"><\#83><f$>        Sigma   Symbol<\n> <f"Symbol"><\#84><f$>        Tau     Symbol<\n> <f"Symbol"><\#85><f$>        Upsilon Symbol<\n> <f"Symbol"><\#86><f$>        sigma1  Symbol<\n> <f"Symbol"><\#87><f$>        Omega   Symbol<\n> <f"Symbol"><\#88><f$>        Xi      Symbol<\n> <f"Symbol"><\#89><f$>        Psi     Symbol<\n> <f"Symbol"><\#90><f$>        Zeta    Symbol<\n> <f"Symbol"><\#91><f$>        bracketleft     Symbol<\n> <f"Symbol"><\#92><f$>        therefore       Symbol<\n> <f"Symbol"><\#93><f$>        bracketright    Symbol<\n> <f"Symbol"><\#94><f$>        perpendicular   Symbol<\n> <f"Symbol"><\#95><f$>        underscore      Symbol<\n> <f"Symbol"><\#96><f$>        radicalex       Symbol<\n> <f"Symbol"><\#97><f$>        alpha   Symbol<\n> <f"Symbol"><\#98><f$>        beta    Symbol<\n> <f"Symbol"><\#99><f$>        chi     Symbol<\n> <f"Symbol"><\#100><f$>       delta   Symbol<\n> <f"Symbol"><\#101><f$>       epsilon Symbol<\n> <f"Symbol"><\#102><f$>       phi     Symbol<\n> <f"Symbol"><\#103><f$>       gamma   Symbol<\n> <f"Symbol"><\#104><f$>       eta     Symbol<\n> <f"Symbol"><\#105><f$>       iota    Symbol<\n> <f"Symbol"><\#106><f$>       phi1    Symbol<\n> <f"Symbol"><\#107><f$>       kappa   Symbol<\n> <f"Symbol"><\#108><f$>       lambda  Symbol<\n> <f"Symbol"><\#109><f$>       mu      Symbol<\n> <f"Symbol"><\#110><f$>       nu      Symbol<\n> <f"Symbol"><\#111><f$>       omicron Symbol<\n> <f"Symbol"><\#112><f$>       pi      Symbol<\n> <f"Symbol"><\#113><f$>       theta   Symbol<\n> <f"Symbol"><\#114><f$>       rho     Symbol<\n> <f"Symbol"><\#115><f$>       sigma   Symbol<\n> <f"Symbol"><\#116><f$>       tau     Symbol<\n> <f"Symbol"><\#117><f$>       upsilon Symbol<\n> <f"Symbol"><\#118><f$>       omega1  Symbol<\n> <f"Symbol"><\#119><f$>       omega   Symbol<\n> <f"Symbol"><\#120><f$>       xi      Symbol<\n> <f"Symbol"><\#121><f$>       psi     Symbol<\n> <f"Symbol"><\#122><f$>       zeta    Symbol<\n> <f"Symbol"><\#123><f$>       braceleft       Symbol<\n> <f"Symbol"><\#124><f$>       bar     Symbol<\n> <f"Symbol"><\#125><f$>       braceright      Symbol<\n> <f"Symbol"><\#126><f$>       similar Symbol<\n> <f"Symbol"><\#160><f$>       Euro    Symbol<\n> <f"Symbol"><\#161><f$>       Upsilon1        Symbol<\n> <f"Symbol"><\#162><f$>       minute  Symbol<\n> <f"Symbol"><\#163><f$>       lessequal       Symbol<\n> <f"Symbol"><\#164><f$>       fraction        Symbol<\n> <f"Symbol"><\#165><f$>       infinity        Symbol<\n> <f"Symbol"><\#166><f$>       florin  Symbol<\n> <f"Symbol"><\#167><f$>       club    Symbol<\n> <f"Symbol"><\#168><f$>       diamond Symbol<\n> <f"Symbol"><\#169><f$>       heart   Symbol<\n> <f"Symbol"><\#170><f$>       spade   Symbol<\n> <f"Symbol"><\#171><f$>       arrowboth       Symbol<\n> <f"Symbol"><\#172><f$>       arrowleft       Symbol<\n> <f"Symbol"><\#173><f$>       arrowup Symbol<\n> <f"Symbol"><\#174><f$>       arrowright      Symbol<\n> <f"Symbol"><\#175><f$>       arrowdown       Symbol<\n> <f"Symbol"><\#176><f$>       degree  Symbol<\n> <f"Symbol"><\#177><f$>       plusminus       Symbol<\n> <f"Symbol"><\#178><f$>       second  Symbol<\n> <f"Symbol"><\#179><f$>       greaterequal    Symbol<\n> <f"Symbol"><\#180><f$>       multiply        Symbol<\n> <f"Symbol"><\#181><f$>       proportional    Symbol<\n> <f"Symbol"><\#182><f$>       partialdiff     Symbol<\n> <f"Symbol"><\#183><f$>       bullet  Symbol<\n> <f"Symbol"><\#184><f$>       divide  Symbol<\n> <f"Symbol"><\#185><f$>       notequal        Symbol<\n> <f"Symbol"><\#186><f$>       equivalence     Symbol<\n> <f"Symbol"><\#187><f$>       approxequal     Symbol<\n> <f"Symbol"><\#189><f$>       arrowvertex     Symbol<\n> <f"Symbol"><\#190><f$>       arrowhorizex    Symbol<\n> <f"Symbol"><\#191><f$>       carriagereturn  Symbol<\n> <f"Symbol"><\#192><f$>       aleph   Symbol<\n> <f"Symbol"><\#193><f$>       Ifraktur        Symbol<\n> <f"Symbol"><\#194><f$>       Rfraktur        Symbol<\n> <f"Symbol"><\#195><f$>       weierstrass     Symbol<\n> <f"Symbol"><\#196><f$>       circlemultiply  Symbol<\n> <f"Symbol"><\#197><f$>       circleplus      Symbol<\n> <f"Symbol"><\#198><f$>       emptyset        Symbol<\n> <f"Symbol"><\#199><f$>       intersection    Symbol<\n> <f"Symbol"><\#200><f$>       union   Symbol<\n> <f"Symbol"><\#201><f$>       propersuperset  Symbol<\n> <f"Symbol"><\#202><f$>       reflexsuperset  Symbol<\n> <f"Symbol"><\#203><f$>       notsubset       Symbol<\n> <f"Symbol"><\#204><f$>       propersubset    Symbol<\n> <f"Symbol"><\#205><f$>       reflexsubset    Symbol<\n> <f"Symbol"><\#206><f$>       element Symbol<\n> <f"Symbol"><\#207><f$>       notelement      Symbol<\n> <f"Symbol"><\#208><f$>       angle   Symbol<\n> <f"Symbol"><\#209><f$>       gradient        Symbol<\n> <f"Symbol"><\#210><f$>       registerserif   Symbol<\n> <f"Symbol"><\#211><f$>       copyrightserif  Symbol<\n> <f"Symbol"><\#212><f$>       trademarkserif  Symbol<\n> <f"Symbol"><\#213><f$>       product Symbol<\n> <f"Symbol"><\#214><f$>       radical Symbol<\n> <f"Symbol"><\#215><f$>       dotmath Symbol<\n> <f"Symbol"><\#216><f$>       logicalnot      Symbol<\n> <f"Symbol"><\#217><f$>       logicaland      Symbol<\n> <f"Symbol"><\#218><f$>       logicalor       Symbol<\n> <f"Symbol"><\#219><f$>       arrowdblboth    Symbol<\n> <f"Symbol"><\#220><f$>       arrowdblleft    Symbol<\n> <f"Symbol"><\#221><f$>       arrowdblup      Symbol<\n> <f"Symbol"><\#222><f$>       arrowdblright   Symbol<\n> <f"Symbol"><\#223><f$>       arrowdbldown    Symbol<\n> <f"Symbol"><\#224><f$>       lozenge Symbol<\n> <f"Symbol"><\#225><f$>       angleleft       Symbol<\n> <f"Symbol"><\#226><f$>       registersans    Symbol<\n> <f"Symbol"><\#227><f$>       copyrightsans   Symbol<\n> <f"Symbol"><\#228><f$>       trademarksans   Symbol<\n> <f"Symbol"><\#229><f$>       summation       Symbol<\n> <f"Symbol"><\#230><f$>       parenlefttp     Symbol<\n> <f"Symbol"><\#231><f$>       parenleftex     Symbol<\n> <f"Symbol"><\#232><f$>       parenleftbt     Symbol<\n> <f"Symbol"><\#233><f$>       bracketlefttp   Symbol<\n> <f"Symbol"><\#234><f$>       bracketleftex   Symbol<\n> <f"Symbol"><\#235><f$>       bracketleftbt   Symbol<\n> <f"Symbol"><\#236><f$>       bracelefttp     Symbol<\n> <f"Symbol"><\#237><f$>       braceleftmid    Symbol<\n> <f"Symbol"><\#238><f$>       braceleftbt     Symbol<\n> <f"Symbol"><\#239><f$>       braceex Symbol<\n> <f"Symbol"><\#241><f$>       angleright      Symbol<\n> <f"Symbol"><\#242><f$>       integral        Symbol<\n> <f"Symbol"><\#243><f$>       integraltp      Symbol<\n> <f"Symbol"><\#244><f$>       integralex      Symbol<\n> <f"Symbol"><\#245><f$>       integralbt      Symbol<\n> <f"Symbol"><\#246><f$>       parenrighttp    Symbol<\n> <f"Symbol"><\#247><f$>       parenrightex    Symbol<\n> <f"Symbol"><\#248><f$>       parenrightbt    Symbol<\n> <f"Symbol"><\#249><f$>       bracketrighttp  Symbol<\n> <f"Symbol"><\#250><f$>       bracketrightex  Symbol<\n> <f"Symbol"><\#251><f$>       bracketrightbt  Symbol<\n> <f"Symbol"><\#252><f$>       bracerighttp    Symbol<\n> <f"Symbol"><\#253><f$>       bracerightmid   Symbol<\n> <f"Symbol"><\#254><f$>       bracerightbt    Symbol<\n> 
\ No newline at end of file
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/symbol-charmap.processed.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/junk/symbol-charmap.processed.txt
new file mode 100755 (executable)
index 0000000..c951d68
--- /dev/null
@@ -0,0 +1,532 @@
+\preamble\r
+\loadchars{k:\Research\Tagger\maps\standard-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathsym-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathit-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\lucmathext-charmap.txt}\r
+\loadchars{k:\Research\Tagger\maps\symbol-charmap.txt}\r
+\loadstyles{k:\Research\Tagger\examples\styles.txt}\r
+\r
+\section Symbol Charmap\r
+\r
+\space space   Symbol\\\r
+\exclam        exclam  Symbol\\\r
+\universal     universal       Symbol\\\r
+\numbersign    numbersign      Symbol\\\r
+\existential   existential     Symbol\\\r
+\percent       percent Symbol\\\r
+\ampersand     ampersand       Symbol\\\r
+\suchthat      suchthat        Symbol\\\r
+\parenleft     parenleft       Symbol\\\r
+\parenright    parenright      Symbol\\\r
+\asteriskmath  asteriskmath    Symbol\\\r
+\plus  plus    Symbol\\\r
+\comma comma   Symbol\\\r
+\minus minus   Symbol\\\r
+\period        period  Symbol\\\r
+\slash slash   Symbol\\\r
+\zero  zero    Symbol\\\r
+\one   one     Symbol\\\r
+\two   two     Symbol\\\r
+\three three   Symbol\\\r
+\four  four    Symbol\\\r
+\five  five    Symbol\\\r
+\six   six     Symbol\\\r
+\seven seven   Symbol\\\r
+\eight eight   Symbol\\\r
+\nine  nine    Symbol\\\r
+\colon colon   Symbol\\\r
+\semicolon     semicolon       Symbol\\\r
+\less  less    Symbol\\\r
+\equal equal   Symbol\\\r
+\greater       greater Symbol\\\r
+\question      question        Symbol\\\r
+\congruent     congruent       Symbol\\\r
+\Alpha Alpha   Symbol\\\r
+\Beta  Beta    Symbol\\\r
+\Chi   Chi     Symbol\\\r
+\Delta Delta   Symbol\\\r
+\Epsilon       Epsilon Symbol\\\r
+\Phi   Phi     Symbol\\\r
+\Gamma Gamma   Symbol\\\r
+\Eta   Eta     Symbol\\\r
+\Iota  Iota    Symbol\\\r
+\theta1        theta1  Symbol\\\r
+\Kappa Kappa   Symbol\\\r
+\Lambda        Lambda  Symbol\\\r
+\Mu    Mu      Symbol\\\r
+\Nu    Nu      Symbol\\\r
+\Omicron       Omicron Symbol\\\r
+\Pi    Pi      Symbol\\\r
+\Theta Theta   Symbol\\\r
+\Rho   Rho     Symbol\\\r
+\Sigma Sigma   Symbol\\\r
+\Tau   Tau     Symbol\\\r
+\Upsilon       Upsilon Symbol\\\r
+\sigma1        sigma1  Symbol\\\r
+\Omega Omega   Symbol\\\r
+\Xi    Xi      Symbol\\\r
+\Psi   Psi     Symbol\\\r
+\Zeta  Zeta    Symbol\\\r
+\bracketleft   bracketleft     Symbol\\\r
+\therefore     therefore       Symbol\\\r
+\bracketright  bracketright    Symbol\\\r
+\perpendicular perpendicular   Symbol\\\r
+\underscore    underscore      Symbol\\\r
+\radicalex     radicalex       Symbol\\\r
+\alpha alpha   Symbol\\\r
+\beta  beta    Symbol\\\r
+\chi   chi     Symbol\\\r
+\delta delta   Symbol\\\r
+\epsilon       epsilon Symbol\\\r
+\phi   phi     Symbol\\\r
+\gamma gamma   Symbol\\\r
+\eta   eta     Symbol\\\r
+\iota  iota    Symbol\\\r
+\phi1  phi1    Symbol\\\r
+\kappa kappa   Symbol\\\r
+\lambda        lambda  Symbol\\\r
+\mu    mu      Symbol\\\r
+\nu    nu      Symbol\\\r
+\omicron       omicron Symbol\\\r
+\pi    pi      Symbol\\\r
+\theta theta   Symbol\\\r
+\rho   rho     Symbol\\\r
+\sigma sigma   Symbol\\\r
+\tau   tau     Symbol\\\r
+\upsilon       upsilon Symbol\\\r
+\omega1        omega1  Symbol\\\r
+\omega omega   Symbol\\\r
+\xi    xi      Symbol\\\r
+\psi   psi     Symbol\\\r
+\zeta  zeta    Symbol\\\r
+\braceleft     braceleft       Symbol\\\r
+\bar   bar     Symbol\\\r
+\braceright    braceright      Symbol\\\r
+\similar       similar Symbol\\\r
+\Euro  Euro    Symbol\\\r
+\Upsilon1      Upsilon1        Symbol\\\r
+\minute        minute  Symbol\\\r
+\lessequal     lessequal       Symbol\\\r
+\fraction      fraction        Symbol\\\r
+\infinity      infinity        Symbol\\\r
+\florin        florin  Symbol\\\r
+\club  club    Symbol\\\r
+\diamond       diamond Symbol\\\r
+\heart heart   Symbol\\\r
+\spade spade   Symbol\\\r
+\arrowboth     arrowboth       Symbol\\\r
+\arrowleft     arrowleft       Symbol\\\r
+\arrowup       arrowup Symbol\\\r
+\arrowright    arrowright      Symbol\\\r
+\arrowdown     arrowdown       Symbol\\\r
+\degree        degree  Symbol\\\r
+\plusminus     plusminus       Symbol\\\r
+\second        second  Symbol\\\r
+\greaterequal  greaterequal    Symbol\\\r
+\multiply      multiply        Symbol\\\r
+\proportional  proportional    Symbol\\\r
+\partialdiff   partialdiff     Symbol\\\r
+\bullet        bullet  Symbol\\\r
+\divide        divide  Symbol\\\r
+\notequal      notequal        Symbol\\\r
+\equivalence   equivalence     Symbol\\\r
+\approxequal   approxequal     Symbol\\\r
+\arrowvertex   arrowvertex     Symbol\\\r
+\arrowhorizex  arrowhorizex    Symbol\\\r
+\carriagereturn        carriagereturn  Symbol\\\r
+\aleph aleph   Symbol\\\r
+\Ifraktur      Ifraktur        Symbol\\\r
+\Rfraktur      Rfraktur        Symbol\\\r
+\weierstrass   weierstrass     Symbol\\\r
+\circlemultiply        circlemultiply  Symbol\\\r
+\circleplus    circleplus      Symbol\\\r
+\emptyset      emptyset        Symbol\\\r
+\intersection  intersection    Symbol\\\r
+\union union   Symbol\\\r
+\propersuperset        propersuperset  Symbol\\\r
+\reflexsuperset        reflexsuperset  Symbol\\\r
+\notsubset     notsubset       Symbol\\\r
+\propersubset  propersubset    Symbol\\\r
+\reflexsubset  reflexsubset    Symbol\\\r
+\element       element Symbol\\\r
+\notelement    notelement      Symbol\\\r
+\angle angle   Symbol\\\r
+\gradient      gradient        Symbol\\\r
+\registerserif registerserif   Symbol\\\r
+\copyrightserif        copyrightserif  Symbol\\\r
+\trademarkserif        trademarkserif  Symbol\\\r
+\product       product Symbol\\\r
+\radical       radical Symbol\\\r
+\dotmath       dotmath Symbol\\\r
+\logicalnot    logicalnot      Symbol\\\r
+\logicaland    logicaland      Symbol\\\r
+\logicalor     logicalor       Symbol\\\r
+\arrowdblboth  arrowdblboth    Symbol\\\r
+\arrowdblleft  arrowdblleft    Symbol\\\r
+\arrowdblup    arrowdblup      Symbol\\\r
+\arrowdblright arrowdblright   Symbol\\\r
+\arrowdbldown  arrowdbldown    Symbol\\\r
+\lozenge       lozenge Symbol\\\r
+\angleleft     angleleft       Symbol\\\r
+\registersans  registersans    Symbol\\\r
+\copyrightsans copyrightsans   Symbol\\\r
+\trademarksans trademarksans   Symbol\\\r
+\summation     summation       Symbol\\\r
+\parenlefttp   parenlefttp     Symbol\\\r
+\parenleftex   parenleftex     Symbol\\\r
+\parenleftbt   parenleftbt     Symbol\\\r
+\bracketlefttp bracketlefttp   Symbol\\\r
+\bracketleftex bracketleftex   Symbol\\\r
+\bracketleftbt bracketleftbt   Symbol\\\r
+\bracelefttp   bracelefttp     Symbol\\\r
+\braceleftmid  braceleftmid    Symbol\\\r
+\braceleftbt   braceleftbt     Symbol\\\r
+\braceex       braceex Symbol\\\r
+\angleright    angleright      Symbol\\\r
+\integral      integral        Symbol\\\r
+\integraltp    integraltp      Symbol\\\r
+\integralex    integralex      Symbol\\\r
+\integralbt    integralbt      Symbol\\\r
+\parenrighttp  parenrighttp    Symbol\\\r
+\parenrightex  parenrightex    Symbol\\\r
+\parenrightbt  parenrightbt    Symbol\\\r
+\bracketrighttp        bracketrighttp  Symbol\\\r
+\bracketrightex        bracketrightex  Symbol\\\r
+\bracketrightbt        bracketrightbt  Symbol\\\r
+\bracerighttp  bracerighttp    Symbol\\\r
+\bracerightmid bracerightmid   Symbol\\\r
+\bracerightbt  bracerightbt    Symbol\\\r
+\r
+\r
+\section Lucida Math Italic Charmap\r
+\r
+\Gamma Gamma   LucidNewMatItaT\\\r
+\Delta Delta   LucidNewMatItaT\\\r
+\Theta Theta   LucidNewMatItaT\\\r
+\Lambda        Lambda  LucidNewMatItaT\\\r
+\Xi    Xi      LucidNewMatItaT\\\r
+\Pi    Pi      LucidNewMatItaT\\\r
+\Sigma Sigma   LucidNewMatItaT\\\r
+\Upsilon       Upsilon LucidNewMatItaT\\\r
+\Phi   Phi     LucidNewMatItaT\\\r
+\Psi   Psi     LucidNewMatItaT\\\r
+\Omega Omega   LucidNewMatItaT\\\r
+\alpha alpha   LucidNewMatItaT\\\r
+\beta  beta    LucidNewMatItaT\\\r
+\gamma gamma   LucidNewMatItaT\\\r
+\delta delta   LucidNewMatItaT\\\r
+\epsilon1      epsilon1        LucidNewMatItaT\\\r
+\zeta  zeta    LucidNewMatItaT\\\r
+\eta   eta     LucidNewMatItaT\\\r
+\theta theta   LucidNewMatItaT\\\r
+\iota  iota    LucidNewMatItaT\\\r
+\kappa kappa   LucidNewMatItaT\\\r
+\lambda        lambda  LucidNewMatItaT\\\r
+\mu    mu      LucidNewMatItaT\\\r
+\nu    nu      LucidNewMatItaT\\\r
+\xi    xi      LucidNewMatItaT\\\r
+\pi    pi      LucidNewMatItaT\\\r
+\rho   rho     LucidNewMatItaT\\\r
+\sigma sigma   LucidNewMatItaT\\\r
+\tau   tau     LucidNewMatItaT\\\r
+\upsilon       upsilon LucidNewMatItaT\\\r
+\phi   phi     LucidNewMatItaT\\\r
+\chi   chi     LucidNewMatItaT\\\r
+\psi   psi     LucidNewMatItaT\\\r
+\tie   tie     LucidNewMatItaT\\\r
+\omega omega   LucidNewMatItaT\\\r
+\epsilon       epsilon LucidNewMatItaT\\\r
+\theta1        theta1  LucidNewMatItaT\\\r
+\pi1   pi1     LucidNewMatItaT\\\r
+\rho1  rho1    LucidNewMatItaT\\\r
+\sigma1        sigma1  LucidNewMatItaT\\\r
+\phi1  phi1    LucidNewMatItaT\\\r
+\arrowlefttophalf      arrowlefttophalf        LucidNewMatItaT\\\r
+\arrowleftbothalf      arrowleftbothalf        LucidNewMatItaT\\\r
+\arrowrighttophalf     arrowrighttophalf       LucidNewMatItaT\\\r
+\arrowrightbothalf     arrowrightbothalf       LucidNewMatItaT\\\r
+\arrowhookleft arrowhookleft   LucidNewMatItaT\\\r
+\arrowhookright        arrowhookright  LucidNewMatItaT\\\r
+\triangleright triangleright   LucidNewMatItaT\\\r
+\triangleleft  triangleleft    LucidNewMatItaT\\\r
+\period        period  LucidNewMatItaT\\\r
+\comma comma   LucidNewMatItaT\\\r
+\less  less    LucidNewMatItaT\\\r
+\slash slash   LucidNewMatItaT\\\r
+\greater       greater LucidNewMatItaT\\\r
+\star  star    LucidNewMatItaT\\\r
+\partialdiff   partialdiff     LucidNewMatItaT\\\r
+\flat  flat    LucidNewMatItaT\\\r
+\natural       natural LucidNewMatItaT\\\r
+\sharp sharp   LucidNewMatItaT\\\r
+\slurbelow     slurbelow       LucidNewMatItaT\\\r
+\slurabove     slurabove       LucidNewMatItaT\\\r
+\lscript       lscript LucidNewMatItaT\\\r
+\dotlessi      dotlessi        LucidNewMatItaT\\\r
+\dotlessj      dotlessj        LucidNewMatItaT\\\r
+\weierstrass   weierstrass     LucidNewMatItaT\\\r
+\vector        vector  LucidNewMatItaT\\\r
+\r
+\section Lucida Math Symbol Charmap\r
+\r
+\minus minus   LucidNewMatSymT\\\r
+\periodcentered        periodcentered  LucidNewMatSymT\\\r
+\multiply      multiply        LucidNewMatSymT\\\r
+\asteriskmath  asteriskmath    LucidNewMatSymT\\\r
+\divide        divide  LucidNewMatSymT\\\r
+\diamondmath   diamondmath     LucidNewMatSymT\\\r
+\plusminus     plusminus       LucidNewMatSymT\\\r
+\minusplus     minusplus       LucidNewMatSymT\\\r
+\circleplus    circleplus      LucidNewMatSymT\\\r
+\circleminus   circleminus     LucidNewMatSymT\\\r
+\circlemultiply        circlemultiply  LucidNewMatSymT\\\r
+\circledivide  circledivide    LucidNewMatSymT\\\r
+\circledot     circledot       LucidNewMatSymT\\\r
+\circlecopyrt  circlecopyrt    LucidNewMatSymT\\\r
+\openbullet    openbullet      LucidNewMatSymT\\\r
+\bullet        bullet  LucidNewMatSymT\\\r
+\equivasymptotic       equivasymptotic LucidNewMatSymT\\\r
+\equivalence   equivalence     LucidNewMatSymT\\\r
+\reflexsubset  reflexsubset    LucidNewMatSymT\\\r
+\reflexsuperset        reflexsuperset  LucidNewMatSymT\\\r
+\lessequal     lessequal       LucidNewMatSymT\\\r
+\greaterequal  greaterequal    LucidNewMatSymT\\\r
+\precedesequal precedesequal   LucidNewMatSymT\\\r
+\followsequal  followsequal    LucidNewMatSymT\\\r
+\similar       similar LucidNewMatSymT\\\r
+\approxequal   approxequal     LucidNewMatSymT\\\r
+\propersubset  propersubset    LucidNewMatSymT\\\r
+\propersuperset        propersuperset  LucidNewMatSymT\\\r
+\lessmuch      lessmuch        LucidNewMatSymT\\\r
+\greatermuch   greatermuch     LucidNewMatSymT\\\r
+\precedes      precedes        LucidNewMatSymT\\\r
+\follows       follows LucidNewMatSymT\\\r
+\arrowleft     arrowleft       LucidNewMatSymT\\\r
+\spade spade   LucidNewMatSymT\\\r
+\arrowright    arrowright      LucidNewMatSymT\\\r
+\arrowup       arrowup LucidNewMatSymT\\\r
+\arrowdown     arrowdown       LucidNewMatSymT\\\r
+\arrowboth     arrowboth       LucidNewMatSymT\\\r
+\arrownortheast        arrownortheast  LucidNewMatSymT\\\r
+\arrowsoutheast        arrowsoutheast  LucidNewMatSymT\\\r
+\similarequal  similarequal    LucidNewMatSymT\\\r
+\arrowdblleft  arrowdblleft    LucidNewMatSymT\\\r
+\arrowdblright arrowdblright   LucidNewMatSymT\\\r
+\arrowdblup    arrowdblup      LucidNewMatSymT\\\r
+\arrowdbldown  arrowdbldown    LucidNewMatSymT\\\r
+\arrowdblboth  arrowdblboth    LucidNewMatSymT\\\r
+\arrownorthwest        arrownorthwest  LucidNewMatSymT\\\r
+\arrowsouthwest        arrowsouthwest  LucidNewMatSymT\\\r
+\proportional  proportional    LucidNewMatSymT\\\r
+\prime prime   LucidNewMatSymT\\\r
+\infinity      infinity        LucidNewMatSymT\\\r
+\element       element LucidNewMatSymT\\\r
+\owner owner   LucidNewMatSymT\\\r
+\triangle      triangle        LucidNewMatSymT\\\r
+\triangleinv   triangleinv     LucidNewMatSymT\\\r
+\negationslash negationslash   LucidNewMatSymT\\\r
+\mapsto        mapsto  LucidNewMatSymT\\\r
+\universal     universal       LucidNewMatSymT\\\r
+\existential   existential     LucidNewMatSymT\\\r
+\logicalnot    logicalnot      LucidNewMatSymT\\\r
+\emptyset      emptyset        LucidNewMatSymT\\\r
+\Rfractur      Rfractur        LucidNewMatSymT\\\r
+\Ifractur      Ifractur        LucidNewMatSymT\\\r
+\latticetop    latticetop      LucidNewMatSymT\\\r
+\perpendicular perpendicular   LucidNewMatSymT\\\r
+\aleph aleph   LucidNewMatSymT\\\r
+\scriptA       scriptA LucidNewMatSymT\\\r
+\scriptB       scriptB LucidNewMatSymT\\\r
+\scriptC       scriptC LucidNewMatSymT\\\r
+\scriptD       scriptD LucidNewMatSymT\\\r
+\scriptE       scriptE LucidNewMatSymT\\\r
+\scriptF       scriptF LucidNewMatSymT\\\r
+\scriptG       scriptG LucidNewMatSymT\\\r
+\scriptH       scriptH LucidNewMatSymT\\\r
+\scriptI       scriptI LucidNewMatSymT\\\r
+\scriptJ       scriptJ LucidNewMatSymT\\\r
+\scriptK       scriptK LucidNewMatSymT\\\r
+\scriptL       scriptL LucidNewMatSymT\\\r
+\scriptM       scriptM LucidNewMatSymT\\\r
+\scriptN       scriptN LucidNewMatSymT\\\r
+\scriptO       scriptO LucidNewMatSymT\\\r
+\scriptP       scriptP LucidNewMatSymT\\\r
+\scriptQ       scriptQ LucidNewMatSymT\\\r
+\scriptR       scriptR LucidNewMatSymT\\\r
+\scriptS       scriptS LucidNewMatSymT\\\r
+\scriptT       scriptT LucidNewMatSymT\\\r
+\scriptU       scriptU LucidNewMatSymT\\\r
+\scriptV       scriptV LucidNewMatSymT\\\r
+\scriptW       scriptW LucidNewMatSymT\\\r
+\scriptX       scriptX LucidNewMatSymT\\\r
+\scriptY       scriptY LucidNewMatSymT\\\r
+\scriptZ       scriptZ LucidNewMatSymT\\\r
+\union union   LucidNewMatSymT\\\r
+\intersection  intersection    LucidNewMatSymT\\\r
+\unionmulti    unionmulti      LucidNewMatSymT\\\r
+\logicaland    logicaland      LucidNewMatSymT\\\r
+\logicalor     logicalor       LucidNewMatSymT\\\r
+\turnstileleft turnstileleft   LucidNewMatSymT\\\r
+\turnstileright        turnstileright  LucidNewMatSymT\\\r
+\floorleft     floorleft       LucidNewMatSymT\\\r
+\floorright    floorright      LucidNewMatSymT\\\r
+\ceilingleft   ceilingleft     LucidNewMatSymT\\\r
+\ceilingright  ceilingright    LucidNewMatSymT\\\r
+\braceleft     braceleft       LucidNewMatSymT\\\r
+\braceright    braceright      LucidNewMatSymT\\\r
+\angbracketleft        angbracketleft  LucidNewMatSymT\\\r
+\angbracketright       angbracketright LucidNewMatSymT\\\r
+\bar   bar     LucidNewMatSymT\\\r
+\bardbl        bardbl  LucidNewMatSymT\\\r
+\arrowbothv    arrowbothv      LucidNewMatSymT\\\r
+\arrowdblbothv arrowdblbothv   LucidNewMatSymT\\\r
+\backslash     backslash       LucidNewMatSymT\\\r
+\wreathproduct wreathproduct   LucidNewMatSymT\\\r
+\radical       radical LucidNewMatSymT\\\r
+\coproduct     coproduct       LucidNewMatSymT\\\r
+\nabla nabla   LucidNewMatSymT\\\r
+\integral      integral        LucidNewMatSymT\\\r
+\unionsq       unionsq LucidNewMatSymT\\\r
+\intersectionsq        intersectionsq  LucidNewMatSymT\\\r
+\subsetsqequal subsetsqequal   LucidNewMatSymT\\\r
+\supersetsqequal       supersetsqequal LucidNewMatSymT\\\r
+\section       section LucidNewMatSymT\\\r
+\dagger        dagger  LucidNewMatSymT\\\r
+\daggerdbl     daggerdbl       LucidNewMatSymT\\\r
+\paragraph     paragraph       LucidNewMatSymT\\\r
+\club  club    LucidNewMatSymT\\\r
+\diamond       diamond LucidNewMatSymT\\\r
+\heart heart   LucidNewMatSymT\\\r
+\r
+\section Lucida Math Extended Charmap\r
+\r
+\parenleftbig  parenleftbig    LucidNewMatExtT\\\r
+\parenrightbig parenrightbig   LucidNewMatExtT\\\r
+\bracketleftbig        bracketleftbig  LucidNewMatExtT\\\r
+\bracketrightbig       bracketrightbig LucidNewMatExtT\\\r
+\floorleftbig  floorleftbig    LucidNewMatExtT\\\r
+\floorrightbig floorrightbig   LucidNewMatExtT\\\r
+\ceilingleftbig        ceilingleftbig  LucidNewMatExtT\\\r
+\ceilingrightbig       ceilingrightbig LucidNewMatExtT\\\r
+\braceleftbig  braceleftbig    LucidNewMatExtT\\\r
+\bracerightbig bracerightbig   LucidNewMatExtT\\\r
+\angbracketleftbig     angbracketleftbig       LucidNewMatExtT\\\r
+\angbracketrightbig    angbracketrightbig      LucidNewMatExtT\\\r
+\vextendsingle vextendsingle   LucidNewMatExtT\\\r
+\vextenddouble vextenddouble   LucidNewMatExtT\\\r
+\slashbig      slashbig        LucidNewMatExtT\\\r
+\backslashbig  backslashbig    LucidNewMatExtT\\\r
+\parenleftBig  parenleftBig    LucidNewMatExtT\\\r
+\parenrightBig parenrightBig   LucidNewMatExtT\\\r
+\parenleftbigg parenleftbigg   LucidNewMatExtT\\\r
+\parenrightbigg        parenrightbigg  LucidNewMatExtT\\\r
+\bracketleftbigg       bracketleftbigg LucidNewMatExtT\\\r
+\bracketrightbigg      bracketrightbigg        LucidNewMatExtT\\\r
+\floorleftbigg floorleftbigg   LucidNewMatExtT\\\r
+\floorrightbigg        floorrightbigg  LucidNewMatExtT\\\r
+\ceilingleftbigg       ceilingleftbigg LucidNewMatExtT\\\r
+\ceilingrightbigg      ceilingrightbigg        LucidNewMatExtT\\\r
+\braceleftbigg braceleftbigg   LucidNewMatExtT\\\r
+\bracerightbigg        bracerightbigg  LucidNewMatExtT\\\r
+\angbracketleftbigg    angbracketleftbigg      LucidNewMatExtT\\\r
+\angbracketrightbigg   angbracketrightbigg     LucidNewMatExtT\\\r
+\slashbigg     slashbigg       LucidNewMatExtT\\\r
+\backslashbigg backslashbigg   LucidNewMatExtT\\\r
+\parenleftBigg parenleftBigg   LucidNewMatExtT\\\r
+\parenrightBigg        parenrightBigg  LucidNewMatExtT\\\r
+\bracketleftBigg       bracketleftBigg LucidNewMatExtT\\\r
+\bracketrightBigg      bracketrightBigg        LucidNewMatExtT\\\r
+\floorleftBigg floorleftBigg   LucidNewMatExtT\\\r
+\floorrightBigg        floorrightBigg  LucidNewMatExtT\\\r
+\ceilingleftBigg       ceilingleftBigg LucidNewMatExtT\\\r
+\ceilingrightBigg      ceilingrightBigg        LucidNewMatExtT\\\r
+\braceleftBigg braceleftBigg   LucidNewMatExtT\\\r
+\bracerightBigg        bracerightBigg  LucidNewMatExtT\\\r
+\angbracketleftBigg    angbracketleftBigg      LucidNewMatExtT\\\r
+\angbracketrightBigg   angbracketrightBigg     LucidNewMatExtT\\\r
+\slashBigg     slashBigg       LucidNewMatExtT\\\r
+\backslashBigg backslashBigg   LucidNewMatExtT\\\r
+\slashBig      slashBig        LucidNewMatExtT\\\r
+\backslashBig  backslashBig    LucidNewMatExtT\\\r
+\parenlefttp   parenlefttp     LucidNewMatExtT\\\r
+\parenrighttp  parenrighttp    LucidNewMatExtT\\\r
+\bracketlefttp bracketlefttp   LucidNewMatExtT\\\r
+\bracketrighttp        bracketrighttp  LucidNewMatExtT\\\r
+\bracketleftbt bracketleftbt   LucidNewMatExtT\\\r
+\bracketrightbt        bracketrightbt  LucidNewMatExtT\\\r
+\bracketleftex bracketleftex   LucidNewMatExtT\\\r
+\bracketrightex        bracketrightex  LucidNewMatExtT\\\r
+\bracelefttp   bracelefttp     LucidNewMatExtT\\\r
+\bracerighttp  bracerighttp    LucidNewMatExtT\\\r
+\braceleftbt   braceleftbt     LucidNewMatExtT\\\r
+\bracerightbt  bracerightbt    LucidNewMatExtT\\\r
+\braceleftmid  braceleftmid    LucidNewMatExtT\\\r
+\bracerightmid bracerightmid   LucidNewMatExtT\\\r
+\braceex       braceex LucidNewMatExtT\\\r
+\arrowvertex   arrowvertex     LucidNewMatExtT\\\r
+\parenleftbt   parenleftbt     LucidNewMatExtT\\\r
+\parenrightbt  parenrightbt    LucidNewMatExtT\\\r
+\parenleftex   parenleftex     LucidNewMatExtT\\\r
+\parenrightex  parenrightex    LucidNewMatExtT\\\r
+\angbracketleftBig     angbracketleftBig       LucidNewMatExtT\\\r
+\angbracketrightBig    angbracketrightBig      LucidNewMatExtT\\\r
+\unionsqtext   unionsqtext     LucidNewMatExtT\\\r
+\unionsqdisplay        unionsqdisplay  LucidNewMatExtT\\\r
+\contintegraltext      contintegraltext        LucidNewMatExtT\\\r
+\contintegraldisplay   contintegraldisplay     LucidNewMatExtT\\\r
+\circledottext circledottext   LucidNewMatExtT\\\r
+\circledotdisplay      circledotdisplay        LucidNewMatExtT\\\r
+\circleplustext        circleplustext  LucidNewMatExtT\\\r
+\circleplusdisplay     circleplusdisplay       LucidNewMatExtT\\\r
+\circlemultiplytext    circlemultiplytext      LucidNewMatExtT\\\r
+\circlemultiplydisplay circlemultiplydisplay   LucidNewMatExtT\\\r
+\summationtext summationtext   LucidNewMatExtT\\\r
+\producttext   producttext     LucidNewMatExtT\\\r
+\integraltext  integraltext    LucidNewMatExtT\\\r
+\uniontext     uniontext       LucidNewMatExtT\\\r
+\intersectiontext      intersectiontext        LucidNewMatExtT\\\r
+\unionmultitext        unionmultitext  LucidNewMatExtT\\\r
+\logicalandtext        logicalandtext  LucidNewMatExtT\\\r
+\logicalortext logicalortext   LucidNewMatExtT\\\r
+\summationdisplay      summationdisplay        LucidNewMatExtT\\\r
+\productdisplay        productdisplay  LucidNewMatExtT\\\r
+\integraldisplay       integraldisplay LucidNewMatExtT\\\r
+\uniondisplay  uniondisplay    LucidNewMatExtT\\\r
+\intersectiondisplay   intersectiondisplay     LucidNewMatExtT\\\r
+\unionmultidisplay     unionmultidisplay       LucidNewMatExtT\\\r
+\logicalanddisplay     logicalanddisplay       LucidNewMatExtT\\\r
+\logicalordisplay      logicalordisplay        LucidNewMatExtT\\\r
+\coproducttext coproducttext   LucidNewMatExtT\\\r
+\coproductdisplay      coproductdisplay        LucidNewMatExtT\\\r
+\hatwide       hatwide LucidNewMatExtT\\\r
+\hatwider      hatwider        LucidNewMatExtT\\\r
+\hatwidest     hatwidest       LucidNewMatExtT\\\r
+\tildewide     tildewide       LucidNewMatExtT\\\r
+\tildewider    tildewider      LucidNewMatExtT\\\r
+\tildewidest   tildewidest     LucidNewMatExtT\\\r
+\bracketleftBig        bracketleftBig  LucidNewMatExtT\\\r
+\bracketrightBig       bracketrightBig LucidNewMatExtT\\\r
+\floorleftBig  floorleftBig    LucidNewMatExtT\\\r
+\floorrightBig floorrightBig   LucidNewMatExtT\\\r
+\ceilingleftBig        ceilingleftBig  LucidNewMatExtT\\\r
+\ceilingrightBig       ceilingrightBig LucidNewMatExtT\\\r
+\braceleftBig  braceleftBig    LucidNewMatExtT\\\r
+\bracerightBig bracerightBig   LucidNewMatExtT\\\r
+\radicalbig    radicalbig      LucidNewMatExtT\\\r
+\radicalBig    radicalBig      LucidNewMatExtT\\\r
+\radicalbigg   radicalbigg     LucidNewMatExtT\\\r
+\radicalBigg   radicalBigg     LucidNewMatExtT\\\r
+\radicalbt     radicalbt       LucidNewMatExtT\\\r
+\radicalvertex radicalvertex   LucidNewMatExtT\\\r
+\radicaltp     radicaltp       LucidNewMatExtT\\\r
+\arrowvertexdbl        arrowvertexdbl  LucidNewMatExtT\\\r
+\arrowtp       arrowtp LucidNewMatExtT\\\r
+\arrowbt       arrowbt LucidNewMatExtT\\\r
+\bracehtipdownleft     bracehtipdownleft       LucidNewMatExtT\\\r
+\bracehtipdownright    bracehtipdownright      LucidNewMatExtT\\\r
+\bracehtipupleft       bracehtipupleft LucidNewMatExtT\\\r
+\bracehtipupright      bracehtipupright        LucidNewMatExtT\\\r
+\arrowdbltp    arrowdbltp      LucidNewMatExtT\\\r
+\arrowdblbt    arrowdblbt      LucidNewMatExtT\\\r
+\r
+\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/lucmathext-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/lucmathext-charmap.txt
new file mode 100755 (executable)
index 0000000..623b304
--- /dev/null
@@ -0,0 +1,130 @@
+# character map for Lucida New Math Extended font\r
+\r
+<char:parenleftbig><font:LucidNewMatExtT><index:161>\r
+<char:parenrightbig><font:LucidNewMatExtT><index:162>\r
+<char:bracketleftbig><font:LucidNewMatExtT><index:163>\r
+<char:bracketrightbig><font:LucidNewMatExtT><index:164>\r
+<char:floorleftbig><font:LucidNewMatExtT><index:165>\r
+<char:floorrightbig><font:LucidNewMatExtT><index:166>\r
+<char:ceilingleftbig><font:LucidNewMatExtT><index:167>\r
+<char:ceilingrightbig><font:LucidNewMatExtT><index:168>\r
+<char:braceleftbig><font:LucidNewMatExtT><index:169>\r
+<char:bracerightbig><font:LucidNewMatExtT><index:170>\r
+<char:angbracketleftbig><font:LucidNewMatExtT><index:173>\r
+<char:angbracketrightbig><font:LucidNewMatExtT><index:174>\r
+<char:vextendsingle><font:LucidNewMatExtT><index:175>\r
+<char:vextenddouble><font:LucidNewMatExtT><index:176>\r
+<char:slashbig><font:LucidNewMatExtT><index:177>\r
+<char:backslashbig><font:LucidNewMatExtT><index:178>\r
+<char:parenleftBig><font:LucidNewMatExtT><index:179>\r
+<char:parenrightBig><font:LucidNewMatExtT><index:180>\r
+<char:parenleftbigg><font:LucidNewMatExtT><index:181>\r
+<char:parenrightbigg><font:LucidNewMatExtT><index:182>\r
+<char:bracketleftbigg><font:LucidNewMatExtT><index:183>\r
+<char:bracketrightbigg><font:LucidNewMatExtT><index:184>\r
+<char:floorleftbigg><font:LucidNewMatExtT><index:185>\r
+<char:floorrightbigg><font:LucidNewMatExtT><index:186>\r
+<char:ceilingleftbigg><font:LucidNewMatExtT><index:187>\r
+<char:ceilingrightbigg><font:LucidNewMatExtT><index:188>\r
+<char:braceleftbigg><font:LucidNewMatExtT><index:189>\r
+<char:bracerightbigg><font:LucidNewMatExtT><index:190>\r
+<char:angbracketleftbigg><font:LucidNewMatExtT><index:28>\r
+<char:angbracketrightbigg><font:LucidNewMatExtT><index:29>\r
+<char:slashbigg><font:LucidNewMatExtT><index:193>\r
+<char:backslashbigg><font:LucidNewMatExtT><index:194>\r
+<char:parenleftBigg><font:LucidNewMatExtT><index:195>\r
+<char:parenrightBigg><font:LucidNewMatExtT><index:33>\r
+<char:bracketleftBigg><font:LucidNewMatExtT><index:34>\r
+<char:bracketrightBigg><font:LucidNewMatExtT><index:35>\r
+<char:floorleftBigg><font:LucidNewMatExtT><index:36>\r
+<char:floorrightBigg><font:LucidNewMatExtT><index:37>\r
+<char:ceilingleftBigg><font:LucidNewMatExtT><index:38>\r
+<char:ceilingrightBigg><font:LucidNewMatExtT><index:39>\r
+<char:braceleftBigg><font:LucidNewMatExtT><index:40>\r
+<char:bracerightBigg><font:LucidNewMatExtT><index:41>\r
+<char:angbracketleftBigg><font:LucidNewMatExtT><index:42>\r
+<char:angbracketrightBigg><font:LucidNewMatExtT><index:43>\r
+<char:slashBigg><font:LucidNewMatExtT><index:44>\r
+<char:backslashBigg><font:LucidNewMatExtT><index:45>\r
+<char:slashBig><font:LucidNewMatExtT><index:46>\r
+<char:backslashBig><font:LucidNewMatExtT><index:47>\r
+<char:parenlefttp><font:LucidNewMatExtT><index:48>\r
+<char:parenrighttp><font:LucidNewMatExtT><index:49>\r
+<char:bracketlefttp><font:LucidNewMatExtT><index:50>\r
+<char:bracketrighttp><font:LucidNewMatExtT><index:51>\r
+<char:bracketleftbt><font:LucidNewMatExtT><index:52>\r
+<char:bracketrightbt><font:LucidNewMatExtT><index:53>\r
+<char:bracketleftex><font:LucidNewMatExtT><index:54>\r
+<char:bracketrightex><font:LucidNewMatExtT><index:55>\r
+<char:bracelefttp><font:LucidNewMatExtT><index:56>\r
+<char:bracerighttp><font:LucidNewMatExtT><index:57>\r
+<char:braceleftbt><font:LucidNewMatExtT><index:58>\r
+<char:bracerightbt><font:LucidNewMatExtT><index:59>\r
+<char:braceleftmid><font:LucidNewMatExtT><index:60>\r
+<char:bracerightmid><font:LucidNewMatExtT><index:61>\r
+<char:braceex><font:LucidNewMatExtT><index:62>\r
+<char:arrowvertex><font:LucidNewMatExtT><index:63>\r
+<char:parenleftbt><font:LucidNewMatExtT><index:64>\r
+<char:parenrightbt><font:LucidNewMatExtT><index:65>\r
+<char:parenleftex><font:LucidNewMatExtT><index:66>\r
+<char:parenrightex><font:LucidNewMatExtT><index:67>\r
+<char:angbracketleftBig><font:LucidNewMatExtT><index:68>\r
+<char:angbracketrightBig><font:LucidNewMatExtT><index:69>\r
+<char:unionsqtext><font:LucidNewMatExtT><index:70>\r
+<char:unionsqdisplay><font:LucidNewMatExtT><index:71>\r
+<char:contintegraltext><font:LucidNewMatExtT><index:72>\r
+<char:contintegraldisplay><font:LucidNewMatExtT><index:73>\r
+<char:circledottext><font:LucidNewMatExtT><index:74>\r
+<char:circledotdisplay><font:LucidNewMatExtT><index:75>\r
+<char:circleplustext><font:LucidNewMatExtT><index:76>\r
+<char:circleplusdisplay><font:LucidNewMatExtT><index:77>\r
+<char:circlemultiplytext><font:LucidNewMatExtT><index:78>\r
+<char:circlemultiplydisplay><font:LucidNewMatExtT><index:79>\r
+<char:summationtext><font:LucidNewMatExtT><index:80>\r
+<char:producttext><font:LucidNewMatExtT><index:81>\r
+<char:integraltext><font:LucidNewMatExtT><index:82>\r
+<char:uniontext><font:LucidNewMatExtT><index:83>\r
+<char:intersectiontext><font:LucidNewMatExtT><index:84>\r
+<char:unionmultitext><font:LucidNewMatExtT><index:85>\r
+<char:logicalandtext><font:LucidNewMatExtT><index:86>\r
+<char:logicalortext><font:LucidNewMatExtT><index:87>\r
+<char:summationdisplay><font:LucidNewMatExtT><index:88>\r
+<char:productdisplay><font:LucidNewMatExtT><index:89>\r
+<char:integraldisplay><font:LucidNewMatExtT><index:90>\r
+<char:uniondisplay><font:LucidNewMatExtT><index:91>\r
+<char:intersectiondisplay><font:LucidNewMatExtT><index:92>\r
+<char:unionmultidisplay><font:LucidNewMatExtT><index:93>\r
+<char:logicalanddisplay><font:LucidNewMatExtT><index:94>\r
+<char:logicalordisplay><font:LucidNewMatExtT><index:95>\r
+<char:coproducttext><font:LucidNewMatExtT><index:96>\r
+<char:coproductdisplay><font:LucidNewMatExtT><index:97>\r
+<char:hatwide><font:LucidNewMatExtT><index:98>\r
+<char:hatwider><font:LucidNewMatExtT><index:99>\r
+<char:hatwidest><font:LucidNewMatExtT><index:100>\r
+<char:tildewide><font:LucidNewMatExtT><index:101>\r
+<char:tildewider><font:LucidNewMatExtT><index:102>\r
+<char:tildewidest><font:LucidNewMatExtT><index:103>\r
+<char:bracketleftBig><font:LucidNewMatExtT><index:104>\r
+<char:bracketrightBig><font:LucidNewMatExtT><index:105>\r
+<char:floorleftBig><font:LucidNewMatExtT><index:106>\r
+<char:floorrightBig><font:LucidNewMatExtT><index:107>\r
+<char:ceilingleftBig><font:LucidNewMatExtT><index:108>\r
+<char:ceilingrightBig><font:LucidNewMatExtT><index:109>\r
+<char:braceleftBig><font:LucidNewMatExtT><index:110>\r
+<char:bracerightBig><font:LucidNewMatExtT><index:111>\r
+<char:radicalbig><font:LucidNewMatExtT><index:112>\r
+<char:radicalBig><font:LucidNewMatExtT><index:113>\r
+<char:radicalbigg><font:LucidNewMatExtT><index:114>\r
+<char:radicalBigg><font:LucidNewMatExtT><index:115>\r
+<char:radicalbt><font:LucidNewMatExtT><index:116>\r
+<char:radicalvertex><font:LucidNewMatExtT><index:117>\r
+<char:radicaltp><font:LucidNewMatExtT><index:118>\r
+<char:arrowvertexdbl><font:LucidNewMatExtT><index:119>\r
+<char:arrowtp><font:LucidNewMatExtT><index:120>\r
+<char:arrowbt><font:LucidNewMatExtT><index:121>\r
+<char:bracehtipdownleft><font:LucidNewMatExtT><index:122>\r
+<char:bracehtipdownright><font:LucidNewMatExtT><index:123>\r
+<char:bracehtipupleft><font:LucidNewMatExtT><index:124>\r
+<char:bracehtipupright><font:LucidNewMatExtT><index:125>\r
+<char:arrowdbltp><font:LucidNewMatExtT><index:126>\r
+<char:arrowdblbt><font:LucidNewMatExtT><index:196>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/lucmathit-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/lucmathit-charmap.txt
new file mode 100755 (executable)
index 0000000..612d09c
--- /dev/null
@@ -0,0 +1,68 @@
+# character map for Lucida Math Italic font\r
+\r
+<char:Gamma><font:LucidNewMatItaT><index:161>\r
+<char:Delta><font:LucidNewMatItaT><index:162>\r
+<char:Theta><font:LucidNewMatItaT><index:163>\r
+<char:Lambda><font:LucidNewMatItaT><index:164>\r
+<char:Xi><font:LucidNewMatItaT><index:165>\r
+<char:Pi><font:LucidNewMatItaT><index:166>\r
+<char:Sigma><font:LucidNewMatItaT><index:167>\r
+<char:Upsilon><font:LucidNewMatItaT><index:7>\r
+<char:Phi><font:LucidNewMatItaT><index:169>\r
+<char:Psi><font:LucidNewMatItaT><index:170>\r
+<char:Omega><font:LucidNewMatItaT><index:173>\r
+<char:alpha><font:LucidNewMatItaT><index:174>\r
+<char:beta><font:LucidNewMatItaT><index:175>\r
+<char:gamma><font:LucidNewMatItaT><index:176>\r
+<char:delta><font:LucidNewMatItaT><index:177>\r
+<char:epsilon1><font:LucidNewMatItaT><index:178>\r
+<char:zeta><font:LucidNewMatItaT><index:179>\r
+<char:eta><font:LucidNewMatItaT><index:180>\r
+<char:theta><font:LucidNewMatItaT><index:181>\r
+<char:iota><font:LucidNewMatItaT><index:182>\r
+<char:kappa><font:LucidNewMatItaT><index:183>\r
+<char:lambda><font:LucidNewMatItaT><index:184>\r
+<char:mu><font:LucidNewMatItaT><index:185>\r
+<char:nu><font:LucidNewMatItaT><index:186>\r
+<char:xi><font:LucidNewMatItaT><index:187>\r
+<char:pi><font:LucidNewMatItaT><index:188>\r
+<char:rho><font:LucidNewMatItaT><index:189>\r
+<char:sigma><font:LucidNewMatItaT><index:190>\r
+<char:tau><font:LucidNewMatItaT><index:191>\r
+<char:upsilon><font:LucidNewMatItaT><index:192>\r
+<char:phi><font:LucidNewMatItaT><index:193>\r
+<char:chi><font:LucidNewMatItaT><index:194>\r
+<char:psi><font:LucidNewMatItaT><index:195>\r
+<char:tie><font:LucidNewMatItaT><index:196>\r
+<char:omega><font:LucidNewMatItaT><index:33>\r
+<char:epsilon><font:LucidNewMatItaT><index:34>\r
+<char:theta1><font:LucidNewMatItaT><index:35>\r
+<char:pi1><font:LucidNewMatItaT><index:36>\r
+<char:rho1><font:LucidNewMatItaT><index:37>\r
+<char:sigma1><font:LucidNewMatItaT><index:38>\r
+<char:phi1><font:LucidNewMatItaT><index:39>\r
+<char:arrowlefttophalf><font:LucidNewMatItaT><index:40>\r
+<char:arrowleftbothalf><font:LucidNewMatItaT><index:41>\r
+<char:arrowrighttophalf><font:LucidNewMatItaT><index:42>\r
+<char:arrowrightbothalf><font:LucidNewMatItaT><index:43>\r
+<char:arrowhookleft><font:LucidNewMatItaT><index:44>\r
+<char:arrowhookright><font:LucidNewMatItaT><index:45>\r
+<char:triangleright><font:LucidNewMatItaT><index:46>\r
+<char:triangleleft><font:LucidNewMatItaT><index:47>\r
+<char:period><font:LucidNewMatItaT><index:58>\r
+<char:comma><font:LucidNewMatItaT><index:59>\r
+<char:less><font:LucidNewMatItaT><index:60>\r
+<char:slash><font:LucidNewMatItaT><index:61>\r
+<char:greater><font:LucidNewMatItaT><index:62>\r
+<char:star><font:LucidNewMatItaT><index:63>\r
+<char:partialdiff><font:LucidNewMatItaT><index:64>\r
+<char:flat><font:LucidNewMatItaT><index:91>\r
+<char:natural><font:LucidNewMatItaT><index:92>\r
+<char:sharp><font:LucidNewMatItaT><index:93>\r
+<char:slurbelow><font:LucidNewMatItaT><index:94>\r
+<char:slurabove><font:LucidNewMatItaT><index:95>\r
+<char:lscript><font:LucidNewMatItaT><index:96>\r
+<char:dotlessi><font:LucidNewMatItaT><index:123>\r
+<char:dotlessj><font:LucidNewMatItaT><index:124>\r
+<char:weierstrass><font:LucidNewMatItaT><index:125>\r
+<char:vector><font:LucidNewMatItaT><index:126>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/lucmathsym-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/lucmathsym-charmap.txt
new file mode 100755 (executable)
index 0000000..bdde61d
--- /dev/null
@@ -0,0 +1,130 @@
+# mathematical characters for Lucida New Math Symbol font\r
+\r
+<char:minus><font:LucidNewMatSymT><index:161>\r
+<char:periodcentered><font:LucidNewMatSymT><index:162>\r
+<char:multiply><font:LucidNewMatSymT><index:163>\r
+<char:asteriskmath><font:LucidNewMatSymT><index:164>\r
+<char:divide><font:LucidNewMatSymT><index:165>\r
+<char:diamondmath><font:LucidNewMatSymT><index:166>\r
+<char:plusminus><font:LucidNewMatSymT><index:167>\r
+<char:minusplus><font:LucidNewMatSymT><index:168>\r
+<char:circleplus><font:LucidNewMatSymT><index:169>\r
+<char:circleminus><font:LucidNewMatSymT><index:170>\r
+<char:circlemultiply><font:LucidNewMatSymT><index:173>\r
+<char:circledivide><font:LucidNewMatSymT><index:174>\r
+<char:circledot><font:LucidNewMatSymT><index:175>\r
+<char:circlecopyrt><font:LucidNewMatSymT><index:176>\r
+<char:openbullet><font:LucidNewMatSymT><index:177>\r
+<char:bullet><font:LucidNewMatSymT><index:178>\r
+<char:equivasymptotic><font:LucidNewMatSymT><index:179>\r
+<char:equivalence><font:LucidNewMatSymT><index:180>\r
+<char:reflexsubset><font:LucidNewMatSymT><index:181>\r
+<char:reflexsuperset><font:LucidNewMatSymT><index:182>\r
+<char:lessequal><font:LucidNewMatSymT><index:183>\r
+<char:greaterequal><font:LucidNewMatSymT><index:184>\r
+<char:precedesequal><font:LucidNewMatSymT><index:185>\r
+<char:followsequal><font:LucidNewMatSymT><index:186>\r
+<char:similar><font:LucidNewMatSymT><index:187>\r
+<char:approxequal><font:LucidNewMatSymT><index:188>\r
+<char:propersubset><font:LucidNewMatSymT><index:189>\r
+<char:propersuperset><font:LucidNewMatSymT><index:190>\r
+<char:lessmuch><font:LucidNewMatSymT><index:191>\r
+<char:greatermuch><font:LucidNewMatSymT><index:192>\r
+<char:precedes><font:LucidNewMatSymT><index:193>\r
+<char:follows><font:LucidNewMatSymT><index:194>\r
+<char:arrowleft><font:LucidNewMatSymT><index:195>\r
+<char:spade><font:LucidNewMatSymT><index:196>\r
+<char:arrowright><font:LucidNewMatSymT><index:33>\r
+<char:arrowup><font:LucidNewMatSymT><index:34>\r
+<char:arrowdown><font:LucidNewMatSymT><index:35>\r
+<char:arrowboth><font:LucidNewMatSymT><index:36>\r
+<char:arrownortheast><font:LucidNewMatSymT><index:37>\r
+<char:arrowsoutheast><font:LucidNewMatSymT><index:38>\r
+<char:similarequal><font:LucidNewMatSymT><index:39>\r
+<char:arrowdblleft><font:LucidNewMatSymT><index:40>\r
+<char:arrowdblright><font:LucidNewMatSymT><index:41>\r
+<char:arrowdblup><font:LucidNewMatSymT><index:42>\r
+<char:arrowdbldown><font:LucidNewMatSymT><index:43>\r
+<char:arrowdblboth><font:LucidNewMatSymT><index:44>\r
+<char:arrownorthwest><font:LucidNewMatSymT><index:45>\r
+<char:arrowsouthwest><font:LucidNewMatSymT><index:46>\r
+<char:proportional><font:LucidNewMatSymT><index:47>\r
+<char:prime><font:LucidNewMatSymT><index:48>\r
+<char:infinity><font:LucidNewMatSymT><index:49>\r
+<char:element><font:LucidNewMatSymT><index:50>\r
+<char:owner><font:LucidNewMatSymT><index:51>\r
+<char:triangle><font:LucidNewMatSymT><index:52>\r
+<char:triangleinv><font:LucidNewMatSymT><index:53>\r
+<char:negationslash><font:LucidNewMatSymT><index:54>\r
+<char:mapsto><font:LucidNewMatSymT><index:55>\r
+<char:universal><font:LucidNewMatSymT><index:56>\r
+<char:existential><font:LucidNewMatSymT><index:57>\r
+<char:logicalnot><font:LucidNewMatSymT><index:58>\r
+<char:emptyset><font:LucidNewMatSymT><index:59>\r
+<char:Rfractur><font:LucidNewMatSymT><index:60>\r
+<char:Ifractur><font:LucidNewMatSymT><index:61>\r
+<char:latticetop><font:LucidNewMatSymT><index:62>\r
+<char:perpendicular><font:LucidNewMatSymT><index:63>\r
+<char:aleph><font:LucidNewMatSymT><index:64>\r
+<char:scriptA><font:LucidNewMatSymT><index:65>\r
+<char:scriptB><font:LucidNewMatSymT><index:66>\r
+<char:scriptC><font:LucidNewMatSymT><index:67>\r
+<char:scriptD><font:LucidNewMatSymT><index:68>\r
+<char:scriptE><font:LucidNewMatSymT><index:69>\r
+<char:scriptF><font:LucidNewMatSymT><index:70>\r
+<char:scriptG><font:LucidNewMatSymT><index:71>\r
+<char:scriptH><font:LucidNewMatSymT><index:72>\r
+<char:scriptI><font:LucidNewMatSymT><index:73>\r
+<char:scriptJ><font:LucidNewMatSymT><index:74>\r
+<char:scriptK><font:LucidNewMatSymT><index:75>\r
+<char:scriptL><font:LucidNewMatSymT><index:76>\r
+<char:scriptM><font:LucidNewMatSymT><index:77>\r
+<char:scriptN><font:LucidNewMatSymT><index:78>\r
+<char:scriptO><font:LucidNewMatSymT><index:79>\r
+<char:scriptP><font:LucidNewMatSymT><index:80>\r
+<char:scriptQ><font:LucidNewMatSymT><index:81>\r
+<char:scriptR><font:LucidNewMatSymT><index:82>\r
+<char:scriptS><font:LucidNewMatSymT><index:83>\r
+<char:scriptT><font:LucidNewMatSymT><index:84>\r
+<char:scriptU><font:LucidNewMatSymT><index:85>\r
+<char:scriptV><font:LucidNewMatSymT><index:86>\r
+<char:scriptW><font:LucidNewMatSymT><index:87>\r
+<char:scriptX><font:LucidNewMatSymT><index:88>\r
+<char:scriptY><font:LucidNewMatSymT><index:89>\r
+<char:scriptZ><font:LucidNewMatSymT><index:90>\r
+<char:union><font:LucidNewMatSymT><index:91>\r
+<char:intersection><font:LucidNewMatSymT><index:92>\r
+<char:unionmulti><font:LucidNewMatSymT><index:93>\r
+<char:logicaland><font:LucidNewMatSymT><index:94>\r
+<char:logicalor><font:LucidNewMatSymT><index:95>\r
+<char:turnstileleft><font:LucidNewMatSymT><index:96>\r
+<char:turnstileright><font:LucidNewMatSymT><index:97>\r
+<char:floorleft><font:LucidNewMatSymT><index:98>\r
+<char:floorright><font:LucidNewMatSymT><index:99>\r
+<char:ceilingleft><font:LucidNewMatSymT><index:100>\r
+<char:ceilingright><font:LucidNewMatSymT><index:101>\r
+<char:braceleft><font:LucidNewMatSymT><index:102>\r
+<char:braceright><font:LucidNewMatSymT><index:103>\r
+<char:angbracketleft><font:LucidNewMatSymT><index:104>\r
+<char:angbracketright><font:LucidNewMatSymT><index:105>\r
+<char:bar><font:LucidNewMatSymT><index:106>\r
+<char:bardbl><font:LucidNewMatSymT><index:107>\r
+<char:arrowbothv><font:LucidNewMatSymT><index:108>\r
+<char:arrowdblbothv><font:LucidNewMatSymT><index:109>\r
+<char:backslash><font:LucidNewMatSymT><index:110>\r
+<char:wreathproduct><font:LucidNewMatSymT><index:111>\r
+<char:radical><font:LucidNewMatSymT><index:112>\r
+<char:coproduct><font:LucidNewMatSymT><index:113>\r
+<char:nabla><font:LucidNewMatSymT><index:114>\r
+<char:integral><font:LucidNewMatSymT><index:115>\r
+<char:unionsq><font:LucidNewMatSymT><index:116>\r
+<char:intersectionsq><font:LucidNewMatSymT><index:117>\r
+<char:subsetsqequal><font:LucidNewMatSymT><index:118>\r
+<char:supersetsqequal><font:LucidNewMatSymT><index:119>\r
+<char:section><font:LucidNewMatSymT><index:120>\r
+<char:dagger><font:LucidNewMatSymT><index:121>\r
+<char:daggerdbl><font:LucidNewMatSymT><index:122>\r
+<char:paragraph><font:LucidNewMatSymT><index:123>\r
+<char:club><font:LucidNewMatSymT><index:124>\r
+<char:diamond><font:LucidNewMatSymT><index:125>\r
+<char:heart><font:LucidNewMatSymT><index:126>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/make-charmap-display.pl b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/make-charmap-display.pl
new file mode 100755 (executable)
index 0000000..a6540ae
--- /dev/null
@@ -0,0 +1,25 @@
+# perl script\r
+# makes tagged text to show contents of char map\r
+\r
+# generate file names for input\r
+$sourcefile = $ARGV[0];\r
+# generate file names for output\r
+# trim off suffix starting with dot\r
+($base = $sourcefile) =~ s/(.+)\..*/$1/;\r
+$resultfile = "$base.processed.txt";\r
+\r
+print "Converting $sourcefile to $resultfile ...\n";\r
+open (SOURCE, "<$sourcefile");\r
+open (RESULT, ">$resultfile");\r
+\r
+LINE: while ($line = <SOURCE>) {\r
+       next LINE if $line =~ /^#/;             # skip if line matches pattern\r
+       \r
+       if ($line =~ /<char:(\w+)><font:(\w*)>/) {\r
+               $charname = $1;\r
+               $fontname = $2;\r
+               print RESULT "\\$charname\t$charname\t$fontname\\\\\n";\r
+               }\r
+       }\r
+close (SOURCE);\r
+close (RESULT);\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/make-map.pl b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/make-map.pl
new file mode 100755 (executable)
index 0000000..127de4f
--- /dev/null
@@ -0,0 +1,29 @@
+# perl script\r
+# makes character map\r
+# input line: number tab name\r
+# output line: <char:name><font:><index:number>\r
+\r
+# generate file names for input\r
+$sourcefile = $ARGV[0];\r
+# generate file names for output\r
+# trim off suffix starting with dot\r
+($base = $sourcefile) =~ s/(.+)\..*/$1/;\r
+$resultfile = "$base.processed.txt";\r
+\r
+print "Converting $sourcefile to $resultfile ...\n";\r
+open (SOURCE, "<$sourcefile");\r
+open (RESULT, ">$resultfile");\r
+\r
+LINE: while ($line = <SOURCE>) {\r
+       next LINE if $line =~ /^#/;             # skip if line matches pattern\r
+       next LINE if $line =~ /^\s*$/;  # skip if source line is empty\r
+       \r
+       if ($line =~ /^(\w+)\s+(\w+)/) {\r
+               $number = $1;\r
+               $name = $2;\r
+               print RESULT "<char:$name><font:><index:$number>\n";\r
+               }\r
+       }\r
+\r
+close (SOURCE);\r
+close (RESULT);\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/lucida-math-extended-map.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/lucida-math-extended-map.txt
new file mode 100755 (executable)
index 0000000..5423c01
--- /dev/null
@@ -0,0 +1,133 @@
+LucidaMath-Extended\r
+\r
+\r
+161    parenleftbig\r
+\r
+162    parenrightbig\r
+163    bracketleftbig\r
+164    bracketrightbig\r
+165    floorleftbig\r
+166    floorrightbig\r
+167    ceilingleftbig\r
+168    ceilingrightbig\r
+169    braceleftbig\r
+170    bracerightbig\r
+173    angbracketleftbig\r
+174    angbracketrightbig\r
+175    vextendsingle\r
+176    vextenddouble\r
+177    slashbig\r
+178    backslashbig\r
+179    parenleftBig\r
+180    parenrightBig\r
+181    parenleftbigg\r
+182    parenrightbigg\r
+183    bracketleftbigg\r
+184    bracketrightbigg\r
+185    floorleftbigg\r
+186    floorrightbigg\r
+187    ceilingleftbigg\r
+188    ceilingrightbigg\r
+189    braceleftbigg\r
+190    bracerightbigg\r
+28     angbracketleftbigg\r
+29     angbracketrightbigg\r
+193    slashbigg\r
+194    backslashbigg\r
+195    parenleftBigg\r
+\r
+33     parenrightBigg\r
+34     bracketleftBigg\r
+35     bracketrightBigg\r
+36     floorleftBigg\r
+37     floorrightBigg\r
+38     ceilingleftBigg\r
+39     ceilingrightBigg\r
+40     braceleftBigg\r
+41     bracerightBigg\r
+42     angbracketleftBigg\r
+43     angbracketrightBigg\r
+44     slashBigg\r
+45     backslashBigg\r
+46     slashBig\r
+47     backslashBig\r
+48     parenlefttp\r
+49     parenrighttp\r
+50     bracketlefttp\r
+51     bracketrighttp\r
+52     bracketleftbt\r
+53     bracketrightbt\r
+54     bracketleftex\r
+55     bracketrightex\r
+56     bracelefttp\r
+57     bracerighttp\r
+58     braceleftbt\r
+59     bracerightbt\r
+60     braceleftmid\r
+61     bracerightmid\r
+62     braceex\r
+63     arrowvertex\r
+64     parenleftbt\r
+65     parenrightbt\r
+66     parenleftex\r
+67     parenrightex\r
+68     angbracketleftBig\r
+69     angbracketrightBig\r
+70     unionsqtext\r
+71     unionsqdisplay\r
+72     contintegraltext\r
+73     contintegraldisplay\r
+74     circledottext\r
+75     circledotdisplay\r
+76     circleplustext\r
+77     circleplusdisplay\r
+78     circlemultiplytext\r
+79     circlemultiplydisplay\r
+80     summationtext\r
+81     producttext\r
+82     integraltext\r
+83     uniontext\r
+84     intersectiontext\r
+85     unionmultitext\r
+86     logicalandtext\r
+87     logicalortext\r
+88     summationdisplay\r
+89     productdisplay\r
+90     integraldisplay\r
+91     uniondisplay\r
+92     intersectiondisplay\r
+93     unionmultidisplay\r
+94     logicalanddisplay\r
+95     logicalordisplay\r
+96     coproducttext\r
+97     coproductdisplay\r
+98     hatwide\r
+99     hatwider\r
+100    hatwidest\r
+101    tildewide\r
+102    tildewider\r
+103    tildewidest\r
+104    bracketleftBig\r
+105    bracketrightBig\r
+106    floorleftBig\r
+107    floorrightBig\r
+108    ceilingleftBig\r
+109    ceilingrightBig\r
+110    braceleftBig\r
+111    bracerightBig\r
+112    radicalbig\r
+113    radicalBig\r
+114    radicalbigg\r
+115    radicalBigg\r
+116    radicalbt\r
+117    radicalvertex\r
+118    radicaltp\r
+119    arrowvertexdbl\r
+120    arrowtp\r
+121    arrowbt\r
+122    bracehtipdownleft\r
+123    bracehtipdownright\r
+124    bracehtipupleft\r
+125    bracehtipupright\r
+126    arrowdbltp\r
+196    arrowdblbt\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/lucida-math-italic-map.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/lucida-math-italic-map.txt
new file mode 100755 (executable)
index 0000000..1e35531
--- /dev/null
@@ -0,0 +1,71 @@
+lucida math italic\r
+\r
+161    Gamma\r
+162    Delta\r
+163    Theta\r
+164    Lambda\r
+165    Xi\r
+166    Pi\r
+167    Sigma\r
+7      Upsilon\r
+169    Phi\r
+170    Psi\r
+\r
+173    Omega\r
+174    alpha\r
+175    beta\r
+176    gamma\r
+177    delta\r
+178    epsilon1\r
+179    zeta\r
+180    eta\r
+181    theta\r
+182    iota\r
+183    kappa\r
+184    lambda\r
+185    mu\r
+186    nu\r
+187    xi\r
+188    pi\r
+189    rho\r
+190    sigma\r
+191    tau\r
+192    upsilon\r
+193    phi\r
+194    chi\r
+195    psi\r
+196    tie\r
+\r
+33     omega\r
+34     epsilon\r
+35     theta1\r
+36     pi1\r
+37     rho1\r
+38     sigma1\r
+39     phi1\r
+40     arrowlefttophalf\r
+41     arrowleftbothalf\r
+42     arrowrighttophalf\r
+43     arrowrightbothalf\r
+44     arrowhookleft\r
+45     arrowhookright\r
+46     triangleright\r
+47     triangleleft\r
+58     period\r
+59     comma\r
+60     less\r
+61     slash\r
+62     greater\r
+63     star\r
+64     partialdiff\r
+91     flat\r
+92     natural\r
+93     sharp\r
+94     slurbelow\r
+95     slurabove\r
+96     lscript\r
+123    dotlessi\r
+124    dotlessj\r
+125    weierstrass\r
+126    vector\r
+\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/lucida-math-symbol-map.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/lucida-math-symbol-map.txt
new file mode 100755 (executable)
index 0000000..7868fa9
--- /dev/null
@@ -0,0 +1,130 @@
+lucida math symbol\r
+\r
+161    minus\r
+162    periodcentered\r
+163    multiply\r
+164    asteriskmath\r
+165    divide\r
+166    diamondmath\r
+167    plusminus\r
+168    minusplus\r
+169    circleplus\r
+170    circleminus\r
+173    circlemultiply\r
+174    circledivide\r
+175    circledot\r
+176    circlecopyrt\r
+177    openbullet\r
+178    bullet\r
+179    equivasymptotic\r
+180    equivalence\r
+181    reflexsubset\r
+182    reflexsuperset\r
+183    lessequal\r
+184    greaterequal\r
+185    precedesequal\r
+186    followsequal\r
+187    similar\r
+188    approxequal\r
+189    propersubset\r
+190    propersuperset\r
+191    lessmuch\r
+192    greatermuch\r
+193    precedes\r
+194    follows\r
+195    arrowleft\r
+196    spade\r
+33     arrowright\r
+34     arrowup\r
+35     arrowdown\r
+36     arrowboth\r
+37     arrownortheast\r
+38     arrowsoutheast\r
+39     similarequal\r
+40     arrowdblleft\r
+41     arrowdblright\r
+42     arrowdblup\r
+43     arrowdbldown\r
+44     arrowdblboth\r
+45     arrownorthwest\r
+46     arrowsouthwest\r
+47     proportional\r
+48     prime\r
+49     infinity\r
+50     element\r
+51     owner\r
+52     triangle\r
+53     triangleinv\r
+54     negationslash\r
+55     mapsto\r
+56     universal\r
+57     existential\r
+58     logicalnot\r
+59     emptyset\r
+60     Rfractur\r
+61     Ifractur\r
+62     latticetop\r
+63     perpendicular\r
+64     aleph\r
+65     scriptA\r
+66     scriptB\r
+67     scriptC\r
+68     scriptD\r
+69     scriptE\r
+70     scriptF\r
+71     scriptG\r
+72     scriptH\r
+73     scriptI\r
+74     scriptJ\r
+75     scriptK\r
+76     scriptL\r
+77     scriptM\r
+78     scriptN\r
+79     scriptO\r
+80     scriptP\r
+81     scriptQ\r
+82     scriptR\r
+83     scriptS\r
+84     scriptT\r
+85     scriptU\r
+86     scriptV\r
+87     scriptW\r
+88     scriptX\r
+89     scriptY\r
+90     scriptZ\r
+91     union\r
+92     intersection\r
+93     unionmulti\r
+94     logicaland\r
+95     logicalor\r
+96     turnstileleft\r
+97     turnstileright\r
+98     floorleft\r
+99     floorright\r
+100    ceilingleft\r
+101    ceilingright\r
+102    braceleft\r
+103    braceright\r
+104    angbracketleft\r
+105    angbracketright\r
+106    bar\r
+107    bardbl\r
+108    arrowbothv\r
+109    arrowdblbothv\r
+110    backslash\r
+111    wreathproduct\r
+112    radical\r
+113    coproduct\r
+114    nabla\r
+115    integral\r
+116    unionsq\r
+117    intersectionsq\r
+118    subsetsqequal\r
+119    supersetsqequal\r
+120    section\r
+121    dagger\r
+122    daggerdbl\r
+123    paragraph\r
+124    club\r
+125    diamond\r
+126    heart\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/standard-map.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/standard-map.txt
new file mode 100755 (executable)
index 0000000..e56033b
--- /dev/null
@@ -0,0 +1,221 @@
+# character map for standard font\r
+\r
+32     space\r
+33     exclam\r
+34     quotedbl\r
+35     numbersign\r
+36     dollar\r
+37     percent\r
+38     ampersand\r
+39     quotesingle\r
+40     parenleft\r
+41     parenright\r
+42     asterisk\r
+43     plus\r
+44     comma\r
+45     hyphen\r
+46     period\r
+47     slash\r
+48     zero\r
+49     one\r
+50     two\r
+51     three\r
+52     four\r
+53     five\r
+54     six\r
+55     seven\r
+56     eight\r
+57     nine\r
+58     colon\r
+59     semicolon\r
+60     less\r
+61     equal\r
+62     greater\r
+63     question\r
+64     at\r
+65     A\r
+66     B\r
+67     C\r
+68     D\r
+69     E\r
+70     F\r
+71     G\r
+72     H\r
+73     I\r
+74     J\r
+75     K\r
+76     L\r
+77     M\r
+78     N\r
+79     O\r
+80     P\r
+81     Q\r
+82     R\r
+83     S\r
+84     T\r
+85     U\r
+86     V\r
+87     W\r
+88     X\r
+89     Y\r
+90     Z\r
+91     bracketleft\r
+92     backslash\r
+93     bracketright\r
+94     asciicircum\r
+95     underscore\r
+96     grave\r
+97     a\r
+98     b\r
+99     c\r
+100    d\r
+101    e\r
+102    f\r
+103    g\r
+104    h\r
+105    i\r
+106    j\r
+107    k\r
+108    l\r
+109    m\r
+110    n\r
+111    o\r
+112    p\r
+113    q\r
+114    r\r
+115    s\r
+116    t\r
+117    u\r
+118    v\r
+119    w\r
+120    x\r
+121    y\r
+122    z\r
+123    braceleft\r
+124    bar\r
+125    braceright\r
+126    asciitilde\r
+\r
+128    euro\r
+130    quotesinglbase\r
+131    florin\r
+132    quotedblbase\r
+133    ellipsis\r
+134    dagger\r
+135    daggerdbl\r
+136    circumflex\r
+137    perthousand\r
+138    Scaron\r
+139    guilsinglleft\r
+140    OE\r
+142    Zcaron\r
+145    quoteleft\r
+146    quoteright\r
+147    quotedblleft\r
+148    quotedblright\r
+149    bullet\r
+150    endash\r
+151    emdash\r
+152    tilde\r
+153    trademark\r
+154    scaron\r
+155    guilsinglright\r
+156    oe\r
+158    zcaron\r
+159    Ydieresis\r
+160    nbspace\r
+161    exclamdown\r
+162    cent\r
+163    sterling\r
+164    currency\r
+165    yen\r
+166    brokenbar\r
+167    section\r
+168    dieresis\r
+169    copyright\r
+170    ordfeminine\r
+171    guillemotleft\r
+172    logicalnot\r
+173    sfthyphen\r
+174    registered\r
+175    macron\r
+176    degree\r
+177    plusminus\r
+178    twosuperior\r
+179    threesuperior\r
+180    acute\r
+181    mu\r
+182    paragraph\r
+183    periodcentered\r
+184    cedilla\r
+185    onesuperior\r
+186    ordmasculine\r
+187    guillemotright\r
+188    onequarter\r
+189    onehalf\r
+190    threequarters\r
+191    questiondown\r
+192    Agrave\r
+193    Aacute\r
+194    Acircumflex\r
+195    Atilde\r
+196    Adieresis\r
+197    Aring\r
+198    AE\r
+199    Ccedilla\r
+200    Egrave\r
+201    Eacute\r
+202    Ecircumflex\r
+203    Edieresis\r
+204    Igrave\r
+205    Iacute\r
+206    Icircumflex\r
+207    Idieresis\r
+208    Eth\r
+209    Ntilde\r
+210    Ograve\r
+211    Oacute\r
+212    Ocircumflex\r
+213    Otilde\r
+214    Odieresis\r
+215    multiply\r
+216    Oslash\r
+217    Ugrave\r
+218    Uacute\r
+219    Ucircumflex\r
+220    Udieresis\r
+221    Yacute\r
+222    Thorn\r
+223    germandbls\r
+224    agrave\r
+225    aacute\r
+226    acircumflex\r
+227    atilde\r
+228    adieresis\r
+229    aring\r
+230    ae\r
+231    ccedilla\r
+232    egrave\r
+233    eacute\r
+234    ecircumflex\r
+235    edieresis\r
+236    igrave\r
+237    iacute\r
+238    icircumflex\r
+239    idieresis\r
+240    eth\r
+241    ntilde\r
+242    ograve\r
+243    oacute\r
+244    ocircumflex\r
+245    otilde\r
+246    odieresis\r
+247    divide\r
+248    oslash\r
+249    ugrave\r
+250    uacute\r
+251    ucircumflex\r
+252    udieresis\r
+253    yacute\r
+254    thorn\r
+255    ydieresis\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/symbol-map.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/sources/symbol-map.txt
new file mode 100755 (executable)
index 0000000..808fec7
--- /dev/null
@@ -0,0 +1,193 @@
+for Symbol font\r
+\r
+32     space\r
+33     exclam\r
+34     universal\r
+35     numbersign\r
+36     existential\r
+37     percent\r
+38     ampersand\r
+39     suchthat\r
+40     parenleft\r
+41     parenright\r
+42     asteriskmath\r
+43     plus\r
+44     comma\r
+45     minus\r
+46     period\r
+47     slash\r
+48     zero\r
+49     one\r
+50     two\r
+51     three\r
+52     four\r
+53     five\r
+54     six\r
+55     seven\r
+56     eight\r
+57     nine\r
+58     colon\r
+59     semicolon\r
+60     less\r
+61     equal\r
+62     greater\r
+63     question\r
+64     congruent\r
+65     Alpha\r
+66     Beta\r
+67     Chi\r
+68     Delta\r
+69     Epsilon\r
+70     Phi\r
+71     Gamma\r
+72     Eta\r
+73     Iota\r
+74     theta1\r
+75     Kappa\r
+76     Lambda\r
+77     Mu\r
+78     Nu\r
+79     Omicron\r
+80     Pi\r
+81     Theta\r
+82     Rho\r
+83     Sigma\r
+84     Tau\r
+85     Upsilon\r
+86     sigma1\r
+87     Omega\r
+88     Xi\r
+89     Psi\r
+90     Zeta\r
+91     bracketleft\r
+92     therefore\r
+93     bracketright\r
+94     perpendicular\r
+95     underscore\r
+96     radicalex\r
+97     alpha\r
+98     beta\r
+99     chi\r
+100    delta\r
+101    epsilon\r
+102    phi\r
+103    gamma\r
+104    eta\r
+105    iota\r
+106    phi1\r
+107    kappa\r
+108    lambda\r
+109    mu\r
+110    nu\r
+111    omicron\r
+112    pi\r
+113    theta\r
+114    rho\r
+115    sigma\r
+116    tau\r
+117    upsilon\r
+118    omega1\r
+119    omega\r
+120    xi\r
+121    psi\r
+122    zeta\r
+123    braceleft\r
+124    bar\r
+125    braceright\r
+126    similar\r
+\r
+160    Euro\r
+161    Upsilon1\r
+162    minute\r
+163    lessequal\r
+164    fraction\r
+165    infinity\r
+166    florin\r
+167    club\r
+168    diamond\r
+169    heart\r
+170    spade\r
+171    arrowboth\r
+172    arrowleft\r
+173    arrowup\r
+174    arrowright\r
+175    arrowdown\r
+176    degree\r
+177    plusminus\r
+178    second\r
+179    greaterequal\r
+180    multiply\r
+181    proportional\r
+182    partialdiff\r
+183    bullet\r
+184    divide\r
+185    notequal\r
+186    equivalence\r
+187    approxequal\r
+188    ellipsis\r
+189    arrowvertex\r
+190    arrowhorizex\r
+191    carriagereturn\r
+192    aleph\r
+193    Ifraktur\r
+194    Rfraktur\r
+195    weierstrass\r
+196    circlemultiply\r
+197    circleplus\r
+198    emptyset\r
+199    intersection\r
+200    union\r
+201    propersuperset\r
+202    reflexsuperset\r
+203    notsubset\r
+204    propersubset\r
+205    reflexsubset\r
+206    element\r
+207    notelement\r
+208    angle\r
+209    gradient\r
+210    registerserif\r
+211    copyrightserif\r
+212    trademarkserif\r
+213    product\r
+214    radical\r
+215    dotmath\r
+216    logicalnot\r
+217    logicaland\r
+218    logicalor\r
+219    arrowdblboth\r
+220    arrowdblleft\r
+221    arrowdblup\r
+222    arrowdblright\r
+223    arrowdbldown\r
+224    lozenge\r
+225    angleleft\r
+226    registersans\r
+227    copyrightsans\r
+228    trademarksans\r
+229    summation\r
+230    parenlefttp\r
+231    parenleftex\r
+232    parenleftbt\r
+233    bracketlefttp\r
+234    bracketleftex\r
+235    bracketleftbt\r
+236    bracelefttp\r
+237    braceleftmid\r
+238    braceleftbt\r
+239    braceex\r
+% 240 apple\r
+241    angleright\r
+242    integral\r
+243    integraltp\r
+244    integralex\r
+245    integralbt\r
+246    parenrighttp\r
+247    parenrightex\r
+248    parenrightbt\r
+249    bracketrighttp\r
+250    bracketrightex\r
+251    bracketrightbt\r
+252    bracerighttp\r
+253    bracerightmid\r
+254    bracerightbt\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/standard-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/standard-charmap.txt
new file mode 100755 (executable)
index 0000000..9e6a44f
--- /dev/null
@@ -0,0 +1,220 @@
+# character map for standard font\r
+\r
+<char:space><font:><index:32>\r
+<char:exclam><font:><index:33>\r
+<char:quotedbl><font:><index:34>\r
+<char:numbersign><font:><index:35>\r
+<char:dollar><font:><index:36>\r
+<char:percent><font:><index:37>\r
+<char:ampersand><font:><index:38>\r
+<char:quotesingle><font:><index:39>\r
+<char:parenleft><font:><index:40>\r
+<char:parenright><font:><index:41>\r
+<char:asterisk><font:><index:42>\r
+<char:plus><font:><index:43>\r
+<char:comma><font:><index:44>\r
+<char:hyphen><font:><index:45>\r
+<char:period><font:><index:46>\r
+<char:slash><font:><index:47>\r
+<char:zero><font:><index:48>\r
+<char:one><font:><index:49>\r
+<char:two><font:><index:50>\r
+<char:three><font:><index:51>\r
+<char:four><font:><index:52>\r
+<char:five><font:><index:53>\r
+<char:six><font:><index:54>\r
+<char:seven><font:><index:55>\r
+<char:eight><font:><index:56>\r
+<char:nine><font:><index:57>\r
+<char:colon><font:><index:58>\r
+<char:semicolon><font:><index:59>\r
+<char:less><font:><index:60>\r
+<char:equal><font:><index:61>\r
+<char:greater><font:><index:62>\r
+<char:question><font:><index:63>\r
+<char:at><font:><index:64>\r
+<char:A><font:><index:65>\r
+<char:B><font:><index:66>\r
+<char:C><font:><index:67>\r
+<char:D><font:><index:68>\r
+<char:E><font:><index:69>\r
+<char:F><font:><index:70>\r
+<char:G><font:><index:71>\r
+<char:H><font:><index:72>\r
+<char:I><font:><index:73>\r
+<char:J><font:><index:74>\r
+<char:K><font:><index:75>\r
+<char:L><font:><index:76>\r
+<char:M><font:><index:77>\r
+<char:N><font:><index:78>\r
+<char:O><font:><index:79>\r
+<char:P><font:><index:80>\r
+<char:Q><font:><index:81>\r
+<char:R><font:><index:82>\r
+<char:S><font:><index:83>\r
+<char:T><font:><index:84>\r
+<char:U><font:><index:85>\r
+<char:V><font:><index:86>\r
+<char:W><font:><index:87>\r
+<char:X><font:><index:88>\r
+<char:Y><font:><index:89>\r
+<char:Z><font:><index:90>\r
+<char:bracketleft><font:><index:91>\r
+<char:backslash><font:><index:92>\r
+<char:bracketright><font:><index:93>\r
+<char:asciicircum><font:><index:94>\r
+<char:underscore><font:><index:95>\r
+<char:grave><font:><index:96>\r
+<char:a><font:><index:97>\r
+<char:b><font:><index:98>\r
+<char:c><font:><index:99>\r
+<char:d><font:><index:100>\r
+<char:e><font:><index:101>\r
+<char:f><font:><index:102>\r
+<char:g><font:><index:103>\r
+<char:h><font:><index:104>\r
+<char:i><font:><index:105>\r
+<char:j><font:><index:106>\r
+<char:k><font:><index:107>\r
+<char:l><font:><index:108>\r
+<char:m><font:><index:109>\r
+<char:n><font:><index:110>\r
+<char:o><font:><index:111>\r
+<char:p><font:><index:112>\r
+<char:q><font:><index:113>\r
+<char:r><font:><index:114>\r
+<char:s><font:><index:115>\r
+<char:t><font:><index:116>\r
+<char:u><font:><index:117>\r
+<char:v><font:><index:118>\r
+<char:w><font:><index:119>\r
+<char:x><font:><index:120>\r
+<char:y><font:><index:121>\r
+<char:z><font:><index:122>\r
+<char:braceleft><font:><index:123>\r
+<char:bar><font:><index:124>\r
+<char:braceright><font:><index:125>\r
+<char:asciitilde><font:><index:126>\r
+<char:euro><font:><index:128>\r
+<char:quotesinglbase><font:><index:130>\r
+<char:florin><font:><index:131>\r
+<char:quotedblbase><font:><index:132>\r
+<char:ellipsis><font:><index:133>\r
+<char:dagger><font:><index:134>\r
+<char:daggerdbl><font:><index:135>\r
+<char:circumflex><font:><index:136>\r
+<char:perthousand><font:><index:137>\r
+<char:Scaron><font:><index:138>\r
+<char:guilsinglleft><font:><index:139>\r
+<char:OE><font:><index:140>\r
+<char:Zcaron><font:><index:142>\r
+<char:quoteleft><font:><index:145>\r
+<char:quoteright><font:><index:146>\r
+<char:quotedblleft><font:><index:147>\r
+<char:quotedblright><font:><index:148>\r
+<char:bullet><font:><index:149>\r
+<char:endash><font:><index:150>\r
+<char:emdash><font:><index:151>\r
+<char:tilde><font:><index:152>\r
+<char:trademark><font:><index:153>\r
+<char:scaron><font:><index:154>\r
+<char:guilsinglright><font:><index:155>\r
+<char:oe><font:><index:156>\r
+<char:zcaron><font:><index:158>\r
+<char:Ydieresis><font:><index:159>\r
+<char:nbspace><font:><index:160>\r
+<char:exclamdown><font:><index:161>\r
+<char:cent><font:><index:162>\r
+<char:sterling><font:><index:163>\r
+<char:currency><font:><index:164>\r
+<char:yen><font:><index:165>\r
+<char:brokenbar><font:><index:166>\r
+<char:section><font:><index:167>\r
+<char:dieresis><font:><index:168>\r
+<char:copyright><font:><index:169>\r
+<char:ordfeminine><font:><index:170>\r
+<char:guillemotleft><font:><index:171>\r
+<char:logicalnot><font:><index:172>\r
+<char:sfthyphen><font:><index:173>\r
+<char:registered><font:><index:174>\r
+<char:macron><font:><index:175>\r
+<char:degree><font:><index:176>\r
+<char:plusminus><font:><index:177>\r
+<char:twosuperior><font:><index:178>\r
+<char:threesuperior><font:><index:179>\r
+<char:acute><font:><index:180>\r
+<char:mu><font:><index:181>\r
+<char:paragraph><font:><index:182>\r
+<char:periodcentered><font:><index:183>\r
+<char:cedilla><font:><index:184>\r
+<char:onesuperior><font:><index:185>\r
+<char:ordmasculine><font:><index:186>\r
+<char:guillemotright><font:><index:187>\r
+<char:onequarter><font:><index:188>\r
+<char:onehalf><font:><index:189>\r
+<char:threequarters><font:><index:190>\r
+<char:questiondown><font:><index:191>\r
+<char:Agrave><font:><index:192>\r
+<char:Aacute><font:><index:193>\r
+<char:Acircumflex><font:><index:194>\r
+<char:Atilde><font:><index:195>\r
+<char:Adieresis><font:><index:196>\r
+<char:Aring><font:><index:197>\r
+<char:AE><font:><index:198>\r
+<char:Ccedilla><font:><index:199>\r
+<char:Egrave><font:><index:200>\r
+<char:Eacute><font:><index:201>\r
+<char:Ecircumflex><font:><index:202>\r
+<char:Edieresis><font:><index:203>\r
+<char:Igrave><font:><index:204>\r
+<char:Iacute><font:><index:205>\r
+<char:Icircumflex><font:><index:206>\r
+<char:Idieresis><font:><index:207>\r
+<char:Eth><font:><index:208>\r
+<char:Ntilde><font:><index:209>\r
+<char:Ograve><font:><index:210>\r
+<char:Oacute><font:><index:211>\r
+<char:Ocircumflex><font:><index:212>\r
+<char:Otilde><font:><index:213>\r
+<char:Odieresis><font:><index:214>\r
+<char:multiply><font:><index:215>\r
+<char:Oslash><font:><index:216>\r
+<char:Ugrave><font:><index:217>\r
+<char:Uacute><font:><index:218>\r
+<char:Ucircumflex><font:><index:219>\r
+<char:Udieresis><font:><index:220>\r
+<char:Yacute><font:><index:221>\r
+<char:Thorn><font:><index:222>\r
+<char:germandbls><font:><index:223>\r
+<char:agrave><font:><index:224>\r
+<char:aacute><font:><index:225>\r
+<char:acircumflex><font:><index:226>\r
+<char:atilde><font:><index:227>\r
+<char:adieresis><font:><index:228>\r
+<char:aring><font:><index:229>\r
+<char:ae><font:><index:230>\r
+<char:ccedilla><font:><index:231>\r
+<char:egrave><font:><index:232>\r
+<char:eacute><font:><index:233>\r
+<char:ecircumflex><font:><index:234>\r
+<char:edieresis><font:><index:235>\r
+<char:igrave><font:><index:236>\r
+<char:iacute><font:><index:237>\r
+<char:icircumflex><font:><index:238>\r
+<char:idieresis><font:><index:239>\r
+<char:eth><font:><index:240>\r
+<char:ntilde><font:><index:241>\r
+<char:ograve><font:><index:242>\r
+<char:oacute><font:><index:243>\r
+<char:ocircumflex><font:><index:244>\r
+<char:otilde><font:><index:245>\r
+<char:odieresis><font:><index:246>\r
+<char:divide><font:><index:247>\r
+<char:oslash><font:><index:248>\r
+<char:ugrave><font:><index:249>\r
+<char:uacute><font:><index:250>\r
+<char:ucircumflex><font:><index:251>\r
+<char:udieresis><font:><index:252>\r
+<char:yacute><font:><index:253>\r
+<char:thorn><font:><index:254>\r
+<char:ydieresis><font:><index:255>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/maps/symbol-charmap.txt b/Robust/src/Benchmarks/mlp/tagger/original-java/maps/symbol-charmap.txt
new file mode 100755 (executable)
index 0000000..4481c17
--- /dev/null
@@ -0,0 +1,195 @@
+# character map for Symbol font\r
+\r
+<char:Symbol><font:Symbol><index:for>\r
+<char:space><font:Symbol><index:32>\r
+<char:exclam><font:Symbol><index:33>\r
+<char:universal><font:Symbol><index:34>\r
+<char:numbersign><font:Symbol><index:35>\r
+<char:existential><font:Symbol><index:36>\r
+<char:percent><font:Symbol><index:37>\r
+<char:ampersand><font:Symbol><index:38>\r
+<char:suchthat><font:Symbol><index:39>\r
+<char:parenleft><font:Symbol><index:40>\r
+<char:parenright><font:Symbol><index:41>\r
+<char:asteriskmath><font:Symbol><index:42>\r
+<char:plus><font:Symbol><index:43>\r
+<char:comma><font:Symbol><index:44>\r
+<char:minus><font:Symbol><index:45>\r
+<char:period><font:Symbol><index:46>\r
+<char:slash><font:Symbol><index:47>\r
+<char:zero><font:Symbol><index:48>\r
+<char:one><font:Symbol><index:49>\r
+<char:two><font:Symbol><index:50>\r
+<char:three><font:Symbol><index:51>\r
+<char:four><font:Symbol><index:52>\r
+<char:five><font:Symbol><index:53>\r
+<char:six><font:Symbol><index:54>\r
+<char:seven><font:Symbol><index:55>\r
+<char:eight><font:Symbol><index:56>\r
+<char:nine><font:Symbol><index:57>\r
+<char:colon><font:Symbol><index:58>\r
+<char:semicolon><font:Symbol><index:59>\r
+<char:less><font:Symbol><index:60>\r
+<char:equal><font:Symbol><index:61>\r
+<char:greater><font:Symbol><index:62>\r
+<char:question><font:Symbol><index:63>\r
+<char:congruent><font:Symbol><index:64>\r
+<char:Alpha><font:Symbol><index:65>\r
+<char:Beta><font:Symbol><index:66>\r
+<char:Chi><font:Symbol><index:67>\r
+<char:Delta><font:Symbol><index:68>\r
+<char:Epsilon><font:Symbol><index:69>\r
+<char:Phi><font:Symbol><index:70>\r
+<char:Gamma><font:Symbol><index:71>\r
+<char:Eta><font:Symbol><index:72>\r
+<char:Iota><font:Symbol><index:73>\r
+<char:theta1><font:Symbol><index:74>\r
+<char:Kappa><font:Symbol><index:75>\r
+<char:Lambda><font:Symbol><index:76>\r
+<char:Mu><font:Symbol><index:77>\r
+<char:Nu><font:Symbol><index:78>\r
+<char:Omicron><font:Symbol><index:79>\r
+<char:Pi><font:Symbol><index:80>\r
+<char:Theta><font:Symbol><index:81>\r
+<char:Rho><font:Symbol><index:82>\r
+<char:Sigma><font:Symbol><index:83>\r
+<char:Tau><font:Symbol><index:84>\r
+<char:Upsilon><font:Symbol><index:85>\r
+<char:sigma1><font:Symbol><index:86>\r
+<char:Omega><font:Symbol><index:87>\r
+<char:Xi><font:Symbol><index:88>\r
+<char:Psi><font:Symbol><index:89>\r
+<char:Zeta><font:Symbol><index:90>\r
+<char:bracketleft><font:Symbol><index:91>\r
+<char:therefore><font:Symbol><index:92>\r
+<char:bracketright><font:Symbol><index:93>\r
+<char:perpendicular><font:Symbol><index:94>\r
+<char:underscore><font:Symbol><index:95>\r
+<char:radicalex><font:Symbol><index:96>\r
+<char:alpha><font:Symbol><index:97>\r
+<char:beta><font:Symbol><index:98>\r
+<char:chi><font:Symbol><index:99>\r
+<char:delta><font:Symbol><index:100>\r
+<char:epsilon><font:Symbol><index:101>\r
+<char:phi><font:Symbol><index:102>\r
+<char:gamma><font:Symbol><index:103>\r
+<char:eta><font:Symbol><index:104>\r
+<char:iota><font:Symbol><index:105>\r
+<char:phi1><font:Symbol><index:106>\r
+<char:kappa><font:Symbol><index:107>\r
+<char:lambda><font:Symbol><index:108>\r
+<char:mu><font:Symbol><index:109>\r
+<char:nu><font:Symbol><index:110>\r
+<char:omicron><font:Symbol><index:111>\r
+<char:pi><font:Symbol><index:112>\r
+<char:theta><font:Symbol><index:113>\r
+<char:rho><font:Symbol><index:114>\r
+<char:sigma><font:Symbol><index:115>\r
+<char:tau><font:Symbol><index:116>\r
+<char:upsilon><font:Symbol><index:117>\r
+<char:omega1><font:Symbol><index:118>\r
+<char:omega><font:Symbol><index:119>\r
+<char:xi><font:Symbol><index:120>\r
+<char:psi><font:Symbol><index:121>\r
+<char:zeta><font:Symbol><index:122>\r
+<char:braceleft><font:Symbol><index:123>\r
+<char:bar><font:Symbol><index:124>\r
+<char:braceright><font:Symbol><index:125>\r
+<char:similar><font:Symbol><index:126>\r
+<char:Euro><font:Symbol><index:160>\r
+<char:Upsilon1><font:Symbol><index:161>\r
+<char:minute><font:Symbol><index:162>\r
+<char:lessequal><font:Symbol><index:163>\r
+<char:fraction><font:Symbol><index:164>\r
+<char:infinity><font:Symbol><index:165>\r
+<char:florin><font:Symbol><index:166>\r
+<char:club><font:Symbol><index:167>\r
+<char:diamond><font:Symbol><index:168>\r
+<char:heart><font:Symbol><index:169>\r
+<char:spade><font:Symbol><index:170>\r
+<char:arrowboth><font:Symbol><index:171>\r
+<char:arrowleft><font:Symbol><index:172>\r
+<char:arrowup><font:Symbol><index:173>\r
+<char:arrowright><font:Symbol><index:174>\r
+<char:arrowdown><font:Symbol><index:175>\r
+<char:degree><font:Symbol><index:176>\r
+<char:plusminus><font:Symbol><index:177>\r
+<char:second><font:Symbol><index:178>\r
+<char:greaterequal><font:Symbol><index:179>\r
+<char:multiply><font:Symbol><index:180>\r
+<char:proportional><font:Symbol><index:181>\r
+<char:partialdiff><font:Symbol><index:182>\r
+<char:bullet><font:Symbol><index:183>\r
+<char:divide><font:Symbol><index:184>\r
+<char:notequal><font:Symbol><index:185>\r
+<char:equivalence><font:Symbol><index:186>\r
+<char:approxequal><font:Symbol><index:187>\r
+\r
+# seems to be a quarter fraction\r
+# <char:ellipsis><font:Symbol><index:188>\r
+\r
+<char:arrowvertex><font:Symbol><index:189>\r
+<char:arrowhorizex><font:Symbol><index:190>\r
+<char:carriagereturn><font:Symbol><index:191>\r
+<char:aleph><font:Symbol><index:192>\r
+<char:Ifraktur><font:Symbol><index:193>\r
+<char:Rfraktur><font:Symbol><index:194>\r
+<char:weierstrass><font:Symbol><index:195>\r
+<char:circlemultiply><font:Symbol><index:196>\r
+<char:circleplus><font:Symbol><index:197>\r
+<char:emptyset><font:Symbol><index:198>\r
+<char:intersection><font:Symbol><index:199>\r
+<char:union><font:Symbol><index:200>\r
+<char:propersuperset><font:Symbol><index:201>\r
+<char:reflexsuperset><font:Symbol><index:202>\r
+<char:notsubset><font:Symbol><index:203>\r
+<char:propersubset><font:Symbol><index:204>\r
+<char:reflexsubset><font:Symbol><index:205>\r
+<char:element><font:Symbol><index:206>\r
+<char:notelement><font:Symbol><index:207>\r
+<char:angle><font:Symbol><index:208>\r
+<char:gradient><font:Symbol><index:209>\r
+<char:registerserif><font:Symbol><index:210>\r
+<char:copyrightserif><font:Symbol><index:211>\r
+<char:trademarkserif><font:Symbol><index:212>\r
+<char:product><font:Symbol><index:213>\r
+<char:radical><font:Symbol><index:214>\r
+<char:dotmath><font:Symbol><index:215>\r
+<char:logicalnot><font:Symbol><index:216>\r
+<char:logicaland><font:Symbol><index:217>\r
+<char:logicalor><font:Symbol><index:218>\r
+<char:arrowdblboth><font:Symbol><index:219>\r
+<char:arrowdblleft><font:Symbol><index:220>\r
+<char:arrowdblup><font:Symbol><index:221>\r
+<char:arrowdblright><font:Symbol><index:222>\r
+<char:arrowdbldown><font:Symbol><index:223>\r
+<char:lozenge><font:Symbol><index:224>\r
+<char:angleleft><font:Symbol><index:225>\r
+<char:registersans><font:Symbol><index:226>\r
+<char:copyrightsans><font:Symbol><index:227>\r
+<char:trademarksans><font:Symbol><index:228>\r
+<char:summation><font:Symbol><index:229>\r
+<char:parenlefttp><font:Symbol><index:230>\r
+<char:parenleftex><font:Symbol><index:231>\r
+<char:parenleftbt><font:Symbol><index:232>\r
+<char:bracketlefttp><font:Symbol><index:233>\r
+<char:bracketleftex><font:Symbol><index:234>\r
+<char:bracketleftbt><font:Symbol><index:235>\r
+<char:bracelefttp><font:Symbol><index:236>\r
+<char:braceleftmid><font:Symbol><index:237>\r
+<char:braceleftbt><font:Symbol><index:238>\r
+<char:braceex><font:Symbol><index:239>\r
+<char:angleright><font:Symbol><index:241>\r
+<char:integral><font:Symbol><index:242>\r
+<char:integraltp><font:Symbol><index:243>\r
+<char:integralex><font:Symbol><index:244>\r
+<char:integralbt><font:Symbol><index:245>\r
+<char:parenrighttp><font:Symbol><index:246>\r
+<char:parenrightex><font:Symbol><index:247>\r
+<char:parenrightbt><font:Symbol><index:248>\r
+<char:bracketrighttp><font:Symbol><index:249>\r
+<char:bracketrightex><font:Symbol><index:250>\r
+<char:bracketrightbt><font:Symbol><index:251>\r
+<char:bracerighttp><font:Symbol><index:252>\r
+<char:bracerightmid><font:Symbol><index:253>\r
+<char:bracerightbt><font:Symbol><index:254>\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Action.java b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Action.java
new file mode 100755 (executable)
index 0000000..d8eac4b
--- /dev/null
@@ -0,0 +1,28 @@
+/**\r
+ * Action class\r
+ * Represents an action performed in response to a token\r
+ * Instance of command pattern\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/06/01\r
+ */\r
+\r
+package tagger;\r
+import java.util.*;\r
+\r
+public abstract class Action {\r
+       /**\r
+       * requires: iter is an iterator that just yielded this\r
+       * ensures: performs action for token, and may remove itself from iter\r
+       * default behaviour is equivalent to perform\r
+       */\r
+       public void perform (Token token, Iterator iter) {\r
+               perform (token);\r
+               }\r
+\r
+       public  void perform (Token token) {\r
+               ;\r
+               }\r
+       }\r
+\r
+\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Assert.java b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Assert.java
new file mode 100755 (executable)
index 0000000..6cad6ba
--- /dev/null
@@ -0,0 +1,25 @@
+/**\r
+ * Assert class\r
+ * Provides assertion checking\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/03/01\r
+ */\r
+\r
+package tagger;\r
+import java.io.*;\r
+\r
+public class Assert {\r
+       static PrintStream error_stream = Tagger.error_stream;\r
+\r
+       public static void assert (boolean cond) {\r
+               if (!cond) {\r
+                       error_stream.println ("Assertion failure");\r
+                       // print stack trace\r
+                       }\r
+               }\r
+\r
+       public static void unreachable () {\r
+               error_stream.println ("Assertion failure");\r
+               }\r
+       }\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Counter.java b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Counter.java
new file mode 100755 (executable)
index 0000000..888e079
--- /dev/null
@@ -0,0 +1,125 @@
+/**\r
+ * Counter class\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/03/01\r
+ */\r
+\r
+package tagger;\r
+import java.io.*;\r
+\r
+public class Counter {\r
+       private int count;\r
+       private int initial;\r
+       private int type;\r
+\r
+       final static int NO_SUCH_TYPE = -1;\r
+       final static int ARABIC = 0;\r
+       final static int ROMAN_UPPER = 1;\r
+       final static int ROMAN_LOWER = 2;\r
+       final static int ALPHA_UPPER = 3;\r
+       final static int ALPHA_LOWER = 4;\r
+\r
+       // eventually recognize counter_type and set initial count and output format\r
+       // takes style and stream for error reporting\r
+       /*\r
+       * requires: count_prop and style are non null\r
+       *\r
+       */\r
+       public Counter (String count_prop, String style, PrintStream error_stream) {\r
+               Assert.assert (count_prop != null);\r
+               Assert.assert (style != null);\r
+               type = get_type (count_prop);\r
+               switch (type) {\r
+                       case NO_SUCH_TYPE:\r
+                               type = ARABIC;\r
+                               initial = 0;\r
+                               break;\r
+                       case ALPHA_LOWER:\r
+                       case ALPHA_UPPER:\r
+                               if (count_prop.length () != 1) {\r
+                                       error_stream.println ("Bad counter type for style " + style + ": " + count_prop);\r
+                                       initial = 0;\r
+                                       break;\r
+                                       }\r
+                               initial = count_prop.toLowerCase().charAt (0) - 'a';\r
+                               break;\r
+                       case ARABIC:\r
+                               try {\r
+                               initial = Integer.parseInt (count_prop) - 1;\r
+                               } catch (NumberFormatException e) {\r
+                                       error_stream.println ("Bad counter type for style " + style + ": " + count_prop + "; " + e.getMessage());\r
+                                       }\r
+                               break;\r
+                       case ROMAN_LOWER:\r
+                       case ROMAN_UPPER:\r
+                               // not yet implemented\r
+                               initial = 0;\r
+                               type = ARABIC;\r
+                               break;\r
+                       default:\r
+                               Assert.unreachable ();\r
+                       }\r
+               count = initial;\r
+               }\r
+\r
+       /**\r
+       * ensures: increments counter\r
+       * returns true iff successful, false otherwise (eg, because alphabetic counter went past 'z')\r
+       */\r
+       public boolean increment () {\r
+               if ((type == ALPHA_UPPER || type == ALPHA_LOWER) && count == 26)\r
+                       return false;\r
+               count++;\r
+               return true;\r
+               }\r
+\r
+       public void reset () {\r
+               count = initial;\r
+               }\r
+\r
+       public String unparse () {\r
+               switch (type) {\r
+                       case ALPHA_LOWER: {\r
+                               char c = (char) ('a' + count - 1);\r
+                               return new Character (c).toString();\r
+                               }\r
+                       case ALPHA_UPPER: {\r
+                               char c = (char) ('A' + count - 1);\r
+                               return new Character (c).toString();\r
+                               }\r
+                       case ARABIC:\r
+                               return String.valueOf (count);\r
+                       case ROMAN_LOWER:\r
+                       case ROMAN_UPPER:\r
+                               // not yet implemented\r
+                               Assert.unreachable ();\r
+                               break;\r
+                       default:\r
+                               Assert.unreachable ();\r
+                       }\r
+               return "DUMMY";\r
+               }\r
+\r
+       /**\r
+       *\r
+       * ensures: returns counter type of counter given in the string counter_type\r
+       * as an int, being equal to one of the values of the constants declared in the Counter class.\r
+       * returns Counter.NO_SUCH_TYPE if the string is not well formed.\r
+       */\r
+       public static int get_type (String counter_type) {\r
+               if (counter_type.length() == 0) return NO_SUCH_TYPE;\r
+               char c = counter_type.charAt (0);\r
+               if (c >= 'a' && c <= 'z')\r
+                       return ALPHA_LOWER;\r
+               if (c >= 'A' && c <= 'Z')\r
+                       return ALPHA_UPPER;\r
+               if (c == 'i' || c == 'v' || c == 'x' ||c == 'l' || c == 'c' || c == 'm')\r
+                       return ROMAN_LOWER;\r
+               if (c == 'I' || c == 'V' || c == 'X' ||c == 'L' || c == 'C' || c == 'M')\r
+                       return ROMAN_LOWER;\r
+               if (c >= '0' && c <= '9')\r
+                       return ARABIC;\r
+               return NO_SUCH_TYPE;\r
+               }\r
+}
\ No newline at end of file
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Engine.java b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Engine.java
new file mode 100755 (executable)
index 0000000..72a8e47
--- /dev/null
@@ -0,0 +1,78 @@
+/**\r
+ * Engine class\r
+ * Maps token types to actions\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/06/01\r
+ */\r
+\r
+package tagger;\r
+import java.util.*;\r
+\r
+public class Engine {\r
+       /**\r
+       * There are some very tricky concurrent modification issues with this class.\r
+       * Can't execute a register or unregister method during an execution of consume_token\r
+       * if the register or unregister affects the same list of actions associated with the token.\r
+       * This means that during a consume_token for some type, can't register or unregister for\r
+       * that type, or for the all types.\r
+       * Note that a version of the perform method of action takes an iterator argument to\r
+       * allow an action to remove itself.\r
+       */\r
+\r
+       // array of Action lists indexed on token type\r
+       private LinkedList [] actions;\r
+\r
+       // actions performed for all token types\r
+       private LinkedList default_actions;\r
+\r
+       public Engine () {\r
+               actions = new LinkedList [Token.MAXTOKEN + 1];\r
+               for (int i = 0; i < actions.length; i++)\r
+                       actions[i] = new LinkedList ();\r
+               default_actions = new LinkedList ();\r
+       }\r
+\r
+       public void register_by_type (Action action, int type) {\r
+               register_by_type_front (action, type);\r
+               }\r
+\r
+       public void register_for_all (Action action) {\r
+               default_actions.addFirst (action);\r
+               }\r
+\r
+       public void unregister_for_all (Action action) {\r
+               default_actions.remove (action);\r
+               }\r
+\r
+       public void register_by_type_front (Action action, int type) {\r
+               Assert.assert (type >= 0);\r
+               Assert.assert (type <= Token.MAXTOKEN);\r
+               actions[type].addFirst (action);\r
+               }\r
+\r
+       public void register_by_type_back (Action action, int type) {\r
+               Assert.assert (type >= 0);\r
+               Assert.assert (type <= Token.MAXTOKEN);\r
+               actions[type].addLast (action);\r
+               }\r
+\r
+       public void unregister_by_type (Action action, int type) {\r
+               Assert.assert (type >= 0);\r
+               Assert.assert (type <= Token.MAXTOKEN);\r
+               actions[type].remove (action);\r
+               }\r
+\r
+       public void consume_token (Token token) {\r
+               perform_actions (default_actions, token);\r
+               perform_actions (actions[token.type], token);\r
+               }\r
+\r
+       public static void perform_actions (LinkedList actions, Token token) {\r
+               Iterator i = actions.iterator ();\r
+               while (i.hasNext ()) {\r
+                       Action a = (Action) i.next ();\r
+                       a.perform (token, i);\r
+                       }\r
+               }\r
+}
\ No newline at end of file
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Generator.java b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Generator.java
new file mode 100755 (executable)
index 0000000..d5b2dc4
--- /dev/null
@@ -0,0 +1,42 @@
+/**\r
+ * Generator interface\r
+ * Generic backend tagged text generator\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/08/01\r
+ */\r
+\r
+package tagger;\r
+import java.io.*;\r
+import java.util.*;\r
+\r
+public interface Generator {\r
+       // formats to pass to push_format\r
+       int ROMAN = 0;\r
+       int ITALICS = 1;\r
+       int BOLD = 2;\r
+       int SUBSCRIPT = 3;\r
+       int SUPERSCRIPT = 4;\r
+\r
+       // prints new line to output\r
+       void linefeed ();\r
+\r
+       void new_para (String style);\r
+\r
+       // inserts code for new line\r
+       void new_line ();\r
+\r
+       void special_char (String font, String index);\r
+\r
+       // for dashes, ellipses, etc\r
+       void special_char (String index);\r
+\r
+       void plaintext (String text);\r
+       void push_format (int format);\r
+       void pop_format ();\r
+\r
+       // turn output suppression on and off\r
+       void suppress_on ();\r
+       void suppress_off ();\r
+\r
+       }\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Numbering.java b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Numbering.java
new file mode 100755 (executable)
index 0000000..ff01162
--- /dev/null
@@ -0,0 +1,198 @@
+/**\r
+ * Numbering class\r
+ * Provides special navigations for numbering\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/03/01\r
+ */\r
+\r
+package tagger;\r
+import java.io.*;\r
+import java.util.*;\r
+\r
+public class Numbering {\r
+       private PrintStream error_stream;\r
+       private PropertyMap style_map;\r
+\r
+       static String PARENT_PROPNAME = "parent";\r
+       static String CHILD_PROPNAME = "child";\r
+       static String ROOT_PROPNAME = "root";\r
+       static String COUNTER_PROPNAME = "counter";\r
+       static String SEPARATOR_PROPNAME = "separator";\r
+       static String LEADER_PROPNAME = "leader";\r
+       static String TRAILER_PROPNAME = "trailer";\r
+\r
+       /*\r
+       * The graph structure of the numbering relations is represented using\r
+       * properties in the paragraph style property map.\r
+       * Each style is mapped to its root -- the ancestor with no parent in the\r
+       * numbering relationship -- and to its parent and child.\r
+       * The child and root properties are added; the parent property is given\r
+       * in the style sheet file.\r
+       *\r
+       * If a style is numbered, its ancestors must be also.\r
+       * This property is not currently checked.\r
+       */\r
+\r
+       /*\r
+       * Representation invariant\r
+       *\r
+       * Definition: A style is numbered if it has a counter property.\r
+       * A numbered style has a root property.\r
+       * A root style has itself as root and has no parent.\r
+       * There is a bidirectional parent/child chain from a style to its root\r
+       *\r
+       * Checking that style sheet is well formed?\r
+       */\r
+\r
+\r
+       // maps paragraph style names to counters\r
+       // styles that are not numbered are not mapped\r
+       private HashMap counter_map; // String -> Counter\r
+\r
+    /**\r
+       * ensures: constructs a Numbering\r
+       * not well formed until incorporate called\r
+       */\r
+       public Numbering (PropertyMap style_map, PrintStream error_stream) {\r
+               this.style_map = style_map;\r
+               this.error_stream = error_stream;\r
+               counter_map = new HashMap ();\r
+               }\r
+\r
+    /**\r
+       * ensures: constructs a Numbering\r
+       * modifies: property lists in style_map\r
+       */\r
+       /*\r
+       public Numbering (PropertyMap style_map) {\r
+               this.style_map = style_map;\r
+               add_extra_properties (style_map);\r
+               initialize_counters (style_map);\r
+               }\r
+       */\r
+\r
+    /**\r
+       * ensures: constructs a Numbering using current entries in style_map\r
+       * modifies: property lists in style_map\r
+       */\r
+       public void incorporate () {\r
+               add_extra_properties ();\r
+               initialize_counters ();\r
+               }\r
+\r
+       /*\r
+       * requires: all ancestor and descendant styles of style are numbered iff style is numbered\r
+       * ensures: returns the numbering string for a new paragraph whose style name is _style_\r
+       *\r
+       * format of numbering string is:\r
+       * <mytrailer><rootcounter><rootseparator>...<counter><separator>...<mycounter><mytrailer>\r
+       */\r
+       public String get_numbering_string (String style) {\r
+               // return empty string if style is not numbered\r
+               if (!style_has_property (style, COUNTER_PROPNAME)) return "";\r
+\r
+               // initialize numbering string to leader\r
+               String leader = style_map.get_property (style, LEADER_PROPNAME);\r
+               String numbering = leader == null ? "" : leader;\r
+\r
+               // append numbering for each style from root to this style\r
+               // each followed by its separator\r
+               String s = style_map.get_property (style, ROOT_PROPNAME);\r
+               Assert.assert (s != null);\r
+               while (! s.equals (style)) {\r
+                       numbering += ((Counter) counter_map.get(s)).unparse ();\r
+                       String separator = style_map.get_property (s, SEPARATOR_PROPNAME);\r
+                       numbering += separator == null ? "" : separator;\r
+                       s = style_map.get_property (s, CHILD_PROPNAME);\r
+                       }\r
+\r
+               // increment numbering for this style and append its string\r
+               Counter c = (Counter) counter_map.get (s);\r
+               boolean success = c.increment ();\r
+               if (!success)\r
+                       error_stream.println ("Counter overrun for style: " + style);\r
+               numbering += c.unparse ();\r
+\r
+               // append trailer\r
+               String trailer = style_map.get_property (s, TRAILER_PROPNAME);\r
+               numbering += trailer == null ? "" : trailer;\r
+\r
+               // reset counters for all descendant styles\r
+               s = style_map.get_property (s, CHILD_PROPNAME);\r
+               while (s != null) {\r
+                       c = (Counter) counter_map.get (s);\r
+                       c.reset ();\r
+                       s = style_map.get_property (s, CHILD_PROPNAME);\r
+                       }\r
+               return numbering;\r
+               }\r
+\r
+       private void add_extra_properties () {\r
+               add_child_property ();\r
+               add_root_property ();\r
+               }\r
+\r
+       // for each style with a counter property, insert into counter_map\r
+       private void initialize_counters () {\r
+               Set styles = style_map.get_items ();\r
+               Iterator iter = styles.iterator ();\r
+               while (iter.hasNext ()) {\r
+                       String style = (String) iter.next ();\r
+                       if (style_has_property (style, COUNTER_PROPNAME)) {\r
+                               // get counter type (arabic, roman, etc)\r
+                               String count_prop = style_map.get_property (style, COUNTER_PROPNAME);\r
+                               int count_type = Counter.get_type (count_prop);\r
+                               if (count_type == Counter.NO_SUCH_TYPE) {\r
+                                       error_stream.println ("Bad counter type for style " + style + ": " + count_prop);\r
+                                       // and insert into counter_map anyway to preserve rep invariant\r
+                                       // so must check counter type when counter is created and default if bad\r
+                                       }\r
+                               counter_map.put (style, new Counter (count_prop, style, error_stream));\r
+                               }\r
+                       }\r
+               }\r
+\r
+       // add to each style that is a parent of another style a child property to it\r
+       private void add_child_property () {\r
+               Set styles = style_map.get_items ();\r
+               Iterator iter = styles.iterator ();\r
+               while (iter.hasNext ()) {\r
+                       String style = (String) iter.next ();\r
+                       String pstyle = (String) style_map.get_property (style, PARENT_PROPNAME);\r
+                       // if parent exists, add child property to it\r
+                       if (pstyle != null) {\r
+                               List props = style_map.get_property_list (pstyle);\r
+                               props.add (new Property (CHILD_PROPNAME, style));\r
+                               }\r
+                       }\r
+               }\r
+\r
+       // add root property to each numbered style\r
+       private void add_root_property () {\r
+               Set styles = style_map.get_items ();\r
+               Iterator iter = styles.iterator ();\r
+               while (iter.hasNext ()) {\r
+                       String style = (String) iter.next ();\r
+                       if (!style_has_property (style, PARENT_PROPNAME)) {\r
+                               // if no parent, then it's a root, so add root property for it and all descendants\r
+                               String root = style;\r
+                               while (style != null) {\r
+                                       List props = style_map.get_property_list (style);\r
+                                       props.add (new Property (ROOT_PROPNAME, root));\r
+                                       style = style_map.get_property (style, CHILD_PROPNAME);\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+       // ensures: returns true iff style has property prop_name\r
+       private boolean style_has_property (String style, String prop_name) {\r
+               String p = (String) style_map.get_property (style, prop_name);\r
+               return p != null;\r
+               }\r
+\r
+       public String toString () {\r
+               return "UNIMPLEMENTED";\r
+               }\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Property.java b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Property.java
new file mode 100755 (executable)
index 0000000..651858a
--- /dev/null
@@ -0,0 +1,25 @@
+/**\r
+ * Property class\r
+ * <p>\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/02/01\r
+ */\r
+\r
+package tagger;\r
+import java.io.*;\r
+import java.util.*;\r
+\r
+public class Property {\r
+       public String property;\r
+       public String value;\r
+\r
+       public Property (String p, String v) {\r
+               property = p;\r
+               value = v;\r
+               }\r
+\r
+       public String toString () {\r
+               return "<" + property + ":" + value + ">";\r
+               }\r
+       }
\ No newline at end of file
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/PropertyMap.java b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/PropertyMap.java
new file mode 100755 (executable)
index 0000000..4b3efdf
--- /dev/null
@@ -0,0 +1,84 @@
+/**\r
+ * PropertyMap class\r
+ * Maps identifiers to property lists\r
+ * Used for stylesheets, character maps, etc\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/03/01\r
+ */\r
+\r
+package tagger;\r
+import java.io.*;\r
+import java.util.*;\r
+\r
+public class PropertyMap {\r
+       private HashMap map;    // String -> LinkedList [Property]\r
+\r
+    /**\r
+       * ensures: constructs an empty property map\r
+       */\r
+       public PropertyMap () {\r
+               map = new HashMap ();\r
+               }\r
+\r
+    /**\r
+       * ensures: constructs a property map using the parser <code>p</code>.\r
+       */\r
+       public PropertyMap (PropertyParser p) {\r
+               map = new HashMap ();\r
+               try {\r
+                       while (p.has_more_properties ()) {\r
+                               LinkedList props = p.get_property_list ();\r
+                               Property prop = (Property) props.removeFirst ();\r
+                               map.put (prop.value, props);\r
+                               }\r
+                       } catch (IOException e) {Assert.unreachable ();}\r
+               }\r
+\r
+    /**\r
+       * ensures: incorporates properties using the parser <code>p</code>.\r
+       */\r
+       public void incorporate (PropertyParser p) {\r
+               try {\r
+                       while (p.has_more_properties ()) {\r
+                               LinkedList props = p.get_property_list ();\r
+                               Property prop = (Property) props.removeFirst ();\r
+                               map.put (prop.value, props);\r
+                               }\r
+                       } catch (IOException e) {Assert.unreachable ();}\r
+               }\r
+\r
+    /**\r
+       * @return the property list for item <code>item</code>. Returns null if no such item.\r
+       */\r
+       public List get_property_list (String item) {\r
+               return (List) map.get (item);\r
+               }\r
+\r
+    /**\r
+       * @return the value of property <code>prop</code> for item <code>item</code>\r
+       * or null if it does not exist\r
+       */\r
+       public String get_property (String item, String prop) {\r
+               List props = (List) map.get (item);\r
+               if (props == null) return null;\r
+               ListIterator iter = props.listIterator ();\r
+               while (iter.hasNext ()) {\r
+                       Property p = (Property) iter.next ();\r
+                       if (p.property.equals (prop))\r
+                               return p.value;\r
+                       }\r
+               return null;\r
+               }\r
+\r
+    /**\r
+       * @return the set of items with property lists in the map\r
+       */\r
+       public Set get_items () {\r
+               return map.keySet ();\r
+               }\r
+\r
+       public String toString () {\r
+               return map.toString ();\r
+               }\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/PropertyParser.java b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/PropertyParser.java
new file mode 100755 (executable)
index 0000000..14cb790
--- /dev/null
@@ -0,0 +1,104 @@
+/**\r
+ * PropertyParser class\r
+ * Parses property files\r
+ * <p>\r
+ * <code>int</code>.\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/02/01\r
+ */\r
+\r
+package tagger;\r
+import java.io.*;\r
+import java.util.*;\r
+\r
+public class PropertyParser {\r
+       private LineNumberReader reader;\r
+       private String token;\r
+       private int next_char;\r
+       private PrintStream error_reporter;\r
+\r
+       public PropertyParser (Reader r, PrintStream s) throws IOException {\r
+               reader = new LineNumberReader (r);\r
+               error_reporter = s;\r
+               next_char = reader.read ();\r
+               consume_comments ();\r
+               }\r
+\r
+       private void consume_comments () throws IOException {\r
+               // consume lines that don't start with <\r
+               while (next_char != '<' && !is_eos (next_char)) {\r
+                       if (!is_eol (next_char))\r
+                               reader.readLine ();\r
+                       consume_char ();\r
+                       }\r
+               }\r
+\r
+       private void consume_char ()  throws IOException {\r
+               token += (char) next_char;\r
+               next_char = reader.read ();\r
+               }\r
+\r
+       private void error (String msg) {\r
+               // correct to number from 1, not zero\r
+               int line_number = reader.getLineNumber() + 1;\r
+               error_reporter.println (line_number + ": " + msg);\r
+               }\r
+\r
+       public boolean has_more_properties () {\r
+               return (!is_eos (next_char));\r
+               }\r
+\r
+    /**\r
+       * requires: next_char contains next character in reader <p>\r
+       * ensures: returns list of properties until end of line or stream <p>\r
+       *       according to the following syntax:\r
+       *               property list is sequence of properties followed by eol of eos\r
+       *               property is left-angle, property-name, colon, value, right-angle\r
+       *               property-name is alphanumeric string, but value is any char sequence\r
+       *       skips lines that do not start with <\r
+       *       reports syntax errors on this.error_reporter\r
+       *       Syntax\r
+       * @return list of properties until end of line or stream.\r
+       *       Notes: chose LinkedList because it provides removeFirst, to support common\r
+       *       case in which first property is removed (eg, because it's a style name)\r
+       */\r
+       public LinkedList get_property_list () throws IOException {\r
+               LinkedList result = new LinkedList ();\r
+               while (!is_eol (next_char) && !is_eos(next_char))\r
+                       result.add (get_property ());\r
+               consume_char ();\r
+               consume_comments ();\r
+               return result;\r
+               }\r
+\r
+       private Property get_property () throws IOException {\r
+               if (next_char != '<')\r
+                       error ("Found " + next_char + " when expecting <");\r
+               consume_char ();\r
+               token = "";\r
+               while (is_alphanumeric (next_char)) consume_char ();\r
+               String property = token;\r
+               if (next_char != ':')\r
+                       error ("Found " + next_char + " following " + token + " when expecting :");\r
+               consume_char ();\r
+               token = "";\r
+               while (next_char != '>' && !is_eol(next_char) && !is_eos (next_char))\r
+                       consume_char ();\r
+               String value = token;\r
+               if (next_char != '>')\r
+                       error ("Found " + next_char + " following " + token + " when expecting >");\r
+               consume_char ();\r
+               return new Property (property, value);\r
+               }\r
+\r
+       static boolean is_eol (int c) {return c == '\n';}\r
+       static boolean is_eos (int c) {return c == -1;}\r
+       static boolean is_alphabetic (int c) {\r
+               return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';\r
+               }\r
+       static boolean is_numeric (int c) {return c >= '0' && c <= '9';}\r
+       static boolean is_alphanumeric (int c) {\r
+               return is_numeric (c) || is_alphabetic (c);\r
+               }\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/QuarkGenerator.java b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/QuarkGenerator.java
new file mode 100755 (executable)
index 0000000..68c3b7b
--- /dev/null
@@ -0,0 +1,92 @@
+/**\r
+ * QuarkGenerator interface\r
+ * Backend tagged text generator for QuarkXpress\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/08/01\r
+ */\r
+\r
+package tagger;\r
+import java.io.*;\r
+import java.util.*;\r
+\r
+public class QuarkGenerator implements Generator {\r
+       PrintStream output_stream;\r
+       Stack format_stack;\r
+       private boolean on = true;\r
+\r
+       public QuarkGenerator (PrintStream s) {\r
+               output_stream = s;\r
+\r
+               // stack holds strings used to terminate formats\r
+               format_stack = new Stack ();\r
+               }\r
+\r
+       public void suppress_on () {\r
+               on = false;\r
+               }\r
+\r
+       public void suppress_off () {\r
+               on = true;\r
+               }\r
+\r
+       private void print (String s) {\r
+               if (on) output_stream.print (s);\r
+               }\r
+\r
+       public void linefeed () {\r
+               if (on) output_stream.println ();\r
+               }\r
+\r
+       // print "@style:"\r
+       public void new_para (String style) {\r
+               print ("@" + style + ":");\r
+               }\r
+\r
+       // print "<\n>"\r
+       public void new_line () {\r
+               print ("<\\n>");\r
+               }\r
+\r
+       public void special_char (String font, String index) {\r
+               print ("<f\"" + font + "\"><\\#" + index + "><f$>");\r
+               }\r
+\r
+       public void special_char (String index) {\r
+               print ("<\\#" + index + ">");\r
+               }\r
+\r
+       public void plaintext (String text) {\r
+               print (text);\r
+               }\r
+\r
+       public void push_format (int format) {\r
+               switch (format) {\r
+                       case Generator.ROMAN:\r
+                       case Generator.ITALICS:\r
+                               print ("<I>");\r
+                               format_stack.push ("<I>");\r
+                               return;\r
+                       case Generator.BOLD:\r
+                               print ("<B>");\r
+                               format_stack.push ("<B>");\r
+                               return;\r
+                       case Generator.SUBSCRIPT:\r
+                               print ("<->");\r
+                               format_stack.push ("<->");\r
+                               return;\r
+                       case Generator.SUPERSCRIPT:\r
+                               print ("<+>");\r
+                               format_stack.push ("<+>");\r
+                               return;\r
+                       default:\r
+                               Assert.unreachable ();\r
+                       }\r
+               }\r
+\r
+       public void pop_format () {\r
+               // for now, handle too many pops without report\r
+               if (format_stack.isEmpty ()) return;\r
+               print ((String) format_stack.pop ());\r
+               }\r
+       }\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/SourceParser.java b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/SourceParser.java
new file mode 100755 (executable)
index 0000000..a5d5fbf
--- /dev/null
@@ -0,0 +1,285 @@
+/**\r
+ * SourceParser class\r
+ * <p>\r
+ * <code>int</code>.\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/02/01\r
+ */\r
+\r
+package tagger;\r
+import java.io.*;\r
+import java.util.*;\r
+\r
+public class SourceParser {\r
+       final static String loadcharmapcommand_name = "loadchars";\r
+       final static String loadstylesheetcommand_name = "loadstyles";\r
+       final static String preamblecommand_name = "preamble";\r
+       final static String refcommand_name = "ref";\r
+       final static String tagcommand_name = "tag";\r
+       final static String citecommand_name = "cite";\r
+       final static String separatorcommand_name = "sep";\r
+\r
+       private LineNumberReader reader;\r
+\r
+       // holds set of strings recognized as paragraph styles\r
+       private Set parastyles;\r
+\r
+       // holds the previous value of next_char\r
+       private int last_char;\r
+       private int next_char;\r
+       private boolean within_single_quotes;\r
+       private boolean within_double_quotes;\r
+       private boolean at_start_of_line;\r
+       private String token;\r
+\r
+       public SourceParser (Reader reader, Set parastyles) throws IOException {\r
+               this.reader = new LineNumberReader (reader);\r
+               this.parastyles = parastyles;\r
+               next_char = reader.read ();\r
+               last_char = -1;\r
+               at_start_of_line = true;\r
+               }\r
+\r
+       public boolean has_more_tokens () {\r
+               return (next_char != -1);\r
+               }\r
+\r
+       private void consume_char ()  throws IOException {\r
+               token += (char) next_char;\r
+               last_char = next_char;\r
+               next_char = reader.read ();\r
+               }\r
+\r
+       // consume until next close curly and return string excluding curly\r
+       private String consume_arg ()  throws IOException {\r
+               consume_char (); // consume open curly\r
+               token = "";\r
+               consume_char ();\r
+               while (!is_close_curly (next_char) && !is_eol (next_char)) consume_char ();\r
+               String arg = token;\r
+               consume_char (); // consume close curly\r
+               return arg;\r
+               }\r
+\r
+    /**\r
+       * requires: next_char contains next character in reader <p>\r
+       * ensures: returns next token according to one of these productions: <p>\r
+       * <blockquote><pre>\r
+       *       char-sequence = alphanumeric+\r
+       *               whitespace ::= (space | tab)+\r
+       *               command ::= slash alphanum* [star]\r
+       *               paragraph-break ::= <blank line>\r
+       *               line-break ::= slash slash\r
+       *               hyphen-sequence ::= hyphen+\r
+       *               dot-sequence ::= dot+\r
+       *               underscore ::= underscore\r
+       * </pre></blockquote>\r
+       *       quote characters, disambiguated by context:\r
+       *               open-single-quote: when not preceded by alphanumeric\r
+       *               close-single-quote: when not followed by alphanumeric and preceded by\r
+       *                       open-single-quote\r
+       *               open-double-quote: when not preceded by open-double-quote\r
+       *               close-double-quote: when preceded by open-double-quote\r
+       *               apostrophe: between alphanumerics, or when followed by numeric\r
+       *               prime: after alphanumeric, when not followed by alphanumeric,\r
+       *                       and not preceded by open-single-quote\r
+       * @return the next token.\r
+       *       explicitly returns end of stream token.\r
+       */\r
+       public Token get_token () throws IOException {\r
+               token = new String ();\r
+               if (is_eos (next_char))\r
+                       return new Token (Token.ENDOFSTREAM, reader.getLineNumber ());\r
+               if (at_start_of_line) {\r
+                       if (is_eol (next_char)) {\r
+                               consume_char ();\r
+                               within_single_quotes = false;\r
+                               within_double_quotes = false;\r
+                               return new Token (Token.PARABREAK, reader.getLineNumber ());\r
+                               }\r
+                       else if (is_hash (next_char)) {\r
+                               String line = reader.readLine ();\r
+                               consume_char ();\r
+                               return new Token (Token.COMMENT, line, reader.getLineNumber ());\r
+                               }\r
+                       else\r
+                               at_start_of_line = false;\r
+                       }\r
+               if (is_eol (next_char)) {\r
+                       consume_char ();\r
+                       at_start_of_line = true;\r
+                       if (is_eol (next_char)) {\r
+                               consume_char ();\r
+                               within_single_quotes = false;\r
+                               within_double_quotes = false;\r
+                               return new Token (Token.PARABREAK, reader.getLineNumber ());\r
+                               }\r
+                       // check this\r
+                       return new Token (Token.WHITESPACE, " ", reader.getLineNumber ());\r
+                       }\r
+               if (is_slash (next_char)) {\r
+                       consume_char ();\r
+                       token = "";\r
+                       if (is_slash (next_char)) {\r
+                               consume_char ();\r
+                               return new Token (Token.LINEBREAK, reader.getLineNumber ());\r
+                               }\r
+                       if (!is_alphabetic (next_char)) {\r
+                               // next character assumed prefixed with slash to avoid special treatment\r
+                               // eg, \< for <, \$ for $\r
+                               token = new Character ((char) next_char).toString ();\r
+                               return new Token (Token.OTHER, token, reader.getLineNumber ());\r
+                               }\r
+                       while (is_alphanumeric (next_char)) consume_char ();\r
+                       String command_name = token;\r
+                       if (is_star (next_char)) consume_char ();\r
+                       if (command_name.equals (preamblecommand_name)) {\r
+                               return new Token (Token.PREAMBLECOMMAND, reader.getLineNumber ());\r
+                               }\r
+                       if (command_name.equals (separatorcommand_name)) {\r
+                               // consume whitespace until next token\r
+                               while (is_whitespace (next_char)) consume_char ();\r
+                               return new Token (Token.SEPARATORCOMMAND, reader.getLineNumber ());\r
+                               }\r
+                       if (is_less_than (next_char)) {\r
+                               consume_char ();\r
+                               return new Token (Token.FORMATCOMMAND, command_name, reader.getLineNumber ());\r
+                               }\r
+                       if (is_open_curly (next_char)) {\r
+                               String arg = consume_arg ();\r
+                               if (command_name.equals (loadcharmapcommand_name)) {\r
+                                       return new Token (Token.LOADCHARMAPCOMMAND, arg, reader.getLineNumber ());\r
+                                       }\r
+                               if (command_name.equals (loadstylesheetcommand_name)) {\r
+                                       return new Token (Token.LOADSTYLESHEETCOMMAND, arg, reader.getLineNumber ());\r
+                                       }\r
+                               if (command_name.equals (refcommand_name)) {\r
+                                       return new Token (Token.REFCOMMAND, arg, reader.getLineNumber ());\r
+                                       }\r
+                               if (command_name.equals (tagcommand_name)) {\r
+                                       return new Token (Token.TAGCOMMAND, arg, reader.getLineNumber ());\r
+                                       }\r
+                               if (command_name.equals (citecommand_name)) {\r
+                                       return new Token (Token.CITECOMMAND, arg, reader.getLineNumber ());\r
+                                       }\r
+                               }\r
+                       if (parastyles.contains (command_name)) {\r
+                               while (is_whitespace (next_char)) consume_char ();\r
+                               // paragraph style command consumes the first linebreak following it also\r
+                               if (is_eol (next_char)) consume_char ();\r
+                               return new Token (Token.PARASTYLECOMMAND, command_name, reader.getLineNumber ());\r
+                               }\r
+                       else\r
+                               // temporary\r
+                               return new Token (Token.CHARCOMMAND, command_name, reader.getLineNumber ());\r
+                       }\r
+               if (is_alphabetic (next_char)) {\r
+                       consume_char ();\r
+                       while (is_alphabetic (next_char)) consume_char ();\r
+                       return new Token (Token.ALPHABETIC, token, reader.getLineNumber ());\r
+                       }\r
+               if (is_numeric (next_char)) {\r
+                       consume_char ();\r
+                       while (is_numeric (next_char)) consume_char ();\r
+                       return new Token (Token.NUMERIC, token, reader.getLineNumber ());\r
+                       }\r
+               if (is_whitespace (next_char)) {\r
+                       consume_char ();\r
+                       while (is_whitespace (next_char)) consume_char ();\r
+                       if (is_eol (next_char)) {\r
+                               consume_char ();\r
+                               // check this\r
+                               return new Token (Token.WHITESPACE, " ", reader.getLineNumber ());\r
+                               }\r
+                       return new Token (Token.WHITESPACE, token, reader.getLineNumber ());\r
+                       }\r
+               if (is_hyphen (next_char)) {\r
+                       consume_char ();\r
+                       while (is_hyphen (next_char)) consume_char ();\r
+                       return new Token (Token.HYPHENS, token, reader.getLineNumber ());\r
+                       }\r
+               if (is_dot (next_char)) {\r
+                       consume_char ();\r
+                       while (is_dot (next_char)) consume_char ();\r
+                       return new Token (Token.DOTS, token, reader.getLineNumber ());\r
+                       }\r
+               if (is_underscore (next_char)) {\r
+                       consume_char ();\r
+                       return new Token (Token.UNDERSCORE, reader.getLineNumber ());\r
+                       }\r
+               if (is_dollar (next_char)) {\r
+                       consume_char ();\r
+                       return new Token (Token.DOLLAR, reader.getLineNumber ());\r
+                       }\r
+               if (is_greater_than (next_char)) {\r
+                       consume_char ();\r
+                       return new Token (Token.POPFORMATCOMMAND, reader.getLineNumber ());\r
+                       }\r
+               if (is_single_quote (next_char)) {\r
+                       if (is_alphanumeric (last_char)) {\r
+                               if (is_alphanumeric (next_char)) {\r
+                                       consume_char ();\r
+                                       return new Token (Token.APOSTROPHE, reader.getLineNumber ());\r
+                                       }\r
+                               else if (within_single_quotes) {\r
+                                       within_single_quotes = false;\r
+                                       consume_char ();\r
+                                       return new Token (Token.CLOSESINGLEQUOTE, reader.getLineNumber ());\r
+                                       }\r
+                               else {\r
+                                       consume_char ();\r
+                                       return new Token (Token.PRIME, reader.getLineNumber ());\r
+                                       }\r
+                               }\r
+                       consume_char ();\r
+                       if (is_numeric (next_char)) {\r
+                               return new Token (Token.APOSTROPHE, reader.getLineNumber ());\r
+                               }\r
+                       else {\r
+                               within_single_quotes = true;\r
+                               return new Token (Token.OPENSINGLEQUOTE, reader.getLineNumber ());\r
+                               }\r
+                       }\r
+               if (is_double_quote (next_char)) {\r
+                       consume_char ();\r
+                       if (within_double_quotes) {\r
+                               within_double_quotes = false;\r
+                               return new Token (Token.CLOSEDOUBLEQUOTE, reader.getLineNumber ());\r
+                               }\r
+                       else {\r
+                               within_double_quotes = true;\r
+                               return new Token (Token.OPENDOUBLEQUOTE, reader.getLineNumber ());\r
+                               }\r
+                       }\r
+               consume_char ();\r
+               return new Token (Token.OTHER, token, reader.getLineNumber ());\r
+               }\r
+\r
+       static boolean is_eol (int c) {return c == '\n';}\r
+       static boolean is_eos (int c) {return c == -1;}\r
+       static boolean is_star (int c) {return c == '*';}\r
+       static boolean is_hash (int c) {return c == '#';}\r
+       static boolean is_dot (int c) {return c == '.';}\r
+       static boolean is_slash (int c) {return c == '\\';}\r
+       static boolean is_hyphen (int c) {return c == '-';}\r
+       static boolean is_underscore (int c) {return c == '_';}\r
+       static boolean is_dollar (int c) {return c == '$';}\r
+       static boolean is_single_quote (int c) {return c == '\'';}\r
+       static boolean is_double_quote (int c) {return c == '\"';}\r
+       static boolean is_open_curly (int c) {return c == '{';}\r
+       static boolean is_close_curly (int c) {return c == '}';}\r
+       static boolean is_less_than (int c) {return c == '<';}\r
+       static boolean is_greater_than (int c) {return c == '>';}\r
+\r
+       // should perhaps use Character.isLetter? not sure, because that allows Unicode chars for\r
+       // other languages that are outside the a-Z range.\r
+       static boolean is_alphabetic (int c) {\r
+               return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';\r
+               }\r
+       static boolean is_numeric (int c) {return c >= '0' && c <= '9';}\r
+       static boolean is_alphanumeric (int c) {\r
+               return is_numeric (c) || is_alphabetic (c);\r
+               }\r
+       static boolean is_whitespace (int c) {return c == ' ' || c == '\t';}\r
+}\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/StandardEngine.java b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/StandardEngine.java
new file mode 100755 (executable)
index 0000000..b6a600d
--- /dev/null
@@ -0,0 +1,377 @@
+/**\r
+ * StandardEngine class\r
+ * Standard registration of actions\r
+ * Implemented as a subclass of Engine for no good reason\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/08/01\r
+ */\r
+\r
+package tagger;\r
+import java.io.*;\r
+import java.util.*;\r
+\r
+public class StandardEngine extends Engine {\r
+\r
+       static Engine STANDARD;\r
+\r
+       // reserved words for property files\r
+\r
+       // character table\r
+       static final String index_prop_name = "index";\r
+       static final String font_prop_name = "font";\r
+\r
+       static final String apostrophe_char_name = "quoteright";\r
+       static final String prime_char_name = "prime";\r
+       static final String opensinglequote_char_name = "quoteleft";\r
+       static final String closesinglequote_char_name = "quoteright";\r
+       static final String opendoublequote_char_name = "quotedblleft";\r
+       static final String closedoublequote_char_name = "quotedblright";\r
+       static final String hyphen_char_name = "hyphen";\r
+       static final String endash_char_name = "endash";\r
+       static final String emdash_char_name = "emdash";\r
+       static final String period_char_name = "period";\r
+       static final String twodotleader_char_name = "twodotleader";\r
+       static final String ellipsis_char_name = "ellipsis";\r
+\r
+       static final String ROMAN_COMMANDNAME = "roman";\r
+       static final String BOLD_COMMANDNAME = "bold";\r
+       static final String ITALICS_COMMANDNAME = "italic";\r
+       static final String SUBSCRIPT_COMMANDNAME = "sub";\r
+       static final String SUPERSCRIPT_COMMANDNAME = "sup";\r
+\r
+       // style sheet\r
+       static final String next_style_prop_name = "next";\r
+       static final String default_style_name = "body";\r
+\r
+       public StandardEngine (\r
+                       final Generator generator,\r
+                       final PropertyMap style_map,\r
+                       final PrintStream error_stream, final PrintStream index_stream\r
+                       ) {\r
+\r
+               final PropertyMap char_map = new PropertyMap ();\r
+               final Numbering numbering = new Numbering (style_map, error_stream);\r
+\r
+               // a hack to work around lack of proper closures in Java\r
+               // can't assign to local variable within actions\r
+               class StringBox {\r
+                       String string;\r
+                       StringBox (String s) {string = s;}\r
+                       void set (String s) {string = s;}\r
+               }\r
+               final StringBox current_para_style = new StringBox (default_style_name);\r
+\r
+               // special action for start of paragraph\r
+               // created once, but dynamically inserted and removed\r
+               // so that it's performed once at the start of each paragraph\r
+               final Action paragraph_action = new Action () {\r
+                       boolean first_para = true;\r
+                       public void perform (Token t, Iterator iter) {\r
+                               if (t.type != Token.PARASTYLECOMMAND) {\r
+                                       if (!first_para) generator.linefeed ();\r
+                                       generator.new_para (current_para_style.string);\r
+                                       String numstr = numbering.get_numbering_string (current_para_style.string);\r
+                                       if (numstr.length() != 0) {\r
+                                               // display numbering as evidence of progress\r
+                                               error_stream.println (numstr);\r
+                                               /*\r
+                                               // this doesn't work. not sure why.\r
+                                               // because it becomes a recursive call!\r
+                                               // need an impoverished engine specially for this, without paras?\r
+\r
+                                               Reader numreader = new StringReader (numstr);\r
+                                               try {\r
+                                               Tagger.consume_source (StandardEngine.STANDARD, style_map, numreader);\r
+                                               }\r
+                                               catch (IOException e) {Assert.unreachable ();}\r
+                                               */\r
+                                               generator.plaintext (numstr);\r
+                                               }\r
+\r
+                                       iter.remove ();\r
+                                       first_para = false;\r
+                                       }\r
+                               }};\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               generator.plaintext (t.arg);\r
+                               }},\r
+                       Token.ALPHABETIC);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               generator.plaintext (t.arg);\r
+                               }},\r
+                       Token.NUMERIC);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               generator.plaintext (t.arg);\r
+                               }},\r
+                       Token.WHITESPACE);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               generator.new_line ();\r
+                               }},\r
+                       Token.LINEBREAK);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               put_special_char (generator, char_map, apostrophe_char_name, error_stream, t.line);\r
+                               }},\r
+                       Token.APOSTROPHE);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               put_special_char (generator, char_map, prime_char_name, error_stream, t.line);\r
+                               }},\r
+                       Token.PRIME);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               put_special_char (generator, char_map, opensinglequote_char_name, error_stream, t.line);\r
+                               }},\r
+                       Token.OPENSINGLEQUOTE);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               put_special_char (generator, char_map, closesinglequote_char_name, error_stream, t.line);\r
+                               }},\r
+                       Token.CLOSESINGLEQUOTE);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               put_special_char (generator, char_map, opendoublequote_char_name, error_stream, t.line);\r
+                               }},\r
+                       Token.OPENDOUBLEQUOTE);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               put_special_char (generator, char_map, closedoublequote_char_name, error_stream, t.line);\r
+                               }},\r
+                       Token.CLOSEDOUBLEQUOTE);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               int len = t.arg.length ();\r
+                               if (len == 1)\r
+                                       put_special_char (generator, char_map, hyphen_char_name, error_stream, t.line);\r
+                               else if (len == 2)\r
+                                       put_special_char (generator, char_map, endash_char_name, error_stream, t.line);\r
+                               else if (len == 3)\r
+                                       put_special_char (generator, char_map, emdash_char_name, error_stream, t.line);\r
+                               else\r
+                                       error_stream.println (t.line + ": Too many hyphens: " + t.arg);\r
+                               }},\r
+                       Token.HYPHENS);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               int len = t.arg.length ();\r
+                               if (len == 1)\r
+                                       generator.plaintext (".");\r
+                               else if (len == 2)\r
+                                       put_special_char (generator, char_map, twodotleader_char_name, error_stream, t.line);\r
+                               else if (len == 3)\r
+                                       put_special_char (generator, char_map, ellipsis_char_name, error_stream, t.line);\r
+                               else\r
+                                       error_stream.println (t.line + ": Too many dots: " + t.arg);\r
+                               }},\r
+                       Token.DOTS);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               // open file with given name and load char map from it\r
+                               String file_name = t.arg;\r
+                               try {\r
+                                       File f = new File (file_name);\r
+                                       FileInputStream s = new FileInputStream (f);\r
+                                       InputStreamReader r = new InputStreamReader (s);\r
+                                       PropertyParser p = new PropertyParser (r, error_stream);\r
+                                       char_map.incorporate (p);\r
+                                       } catch (IOException e) {\r
+                                       error_stream.println (t.line + ": Can't open char map file: " + file_name);\r
+                                       }\r
+                               }},\r
+                       Token.LOADCHARMAPCOMMAND);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               // open file with given name and load char map from it\r
+                               String file_name = t.arg;\r
+                               try {\r
+                                       File f = new File (file_name);\r
+                                       FileInputStream s = new FileInputStream (f);\r
+                                       InputStreamReader r = new InputStreamReader (s);\r
+                                       PropertyParser p = new PropertyParser (r, error_stream);\r
+                                       style_map.incorporate (p);\r
+                                       numbering.incorporate ();\r
+                                       } catch (IOException e) {\r
+                                       error_stream.println (t.line + ": Can't open style sheet file: " + file_name);\r
+                                       }\r
+                               }},\r
+                       Token.LOADSTYLESHEETCOMMAND);\r
+\r
+               final Action unsuppress_action = new Action () {\r
+                       public void perform (Token t, Iterator i) {\r
+                               generator.suppress_off ();\r
+                               i.remove ();\r
+                       }};\r
+\r
+               // preamble command switches on output suppression\r
+               // registers action to turn suppression off with paragraph break command\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               generator.suppress_on ();\r
+                               register_by_type (unsuppress_action, Token.PARABREAK);\r
+                               }},\r
+                       Token.PREAMBLECOMMAND);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               String next_style = style_map.get_property (current_para_style.string, next_style_prop_name);\r
+                               if (next_style == null) {\r
+                                       error_stream.println (t.line + ": No next style property given for style: " + current_para_style.string);\r
+                                       return;\r
+                                       }\r
+                               current_para_style.set (next_style);\r
+                               register_for_all (paragraph_action);\r
+                               }},\r
+                       Token.PARABREAK);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               current_para_style.set (t.arg);\r
+                               }},\r
+                       Token.PARASTYLECOMMAND);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               String index = char_map.get_property (t.arg, index_prop_name);\r
+                               if (index == null) {\r
+                                       error_stream.println (t.line + ": No index property given for character: " + t.arg);\r
+                                       return;\r
+                                       }\r
+                               String font = char_map.get_property (t.arg, font_prop_name);\r
+                               // if no font is listed, generate special character in standard font\r
+                               if (font == null)\r
+                                       generator.special_char (index);\r
+                               else\r
+                                       generator.special_char (font, index);\r
+                               }},\r
+                       Token.CHARCOMMAND);\r
+\r
+               register_by_type (new Action () {\r
+                       boolean italic_mode_on = false;\r
+                       public void perform (Token t) {\r
+                               if (italic_mode_on) {\r
+                                       italic_mode_on = false;\r
+                                       generator.pop_format ();\r
+                                       }\r
+                               else {\r
+                                       italic_mode_on = true;\r
+                                       generator.push_format (Generator.ITALICS);\r
+                                       }\r
+                               }},\r
+                       Token.UNDERSCORE);\r
+\r
+               // used to italicize alphabetic tokens in math mode\r
+               final Action push_italics_action = new Action () {\r
+                       public void perform (Token t, Iterator iter) {\r
+                               Assert.assert (t.type == Token.ALPHABETIC);\r
+                               generator.push_format (Generator.ITALICS);\r
+                               }};\r
+               final Action pop_italics_action = new Action () {\r
+                       public void perform (Token t, Iterator iter) {\r
+                               Assert.assert (t.type == Token.ALPHABETIC);\r
+                               generator.pop_format ();\r
+                               }};\r
+\r
+               register_by_type (new Action () {\r
+                       boolean math_mode_on = false;\r
+                       public void perform (Token t) {\r
+                               if (math_mode_on) {\r
+                                       math_mode_on = false;\r
+                                       unregister_by_type (push_italics_action, Token.ALPHABETIC);\r
+                                       unregister_by_type (pop_italics_action, Token.ALPHABETIC);\r
+                                       }\r
+                               else {\r
+                                       math_mode_on = true;\r
+                                       register_by_type_back (pop_italics_action, Token.ALPHABETIC);\r
+                                       register_by_type_front (push_italics_action, Token.ALPHABETIC);\r
+                                       }\r
+                               }},\r
+                       Token.DOLLAR);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               if (t.arg.equals (ROMAN_COMMANDNAME))\r
+                                       generator.push_format (Generator.ROMAN);\r
+                               else if (t.arg.equals (BOLD_COMMANDNAME))\r
+                                       generator.push_format (Generator.BOLD);\r
+                               else if (t.arg.equals (ITALICS_COMMANDNAME))\r
+                                       generator.push_format (Generator.ITALICS);\r
+                               else if (t.arg.equals (SUBSCRIPT_COMMANDNAME))\r
+                                       generator.push_format (Generator.SUBSCRIPT);\r
+                               else if (t.arg.equals (SUPERSCRIPT_COMMANDNAME))\r
+                                       generator.push_format (Generator.SUPERSCRIPT);\r
+                               }},\r
+                       Token.FORMATCOMMAND);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               generator.pop_format ();\r
+                               }},\r
+                       Token.POPFORMATCOMMAND);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               generator.plaintext (t.arg);\r
+                               }},\r
+                       Token.OTHER);\r
+\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               error_stream.println ("... done");\r
+                               }},\r
+                       Token.ENDOFSTREAM);\r
+\r
+               STANDARD = this;\r
+       }\r
+\r
+       /* no actions for these token types:\r
+       COMMENT\r
+       SEPARATORCOMMAND\r
+       */\r
+\r
+/*\r
+       not yet coded:\r
+\r
+       public static final int REFCOMMAND = 32;\r
+       public static final int TAGCOMMAND = 33;\r
+       public static final int CITECOMMAND = 34;\r
+*/\r
+\r
+\r
+       /* general form of action registration is this:\r
+               register_by_type (new Action () {\r
+                       public void perform (Token t) {\r
+                               // put code to be executed for token type here\r
+                               }},\r
+                       Token.TYPENAME);\r
+       */\r
+\r
+       void put_special_char (Generator generator, PropertyMap char_map,\r
+               String char_name, PrintStream error_stream, int line) {\r
+                       String index = char_map.get_property (char_name, index_prop_name);\r
+                       if (index == null) {\r
+                               error_stream.println (line + ": Unresolved character: " + char_name);\r
+                               }\r
+                       else\r
+                               generator.special_char (index);\r
+               }\r
+\r
+}
\ No newline at end of file
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Tagger.java b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Tagger.java
new file mode 100755 (executable)
index 0000000..ef187f3
--- /dev/null
@@ -0,0 +1,103 @@
+/**\r
+ * Tagger class\r
+ * Main class of Tagger application\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/02/01\r
+ */\r
+\r
+\r
+package tagger;\r
+import java.io.*;\r
+import java.util.*;\r
+\r
+public class Tagger {\r
+\r
+       public static PrintStream error_stream = System.out;\r
+\r
+       // holds mapping of token types to actions\r
+       Engine engine;\r
+\r
+       /**\r
+        * The main method of the Tagger application.\r
+        * @param args The command line arguments, described in usage method\r
+        */\r
+       public static void main (String[] args) {\r
+               check_usage (args);\r
+\r
+               String base_name = args[0];\r
+               String source_file_name = base_name + ".txt";\r
+               String output_file_name = base_name + ".tag.txt";\r
+               String index_file_name = base_name + ".index.txt";\r
+               Reader source_reader;\r
+               PrintStream output_stream;\r
+               PrintStream index_stream;\r
+\r
+               try {source_reader = get_reader_from_file_name (source_file_name);\r
+               } catch (IOException e) {\r
+                       error_stream.println (\r
+                               "Unable to open source file " + source_file_name + ": " + e.getMessage ());\r
+                       return;\r
+                       };\r
+               try {output_stream = get_stream_from_file_name (output_file_name);\r
+               } catch (IOException e) {\r
+                       error_stream.println (\r
+                               "Unable to open output file " + output_file_name + ": " + e.getMessage ());\r
+                       return;\r
+                       };\r
+               try {index_stream = get_stream_from_file_name (index_file_name);\r
+               } catch (IOException e) {\r
+                       error_stream.println (\r
+                               "Unable to open index file " + index_file_name + ": " + e.getMessage ());\r
+                       return;\r
+                       };\r
+\r
+               // for now, hardwire to Quark\r
+               Generator generator = new QuarkGenerator (output_stream);\r
+\r
+               PropertyMap style_map = new PropertyMap ();\r
+               Engine engine = new StandardEngine (generator, style_map, error_stream, index_stream);\r
+               try {\r
+               consume_source (engine, style_map, source_reader);\r
+               } catch (IOException e) {Assert.unreachable ();}\r
+               output_stream.close ();\r
+               }\r
+\r
+       public static void consume_source (Engine engine, PropertyMap style_map, Reader source_reader)\r
+               throws IOException {\r
+               Set para_styles = style_map.get_items ();\r
+               SourceParser p = new SourceParser (source_reader, para_styles);\r
+               Token token;\r
+               while (p.has_more_tokens ()) {\r
+                       token = p.get_token ();\r
+                       engine.consume_token (token);\r
+                       }\r
+               // consume end of stream token explicitly\r
+               // depends on get_token returning ENDOFSTREAM token when no more tokens\r
+               token = p.get_token ();\r
+               engine.consume_token (token);\r
+               }\r
+\r
+       static void check_usage (String args []) {\r
+               if (args.length == 0) {\r
+                       error_stream.println (\r
+                               "one argument required, should be name of source file, excluding .txt extension"\r
+                               );\r
+                       }\r
+               }\r
+\r
+       static Reader get_reader_from_file_name(String file_name) throws IOException {\r
+               File f = new File (file_name);\r
+               FileInputStream s = new FileInputStream (f);\r
+               InputStreamReader r = new InputStreamReader (s);\r
+               return r;\r
+               }\r
+\r
+       static PrintStream get_stream_from_file_name (String file_name) throws IOException {\r
+               File f = new File (file_name);\r
+               FileOutputStream s = new FileOutputStream (f);\r
+               PrintStream ps = new PrintStream (s);\r
+               return ps;\r
+               }\r
+\r
+       }\r
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Token.java b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/Token.java
new file mode 100755 (executable)
index 0000000..af03320
--- /dev/null
@@ -0,0 +1,72 @@
+/**\r
+ * Token class\r
+ * Represents tokens generated by lexer\r
+ * <p>\r
+ *\r
+ * @author  Daniel Jackson\r
+ * @version 0, 07/06/01\r
+ */\r
+\r
+package tagger;\r
+import java.io.*;\r
+import java.util.*;\r
+\r
+public class Token {\r
+       // may be null\r
+       public String arg;\r
+       public int line;\r
+       public int type;\r
+\r
+       public static final int COMMENT = 0;\r
+       public static final int WHITESPACE = 1;\r
+       public static final int ALPHABETIC = 2;\r
+       public static final int NUMERIC = 3;\r
+\r
+       public static final int PARABREAK = 4;\r
+       public static final int LINEBREAK = 5;\r
+\r
+       public static final int APOSTROPHE = 10;\r
+       public static final int PRIME = 11;\r
+       public static final int OPENSINGLEQUOTE = 12;\r
+       public static final int CLOSESINGLEQUOTE = 13;\r
+       public static final int OPENDOUBLEQUOTE = 14;\r
+       public static final int CLOSEDOUBLEQUOTE = 15;\r
+       public static final int HYPHENS = 16;\r
+       public static final int DOTS = 17;\r
+\r
+       public static final int PARASTYLECOMMAND = 20;\r
+       public static final int FORMATCOMMAND = 21;\r
+       public static final int POPFORMATCOMMAND = 22;\r
+       public static final int REFCOMMAND = 23;\r
+       public static final int TAGCOMMAND = 24;\r
+       public static final int CITECOMMAND = 25;\r
+       public static final int CHARCOMMAND = 26;\r
+       public static final int LOADCHARMAPCOMMAND = 27;\r
+       public static final int LOADSTYLESHEETCOMMAND = 28;\r
+       public static final int PREAMBLECOMMAND = 29;\r
+       public static final int SEPARATORCOMMAND = 30;\r
+\r
+       // treated as a command for italicizing or as a char style\r
+       public static final int UNDERSCORE = 31;\r
+       public static final int DOLLAR = 32;\r
+       public static final int OTHER = 33;\r
+       public static final int ENDOFSTREAM = 34;\r
+\r
+       public static final int MAXTOKEN = 34;\r
+\r
+       public Token (int type, String arg, int line) {\r
+               this.type = type;\r
+               this.arg = arg;\r
+               this.line = line;\r
+               }\r
+\r
+       public Token (int type, int line) {\r
+               this.type = type;\r
+               this.line = line;\r
+               }\r
+\r
+       // temporary implementation\r
+       public String toString () {\r
+               return arg;\r
+               }\r
+}
\ No newline at end of file
diff --git a/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/makefile b/Robust/src/Benchmarks/mlp/tagger/original-java/src/tagger/makefile
new file mode 100644 (file)
index 0000000..603bbe5
--- /dev/null
@@ -0,0 +1,6 @@
+all:
+       javac -nowarn -source 1.3 *.java
+
+clean:
+       rm -f *.class
+       rm -f *~