@@ -2580,3 +2580,94 @@ def _print_latex_(self, ex, var, to, direction=''):
2580
2580
2581
2581
symbolic_limit = Function_limit ()
2582
2582
2583
+
2584
+ class Function_cases (GinacFunction ):
2585
+ """
2586
+ Formal function holding ``(condition, expression)`` pairs.
2587
+
2588
+ Numbers are considered conditions with zero being ``False``.
2589
+ A true condition marks a default value. The function is not
2590
+ evaluated as long as it contains a relation that cannot be
2591
+ decided by Pynac.
2592
+
2593
+ EXAMPLES::
2594
+
2595
+ sage: ex = cases([(x==0, pi), (True, 0)]); ex
2596
+ cases(((x == 0, pi), (1, 0)))
2597
+ sage: ex.subs(x==0)
2598
+ pi
2599
+ sage: ex.subs(x==2)
2600
+ 0
2601
+ sage: ex + 1
2602
+ cases(((x == 0, pi), (1, 0))) + 1
2603
+ sage: _.subs(x==0)
2604
+ pi + 1
2605
+
2606
+ The first encountered default is used, as well as the first relation
2607
+ that can be trivially decided::
2608
+
2609
+ sage: cases(((True, pi), (True, 0)))
2610
+ pi
2611
+
2612
+ sage: _ = var('y')
2613
+ sage: ex = cases(((x==0, pi), (y==1, 0))); ex
2614
+ cases(((x == 0, pi), (y == 1, 0)))
2615
+ sage: ex.subs(x==0)
2616
+ pi
2617
+ sage: ex.subs(x==0, y==1)
2618
+ pi
2619
+ """
2620
+ def __init__ (self ):
2621
+ """
2622
+ EXAMPLES::
2623
+
2624
+ sage: loads(dumps(cases))
2625
+ cases
2626
+ """
2627
+ GinacFunction .__init__ (self , "cases" )
2628
+
2629
+ def __call__ (self , l , ** kwargs ):
2630
+ """
2631
+ EXAMPLES::
2632
+
2633
+ sage: ex = cases([(x==0, pi), (True, 0)]); ex
2634
+ cases(((x == 0, pi), (1, 0)))
2635
+
2636
+ TESTS::
2637
+
2638
+ sage: cases()
2639
+ Traceback (most recent call last):
2640
+ ...
2641
+ TypeError: __call__() takes exactly 2 arguments (1 given)
2642
+
2643
+ sage: cases(x)
2644
+ Traceback (most recent call last):
2645
+ ...
2646
+ RuntimeError: cases argument not a sequence
2647
+ """
2648
+ return GinacFunction .__call__ (self ,
2649
+ SR ._force_pyobject (l ), ** kwargs )
2650
+
2651
+ def _print_latex_ (self , l , ** kwargs ):
2652
+ r"""
2653
+ EXAMPLES::
2654
+
2655
+ sage: ex = cases([(x==0, pi), (True, 0)]); ex
2656
+ cases(((x == 0, pi), (1, 0)))
2657
+ sage: latex(ex)
2658
+ \begin{cases}{\pi} & {x = 0}\\{0} & {1}\end{cases}
2659
+ """
2660
+ if not isinstance (l , (list , tuple )):
2661
+ raise ValueError ("cases() argument must be a list" )
2662
+ str = r"\begin{cases}"
2663
+ for pair in l :
2664
+ left = None
2665
+ if (isinstance (pair , tuple )):
2666
+ right ,left = pair
2667
+ else :
2668
+ right = pair
2669
+ str += r"{%s} & {%s}\\" % (latex (left ), latex (right ))
2670
+ print (str [:- 2 ] + r"\end{cases}" )
2671
+
2672
+ cases = Function_cases ()
2673
+
0 commit comments