【问题标题】:Maple 13: how to turn true into 1 and false into 0?枫13:如何将真为1,假为0?
【发布时间】:2010-11-01 22:39:27
【问题描述】:

一般来说,我需要的是类型转换指令,以便能够例如在 true 上相乘,例如 5 * true 和 get5,比如 x * false 并得到 0

这样的事情怎么办?

【问题讨论】:

    标签: boolean type-conversion maple


    【解决方案1】:

    你可以这样做:

    subs([false=0, true=1], expr);
    

    【讨论】:

      【解决方案2】:

      有几种方法可以获得这种效果,您选择哪种方法可能取决于您打算如何使用它的更多细节。

      最简单的方法是使用 2 参数 eval(或 subs,因为由于涉及精确 1 或 0 的产品的自动简化,应该进行评估)。

      > eval( 5*true, [true=1,false=0]);
                                 5
      > eval( x*false, [true=1,false=0]);
                                 0
      

      当然,您可以创建一个过程来处理该评估,

      > T := expr -> eval(expr,[true=1,false=0]):
      
      > T( 5*true );
                                 5
      > T( x*false );
                                 0
      

      您也可以尝试使用模块来导出(从而在交互使用的“顶层”重新定义)增强的*

      注意。下面这个导出过程* 的一个更仔细的版本只会在作为整个被乘数出现时替换“真”和“假”,而不是在整个表达式中进行替换。 (标量表达式可以包含未计算的函数调用,例如,可选参数中出现“真”和“假”。理想情况下,这些应该不理会。)

      > M:=module() option package; export `*`;
      >  `*`:=proc(ee::seq(anything))
      >         :-`*`(op(eval([ee],[true=1,false=0])));
      >       end proc;
      > end module:
      
      > with(M):
      
      > 5*true;
                                 5
      > x*false;
                                 0
      
      > a*b*c;
                               a b c
      
      > eval( %, b=false ); # this doesn't play along
                             a false c
      

      请注意,在最后一个结果中,“false”的替换不会产生 0。这是因为 a*b*c(对于未知的 a、b 和 c)的结果是全局的:- * 而不是新的*。因此,当 b=false 被替换时,不会调用新的 *。也有可能解决这个问题,尽管结果显示不是那么好(并且解决方法可能会“破坏”你可能想要的其他东西),

      > M:=module() option package; export `*`;
      >   `*`:=proc(ee::seq(anything))
      >          local res;
      >          res:=:-`*`(op(eval([ee],[true=1,false=0])));
      >          if type(res,:-`*`) then
      >            'procname'(op(res));
      >          else
      >            res;
      >          end if;
      >        end proc;
      > end module:
      
      > with(M):
      
      > 5*true;
                                 5
      > x*false;
                                 0
      
      > a*b*c;
                           `*`(`*`(a, b), c)
      
      > eval( %, b=false );
                                 0
      

      在上面的最后一个示例中,看起来像 *(*(a, b), c) 的对象实际上是对新 * 的未计算函数调用。因此,当 b=false 被替换时,会调用新的 * 并且可以获得所需的结果。 (希望在我忽略的情况下这不会导致无限递归。)

      【讨论】:

        猜你喜欢
        • 2015-07-09
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 2022-11-24
        • 2021-06-08
        • 1970-01-01
        相关资源
        最近更新 更多