isac-java/src/java-tests/isac/gui/mawen/syntax/TestAst.scala
author Walther Neuper <walther.neuper@jku.at>
Fri, 26 Mar 2021 10:45:05 +0100
changeset 5239 b4e3883d7b66
parent 5229 6bf0e95981e3
permissions -rw-r--r--
reset mathematics-engine to Isabelle2015

note: for this version libisabelle was available,
which connects front-end (Java) and back-end (Isabelle/ML)
wneuper@5049
     1
package isac.gui.mawen.syntax
wneuper@5049
     2
wneuper@5064
     3
import isac.gui.mawen.scalaterm.TestsDATA
wneuper@5088
     4
import isac.gui.mawen.TestDATA
wneuper@5085
     5
import isac.gui.mawen.syntax.Ast._  //"._" simplifies "Ast.Ast" to "Ast"
walther@5239
     6
import edu.tum.cs.isabelle.pure._   // for Term
wneuper@5123
     7
import isac.gui.mawen.syntax.isabelle.XLibrary
wneuper@5088
     8
import isac.gui.mawen.editor.TestDATAeditor
wneuper@5064
     9
wneuper@5049
    10
import junit.framework.TestCase
wneuper@5049
    11
import org.junit.Assert._
wneuper@5049
    12
wneuper@5049
    13
wneuper@5049
    14
class TestAst extends TestCase {
wneuper@5067
    15
wneuper@5138
    16
  // x / y
wneuper@5085
    17
  def a1 = Appl(List(Constant("Fields.inverse_class.divide"), Variable ("x"), Variable ("y")))
wneuper@5085
    18
  // a * b / c
wneuper@5085
    19
  def a2 = Appl(List(Constant("Groups.times_class.times"), Variable ("a"), Appl(List(Constant("Fields.inverse_class.divide"), Variable("b"), Variable("c")))))
wneuper@5085
    20
  // sin(a + b) / c
wneuper@5085
    21
  def a3 = Appl(List
wneuper@5085
    22
      (Constant("Fields.inverse_class.divide"), 
wneuper@5085
    23
          Appl(List(Constant("sin"), 
wneuper@5085
    24
              Appl(List(Constant("Groups.plus_class.plus"), 
wneuper@5085
    25
                  Variable("a"), 
wneuper@5085
    26
                  Variable("b")
wneuper@5085
    27
              ))
wneuper@5085
    28
          ))
wneuper@5085
    29
          ,Variable ("c")
wneuper@5085
    30
      ))
wneuper@5085
    31
  def a4 = Appl(List(Constant("Groups.plus_class.plus"), Appl(List(Constant("Groups.plus_class.plus"), Variable("a"), Variable("b"))), Variable("c")))
wneuper@5085
    32
  def a5 = Appl(List(Constant("Groups.plus_class.plus"), Variable("a"), Appl(List(Constant("Groups.plus_class.plus"), Variable("b"), Variable("c")))))
wneuper@5140
    33
  var post_ast : Ast.Ast = //copied from Isabelle2016-1-MAWEN, types dropped
wneuper@5140
    34
    Appl(List(
wneuper@5140
    35
      Constant("_tuple"),  
wneuper@5140
    36
      Variable("aaa"),
wneuper@5140
    37
      Appl(List(
wneuper@5140
    38
        Constant("_tuple_args"),  
wneuper@5140
    39
        Variable("bbb"),
wneuper@5140
    40
        Appl(List(
wneuper@5140
    41
          Constant("_tuple_args"),
wneuper@5140
    42
          Variable("ccc"),
wneuper@5140
    43
          Appl(List(
wneuper@5140
    44
            Constant("_tuple_arg"),  
wneuper@5140
    45
            Variable("ddd")))))))))
wneuper@5085
    46
  
wneuper@5085
    47
  def test_prefix_string_of() {
wneuper@5085
    48
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_prefix_string_of");
wneuper@5085
    49
    
wneuper@5085
    50
    assertEquals(Ast.prefix_string_of(a1), "/ x y")
wneuper@5085
    51
    assertEquals(Ast.prefix_string_of(a2), "* a / b c")
wneuper@5085
    52
    assertEquals(Ast.prefix_string_of(a3), "/ sin + a b c")
wneuper@5085
    53
    
wneuper@5085
    54
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_prefix_string_of");
wneuper@5085
    55
  }
wneuper@5085
    56
  
wneuper@5138
    57
  def test_math_string_of() {
wneuper@5085
    58
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_math_string_of");
wneuper@5085
    59
    
wneuper@5085
    60
    assertEquals(Ast.math_string_of(a1), "x / y")
wneuper@5085
    61
    assertEquals(Ast.math_string_of(a2), "a * (b / c)")
wneuper@5085
    62
    assertEquals(Ast.math_string_of(a3), "sin (a + b) / c")
wneuper@5085
    63
wneuper@5085
    64
    assertEquals(Ast.math_string_of(a4), "a + b + c")
wneuper@5085
    65
    assertEquals(Ast.math_string_of(a5), "a + (b + c)")
wneuper@5140
    66
    assertEquals(Ast.math_string_of(post_ast), "(aaa, bbb, ccc, ddd)")
wneuper@5085
    67
    
wneuper@5085
    68
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_math_string_of");
wneuper@5085
    69
  }
wneuper@5085
    70
  
wneuper@5085
    71
  /* 
wneuper@5085
    72
   * The examples for reference of Natalie Karl initially took terms,
wneuper@5085
    73
   * @see isac.gui.mawen.scalaterm.TestUtil.
wneuper@5085
    74
   * Here we check, whether term_to_ast + Ast.string_of give the same result.
wneuper@5085
    75
   */
wneuper@5085
    76
  def test_examples_for_NK() {
wneuper@5085
    77
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_examples_for_NK");
wneuper@5085
    78
wneuper@5085
    79
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t1)),
wneuper@5085
    80
        "aaa + bbb = processed_by_Isabelle_Isac ")
wneuper@5085
    81
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t2)), 
wneuper@5085
    82
        "a + 2 * b + 3 * (c + d)")
wneuper@5085
    83
wneuper@5085
    84
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t31)), 
wneuper@5085
    85
        "aaa + bbb + ccc")
wneuper@5085
    86
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t32)), 
wneuper@5085
    87
        "aaa + (bbb + ccc)")
wneuper@5085
    88
wneuper@5140
    89
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t41)), 
wneuper@5140
    90
        "Diff (x + sin (x ^ 2), x)")
wneuper@5085
    91
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t42)), 
wneuper@5085
    92
        "d_d x (x + sin (x ^ 2))")
wneuper@5140
    93
wneuper@5085
    94
    // MAWEN example for reference No.1
wneuper@5085
    95
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt1())), 
wneuper@5085
    96
        "Simplify (1 + 2 * x * (y + 3) / (4 * z * (y + 3)) + 5)")
wneuper@5085
    97
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt3())), 
wneuper@5085
    98
        "1 + 2 * x * (y + 3) / (4 * z * (y + 3)) + 5")
wneuper@5085
    99
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt4())), 
wneuper@5085
   100
        "1 + 2 * x / (4 * z) + 5")
wneuper@5085
   101
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt5())), 
wneuper@5085
   102
        "1 + x / (2 * z) + 5")
wneuper@5085
   103
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt6())), 
wneuper@5085
   104
        "6 + x / (2 * z)")
wneuper@5085
   105
wneuper@5085
   106
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_examples_for_NK");
wneuper@5085
   107
  }
wneuper@5085
   108
wneuper@5085
   109
  //test additional examples with BOX, CURSOR, GAP
wneuper@5085
   110
  def test_BOX_CURSOR_GAP() {
wneuper@5085
   111
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_BOX_CURSOR_GAP");
wneuper@5194
   112
wneuper@5088
   113
    assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_1))   
wneuper@5088
   114
    assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_2))   
wneuper@5088
   115
    assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_3))
wneuper@5085
   116
wneuper@5088
   117
    assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_1_CURSOR))   
wneuper@5088
   118
    assertEquals(  "# + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_1_CURSOR_GAP))
wneuper@5088
   119
    assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_1_CURSOR_b))
wneuper@5085
   120
wneuper@5088
   121
    assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_CURSOR_BOX_3A))   
wneuper@5088
   122
    assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_CURSOR_BOX_3B))
s1520454056@5191
   123
    
wneuper@5194
   124
    assertEquals("d_d x x + d_d x (sin (x ^ 2))", Ast.math_string_of(TestDATAeditor.box_05))
wneuper@5194
   125
    assertEquals("d_d bdv (sin (u)) = cos (u) * d_d bdv (u)", Ast.math_string_of(TestDATAeditor.box_06))   
wneuper@5194
   126
    assertEquals("d_d x x + cos (x ^ 2) * d_d x (#)", Ast.math_string_of(TestDATAeditor.box_07_with_cursor))   
wneuper@5088
   127
    assertEquals("a + (# + c)", Ast.math_string_of(TestDATAeditor.box_gap_cursor))   
wneuper@5088
   128
    assertEquals("#", Ast.math_string_of(TestDATAeditor.box_with_cursor_on_gap))   
wneuper@5088
   129
    assertEquals("# + #", Ast.math_string_of(TestDATAeditor.in_1a))   
wneuper@5088
   130
    assertEquals("a + # / #", Ast.math_string_of(TestDATAeditor.in_1b))   
wneuper@5088
   131
    assertEquals("a + b / #", Ast.math_string_of(TestDATAeditor.in_1c))   
wneuper@5085
   132
wneuper@5085
   133
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_BOX_CURSOR_GAP");
wneuper@5085
   134
  }
wneuper@5085
   135
wneuper@5080
   136
wneuper@5090
   137
    /* from Isabelle2016-1-MAWEN ast.ML: 
wneuper@5090
   138
     * fun try_rules ((lhs, rhs) :: pats) ast = (*WN*)
wneuper@5090
   139
     * 
wneuper@5090
   140
     * lemma "[aaa,bbb] = ddd" --- term_to_ast ---
wneuper@5090
   141
     * with types dropped in ast and rule.
wneuper@5090
   142
     * 
wneuper@5090
   143
     * assert was too expensive at this moment.
wneuper@5090
   144
     */
wneuper@5097
   145
  def test_list_normal() {
wneuper@5097
   146
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_list_normal");
wneuper@5067
   147
    
wneuper@5090
   148
    //======= 1.successful application 
wneuper@5090
   149
    //###try_rules ast: Appl[Constant("List.list.Cons"), Appl[Constant("_constrain"), Appl[Constant("_free"), Variable("bbb"]), Appl[Constant("_ofsort"), Appl[Constant("_tfree"), Variable("'a"]), Constant("\ <^class>HOL.type"]]), Constant("List.list.Nil"]) 
wneuper@5090
   150
    //###try_rules lhs: Appl[Constant("List.list.Cons"), Variable("x"), Constant("List.list.Nil"]) 
wneuper@5090
   151
    //###try_rules rhs: Appl[Constant("_list"), Variable("x"]) 
wneuper@5090
   152
    //------- ast in try_rules (from additional output):
wneuper@5090
   153
    var ast =
wneuper@5083
   154
      Ast.Appl(List(
wneuper@5090
   155
        Ast.Constant("List.list.Cons"),
wneuper@5090
   156
        Ast.Variable("bbb"),
wneuper@5090
   157
        Ast.Constant("List.list.Nil")))
wneuper@5090
   158
    var lhs =
wneuper@5090
   159
      Appl(List(
wneuper@5090
   160
        Constant("List.list.Cons"),
wneuper@5090
   161
        Variable("x"),
wneuper@5090
   162
        Constant("List.list.Nil")))
wneuper@5090
   163
    var rhs =
wneuper@5090
   164
      Appl(List(
wneuper@5090
   165
        Constant("_list"),
wneuper@5090
   166
        Variable("x")))
wneuper@5097
   167
    assertEquals(Ast.matches(ast, lhs), Some((Map("x" -> Variable("bbb")),List())))
wneuper@5097
   168
    // //--------------- tests BEFORE made local to normalize ---------------\\
wneuper@5097
   169
    //assertEquals(Ast.xtry(ast, "List.list.Cons"), Some(Appl(List(Constant("_list"), Variable("bbb")))))
wneuper@5097
   170
    //assertEquals(Ast.try_rules(XSyntax.print_rules("List.list.Cons"), ast), Some(Appl(List(Constant("_list"), Variable("bbb")))))
wneuper@5097
   171
    //assertEquals(Ast.try_rules(List((lhs, rhs)), ast), Some(Appl(List(Constant("_list"), Variable("bbb")))))
wneuper@5097
   172
wneuper@5097
   173
    //assertEquals(Ast.rewrite(ast), Some(Appl(List(Constant("_list"), Variable("bbb")))))
wneuper@5097
   174
    //assertEquals(Ast.norm_root(ast), Appl(List(Constant("_list"), Variable("bbb"))))
wneuper@5097
   175
    //assertEquals(Ast.norm(ast),      Appl(List(Constant("_list"), Variable("bbb"))))
wneuper@5097
   176
    //assertEquals(Ast.normal(ast),    Appl(List(Constant("_list"), Variable("bbb"))))
wneuper@5097
   177
    // \\--------------- tests BEFORE made local to normalize ---------------//
wneuper@5097
   178
    assertEquals(Ast.normalize(XSyntax.print_rules, ast), Appl(List(Constant("_list"), Variable("bbb"))))
wneuper@5090
   179
wneuper@5090
   180
    //------- whole ast calling try_rules:
wneuper@5090
   181
    ast =
wneuper@5090
   182
      Ast.Appl(List(
wneuper@5090
   183
        Ast.Constant("List.list.Cons"),
wneuper@5083
   184
        Ast.Variable("aaa"),
wneuper@5083
   185
        Ast.Appl(List(
wneuper@5090
   186
          Ast.Constant("List.list.Cons"),
wneuper@5083
   187
          Ast.Variable("bbb"),
wneuper@5083
   188
          Ast.Appl(List(
wneuper@5083
   189
            Ast.Constant("List.list.Cons"),
wneuper@5083
   190
            Ast.Variable("ccc"),
wneuper@5090
   191
            Ast.Constant("List.list.Nil")))))))            
wneuper@5097
   192
    assertEquals(Ast.matches(ast, lhs), None) //--> None: the rewriter calls try_rules!
wneuper@5097
   193
    // //--------------- tests BEFORE made local to normalize ---------------\\
wneuper@5097
   194
    //assertEquals(Ast.xtry(ast, "List.list.Cons"), None)
wneuper@5097
   195
    //assertEquals(Ast.try_rules(XSyntax.print_rules("List.list.Cons"), ast), None)
wneuper@5097
   196
    //assertEquals(Ast.try_rules(List((lhs, rhs)), ast), None)
wneuper@5080
   197
wneuper@5097
   198
    //assertEquals(Ast.rewrite(ast), None)
wneuper@5097
   199
    //assertEquals(Ast.norm_root(ast), Appl(List(Constant("List.list.Cons"), Variable("aaa"), Appl(List(Constant("List.list.Cons"), Variable("bbb"), Appl(List(Constant("List.list.Cons"), Variable("ccc"), Constant("List.list.Nil"))))))))
wneuper@5097
   200
    //assertEquals(Ast.normal(ast),    Appl(List(Constant("_list"), Appl(List(Constant("_args"), Variable("aaa"), Appl(List(Constant("_args"), Variable("bbb"), Variable("ccc"))))))))
wneuper@5097
   201
    //assertEquals(Ast.normal(ast),    Appl(List(Constant("_list"), Appl(List(Constant("_args"), Variable("aaa"), Appl(List(Constant("_args"), Variable("bbb"), Variable("ccc"))))))))
wneuper@5097
   202
    // \\--------------- tests BEFORE made local to normalize ---------------//
wneuper@5097
   203
    assertEquals(Ast.normalize(XSyntax.print_rules, ast),
wneuper@5097
   204
      Appl(List(
wneuper@5097
   205
        Constant("_list"), Appl(List(
wneuper@5097
   206
          Constant("_args"), Variable("aaa"), Appl(List(
wneuper@5097
   207
            Constant("_args"), Variable("bbb"), Variable("ccc"))))))))
wneuper@5098
   208
            
wneuper@5098
   209
    /* output from Isabelle_Isac adds types to above structure:
wneuper@5098
   210
       Appl(List(
wneuper@5098
   211
/*_list*/Constant("_list"), Appl(List(
wneuper@5098
   212
/*_args*/  Constant("_args"), Appl(List(
wneuper@5098
   213
             Constant("_constrain"), Appl(List(
wneuper@5098
   214
/* aaa */      Constant("_free"), Variable("aaa"))), Appl(List(
wneuper@5098
   215
                 Constant("_ofsort"), Appl(List(
wneuper@5098
   216
                   Constant("_tfree"), Variable("'a"))), Constant("\\<^class>HOL.type"))))), Appl(List(
wneuper@5098
   217
/*_args*/            Constant("_args"), Appl(List(
wneuper@5098
   218
                       Constant("_constrain"), Appl(List(
wneuper@5098
   219
/* bbb */                Constant("_free"), Variable("bbb"))), Appl(List(
wneuper@5098
   220
                           Constant("_ofsort"), Appl(List(
wneuper@5098
   221
                             Constant("_tfree"), Variable("'a"))), Constant("\\<^class>HOL.type"))))), Appl(List(
wneuper@5098
   222
                               Constant("_constrain"), Appl(List(
wneuper@5098
   223
/* ccc */                        Constant("_free"), Variable("ccc"))), Appl(List(
wneuper@5098
   224
                                   Constant("_ofsort"), Appl(List(
wneuper@5098
   225
                                     Constant("_tfree"), Variable("'a"))), Constant("\\<^class>HOL.type")))))))))))
wneuper@5098
   226
     */
wneuper@5103
   227
wneuper@5103
   228
    ast =
wneuper@5103
   229
      Appl(List(
wneuper@5103
   230
        Constant("_list"), Appl(List(
wneuper@5103
   231
          Constant("_args"), Variable("aaa"), Appl(List(
wneuper@5103
   232
            Constant("_args"), Variable("bbb"), Variable("ccc")))))))    
wneuper@5103
   233
    assertEquals("[aaa, bbb, ccc]", Ast.math_string_of(ast))
wneuper@5097
   234
    
wneuper@5097
   235
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_list_normal");
wneuper@5067
   236
  }
wneuper@5085
   237
wneuper@5137
   238
  def test_tuple_normal() = {
wneuper@5137
   239
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_tuple_normal");
wneuper@5137
   240
    
wneuper@5137
   241
    // cp from ScalaTermFromString#test_etc, term_str = "(aaa, bbb, ccc, ddd)"
wneuper@5137
   242
    var term_from_Isabelle_Isac =
wneuper@5137
   243
      App(
wneuper@5137
   244
        App(
wneuper@5137
   245
          Const("Product_Type.Pair", Type("fun", List(TFree("'a", List("HOL.type")),Type("fun", List(Type("Product_Type.prod", List(TFree("'b", List("HOL.type")),Type("Product_Type.prod", List(TFree("'c", List("HOL.type")),TFree("'d", List("HOL.type")))))),Type("Product_Type.prod", List(TFree("'a", List("HOL.type")),Type("Product_Type.prod", List(TFree("'b", List("HOL.type")),Type("Product_Type.prod", List(TFree("'c", List("HOL.type")),TFree("'d", List("HOL.type"))))))))))))),
wneuper@5137
   246
          Free("aaa", TFree("'a", List("HOL.type")))),
wneuper@5137
   247
        App(
wneuper@5137
   248
          App(
wneuper@5137
   249
            Const("Product_Type.Pair", Type("fun", List(TFree("'b", List("HOL.type")),Type("fun", List(Type("Product_Type.prod", List(TFree("'c", List("HOL.type")),TFree("'d", List("HOL.type")))),Type("Product_Type.prod", List(TFree("'b", List("HOL.type")),Type("Product_Type.prod", List(TFree("'c", List("HOL.type")),TFree("'d", List("HOL.type"))))))))))),
wneuper@5137
   250
            Free("bbb", TFree("'b", List("HOL.type")))),
wneuper@5137
   251
          App(
wneuper@5137
   252
            App(
wneuper@5137
   253
              Const("Product_Type.Pair", Type("fun", List(TFree("'c", List("HOL.type")),Type("fun", List(TFree("'d", List("HOL.type")),Type("Product_Type.prod", List(TFree("'c", List("HOL.type")),TFree("'d", List("HOL.type"))))))))),
wneuper@5137
   254
              Free("ccc", TFree("'c", List("HOL.type")))),
wneuper@5137
   255
            Free("ddd", TFree("'d", List("HOL.type"))
wneuper@5137
   256
          ))
wneuper@5137
   257
        ))
wneuper@5137
   258
    var simple_ast = Syntax_Phases.simple_ast_of(term_from_Isabelle_Isac)
wneuper@5137
   259
    assertEquals(simple_ast,
wneuper@5137
   260
      Appl(List(  //println(raw_string_of(simple_ast))
wneuper@5137
   261
        Constant("Product_Type.Pair"),
wneuper@5137
   262
        Variable("aaa"),
wneuper@5137
   263
        Appl(List(
wneuper@5137
   264
          Constant("Product_Type.Pair"),
wneuper@5137
   265
          Variable("bbb"),
wneuper@5137
   266
          Appl(List(
wneuper@5137
   267
            Constant("Product_Type.Pair"), //???vvvvvvvvvvvvv
wneuper@5137
   268
            Variable("ccc"),
wneuper@5137
   269
            Variable("ddd")))
wneuper@5137
   270
          ))
wneuper@5137
   271
        ))
wneuper@5137
   272
      )
wneuper@5137
   273
    var pre_ast : Ast.Ast = simple_ast
wneuper@5137
   274
//    pre_ast : Ast.Ast =  //copied from Isabelle2016-1-MAWEN, types dropped MAY
wneuper@5137
   275
//      Appl(List(
wneuper@5137
   276
//        Constant("Product_Type.Pair"),
wneuper@5137
   277
//        Variable("aaa"),
wneuper@5137
   278
//        Appl(List(
wneuper@5137
   279
//          Constant("Product_Type.Pair"),
wneuper@5137
   280
//          Variable("bbb"),
wneuper@5137
   281
//          Appl(List(
wneuper@5137
   282
//            Constant("Product_Type.Pair"),
wneuper@5137
   283
//            Appl(List(                     //???^^^^^^^^^^^
wneuper@5137
   284
//               Variable("ccc"))),
wneuper@5137
   285
//               Variable("ddd")))))))
wneuper@5137
   286
    var post_ast : Ast.Ast = //copied from Isabelle2016-1-MAWEN, types dropped
wneuper@5137
   287
      Appl(List(
wneuper@5137
   288
        Constant("_tuple"),  
wneuper@5137
   289
        Variable("aaa"),
wneuper@5137
   290
        Appl(List(
wneuper@5137
   291
          Constant("_tuple_args"),  
wneuper@5137
   292
          Variable("bbb"),
wneuper@5137
   293
          Appl(List(
wneuper@5137
   294
            Constant("_tuple_args"),
wneuper@5137
   295
            Variable("ccc"),
wneuper@5137
   296
            Appl(List(
wneuper@5137
   297
              Constant("_tuple_arg"),  
wneuper@5137
   298
              Variable("ddd")))))))))
wneuper@5137
   299
    val ast = normalize(XSyntax.print_rules, pre_ast)
wneuper@5137
   300
    assertEquals(ast, post_ast)        // LETZTES "_tuple_args" <> "_tuple_args"
wneuper@5137
   301
                  
wneuper@5137
   302
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_tuple_normal");
wneuper@5137
   303
  }
wneuper@5137
   304
  
wneuper@5138
   305
  def test_matches() = {
wneuper@5138
   306
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_matches");
wneuper@5137
   307
    
wneuper@5138
   308
    // at this ast rule 2 should match
wneuper@5138
   309
    val ML4_2old_ast = //AFTER rewrite 3, rule 2, from ###ML old_ast
wneuper@5138
   310
      Appl(List(
wneuper@5138
   311
        Constant("_tuple"),  
wneuper@5138
   312
        Variable("bbb"),
wneuper@5138
   313
        Appl(List(
wneuper@5138
   314
          Constant("_tuple_arg"),   //<---vv
wneuper@5138
   315
          Appl(List(
wneuper@5138
   316
            Constant("_tuple"),     //<---^^
wneuper@5138
   317
              Variable("ccc"),
wneuper@5138
   318
              Appl(List(
wneuper@5138
   319
                Constant("_tuple_arg"),  
wneuper@5138
   320
                Variable("ddd")))  ))))))   //->
wneuper@5138
   321
    val ML4_2lhs = //AFTER rewrite 3, rule 2, from ###ML try_rules lhs:
wneuper@5138
   322
      Appl(List(
wneuper@5138
   323
        Constant("_tuple"),
wneuper@5138
   324
        Variable("x"),
wneuper@5138
   325
        Appl(List(
wneuper@5138
   326
          Constant("_tuple_arg"),
wneuper@5138
   327
          Appl(List(
wneuper@5138
   328
            Constant("_tuple"),
wneuper@5138
   329
            Variable("y"),
wneuper@5138
   330
            Variable("z"))))))) 
wneuper@5138
   331
    var ast_pat = (ML4_2old_ast, ML4_2lhs)
wneuper@5138
   332
    // println("matches(ast_pat): " + matches(ast_pat))
wneuper@5138
   333
    // matches(ast_pat): Some((Map(x -> Variable(bbb), y -> Variable(ccc), z -> Appl(List(Constant(_tuple_arg), Variable(ddd)))),List()))
wneuper@5138
   334
    assertTrue((!(matches(ast_pat)).isEmpty))
wneuper@5138
   335
    
wneuper@5138
   336
    val scala4_2old_ast = //AFTER rewrite 3, NO rule 1, from ###post.scala:
wneuper@5138
   337
      Appl(List(
wneuper@5138
   338
        Constant("_tuple"),
wneuper@5138
   339
        Variable("aaa"),
wneuper@5138
   340
        Appl(List(
wneuper@5138
   341
          Constant("_tuple_arg"),   //<---vv pattern from ###ML 4. rule 2 NOT RECOGNISED
wneuper@5138
   342
          Appl(List(
wneuper@5138
   343
            Constant("_tuple"),     //<---^^ pattern from ###ML 4. rule 2 NOT RECOGNISED
wneuper@5138
   344
            Variable("bbb"),
wneuper@5138
   345
            Appl(List(
wneuper@5138
   346
              Constant("_tuple_arg"),     //<---vv pattern from ###ML 4. rule 2 NOT RECOGNISED
wneuper@5138
   347
              Appl(List(
wneuper@5138
   348
                Constant("_tuple"),       //<---^^ pattern from ###ML 4. rule 2 NOT RECOGNISED
wneuper@5138
   349
                Variable("ccc"),
wneuper@5138
   350
                Appl(List(
wneuper@5138
   351
                  Constant("_tuple_arg"),
wneuper@5138
   352
                  Variable("ddd")))))))))))))
wneuper@5138
   353
    ast_pat = (scala4_2old_ast, ML4_2lhs)
wneuper@5138
   354
    // println("matches(ast_pat): " + matches(ast_pat))
wneuper@5138
   355
    // matches(ast_pat): Some((Map(x -> Variable(aaa), y -> Variable(bbb), z -> Appl(List(Constant(_tuple_arg), Appl(List(Constant(_tuple), Variable(ccc), Appl(List(Constant(_tuple_arg), Variable(ddd)))))))),List()))
wneuper@5138
   356
    assertTrue((!(matches(ast_pat)).isEmpty))
wneuper@5138
   357
wneuper@5138
   358
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_matches");
wneuper@5138
   359
  }
wneuper@5138
   360
  
wneuper@5138
   361
      
wneuper@5085
   362
  def test_update() {
wneuper@5085
   363
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_update");
wneuper@5085
   364
wneuper@5138
   365
    val ast =
wneuper@5138
   366
    /*List()*/    Appl(List(
wneuper@5138
   367
    /*List(1)*/     Constant("Groups.plus_class.plus"),
wneuper@5138
   368
    /*List(2)*/     Appl(List(
wneuper@5138
   369
    /*List(2,1)*/     Constant("Groups.plus_class.plus"),
wneuper@5138
   370
    /*List(2,2)*/     Variable("a"),
wneuper@5138
   371
    /*List(2,3)*/     Appl(List(
wneuper@5138
   372
    /*List(2,3,1)*/     Constant("Groups.plus_class.plus"),
wneuper@5138
   373
    /*List(2,3,2)*/     Variable("b"),
wneuper@5138
   374
    /*List(2,3,3)*/     Variable("c"))) )),
wneuper@5138
   375
    /*List(3)*/     Variable("d")))
wneuper@5138
   376
            
wneuper@5085
   377
    assertEquals("a + (b + c) + d", math_string_of(ast))
wneuper@5100
   378
    assertEquals("X  + d", math_string_of(add(List(2), Constant("X"), ast)))
wneuper@5100
   379
    assertEquals("X  + (b + c) + d", math_string_of(add(List(2,2), Constant("X"), ast)))
wneuper@5100
   380
    assertEquals("a + (X  + c) + d", math_string_of(add(List(2,3,2), Constant("X"), ast)))
wneuper@5100
   381
    assertEquals("a + (b + X ) + d", math_string_of(add(List(2,3,3), Constant("X"), ast)))
wneuper@5100
   382
    assertEquals("a + (b + c) + X ", math_string_of(add(List(3), Constant("X"), ast)))
wneuper@5085
   383
    
wneuper@5100
   384
    assertEquals("X + Y + d", math_string_of(add(List(2),
wneuper@5086
   385
        Appl(List(
wneuper@5086
   386
         Constant("Groups.plus_class.plus"),
wneuper@5086
   387
         Variable("X"),
wneuper@5086
   388
         Variable("Y"))), ast)))
wneuper@5086
   389
    
wneuper@5085
   390
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_update");
wneuper@5085
   391
  }
wneuper@5085
   392
wneuper@5149
   393
  def test_get_value() {
wneuper@5149
   394
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_get_value");
wneuper@5149
   395
    
wneuper@5149
   396
    val ast =
wneuper@5149
   397
    /*List()*/    Appl(List(
wneuper@5149
   398
    /*List(1)*/     Constant("Groups.plus_class.plus"),
wneuper@5149
   399
    /*List(2)*/     Appl(List(
wneuper@5149
   400
    /*List(2,1)*/     Constant("Groups.plus_class.plus"),
wneuper@5149
   401
    /*List(2,2)*/     Variable("a"),
wneuper@5149
   402
    /*List(2,3)*/     Appl(List(
wneuper@5149
   403
    /*List(2,3,1)*/     Constant("Groups.plus_class.plus"),
wneuper@5149
   404
    /*List(2,3,2)*/     Variable("b"),
wneuper@5149
   405
    /*List(2,3,3)*/     Variable("c"))) )),
wneuper@5149
   406
    /*List(3)*/     Variable("d")))
wneuper@5149
   407
    assertEquals("a + (b + c) + d", math_string_of(get_value (List(), ast)))
wneuper@5149
   408
    assertEquals("a", math_string_of(get_value (List(2,2), ast)))
wneuper@5149
   409
    assertEquals("b + c", math_string_of(get_value (List(2,3), ast)))
wneuper@5149
   410
    assertEquals("b", math_string_of(get_value (List(2,3,2), ast)))
wneuper@5149
   411
    
wneuper@5149
   412
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_get_value");
wneuper@5149
   413
  }
wneuper@5149
   414
wneuper@5123
   415
  def test_math_string_of_arbitrary() {
wneuper@5123
   416
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_math_string_of_arbitrary");
wneuper@5123
   417
    
wneuper@5123
   418
    val arbitrary = Appl(List(Variable("a"), Constant("b"),
wneuper@5123
   419
      Appl(List(Constant("Groups.plus_class.plus"), Variable("c"),Variable("d"))),
wneuper@5123
   420
      Appl(List(Variable("y"),Variable("x"))) ))
wneuper@5123
   421
    assertEquals("a b  (c + d) (y (x))", math_string_of(arbitrary))
wneuper@5123
   422
    
wneuper@5123
   423
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_math_string_of_arbitrary");
wneuper@5123
   424
  }
s1520454056@5197
   425
}