@@ -2580,3 +2580,94 @@ def _print_latex_(self, ex, var, to, direction=''):
25802580
25812581symbolic_limit = Function_limit ()
25822582
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