classdef Symbol < sympy.Expr

methods
    function o = Symbol(x)
        o@sympy.Expr(x);
    end


    function f = subsasgn(f, s, rhs)
        if nargin == 1; return; end
        if s.type ~= '()'; error("需要使用圆括号访问"); end
        if ~all(cellfun(@(o)isa(o, 'sympy.Symbol'), s.subs))
            error("从符号创建抽象函数需要全部输入符号！");
        end
        vars = cellfun(@(x)getObj(x), s.subs, 'UniformOutput', false);
        f = getObj(f);
        fname = f.name;
        sp = sympy__sp;
        f = sp.Function(fname);
        f = f(vars{:});
        f = sympy.Function(f, vars, getObj(rhs));
    end


    function assume(x, cond)
        % 给符号变量设置数学条件/限制（仅对Symbol类型的Expr有效）
        % 使用方法：assume(x, cond)
        % 输入：
        %   x - Expr对象（内部为Symbol类型），要设置条件的符号变量
        %   cond - 字符串/元胞字符串数组，指定数学条件；若为"clear"则清空所有条件
        
        % 检查输入参数数量
        if nargin ~= 2
            error('输入参数数量错误！正确用法：assume(x, cond)');
        end
        
        obj = x.getObj();
        
        % 获取sympy符号对象的_assumptions属性
        ass = pygetattr(obj, "_assumptions");
        
        % 处理条件参数
        if iscellstr(cond)  % 元胞字符串数组
            valid_conds = {'commutative', 'real', 'even', 'odd', 'integer', 'positive', 'rational', 'zero', 'nonzero', 'prime'};
            for i = 1:length(cond)
                curr_cond = cond{i};
                if ~ismember(curr_cond, valid_conds)
                    warning('条件"%s"不是预定义的合法值，仍尝试设置', curr_cond);
                end
                ass{curr_cond} = true;
            end
        elseif isstring(cond) && isscalar(cond)  % 单个字符串
            cond_char = char(cond);
            if strcmp(cond_char, "clear")
                ass.clear();  % 清空所有假设条件
            else
                valid_conds = {'commutative', 'real', 'even', 'odd', 'integer', 'positive', 'rational', 'zero', 'nonzero', 'prime'};
                if ~ismember(cond_char, valid_conds)
                    warning('条件"%s"不是预定义的合法值，仍尝试设置', cond_char);
                end
                ass{cond_char} = true;
            end
        else
            error('cond参数类型错误！请输入双引号字符串（如"positive"）或字符串元胞数组（如{"real","integer"}）');
        end
    end

end

end