エレファント・ビジュアライザー調査記録

ビジュアルプログラミングで数式の変形を表すことを考えていくブロクです。

人工知能的代数学(10)

マグマの計算(4)

エレファントな群とリー代数(2) - エレファント・ビジュアライザー調査記録」でやった「モノイドの左逆元・右逆元」の問題をやります。これも基本的には Python に書き換えただけになっています。前回のプログラムでは表示される式が多すぎるので、式を選択することができるようにします。クラス TransitiveTransformer に以下のメソッドを追加します。

    def transitive_select(self, deg, sel_list):
        for n in range(1, deg + 1):
            transitive_transformer.compose_transitive_all()
            print(f"結果({n}回目)のリスト")
            for his in transitive_transformer.history:
                print(" = ".join([e.texstr() for e in his]))
            sel = sel_list[n - 1] - 1 # この要素だけにする
            self.expressions = [self.expressions[sel]]
            self.history = [self.history[sel]]

sel_list で各回の選択する式を指定します。[2, 9, 1, 12, 1] のときは 1 回目には 2 番目の式、2 回目には 9 番目の式…を選択します。

eq1 = custom_transformer.transform(parser.parse("(X*Y)*Z=X*(Y*Z)"))
eq2 = custom_transformer.transform(parser.parse("e*X=X"))
eq3 = custom_transformer.transform(parser.parse("X*e=X"))
eq4 = custom_transformer.transform(parser.parse("x_l*x=e"))
eq5 = custom_transformer.transform(parser.parse("e=x*x_r"))

# 左辺が最初の式(右辺は使わない)
exp = custom_transformer.transform(parser.parse("x_l=x_r")).left

# 入力として等式のリストを提供
equations = [eq1, eq2, eq3, eq4, eq5]
print("元の等式のリスト")
for eq in equations:
    print(eq.texstr())

transitive_transformer = TransitiveTransformer(equations, exp)

transitive_transformer.transitive_select(5, [2, 9, 1, 12, 1])
結果

元の等式のリスト
  ( X Y )  Z = X  ( Y Z )
 e X = X
 X e = X
 x_l x = e
 e = x x_r

結果(1回目)のリスト
 x_l = e x_l
 x_l = x_l e

結果(2回目)のリスト
 x_l = x_l e = e  ( x_l e )
 x_l = x_l e =  ( e x_l )  e
 x_l = x_l e = x_l  ( e e )
 x_l = x_l e = x_l
 x_l = x_l e =  ( x_l e )  e
 x_l = x_l e =  ( x_l e )  e
 x_l = x_l e = x_l  ( e e )
 x_l = x_l e = x_l  ( x_l x )
 x_l = x_l e = x_l  ( x x_r )

結果(3回目)のリスト
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r
 x_l = x_l e = x_l  ( x x_r )  = e  ( x_l  ( x x_r )  )
 x_l = x_l e = x_l  ( x x_r )  =  ( e x_l )   ( x x_r )
 x_l = x_l e = x_l  ( x x_r )  = x_l  ( e  ( x x_r )  )
 x_l = x_l e = x_l  ( x x_r )  = x_l  (  ( e x )  x_r )
 x_l = x_l e = x_l  ( x x_r )  = x_l  ( x  ( e x_r )  )
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l  ( x x_r )  )  e
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l e )   ( x x_r )
 x_l = x_l e = x_l  ( x x_r )  = x_l  (  ( x x_r )  e )
 x_l = x_l e = x_l  ( x x_r )  = x_l  (  ( x e )  x_r )
 x_l = x_l e = x_l  ( x x_r )  = x_l  ( x  ( x_r e )  )
 x_l = x_l e = x_l  ( x x_r )  = x_l e

結果(4回目)のリスト
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r = x_l  ( x x_r )
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r = e  (  ( x_l x )  x_r )
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r =  ( e  ( x_l x )  )  x_r
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r =  (  ( e x_l )  x )  x_r
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r =  ( x_l  ( e x )  )  x_r
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r =  ( x_l x )   ( e x_r )
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r =  (  ( x_l x )  x_r )  e
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r =  (  ( x_l x )  e )  x_r
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r =  (  ( x_l e )  x )  x_r
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r =  ( x_l  ( x e )  )  x_r
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r =  ( x_l x )   ( x_r e )
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r = e x_r

結果(5回目)のリスト
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r = e x_r = x_r
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r = e x_r = e  ( e x_r )
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r = e x_r =  ( e e )  x_r
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r = e x_r = e  ( e x_r )
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r = e x_r =  ( e x_r )  e
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r = e x_r =  ( e e )  x_r
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r = e x_r = e  ( x_r e )
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r = e x_r =  ( x_l x )  x_r
 x_l = x_l e = x_l  ( x x_r )  =  ( x_l x )  x_r = e x_r =  ( x x_r )  x_r