1 package isac.gui.mawen.syntax
3 import isac.gui.mawen.scalaterm.TestsDATA
4 import isac.gui.mawen.TestDATA
5 import isac.gui.mawen.syntax.Ast._ //"._" simplifies "Ast.Ast" to "Ast"
6 import edu.tum.cs.isabelle.pure._ // for Term
7 import isac.gui.mawen.syntax.isabelle.XLibrary
8 import isac.gui.mawen.editor.TestDATAeditor
10 import junit.framework.TestCase
11 import org.junit.Assert._
14 class TestAst extends TestCase {
17 def a1 = Appl(List(Constant("Fields.inverse_class.divide"), Variable ("x"), Variable ("y")))
19 def a2 = Appl(List(Constant("Groups.times_class.times"), Variable ("a"), Appl(List(Constant("Fields.inverse_class.divide"), Variable("b"), Variable("c")))))
22 (Constant("Fields.inverse_class.divide"),
23 Appl(List(Constant("sin"),
24 Appl(List(Constant("Groups.plus_class.plus"),
31 def a4 = Appl(List(Constant("Groups.plus_class.plus"), Appl(List(Constant("Groups.plus_class.plus"), Variable("a"), Variable("b"))), Variable("c")))
32 def a5 = Appl(List(Constant("Groups.plus_class.plus"), Variable("a"), Appl(List(Constant("Groups.plus_class.plus"), Variable("b"), Variable("c")))))
33 var post_ast : Ast.Ast = //copied from Isabelle2016-1-MAWEN, types dropped
38 Constant("_tuple_args"),
41 Constant("_tuple_args"),
44 Constant("_tuple_arg"),
45 Variable("ddd")))))))))
47 def test_prefix_string_of() {
48 println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_prefix_string_of");
50 assertEquals(Ast.prefix_string_of(a1), "/ x y")
51 assertEquals(Ast.prefix_string_of(a2), "* a / b c")
52 assertEquals(Ast.prefix_string_of(a3), "/ sin + a b c")
54 println("\\--END isac.gui.mawen.asttrans.TestAst#test_prefix_string_of");
57 def test_math_string_of() {
58 println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_math_string_of");
60 assertEquals(Ast.math_string_of(a1), "x / y")
61 assertEquals(Ast.math_string_of(a2), "a * (b / c)")
62 assertEquals(Ast.math_string_of(a3), "sin (a + b) / c")
64 assertEquals(Ast.math_string_of(a4), "a + b + c")
65 assertEquals(Ast.math_string_of(a5), "a + (b + c)")
66 assertEquals(Ast.math_string_of(post_ast), "(aaa, bbb, ccc, ddd)")
68 println("\\--END isac.gui.mawen.asttrans.TestAst#test_math_string_of");
72 * The examples for reference of Natalie Karl initially took terms,
73 * @see isac.gui.mawen.scalaterm.TestUtil.
74 * Here we check, whether term_to_ast + Ast.string_of give the same result.
76 def test_examples_for_NK() {
77 println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_examples_for_NK");
79 assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t1)),
80 "aaa + bbb = processed_by_Isabelle_Isac ")
81 assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t2)),
82 "a + 2 * b + 3 * (c + d)")
84 assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t31)),
86 assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t32)),
89 assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t41)),
90 "Diff (x + sin (x ^ 2), x)")
91 assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.t42)),
92 "d_d x (x + sin (x ^ 2))")
94 // MAWEN example for reference No.1
95 assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt1())),
96 "Simplify (1 + 2 * x * (y + 3) / (4 * z * (y + 3)) + 5)")
97 assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt3())),
98 "1 + 2 * x * (y + 3) / (4 * z * (y + 3)) + 5")
99 assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt4())),
100 "1 + 2 * x / (4 * z) + 5")
101 assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt5())),
102 "1 + x / (2 * z) + 5")
103 assertEquals(Ast.math_string_of(Syntax_Phases.term_to_ast(TestsDATA.tt6())),
106 println("\\--END isac.gui.mawen.asttrans.TestAst#test_examples_for_NK");
109 //test additional examples with BOX, CURSOR, GAP
110 def test_BOX_CURSOR_GAP() {
111 println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_BOX_CURSOR_GAP");
113 assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_1))
114 assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_2))
115 assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_3))
117 assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_1_CURSOR))
118 assertEquals( "# + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_1_CURSOR_GAP))
119 assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_BOX_1_CURSOR_b))
121 assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_CURSOR_BOX_3A))
122 assertEquals("aaa + bbb", Ast.math_string_of(TestDATAeditor.nest_CURSOR_BOX_3B))
124 assertEquals("d_d x x + d_d x (sin (x ^ 2))", Ast.math_string_of(TestDATAeditor.box_05))
125 assertEquals("d_d bdv (sin (u)) = cos (u) * d_d bdv (u)", Ast.math_string_of(TestDATAeditor.box_06))
126 assertEquals("d_d x x + cos (x ^ 2) * d_d x (#)", Ast.math_string_of(TestDATAeditor.box_07_with_cursor))
127 assertEquals("a + (# + c)", Ast.math_string_of(TestDATAeditor.box_gap_cursor))
128 assertEquals("#", Ast.math_string_of(TestDATAeditor.box_with_cursor_on_gap))
129 assertEquals("# + #", Ast.math_string_of(TestDATAeditor.in_1a))
130 assertEquals("a + # / #", Ast.math_string_of(TestDATAeditor.in_1b))
131 assertEquals("a + b / #", Ast.math_string_of(TestDATAeditor.in_1c))
133 println("\\--END isac.gui.mawen.asttrans.TestAst#test_BOX_CURSOR_GAP");
137 /* from Isabelle2016-1-MAWEN ast.ML:
138 * fun try_rules ((lhs, rhs) :: pats) ast = (*WN*)
140 * lemma "[aaa,bbb] = ddd" --- term_to_ast ---
141 * with types dropped in ast and rule.
143 * assert was too expensive at this moment.
145 def test_list_normal() {
146 println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_list_normal");
148 //======= 1.successful application
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"])
150 //###try_rules lhs: Appl[Constant("List.list.Cons"), Variable("x"), Constant("List.list.Nil"])
151 //###try_rules rhs: Appl[Constant("_list"), Variable("x"])
152 //------- ast in try_rules (from additional output):
155 Ast.Constant("List.list.Cons"),
157 Ast.Constant("List.list.Nil")))
160 Constant("List.list.Cons"),
162 Constant("List.list.Nil")))
167 assertEquals(Ast.matches(ast, lhs), Some((Map("x" -> Variable("bbb")),List())))
168 // //--------------- tests BEFORE made local to normalize ---------------\\
169 //assertEquals(Ast.xtry(ast, "List.list.Cons"), Some(Appl(List(Constant("_list"), Variable("bbb")))))
170 //assertEquals(Ast.try_rules(XSyntax.print_rules("List.list.Cons"), ast), Some(Appl(List(Constant("_list"), Variable("bbb")))))
171 //assertEquals(Ast.try_rules(List((lhs, rhs)), ast), Some(Appl(List(Constant("_list"), Variable("bbb")))))
173 //assertEquals(Ast.rewrite(ast), Some(Appl(List(Constant("_list"), Variable("bbb")))))
174 //assertEquals(Ast.norm_root(ast), Appl(List(Constant("_list"), Variable("bbb"))))
175 //assertEquals(Ast.norm(ast), Appl(List(Constant("_list"), Variable("bbb"))))
176 //assertEquals(Ast.normal(ast), Appl(List(Constant("_list"), Variable("bbb"))))
177 // \\--------------- tests BEFORE made local to normalize ---------------//
178 assertEquals(Ast.normalize(XSyntax.print_rules, ast), Appl(List(Constant("_list"), Variable("bbb"))))
180 //------- whole ast calling try_rules:
183 Ast.Constant("List.list.Cons"),
186 Ast.Constant("List.list.Cons"),
189 Ast.Constant("List.list.Cons"),
191 Ast.Constant("List.list.Nil")))))))
192 assertEquals(Ast.matches(ast, lhs), None) //--> None: the rewriter calls try_rules!
193 // //--------------- tests BEFORE made local to normalize ---------------\\
194 //assertEquals(Ast.xtry(ast, "List.list.Cons"), None)
195 //assertEquals(Ast.try_rules(XSyntax.print_rules("List.list.Cons"), ast), None)
196 //assertEquals(Ast.try_rules(List((lhs, rhs)), ast), None)
198 //assertEquals(Ast.rewrite(ast), None)
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"))))))))
200 //assertEquals(Ast.normal(ast), Appl(List(Constant("_list"), Appl(List(Constant("_args"), Variable("aaa"), Appl(List(Constant("_args"), Variable("bbb"), Variable("ccc"))))))))
201 //assertEquals(Ast.normal(ast), Appl(List(Constant("_list"), Appl(List(Constant("_args"), Variable("aaa"), Appl(List(Constant("_args"), Variable("bbb"), Variable("ccc"))))))))
202 // \\--------------- tests BEFORE made local to normalize ---------------//
203 assertEquals(Ast.normalize(XSyntax.print_rules, ast),
205 Constant("_list"), Appl(List(
206 Constant("_args"), Variable("aaa"), Appl(List(
207 Constant("_args"), Variable("bbb"), Variable("ccc"))))))))
209 /* output from Isabelle_Isac adds types to above structure:
211 /*_list*/Constant("_list"), Appl(List(
212 /*_args*/ Constant("_args"), Appl(List(
213 Constant("_constrain"), Appl(List(
214 /* aaa */ Constant("_free"), Variable("aaa"))), Appl(List(
215 Constant("_ofsort"), Appl(List(
216 Constant("_tfree"), Variable("'a"))), Constant("\\<^class>HOL.type"))))), Appl(List(
217 /*_args*/ Constant("_args"), Appl(List(
218 Constant("_constrain"), Appl(List(
219 /* bbb */ Constant("_free"), Variable("bbb"))), Appl(List(
220 Constant("_ofsort"), Appl(List(
221 Constant("_tfree"), Variable("'a"))), Constant("\\<^class>HOL.type"))))), Appl(List(
222 Constant("_constrain"), Appl(List(
223 /* ccc */ Constant("_free"), Variable("ccc"))), Appl(List(
224 Constant("_ofsort"), Appl(List(
225 Constant("_tfree"), Variable("'a"))), Constant("\\<^class>HOL.type")))))))))))
230 Constant("_list"), Appl(List(
231 Constant("_args"), Variable("aaa"), Appl(List(
232 Constant("_args"), Variable("bbb"), Variable("ccc")))))))
233 assertEquals("[aaa, bbb, ccc]", Ast.math_string_of(ast))
235 println("\\--END isac.gui.mawen.asttrans.TestAst#test_list_normal");
238 def test_tuple_normal() = {
239 println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_tuple_normal");
241 // cp from ScalaTermFromString#test_etc, term_str = "(aaa, bbb, ccc, ddd)"
242 var term_from_Isabelle_Isac =
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"))))))))))))),
246 Free("aaa", TFree("'a", List("HOL.type")))),
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"))))))))))),
250 Free("bbb", TFree("'b", List("HOL.type")))),
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"))))))))),
254 Free("ccc", TFree("'c", List("HOL.type")))),
255 Free("ddd", TFree("'d", List("HOL.type"))
258 var simple_ast = Syntax_Phases.simple_ast_of(term_from_Isabelle_Isac)
259 assertEquals(simple_ast,
260 Appl(List( //println(raw_string_of(simple_ast))
261 Constant("Product_Type.Pair"),
264 Constant("Product_Type.Pair"),
267 Constant("Product_Type.Pair"), //???vvvvvvvvvvvvv
273 var pre_ast : Ast.Ast = simple_ast
274 // pre_ast : Ast.Ast = //copied from Isabelle2016-1-MAWEN, types dropped MAY
276 // Constant("Product_Type.Pair"),
279 // Constant("Product_Type.Pair"),
282 // Constant("Product_Type.Pair"),
283 // Appl(List( //???^^^^^^^^^^^
284 // Variable("ccc"))),
285 // Variable("ddd")))))))
286 var post_ast : Ast.Ast = //copied from Isabelle2016-1-MAWEN, types dropped
291 Constant("_tuple_args"),
294 Constant("_tuple_args"),
297 Constant("_tuple_arg"),
298 Variable("ddd")))))))))
299 val ast = normalize(XSyntax.print_rules, pre_ast)
300 assertEquals(ast, post_ast) // LETZTES "_tuple_args" <> "_tuple_args"
302 println("\\--END isac.gui.mawen.asttrans.TestAst#test_tuple_normal");
305 def test_matches() = {
306 println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_matches");
308 // at this ast rule 2 should match
309 val ML4_2old_ast = //AFTER rewrite 3, rule 2, from ###ML old_ast
314 Constant("_tuple_arg"), //<---vv
316 Constant("_tuple"), //<---^^
319 Constant("_tuple_arg"),
320 Variable("ddd"))) )))))) //->
321 val ML4_2lhs = //AFTER rewrite 3, rule 2, from ###ML try_rules lhs:
326 Constant("_tuple_arg"),
331 var ast_pat = (ML4_2old_ast, ML4_2lhs)
332 // println("matches(ast_pat): " + matches(ast_pat))
333 // matches(ast_pat): Some((Map(x -> Variable(bbb), y -> Variable(ccc), z -> Appl(List(Constant(_tuple_arg), Variable(ddd)))),List()))
334 assertTrue((!(matches(ast_pat)).isEmpty))
336 val scala4_2old_ast = //AFTER rewrite 3, NO rule 1, from ###post.scala:
341 Constant("_tuple_arg"), //<---vv pattern from ###ML 4. rule 2 NOT RECOGNISED
343 Constant("_tuple"), //<---^^ pattern from ###ML 4. rule 2 NOT RECOGNISED
346 Constant("_tuple_arg"), //<---vv pattern from ###ML 4. rule 2 NOT RECOGNISED
348 Constant("_tuple"), //<---^^ pattern from ###ML 4. rule 2 NOT RECOGNISED
351 Constant("_tuple_arg"),
352 Variable("ddd")))))))))))))
353 ast_pat = (scala4_2old_ast, ML4_2lhs)
354 // println("matches(ast_pat): " + matches(ast_pat))
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()))
356 assertTrue((!(matches(ast_pat)).isEmpty))
358 println("\\--END isac.gui.mawen.asttrans.TestAst#test_matches");
363 println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_update");
366 /*List()*/ Appl(List(
367 /*List(1)*/ Constant("Groups.plus_class.plus"),
368 /*List(2)*/ Appl(List(
369 /*List(2,1)*/ Constant("Groups.plus_class.plus"),
370 /*List(2,2)*/ Variable("a"),
371 /*List(2,3)*/ Appl(List(
372 /*List(2,3,1)*/ Constant("Groups.plus_class.plus"),
373 /*List(2,3,2)*/ Variable("b"),
374 /*List(2,3,3)*/ Variable("c"))) )),
375 /*List(3)*/ Variable("d")))
377 assertEquals("a + (b + c) + d", math_string_of(ast))
378 assertEquals("X + d", math_string_of(add(List(2), Constant("X"), ast)))
379 assertEquals("X + (b + c) + d", math_string_of(add(List(2,2), Constant("X"), ast)))
380 assertEquals("a + (X + c) + d", math_string_of(add(List(2,3,2), Constant("X"), ast)))
381 assertEquals("a + (b + X ) + d", math_string_of(add(List(2,3,3), Constant("X"), ast)))
382 assertEquals("a + (b + c) + X ", math_string_of(add(List(3), Constant("X"), ast)))
384 assertEquals("X + Y + d", math_string_of(add(List(2),
386 Constant("Groups.plus_class.plus"),
388 Variable("Y"))), ast)))
390 println("\\--END isac.gui.mawen.asttrans.TestAst#test_update");
393 def test_get_value() {
394 println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_get_value");
397 /*List()*/ Appl(List(
398 /*List(1)*/ Constant("Groups.plus_class.plus"),
399 /*List(2)*/ Appl(List(
400 /*List(2,1)*/ Constant("Groups.plus_class.plus"),
401 /*List(2,2)*/ Variable("a"),
402 /*List(2,3)*/ Appl(List(
403 /*List(2,3,1)*/ Constant("Groups.plus_class.plus"),
404 /*List(2,3,2)*/ Variable("b"),
405 /*List(2,3,3)*/ Variable("c"))) )),
406 /*List(3)*/ Variable("d")))
407 assertEquals("a + (b + c) + d", math_string_of(get_value (List(), ast)))
408 assertEquals("a", math_string_of(get_value (List(2,2), ast)))
409 assertEquals("b + c", math_string_of(get_value (List(2,3), ast)))
410 assertEquals("b", math_string_of(get_value (List(2,3,2), ast)))
412 println("\\--END isac.gui.mawen.asttrans.TestAst#test_get_value");
415 def test_math_string_of_arbitrary() {
416 println("/--BEGIN isac.gui.mawen.asttrans.TestAst#test_math_string_of_arbitrary");
418 val arbitrary = Appl(List(Variable("a"), Constant("b"),
419 Appl(List(Constant("Groups.plus_class.plus"), Variable("c"),Variable("d"))),
420 Appl(List(Variable("y"),Variable("x"))) ))
421 assertEquals("a b (c + d) (y (x))", math_string_of(arbitrary))
423 println("\\--END isac.gui.mawen.asttrans.TestAst#test_math_string_of_arbitrary");