【问题标题】:How to eliminate parenthesis in algebraic expressions using Lean如何使用 Lean 消除代数表达式中的括号
【发布时间】:2018-10-24 22:05:49
【问题描述】:

我正在尝试使用精益证明一个代数定理。我的代码是

 import algebra.group
import algebra.ring
open algebra

variable {A : Type}

variables [s : ring A] (a b c : A)
include s

theorem clown (a b c d e : A) : 
(a + b  + e) * ( c + d) =   a * c + (b * c + e* c) + (a * d + b * d + e * d)   :=
calc

(a + b  + e) * ( c + d) = (a + (b + e))* (c +d)   : !add.assoc
                    ... = (a + (b + e)) * c + (a + (b + e)) * d   : by rewrite  left_distrib
                    ... =  a * c + (b + e) * c + (a + ( b + e)) * d : by rewrite right_distrib
                    ... =  a * c + (b * c + e* c) + (a + (b + e)) * d : by rewrite right_distrib
                    ... =  a * c + (b * c + e* c) + (a * d + (b + e) * d) : by rewrite right_distrib
                    ... =  a * c + (b * c + e* c) + (a * d + (b * d + e * d) ) : by rewrite right_distrib
                    ... =  a * c + (b * c + e* c) + (a * d + b * d + e * d ) :  !add.assoc

 check clown

请告诉我如何去掉最后的括号。也就是说,我只想得到

a * c + b * c + e* c + a * d + b * d + e * d

非常感谢。

【问题讨论】:

    标签: theorem-proving lean


    【解决方案1】:

    这看起来像 Lean 2 语法。除非您专门将精益 2 用于同伦类型理论模式,否则我强烈建议升级到自 2017 年初推出的精益 3。

    默认情况下,操作 + 和 * 关联到左侧。即a * c + b * c + e* c + a * d + b * d + e * d(((((a * c + b * c) + e* c) + a * d) + b * d) + e * d) 相同。你可以用足够多的add.assoc(在精益3中重命名为add_assoc)来证明这个最终的相等性。在精益 3 中,您可以使用 by simpby simp only [add_assoc] 来证明这一点。

    【讨论】:

      【解决方案2】:

      如果你不介意假设你的环是可交换的,你也可以使用ring 策略。

      import tactic.ring
      
      variables {A : Type} [comm_ring A]
      
      theorem clown (a b c d e : A) : 
        (a + b + e) * (c + d) = a * c + (b * c + e * c) + (a * d + b * d + e * d) :=
      by ring
      

      【讨论】:

        【解决方案3】:

        使用以下代码获得可能的解决方案

         import algebra.group
        import algebra.ring
        open algebra
        
        variable {A : Type}
        
        variables [s : ring A] (a b c : A)
        include s
        
        theorem clown (a b c d e : A)  : 
        (a + b  + e) * ( c + d) =  a * c + a * d + b*c + b*d +e*c+e*d :=
        calc
        
        (a + b  + e) * ( c + d) = a*(c + d) + b*(c + d) + e*(c + d)   : by rewrite distrib_three_right
                           ...  = a * c + a * d + b*(c+d)+e*(c+d) : by rewrite *left_distrib
                           ...  = a * c + a* d + (b*c + b*d) +e*(c+d) : by rewrite *left_distrib
                           ... =  a * c + a* d + (b*c + b*d) +(e*c+e*d): by rewrite left_distrib
                           ... = a * c + a* d + b*c + b*d + (e*c+e*d) :  !add.assoc
                           ... = a * c + a* d + b*c + b*d + e*c+e*d :  !add.assoc
        
        check clown
        

        其他例子

         import algebra.group
        import algebra.ring
        open algebra
        
        variable {A : Type}
        
        variables [s : ring A] (a b c : A)
        include s
        
        theorem clown (a b c d e f: A)  : 
        (a + b  + e + f) * ( c + d) =  a * c + a * d + b*c + b*d +e*c+e*d  + f * c + f * d:=
        calc
        
        (a + b  + e + f) * ( c + d) = a*(c + d) + b*(c + d) + e*(c + d) + f*(c +d)  : by rewrite *right_distrib
                           ...  = a * c + a * d + b*(c+d)+e*(c+d) + f * (c + d): by rewrite *left_distrib
                           ...  = a * c + a* d + (b*c + b*d) +e*(c+d) + f*(c+d): by rewrite *left_distrib
                           ... =  a * c + a* d + (b*c + b*d) +(e*c+e*d)+ f*(c+d): by rewrite left_distrib
                           ... =  a * c + a* d + (b*c + b*d) +(e*c+e*d)+ (f*c+ f*d): by rewrite left_distrib
                           ... = a * c + a* d + b*c + b*d + (e*c+e*d)+ (f*c+f*d) :  !add.assoc
                           ... = a * c + a* d + b*c + b*d + e*c+e*d + (f*c + f*d):  !add.assoc
                           ... = a * c + a* d + b*c + b*d + e*c+e*d + f*c + f*d  :  !add.assoc
        
        check clown
        

        同样的例子,但减少了

            variable {A : Type}
        
        variables [s : ring A] 
        include s
        
            theorem clown (a b c d e f: A)  : 
            (a + b  + e + f) * ( c + d) =  a * c + a * d + b*c + b*d +e*c+e*d  + f * c + f * d:=
            calc
        
            (a + b  + e + f) * ( c + d) = a*(c + d) + b*(c + d) + e*(c + d) + f*(c +d)  : by rewrite *right_distrib
        
                               ... =  a * c + a* d + (b*c + b*d) +(e*c+e*d)+ (f*c+ f*d): by rewrite *left_distrib
        
                               ... = a * c + a* d + b*c + b*d + e*c+e*d + f*c + f*d  :  by rewrite *add.assoc
        
            check clown
        

        其他例子

         import algebra.ring
        open algebra
        check mul_sub_left_distrib 
        check add.assoc
        variable {A : Type}
        
        variables [s : ring A] 
        include s
        
        theorem clown (a b c d : A)  : 
            (a + b ) * ( c - d) =  a*c-a*d+ b*c- b*d:=
            calc
        
            (a + b) * ( c  -d) = a*(c-d) +b*(c-d) : by rewrite *right_distrib
                           ... = a*(c + -d) + b*(c-d) : rfl
                           ... = a*c  + a*-d+b*(c-d) : by rewrite left_distrib
                           ... = a*c + a*-d + (b*c - b*d): by rewrite mul_sub_left_distrib 
                           ... = a*c + a*-d + b*c - b*d : add.assoc
                           ... = a*c + -(a*d)+  b*c - b*d : by rewrite mul_neg_eq_neg_mul_symm
                           ... = a*c - a*d + b*c - b*d : rfl
         check clown  
        

        其他例子

        import algebra.group
        import algebra.ring
        open algebra
        variable {A : Type}
        
        variables [s : ring A] 
        include s
        
        theorem clown (a b c d e : A)  : 
            (a + b + e ) * ( c - d) =  a*c -a*d + b*c - b*d + e*c - e*d:=
            calc
        (a + b + e) * ( c - d) = a*(c-d) +b*(c-d) + e*(c-d) : by rewrite *right_distrib
                           ... = a*(c + -d) + b*(c+ -d) + e*(c-d): rfl
                           ... = a*c  + a*-d+(b*c +b*-d) + e*(c-d) : by rewrite *left_distrib
                           ... = a*c + a*-d + (b*c +b*-d)+ (e*c -e*d) : by rewrite *mul_sub_left_distrib 
                           ... = a*c + a*-d  + b*c + b*-d + (e*c - e*d) : !add.assoc
                           ... = a*c + a*-d + b*c + b*-d + e*c - e*d : !add.assoc
                           ... = a*c + -(a*d) + b*c +-(b*d) + e*c - e*d : by rewrite *mul_neg_eq_neg_mul_symm
                           ... = a*c - a*d + b*c - b*d + e*c - e*d : rfl
         check clown
        

        其他例子

        import algebra.group
        import algebra.ring
        open algebra
        variable {A : Type}
        
        variables [s : ring A] 
        include s
        
        theorem clown (a b c d e f  : A)  : 
            (a + b + e + f) * ( c - d) =  a*c -a*d + b*c - b*d + e*c - e*d + f*c - f*d:=
            calc
        (a + b + e + f) * ( c - d) = a*(c-d) +b*(c-d) + e*(c-d) + f*(c - d) : by rewrite *right_distrib
                           ... = a*(c + -d) + b*(c+ -d) + e*(c + -d) + f *(c-d): rfl
                           ... = a*c  + a*-d+(b*c +b*-d) + (e*c + e*-d)+ f*(c-d) : by rewrite *left_distrib
                           ... = a*c + a*-d + (b*c +b*-d)+ (e*c + e*-d) + (f*c - f*d) : by rewrite *mul_sub_left_distrib 
                           ... = a*c + a*-d  + b*c + b*-d + (e*c + e*-d) + (f*c -f*d): !add.assoc
                           ... = a*c + a*-d + b*c + b*-d + e*c + e*-d  + (f*c - f*d): !add.assoc
                           ... = a*c + a*-d + b*c + b*-d + e*c + e*-d  + f*c - f*d: !add.assoc
                           ... = a*c + -(a*d) + b*c +-(b*d) + e*c + - (e*d) + f*c - f*d : by rewrite *mul_neg_eq_neg_mul_symm
                           ... = a*c - a*d + b*c - b*d + e*c - e*d  + f*c - f*d : rfl
         check clown 
        

        其他例子

            import algebra.group
        import algebra.ring
        open algebra
        variable {A : Type}
        
        variables [s : ring A] 
        include s
        
        theorem clown (a b c d e f  : A)  : 
            (a + b - e  - f) * ( c - d) =  a*c -a*d + b*c -b*d -e*c + e*d - f*c + f*d :=
            calc
        (a + b - e - f) * ( c - d) =(a + b + -e + -f)*(c-d) : rfl
                           ... = a*(c-d) +b*(c-d) + -e*(c-d) + -f*(c - d) : by rewrite *right_distrib
                           ... = a*(c + -d) + b*(c+ -d) + -e*(c + -d) + -f *(c-d): rfl
                           ... = a*c  + a*-d+(b*c +b*-d) + (-e*c + -e*-d)+ -f*(c-d) : by rewrite *left_distrib
                           ... = a*c + a*-d + (b*c +b*-d)+ (-e*c + -e*-d) + (-f*c - -f*d) : by rewrite *mul_sub_left_distrib 
                           ... = a*c + a*-d  + b*c + b*-d + (-e*c + -e*-d) + (-f*c - -f*d): !add.assoc
                           ... = a*c + a*-d + b*c + b*-d + -e*c + -e*-d  + (-f*c - -f*d): !add.assoc
                           ... = a*c + a*-d + b*c + b*-d + -e*c + -e*-d  + -f*c - -f*d: !add.assoc
                           ... = a*c + -(a*d) + b*c +-(b*d) + -e*c + - (-e*d) + -f*c - -f*d : by rewrite *mul_neg_eq_neg_mul_symm
                           ... = a*c - a*d + b*c -b*d + -e*c + - (-e*d) + -f*c  - -f*d : rfl
                           ... =a*c - a*d + b*c -b*d + -(e*c) + - -(e*d) + -(f*c)  - -(f*d) : by rewrite  *neg_mul_eq_neg_mul_symm
                           ... =a*c - a*d + b*c -b*d - e*c + - -(e*d) - f*c  - -(f*d) : rfl
                           ... = a*c - a*d + b*c -b*d - e*c + (e*d) - f*c  - -(f*d) : by rewrite neg_neg
                           ... = a*c - a*d + b*c -b*d - e*c + e*d - f*c +  - -(f*d) : rfl
                           ... = a*c - a*d + b*c -b*d - e*c + e*d - f*c +  (f*d) : by rewrite neg_neg
                           ... = a*c - a*d + b*c -b*d - e*c + e*d - f*c +  f*d : rfl
        
         check clown 
        

        【讨论】:

          猜你喜欢
          • 2016-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-02
          • 2020-02-14
          • 2021-10-03
          • 2010-10-13
          • 1970-01-01
          相关资源
          最近更新 更多