isac-java/src/java-tests/isac/gui/mawen/syntax/TestAst.scala
author Walther Neuper <wneuper@ist.tugraz.at>
Wed, 24 May 2017 16:27:59 +0200
changeset 5123 b9dbd51ae5cf
parent 5107 7d1e524480b8
child 5137 dd797d56d238
permissions -rw-r--r--
Ast.math_string_of for arbitrary asts
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"
wneuper@5123
     6
import isac.gui.mawen.syntax.isabelle.XLibrary
wneuper@5088
     7
import isac.gui.mawen.editor.TestDATAeditor
wneuper@5064
     8
wneuper@5049
     9
import junit.framework.TestCase
wneuper@5049
    10
import org.junit.Assert._
wneuper@5049
    11
wneuper@5049
    12
wneuper@5049
    13
class TestAst extends TestCase {
wneuper@5067
    14
wneuper@5085
    15
   // x / y
wneuper@5085
    16
  def a1 = Appl(List(Constant("Fields.inverse_class.divide"), Variable ("x"), Variable ("y")))
wneuper@5085
    17
  
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
  
wneuper@5085
    21
  // sin(a + b) / c
wneuper@5085
    22
  def a3 = Appl(List
wneuper@5085
    23
      (Constant("Fields.inverse_class.divide"), 
wneuper@5085
    24
          Appl(List(Constant("sin"), 
wneuper@5085
    25
              Appl(List(Constant("Groups.plus_class.plus"), 
wneuper@5085
    26
                  Variable("a"), 
wneuper@5085
    27
                  Variable("b")
wneuper@5085
    28
              ))
wneuper@5085
    29
          ))
wneuper@5085
    30
          ,Variable ("c")
wneuper@5085
    31
      ))
wneuper@5085
    32
  def a4 = Appl(List(Constant("Groups.plus_class.plus"), Appl(List(Constant("Groups.plus_class.plus"), Variable("a"), Variable("b"))), Variable("c")))
wneuper@5085
    33
  def a5 = Appl(List(Constant("Groups.plus_class.plus"), Variable("a"), Appl(List(Constant("Groups.plus_class.plus"), Variable("b"), Variable("c")))))
wneuper@5085
    34
  
wneuper@5085
    35
  def test_prefix_string_of() {
wneuper@5085
    36
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_prefix_string_of");
wneuper@5085
    37
    
wneuper@5085
    38
    assertEquals(Ast.prefix_string_of(a1), "/ x y")
wneuper@5085
    39
    assertEquals(Ast.prefix_string_of(a2), "* a / b c")
wneuper@5085
    40
    assertEquals(Ast.prefix_string_of(a3), "/ sin + a b c")
wneuper@5085
    41
    
wneuper@5085
    42
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_prefix_string_of");
wneuper@5085
    43
  }
wneuper@5085
    44
  
wneuper@5085
    45
    def test_math_string_of() {
wneuper@5085
    46
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_math_string_of");
wneuper@5085
    47
    
wneuper@5085
    48
    assertEquals(Ast.math_string_of(a1), "x / y")
wneuper@5085
    49
    assertEquals(Ast.math_string_of(a2), "a * (b / c)")
wneuper@5085
    50
    assertEquals(Ast.math_string_of(a3), "sin (a + b) / c")
wneuper@5085
    51
wneuper@5085
    52
    assertEquals(Ast.math_string_of(a4), "a + b + c")
wneuper@5085
    53
    assertEquals(Ast.math_string_of(a5), "a + (b + c)")
wneuper@5085
    54
    
wneuper@5085
    55
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_math_string_of");
wneuper@5085
    56
  }
wneuper@5085
    57
  
wneuper@5085
    58
  /* 
wneuper@5085
    59
   * The examples for reference of Natalie Karl initially took terms,
wneuper@5085
    60
   * @see isac.gui.mawen.scalaterm.TestUtil.
wneuper@5085
    61
   * Here we check, whether term_to_ast + Ast.string_of give the same result.
wneuper@5085
    62
   */
wneuper@5085
    63
  def test_examples_for_NK() {
wneuper@5085
    64
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_examples_for_NK");
wneuper@5085
    65
wneuper@5085
    66
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t1)),
wneuper@5085
    67
        "aaa + bbb = processed_by_Isabelle_Isac ")
wneuper@5085
    68
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t2)), 
wneuper@5085
    69
        "a + 2 * b + 3 * (c + d)")
wneuper@5085
    70
wneuper@5085
    71
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t31)), 
wneuper@5085
    72
        "aaa + bbb + ccc")
wneuper@5085
    73
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t32)), 
wneuper@5085
    74
        "aaa + (bbb + ccc)")
wneuper@5085
    75
wneuper@5085
    76
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t41)), 
wneuper@5085
    77
        "Diff (x + sin (x ^ 2), x)")
wneuper@5085
    78
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t42)), 
wneuper@5085
    79
        "d_d x (x + sin (x ^ 2))")
wneuper@5085
    80
    
wneuper@5085
    81
    // MAWEN example for reference No.1
wneuper@5085
    82
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt1())), 
wneuper@5085
    83
        "Simplify (1 + 2 * x * (y + 3) / (4 * z * (y + 3)) + 5)")
wneuper@5085
    84
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt3())), 
wneuper@5085
    85
        "1 + 2 * x * (y + 3) / (4 * z * (y + 3)) + 5")
wneuper@5085
    86
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt4())), 
wneuper@5085
    87
        "1 + 2 * x / (4 * z) + 5")
wneuper@5085
    88
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt5())), 
wneuper@5085
    89
        "1 + x / (2 * z) + 5")
wneuper@5085
    90
    assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt6())), 
wneuper@5085
    91
        "6 + x / (2 * z)")
wneuper@5085
    92
wneuper@5085
    93
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_examples_for_NK");
wneuper@5085
    94
  }
wneuper@5085
    95
wneuper@5085
    96
  //test additional examples with BOX, CURSOR, GAP
wneuper@5085
    97
  def test_BOX_CURSOR_GAP() {
wneuper@5085
    98
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_BOX_CURSOR_GAP");
wneuper@5085
    99
    
wneuper@5088
   100
    assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_1))   
wneuper@5088
   101
    assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_2))   
wneuper@5088
   102
    assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_3))
wneuper@5085
   103
wneuper@5088
   104
    assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_1_CURSOR))   
wneuper@5088
   105
    assertEquals(  "# + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_1_CURSOR_GAP))
wneuper@5088
   106
    assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_1_CURSOR_b))
wneuper@5085
   107
wneuper@5088
   108
    assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_CURSOR_BOX_3A))   
wneuper@5088
   109
    assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_CURSOR_BOX_3B))
wneuper@5085
   110
wneuper@5085
   111
wneuper@5088
   112
    assertEquals("d_d x x + d_d x (sin (x ^ 2))", Ast.math_string_of(TestDATAeditor.box_05))   
wneuper@5088
   113
    assertEquals("d_d bdv (sin (u)) = cos (u) * d_d bdv u", Ast.math_string_of(TestDATAeditor.box_06))   
wneuper@5088
   114
    assertEquals("d_d x x + cos (x ^ 2) * d_d x #", Ast.math_string_of(TestDATAeditor.box_07_with_cursor))   
wneuper@5088
   115
    assertEquals("a + (# + c)", Ast.math_string_of(TestDATAeditor.box_gap_cursor))   
wneuper@5088
   116
    assertEquals("#", Ast.math_string_of(TestDATAeditor.box_with_cursor_on_gap))   
wneuper@5088
   117
    assertEquals("# + #", Ast.math_string_of(TestDATAeditor.in_1a))   
wneuper@5088
   118
    assertEquals("a + # / #", Ast.math_string_of(TestDATAeditor.in_1b))   
wneuper@5088
   119
    assertEquals("a + b / #", Ast.math_string_of(TestDATAeditor.in_1c))   
wneuper@5085
   120
wneuper@5085
   121
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_BOX_CURSOR_GAP");
wneuper@5085
   122
  }
wneuper@5085
   123
wneuper@5080
   124
wneuper@5090
   125
    /* from Isabelle2016-1-MAWEN ast.ML: 
wneuper@5090
   126
     * fun try_rules ((lhs, rhs) :: pats) ast = (*WN*)
wneuper@5090
   127
     * 
wneuper@5090
   128
     * lemma "[aaa,bbb] = ddd" --- term_to_ast ---
wneuper@5090
   129
     * with types dropped in ast and rule.
wneuper@5090
   130
     * 
wneuper@5090
   131
     * assert was too expensive at this moment.
wneuper@5090
   132
     */
wneuper@5097
   133
  def test_list_normal() {
wneuper@5097
   134
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_list_normal");
wneuper@5067
   135
    
wneuper@5090
   136
    //======= 1.successful application 
wneuper@5090
   137
    //###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
   138
    //###try_rules lhs: Appl[Constant("List.list.Cons"), Variable("x"), Constant("List.list.Nil"]) 
wneuper@5090
   139
    //###try_rules rhs: Appl[Constant("_list"), Variable("x"]) 
wneuper@5090
   140
    //------- ast in try_rules (from additional output):
wneuper@5090
   141
    var ast =
wneuper@5083
   142
      Ast.Appl(List(
wneuper@5090
   143
        Ast.Constant("List.list.Cons"),
wneuper@5090
   144
        Ast.Variable("bbb"),
wneuper@5090
   145
        Ast.Constant("List.list.Nil")))
wneuper@5090
   146
    var lhs =
wneuper@5090
   147
      Appl(List(
wneuper@5090
   148
        Constant("List.list.Cons"),
wneuper@5090
   149
        Variable("x"),
wneuper@5090
   150
        Constant("List.list.Nil")))
wneuper@5090
   151
    var rhs =
wneuper@5090
   152
      Appl(List(
wneuper@5090
   153
        Constant("_list"),
wneuper@5090
   154
        Variable("x")))
wneuper@5097
   155
    assertEquals(Ast.matches(ast, lhs), Some((Map("x" -> Variable("bbb")),List())))
wneuper@5097
   156
    // //--------------- tests BEFORE made local to normalize ---------------\\
wneuper@5097
   157
    //assertEquals(Ast.xtry(ast, "List.list.Cons"), Some(Appl(List(Constant("_list"), Variable("bbb")))))
wneuper@5097
   158
    //assertEquals(Ast.try_rules(XSyntax.print_rules("List.list.Cons"), ast), Some(Appl(List(Constant("_list"), Variable("bbb")))))
wneuper@5097
   159
    //assertEquals(Ast.try_rules(List((lhs, rhs)), ast), Some(Appl(List(Constant("_list"), Variable("bbb")))))
wneuper@5097
   160
wneuper@5097
   161
    //assertEquals(Ast.rewrite(ast), Some(Appl(List(Constant("_list"), Variable("bbb")))))
wneuper@5097
   162
    //assertEquals(Ast.norm_root(ast), Appl(List(Constant("_list"), Variable("bbb"))))
wneuper@5097
   163
    //assertEquals(Ast.norm(ast),      Appl(List(Constant("_list"), Variable("bbb"))))
wneuper@5097
   164
    //assertEquals(Ast.normal(ast),    Appl(List(Constant("_list"), Variable("bbb"))))
wneuper@5097
   165
    // \\--------------- tests BEFORE made local to normalize ---------------//
wneuper@5097
   166
    assertEquals(Ast.normalize(XSyntax.print_rules, ast), Appl(List(Constant("_list"), Variable("bbb"))))
wneuper@5090
   167
wneuper@5090
   168
    //------- whole ast calling try_rules:
wneuper@5090
   169
    ast =
wneuper@5090
   170
      Ast.Appl(List(
wneuper@5090
   171
        Ast.Constant("List.list.Cons"),
wneuper@5083
   172
        Ast.Variable("aaa"),
wneuper@5083
   173
        Ast.Appl(List(
wneuper@5090
   174
          Ast.Constant("List.list.Cons"),
wneuper@5083
   175
          Ast.Variable("bbb"),
wneuper@5083
   176
          Ast.Appl(List(
wneuper@5083
   177
            Ast.Constant("List.list.Cons"),
wneuper@5083
   178
            Ast.Variable("ccc"),
wneuper@5090
   179
            Ast.Constant("List.list.Nil")))))))            
wneuper@5097
   180
    assertEquals(Ast.matches(ast, lhs), None) //--> None: the rewriter calls try_rules!
wneuper@5097
   181
    // //--------------- tests BEFORE made local to normalize ---------------\\
wneuper@5097
   182
    //assertEquals(Ast.xtry(ast, "List.list.Cons"), None)
wneuper@5097
   183
    //assertEquals(Ast.try_rules(XSyntax.print_rules("List.list.Cons"), ast), None)
wneuper@5097
   184
    //assertEquals(Ast.try_rules(List((lhs, rhs)), ast), None)
wneuper@5080
   185
wneuper@5097
   186
    //assertEquals(Ast.rewrite(ast), None)
wneuper@5097
   187
    //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
   188
    //assertEquals(Ast.normal(ast),    Appl(List(Constant("_list"), Appl(List(Constant("_args"), Variable("aaa"), Appl(List(Constant("_args"), Variable("bbb"), Variable("ccc"))))))))
wneuper@5097
   189
    //assertEquals(Ast.normal(ast),    Appl(List(Constant("_list"), Appl(List(Constant("_args"), Variable("aaa"), Appl(List(Constant("_args"), Variable("bbb"), Variable("ccc"))))))))
wneuper@5097
   190
    // \\--------------- tests BEFORE made local to normalize ---------------//
wneuper@5097
   191
    assertEquals(Ast.normalize(XSyntax.print_rules, ast),
wneuper@5097
   192
      Appl(List(
wneuper@5097
   193
        Constant("_list"), Appl(List(
wneuper@5097
   194
          Constant("_args"), Variable("aaa"), Appl(List(
wneuper@5097
   195
            Constant("_args"), Variable("bbb"), Variable("ccc"))))))))
wneuper@5098
   196
            
wneuper@5098
   197
    /* output from Isabelle_Isac adds types to above structure:
wneuper@5098
   198
       Appl(List(
wneuper@5098
   199
/*_list*/Constant("_list"), Appl(List(
wneuper@5098
   200
/*_args*/  Constant("_args"), Appl(List(
wneuper@5098
   201
             Constant("_constrain"), Appl(List(
wneuper@5098
   202
/* aaa */      Constant("_free"), Variable("aaa"))), Appl(List(
wneuper@5098
   203
                 Constant("_ofsort"), Appl(List(
wneuper@5098
   204
                   Constant("_tfree"), Variable("'a"))), Constant("\\<^class>HOL.type"))))), Appl(List(
wneuper@5098
   205
/*_args*/            Constant("_args"), Appl(List(
wneuper@5098
   206
                       Constant("_constrain"), Appl(List(
wneuper@5098
   207
/* bbb */                Constant("_free"), Variable("bbb"))), Appl(List(
wneuper@5098
   208
                           Constant("_ofsort"), Appl(List(
wneuper@5098
   209
                             Constant("_tfree"), Variable("'a"))), Constant("\\<^class>HOL.type"))))), Appl(List(
wneuper@5098
   210
                               Constant("_constrain"), Appl(List(
wneuper@5098
   211
/* ccc */                        Constant("_free"), Variable("ccc"))), Appl(List(
wneuper@5098
   212
                                   Constant("_ofsort"), Appl(List(
wneuper@5098
   213
                                     Constant("_tfree"), Variable("'a"))), Constant("\\<^class>HOL.type")))))))))))
wneuper@5098
   214
     */
wneuper@5103
   215
wneuper@5103
   216
    ast =
wneuper@5103
   217
      Appl(List(
wneuper@5103
   218
        Constant("_list"), Appl(List(
wneuper@5103
   219
          Constant("_args"), Variable("aaa"), Appl(List(
wneuper@5103
   220
            Constant("_args"), Variable("bbb"), Variable("ccc")))))))    
wneuper@5103
   221
    assertEquals("[aaa, bbb, ccc]", Ast.math_string_of(ast))
wneuper@5097
   222
    
wneuper@5097
   223
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_list_normal");
wneuper@5067
   224
  }
wneuper@5085
   225
wneuper@5085
   226
  val ast =
wneuper@5085
   227
/*List()*/    Appl(List(
wneuper@5085
   228
/*List(1)*/     Constant("Groups.plus_class.plus"),
wneuper@5085
   229
/*List(2)*/     Appl(List(
wneuper@5085
   230
/*List(2,1)*/     Constant("Groups.plus_class.plus"),
wneuper@5085
   231
/*List(2,2)*/     Variable("a"),
wneuper@5085
   232
/*List(2,3)*/     Appl(List(
wneuper@5085
   233
/*List(2,3,1)*/     Constant("Groups.plus_class.plus"),
wneuper@5085
   234
/*List(2,3,2)*/     Variable("b"),
wneuper@5085
   235
/*List(2,3,3)*/     Variable("c"))) )),
wneuper@5085
   236
/*List(3)*/     Variable("d")))
wneuper@5085
   237
            
wneuper@5085
   238
  def test_update() {
wneuper@5085
   239
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_update");
wneuper@5085
   240
wneuper@5085
   241
    assertEquals("a + (b + c) + d", math_string_of(ast))
wneuper@5100
   242
    assertEquals("X  + d", math_string_of(add(List(2), Constant("X"), ast)))
wneuper@5100
   243
    assertEquals("X  + (b + c) + d", math_string_of(add(List(2,2), Constant("X"), ast)))
wneuper@5100
   244
    assertEquals("a + (X  + c) + d", math_string_of(add(List(2,3,2), Constant("X"), ast)))
wneuper@5100
   245
    assertEquals("a + (b + X ) + d", math_string_of(add(List(2,3,3), Constant("X"), ast)))
wneuper@5100
   246
    assertEquals("a + (b + c) + X ", math_string_of(add(List(3), Constant("X"), ast)))
wneuper@5085
   247
    
wneuper@5100
   248
    assertEquals("X + Y + d", math_string_of(add(List(2),
wneuper@5086
   249
        Appl(List(
wneuper@5086
   250
         Constant("Groups.plus_class.plus"),
wneuper@5086
   251
         Variable("X"),
wneuper@5086
   252
         Variable("Y"))), ast)))
wneuper@5086
   253
    
wneuper@5085
   254
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_update");
wneuper@5085
   255
  }
wneuper@5085
   256
wneuper@5123
   257
  def test_math_string_of_arbitrary() {
wneuper@5123
   258
    println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_math_string_of_arbitrary");
wneuper@5123
   259
    
wneuper@5123
   260
    val arbitrary = Appl(List(Variable("a"), Constant("b"),
wneuper@5123
   261
      Appl(List(Constant("Groups.plus_class.plus"), Variable("c"),Variable("d"))),
wneuper@5123
   262
      Appl(List(Variable("y"),Variable("x"))) ))
wneuper@5123
   263
    assertEquals("a b  (c + d) (y (x))", math_string_of(arbitrary))
wneuper@5123
   264
    
wneuper@5123
   265
    println("\\--END isac.gui.mawen.asttrans.TestAst#test_math_string_of_arbitrary");
wneuper@5123
   266
  }
wneuper@5085
   267
}