論理代数(ブール代数)の多変数への拡張と応用について(荒井公康著)
     (多命題変数の論理代数
     (論理学と代数学の同型性を巡って
     (ブール代数を非線形重回帰分析すると?)
     (ウィトゲンシュタインもあきらめた論理定数の数学的意味を発見!)
     (実験計画法の直交表と論理代数の真理値表の類似性)
     (実験計画法への非線形重回帰分析の適用:材料開発への応用)
     (水溶液の話)
     (避雷器、バリスターの話)
     (科学技術の話)
     (シェファーのストローク:NAND回路への書き換え)
     (命題定理の自動証明)
     (脳の男女差)
     (ブール代数と神経回路網の同型性)
     (人工知能のコネクショニズムとの関係)

 付録:実験計画法の解析手法への応用  付論1 付論2 付論3 付論4 付論5
     ニューラルネットワークとの関連 ブール代数&神経回路網 ブール環
     
 Googleで「ブールの論理代数」のキーワードで検索すると、Wikipediaについで、2番目と3番目に私のサイトが出てくる。多分、読者も増えてのことと思い、嬉しく思っている。なにか認めて頂いたようで、大変に嬉しい。
 数学科以外の学科で教えられる数学は、線形理論が多いので、わかりにくいかも知れないが、論理関数や論理変数に使われる、0,1という数字を普通の数字と考えて、重回帰分析をすると、ブールの論理代数(ブール代数)は極めて非線形な数式となることが分かる。排他的論理和などを表す多変数のブール代数を表す数式を見たことのある人はいないはずである。論理和ならばあるかもしれない。
 このような数学は、実験計画法などの解析にも威力を発揮する。実験計画法で問題にされる交互作用も非線形項を考慮したもので、実験結果を非線形項を考慮した数式でまとめれば、予測計算などに極めて有効な手段となる。非線形ならば偏微分という操作が可能になるので、最適化方向も見つけやすくなる。線形の式では精度が落ちるし、平均値としての最適化方向しか明らかにならない。実験水準に応じた最適化方向を見出すには、非線形分析をしなければならない。
 よく知られているブール代数の公理系が、一般の代数と異なるのは、論理(演算)というものが、数式で表すと、極めて非線形なためである。非線形の数学は難しく、私にも専門外でよく分からないが、私の投稿がきっかけになればと願っている。新しい数学の一分野に発展すればよいと願っている。
 排他的論理和などは、線形分離不可能で、人工的なニューラルネットワークでは、中間層を挿入し、バックプロパゲーションの手法で、問題の解決を行っているが、学習に時間がかかる。ここでは、そのようなことも関係している。

 論理関数の基本的なものに論理和OR、論理積AND、排他的論理和E−ORなどがある。2変数の場合、

  論理和OR                論理積AND            排他的論理和E−OR
      A  B  A∨B            A  B  A∧B            A  B  A●B
      1  1   1              1  1    1             1  1   0
      1  0   1              1  0    0             1  0   1
      0  1   1              0  1    0             0  1   1
      0  0   0              0  0    0             0  0   0

  含意→(ならば)
      A  B  A→B
      1  1    1
      1  0    0
      0  1    1
      0  0    1

含意の論理関数は理解しにくいかも知れないが、A→Bは「(Aでない)∨B」や、「A∧(Bでない)」ことはない、などに翻訳できる。これらの論理関数は通常の四則演算で表すことができる。(ブール環)

   A∨B=a+b-ab   A∧B=ab  A●B=a+b-2ab   A→B = 1-a+b-(1-a)b = -a+ab+1

次に、変数の数を増やしていく。
   A∨B∨C=a+b+c-ab-bc-ca+abc
   A∨B∨C∨D=a+b+c+d-ab-ac-ad-bc-bd-cd+abc+acd+abd+bcd-abcd
    ・・・・・・・・・

   A●B●C=a+b+c-2ab-2ac-2bc+4abc
   A●B●C●D=a+b+c+d-2ab-2ac-2ad-2bc-2bd-2cd+4abc+4acd+4abd+4bcd-8abcd
    ・・・・・・・・

   A∧B∧C=abc

これらが成立していることは容易に確かめられるが、直接証明するのは難しい。しかも、任意の論理関数に応用するのに役立たない。一般にn変数では2のn乗個の項が出てくるが、これらの項の係数を別の方法で求めることを考える。排他的論理和の場合、

n=2の時
   a  b ab         a●b
   1 1 1 1  a1      0
   1 0 0 1  a2  =  1
   0 1 0 1  a3      1
   0 0 0 1  a4     0
     ↑     ↑
    行列   項の未知係数

この連立方程式を解く(この連立方程式はそのままでは解けない。重回帰分析の場合と同じように正規方程式を求めると解ける)と、a1=1,a2=1,a3=-2,a4=0となり、確かに
   
   a●b=a+b-2ab

となっていることがわかる。同じ手法で任意の多変数論理関数を加減乗法で表現できる。下に示したLispプログラムは4変数の場合の任意の論理関数の計算式を求めるためのものである。例えば次のような出鱈目な論理関数に対して次の計算式が得られる。

    a  b  c  d         論理関数F
    0 0 0 0            1
    0 0 0 1            0
    0 0 1 0            1
    0 0 1 1            1
    0 1 0 0            1
    0 1 0 1            1
    0 1 1 0            0
    0 1 1 1  →         1
    1 0 0 0            0
    1 0 0 1            0
    1 0 1 0            0
    1 0 1 1            1
    1 1 0 0            0
    1 1 0 1            1
    1 1 1 0            0
    1 1 1 1            1

論理関数Fは、なんと
    
    F=-a-d+ad-bc+bd+cd+abc-abcd+1.0

と表される。このような論理関数の種類は 2^(2^4) = 65536 通りある(4変数の場合)。これはニューラル・ネットワークが行っていること等価である。学習時間は現実には必要ない利点もある。応用範囲は極めて広いものと考えられる。

今までは、変数値も論理関数値も1、0の値に限っていたが、実数値に拡張することにより、任意の多変数非線形関数を近似的に表現可能である。多変数非線形関数の最適化という難問にもぶつかるが、私は個人的に材料開発において材料特性と組成成分の関係をこの方式で求め、最適化によって成果を挙げた経験がある。

読者諸氏の経験に基づいて、応用されることを希望する。数学的にも面白いテーマであり、更に考察を進めるつもりである。

これに対して、

   F = A1a+A2b+A3c+A4d+A5  (A1〜A5は定数)

の如き回帰式で近似しようとするのは、間違いである。また、変数 a,b,c,d 以外の変数は自然科学では厳密に固定できるが、人間や社会を対象とした場合は、そのような理想化は不可能である。ある要因について調べているつもりでも他の考慮外の要因の効果の排除は原理的に不可能である。言い換えれば、人間や社会に対しては一つの要因について偏微分することは不可能なのである。また要因間には相互作用があり、一つの要因を調べれば、多数の他の要因が関与してきて、どの要因が関与しているかの正確な把握は、人間や社会を対象とした場合、不可能である。


;;;
;;; c:\\program files\\acl62\\kaiki.cl
;;;
(defun read-sentence ()
  (let ((input (make-string-input-stream (read-line))))
   (unwind-protect
     (progn
       (do ((word (read input nil) (read input nil))
          (sentence nil))
         ((not word) (return (reverse sentence)))
        (push word sentence)))
    (close input))))

(defun set-data ()
  (setf a (make-array '(16 16) :initial-element nil))
  (setf a2 (make-array '(16 17) :initial-element nil))
  (setf b (make-array '(16 1) :initial-element nil))
  (setf n (make-array '(16 1) :initial-element nil))

  (setf (aref n 0 0) 'a)
  (setf (aref n 1 0) 'b)
  (setf (aref n 2 0) 'c)
  (setf (aref n 3 0) 'd)
  (setf (aref n 4 0) 'ab)
  (setf (aref n 5 0) 'ac)
  (setf (aref n 6 0) 'ad)
  (setf (aref n 7 0) 'bc)
  (setf (aref n 8 0) 'bd)
  (setf (aref n 9 0) 'cd)
  (setf (aref n 10 0) 'abc)
  (setf (aref n 11 0) 'acd)
  (setf (aref n 12 0) 'abd)
  (setf (aref n 13 0) 'bcd)
  (setf (aref n 14 0) 'abcd)
  (setf (aref n 15 0) "")

;;;        a             b             c            d
  (setf (aref a 0 0) 0) (setf (aref a 0 1) 0) (setf (aref a 0 2) 0) (setf (aref a 0 3) 0)
  (setf (aref a 1 0) 0) (setf (aref a 1 1) 0) (setf (aref a 1 2) 0) (setf (aref a 1 3) 1)
  (setf (aref a 2 0) 0) (setf (aref a 2 1) 0) (setf (aref a 2 2) 1) (setf (aref a 2 3) 0)
  (setf (aref a 3 0) 0) (setf (aref a 3 1) 0) (setf (aref a 3 2) 1) (setf (aref a 3 3) 1)
  (setf (aref a 4 0) 0) (setf (aref a 4 1) 1) (setf (aref a 4 2) 0) (setf (aref a 4 3) 0)
  (setf (aref a 5 0) 0) (setf (aref a 5 1) 1) (setf (aref a 5 2) 0) (setf (aref a 5 3) 1)
  (setf (aref a 6 0) 0) (setf (aref a 6 1) 1) (setf (aref a 6 2) 1) (setf (aref a 6 3) 0)
  (setf (aref a 7 0) 0) (setf (aref a 7 1) 1) (setf (aref a 7 2) 1) (setf (aref a 7 3) 1)
  (setf (aref a 8 0) 1) (setf (aref a 8 1) 0) (setf (aref a 8 2) 0) (setf (aref a 8 3) 0)
  (setf (aref a 9 0) 1) (setf (aref a 9 1) 0) (setf (aref a 9 2) 0) (setf (aref a 9 3) 1)
  (setf (aref a 10 0) 1) (setf (aref a 10 1) 0) (setf (aref a 10 2) 1) (setf (aref a 10 3) 0)
  (setf (aref a 11 0) 1) (setf (aref a 11 1) 0) (setf (aref a 11 2) 1) (setf (aref a 11 3) 1)
  (setf (aref a 12 0) 1) (setf (aref a 12 1) 1) (setf (aref a 12 2) 0) (setf (aref a 12 3) 0)
  (setf (aref a 13 0) 1) (setf (aref a 13 1) 1) (setf (aref a 13 2) 0) (setf (aref a 13 3) 1)
  (setf (aref a 14 0) 1) (setf (aref a 14 1) 1) (setf (aref a 14 2) 1) (setf (aref a 14 3) 0)
  (setf (aref a 15 0) 1) (setf (aref a 15 1) 1) (setf (aref a 15 2) 1) (setf (aref a 15 3) 1)

;;; 定数項
  (do ((i 0 (1+ i)))
     ((> i 15))
    (setf (aref a i 15) 1))

;;; ab
  (do ((i 0 (1+ i)))
     ((> i 15))
    (setf (aref a i 4) (* (aref a i 0) (aref a i 1))))

;;; ac
  (do ((i 0 (1+ i)))
     ((> i 15))
    (setf (aref a i 5) (* (aref a i 0) (aref a i 2))))

;;; ad
  (do ((i 0 (1+ i)))
     ((> i 15))
    (setf (aref a i 6) (* (aref a i 0) (aref a i 3))))

;;; bc
  (do ((i 0 (1+ i)))
     ((> i 15))
    (setf (aref a i 7) (* (aref a i 1) (aref a i 2))))

;;; bd
  (do ((i 0 (1+ i)))
     ((> i 15))
    (setf (aref a i 8) (* (aref a i 1) (aref a i 3))))

;;; cd
  (do ((i 0 (1+ i)))
     ((> i 15))
    (setf (aref a i 9) (* (aref a i 2) (aref a i 3))))

;;; abc
  (do ((i 0 (1+ i)))
     ((> i 15))
    (setf (aref a i 10) (* (aref a i 0) (aref a i 1) (aref a i 2))))

;;; acd
  (do ((i 0 (1+ i)))
     ((> i 15))
    (setf (aref a i 11) (* (aref a i 0) (aref a i 2) (aref a i 3))))

;;; abd
  (do ((i 0 (1+ i)))
     ((> i 15))
    (setf (aref a i 12) (* (aref a i 0) (aref a i 1) (aref a i 3))))

;;; bcd
  (do ((i 0 (1+ i)))
     ((> i 15))
   (setf (aref a i 13) (* (aref a i 1) (aref a i 2) (aref a i 3))))

;;; abcd
  (do ((i 0 (1+ i)))
     ((> i 15))
    (setf (aref a i 14) (* (aref a i 0) (aref a i 1) (aref a i 2) (aref a i 3))))

;;;
;;;
;;;
  (do ((j 0 (1+ j)))
     ((> j 15))
    (do ((i 0 (1+ i))
       (s 0))
       ((> i 15) (setf (aref a2 0 j) s))
      (setf s (+ s (aref a i j)))))

;;;
;;;
;;;
  (do ((l 0 (1+ l)))
     ((> l 14))
    (do ((j 0 (1+ j)))
       ((> j 15))
      (do ((i 0 (1+ i))
         (s 0))
         ((> i 15) (setf (aref a2 (1+ l) j) s))
        (setf s (+ s (* (aref a i l) (aref a i j))))))))

;;;
;;;
;;;
(defun input-1-or-0 ()
  (do ((i 0 (1+ i)))
     ((> i 15))
   (format t "~%No.~a~%" (1+ i))
   (setf (aref b i 0) (car (read-sentence)))))

(defun solve-aux ()
  (input-1-or-0)
  (do ((i 0 (1+ i))
     (s 0))
     ((> i 15) (setf (aref a2 0 16) s))
    (setf s (+ s (aref b i 0))))
  (do ((l 0 (1+ l)))
     ((> l 14))
    (do ((i 0 (1+ i))
       (s 0))
       ((> i 15) (setf (aref a2 (1+ l) 16) s))
      (setf s (+ s (* (aref a i l) (aref b i 0)))))))

(defun convert-l-to-a ()
  (prog ()
    (set-data)
    (solve-aux)
    (do ((k 0 (1+ k)))
       ((> k 15))
      (setf w (aref a2 k k))
      (setf k1 (1+ k))
      (do ((j k1 (1+ j)))
         ((> j 16))
        (setf (aref a2 k j) (/ (aref a2 k j) w)))
      (do ((i 0 (1+ i)))
         ((> i 15))
        (cond ((not (equal i k))
             (setf w (aref a2 i k))
             (do ((j k1 (1+ j)))
                ((> j 16))
               (setf (aref a2 i j) (- (aref a2 i j) (* (aref a2 k j) w))))))))
    (do ((i 0 (1+ i)))
       ((> i 15))
      (format t "~%No.~a ~a~a" (1+ i) (float (aref a2 i 16)) (aref n i 0))))

ここで実験計画法への分散分析に替わる回帰分析の応用を考える。一部実施計画で直交表L16(2-15)を用いた場合に、全ての交互作用が求まるように実験の割り付けを行うと、次のような実験配置になる。

    a    b    c   d   e        実験結果No.
    0   0   0   0   0          1
    0   0   0   1   1          2
    0   0   1   0   1          3
    0   0   1   1   0          4
    0   1   0   0   1          5
    0   1   0   1   0          6
    0   1   1   0   0          7
    0   1   1   1   1          8
    1   0   0   0   1          9
    1   0   0   1   0          10
    1   0   1   0   0          11
    1   0   1   1   1          12
    1   1   0   0   0          13
    1   1   0   1   1          14
    1   1   1   0   1          15
    1   1   1   1   0          16

この実験配置に対して、上のプログラムを少し修正して計算すると次の形の回帰式が得られる。

  実験結果=A1a+A2b+A3c+A4d+A5e+A6ab+A7ac+A8ad+A9ae+A10bc+A11bd+A12be+A13cd+A14ce+A15de+A16

係数A1からA16は次のプログラムで求まる。

10 'The name of this program is L16
20 CLS :SCREEN 4
30 LOCATE 5,5 :INPUT "Enter the name of data." A$
40 N=16
50 M=15
60 DIM B(50),R(50,25),A(50,25),B$(50),C(50,25)
70 X=16
80 '
90 FOR I=1 TO 16 :A(I,16)=1 :NEXT I
100 A(1,1)=0:A(1,2)=0:A(1,3)=0:A(1,4)=0:A(1,5)=0
110 A(2,1)=0:A(2,2)=0:A(2,3)=0:A(2,4)=1:A(2,5)=1
120 A(3,1)=0:A(3,2)=0:A(3,3)=1:A(3,4)=0:A(3,5)=1
130 A(4,1)=0:A(4,2)=0:A(4,3)=1:A(4,4)=1:A(4,5)=0
140 A(5,1)=0:A(5,2)=1:A(5,3)=0:A(5,4)=0:A(5,5)=1
150 A(6,1)=0:A(6,2)=1:A(6,3)=0:A(6,4)=1:A(6,5)=0
160 A(7,1)=0:A(7,2)=1:A(7,3)=1:A(7,4)=0:A(7,5)=0
170 A(8,1)=0:A(8,2)=1:A(8,3)=1:A(8,4)=1:A(8,5)=1
180 A(9,1)=1:A(9,2)=0:A(9,3)=0:A(9,4)=0:A(9,5)=1
190 A(10,1)=1:A(10,2)=0:A(10,3)=0:A(10,4)=1:A(10,5)=0
200 A(11,1)=1:A(11,2)=0:A(11,3)=1:A(11,4)=0:A(11,5)=0
210 A(12,1)=1:A(12,2)=0:A(12,3)=1:A(12,4)=1:A(12,5)=1
220 A(13,1)=1:A(13,2)=1:A(13,3)=0:A(13,4)=0:A(13,5)=0 
230 A(14,1)=1:A(14,2)=1:A(14,3)=0:A(14,4)=1:A(14,5)=1
240 A(15,1)=1:A(15,2)=1:A(15,3)=1:A(15,4)=0:A(15,5)=1
250 A(16,1)=1:A(16,2)=1:A(16,3)=1:A(16,4)=1:A(16,5)=0
260 FOR I=1 TO 16
270    A(I,6)=A(I,1)*A(I,2)
280    A(I,7)=A(I,1)*A(I,3)
290    A(I,8)=A(I,1)*A(I,4)
300    A(I,9)=A(I,1)*A(I,5)
310    A(I,10)=A(I,2)*A(I,3)
320    A(I,11)=A(I,2)*A(I,4)
330    A(I,12)=A(I,2)*A(I,5)
340    A(I,13)=A(I,3)*A(I,4)
350    A(I,14)=A(I,3)*A(I,5)
360    A(I,15)=A(I,4)*A(I,5)
370 NEXT I
380 B$(1)=" 1" :B$(2)=" 2" :B$(3)=" 3" :B$(4)=" 4"
390 B$(5)=" 5" :B$(6)=" 6" :B$(7)=" 7" :B$(8)=" 8"
400 B$(9)=" 9" :B$(10)="10" :B$(11)="11" :B$(12)="12"
410 B$(13)="13" :B$(14)="14" :B$(15)="15" :B$(16)="16"
420 FOR I=1 TO 16
430    PRINT "B(";I;")=";:INPUT B(I)
440 NEXT I
450 FOR J=1 TO 16
460     S=0
470     FOR I=1 TO 16 :S=S+A(I,J) :NEXT I
480     R(I,J)=S
490 NEXT J
500 '
510 FOR L=1 TO 15
520     FOR J=1 TO 16
530     S=0
540     FOR I=1 TO 16 :S=S+A(I,L)*A(I,J) :NEXT I
550     K=L+1 :R(K,J)=S
560     NEXT J
570 NEXT L
580 S=0
590 FOR I=1 TO 16 :S=S+B(I) :NEXT I
600 R(1,17)=S
610 FOR L=1 TO 15
620     S=0
630     FOR I=1 TO 16 :S=S+A(I,L)*B(I) :NEXT I
640     K=L+1 :R(K,17)=S
650 NEXT L
660 '
670 FOR K=1 TO 16
680    W=R(K,K)
690    K1=K+1
700    FOR J=K1 TO 17
710        R(K,J)=R(K,J)/W
720    NEXT J
730    FOR I=1 TO 16
740        IF I=K THEN 790
750        W=R(I,K)
760        FOR J=K1 TO 17
770            R(I,J)=R(I,J)-R(K,J)*W
780        NEXT J
790    NEXT I
800 NEXT K
810 CLS
820 PRINT "*****";A$;"*****"
830 PRINT "A(n,1)X(1)+A(n,2)X(2)+ ........ +A(n,m-1)X(m-1)+A(n,m)X(m)+A(n,m+1)"
840 PRINT " A(1) A(2) A(m-1) A(m) A(m+1)
850 PRINT "m=";16
860 FOR I=1 TO 16 :PRINT "A(";I;")=";R(I,17) :NEXT I
870 END


ここでA1〜A16は計算によって得られる定数である。こうして得られた実験式は忠実に実験結果を反映しており、最急傾斜法や遺伝的アルゴリズム(GA)などの非線形最適化手法を適用することにより、実験対象の特性の制御に有効に使える。また要因間の相互作用も明らかになり、分析的にも有意義である。要因 a を単位当たり動かした時の効果は上式を a で偏微分すればよい。計算式Faは

   Fa=A1+A6b+A7c+A8d+A9e

となる。A6,A7,A8,A9はそれぞれ要因 a と要因 b,c,d,eとの相互作用の大きさの目安となる。同様にbの場合はFb=A2+A6a+A10c+A11d+A12e、cの場合はFc=A3+A7a+A10b+A13d+A14e、dの場合はFd=A4+A8a+A11b+A13c+A15e、eの場合はFe=A5+A8a+A12b+A14c+A15dが偏微分値である。この場合、最急傾斜法による最適化方向は、5次元ベクトル(Fa Fb Fc Fd Fe)で表される。

以上は脳のモデルとされる神経回路網を数学的に見直したものである。要因ないし変数を一個の神経細胞と見なせば脳はこのようなアナログのネットワークから構成されており、デジタルを含む世界を弁別するように自己組織化するものと思われる。係数は正負の値を取り、神経細胞間の結合の強さの目安である。今までの計算はアナログとデジタルを結び、論理と代数をつなぐものである。

以上は数式を使って計算することは、論理的に思考することに等しいことを示す一例である。計算には論理が組み込まれているのである。





付論1:化学と数学と非線形性について

  濃硫酸には強力な脱水作用があり、これは硫酸分子と水の分子が強く結合するためで、水をふ含まない炭水化物からも、水素原子と酸素原子を2対1の比率でうばい、それらを黒く炭化します。濃硫酸は空気中の水分を吸収するため、乾燥剤として利用され、小生も学生の時、実験系に乾燥した空気を送り込むために、硫酸のトラップを作ったことがあります。硫酸と水とが混合すると激しく発熱し、多量の硫酸に水をそそぐと、加えた水が沸騰し硫酸をとびちらせるので危険で、多量の水に硫酸を少しずつ加えて希釈しなければならないことは、よく知られています。熱力学では溶解熱という概念があり、普通1モルの物質が液体に溶解するときに発生または吸収する熱量のことを言います。気体が液体や水に溶解する時は発熱が多いようです。硫酸、水酸化ナトリウム、エタノールなどが水に溶解する時は発熱、食塩、塩化アンモニウムの場合は吸熱となり、物質により異なります。また、溶液に溶媒を加えてうすめた時の、溶質1モル当たりの熱量の変化を希釈熱といい、希釈熱は溶液の濃度がうすいほど小さくなります。希釈熱は電解質、高分子溶液において、溶液中の電解質イオンや高分子などの溶質ー溶質、溶質ー溶媒間の相互作用に関する情報をふくんでいるので、物理化学の溶液論では重要な量です。
  以上は辞書にも書いてあることでしょう。さて、溶解熱では積分溶解熱(integral heat of solution)と微分溶解熱(differential heat of solution)とを区別する必要があります。いままで熱量という言葉を使ってきましたが、厳密に言うとエンタルピーという言葉を使う必要があります。硫酸の話に戻りますが、硫酸を絶えず攪拌しながら水にゆっくりと注いでいくと溶液はだんだんと暖かくなりますが、終わりに近づいてかなり濃厚な溶液に硫酸を加えるようになると加熱速度はずっと遅くなります。n1モルの水に1モルの硫酸を加えた時のエンタルピー変化を、特定の最終組成の溶液を作るための硫酸1モルあたりの積分溶解熱と呼びます。この値は溶液の濃度が小さいほど大きくなり、硫酸の場合、-96.19kJ/モルに収束します。この極限値を無限希釈への積分溶解熱(integral heat of solution to infinitedilution)と呼びます。積分溶解熱を硫酸と水のモル比に対してプロットすると、グラフが得られます。このグラフのある組成での勾配が微分溶解熱と呼ばれます。ある組成の溶液に対して、溶質を無限小変化させたときの積分溶解熱変化を微分溶解熱と考えてもよいです。化学の中にも随分と数学的概念が入っています。これは、一般に現象が非線形であるためでしょう。硫酸水溶液といった単純な系でさえ、濃度によって振る舞いが異なります。



付論2:送変電システムに組み込まれる機能性セラミックの組成計算

  小生が、T社にいた時に従事していた仕事ですが、これは「避雷器」という装置に関するものでした。「雷」という言葉が入っていますが、避雷針とか雷と直接関係のあるものではありません。送変電システムでは、変圧器、遮断器、断路器、避雷器などが、主に構成要素になっています。避雷器とは、送変電系統において、交流系統電圧が印加された状態で、雷サージ電圧が伝播してきた場合、直ちにこれを放電して線路の電圧を機器耐電圧以内に制限し、かつ雷サージのエネルギーを十分放出するとともに、機圧による続流は、これを遮断する自復能力を有し、開閉サージに対しても動作責務の範囲内で十分エネルギーを処理するものです。系統を保護するため、毎相対地間に接続される避雷器は異常電圧を一定値以内に抑制する能力があるため、系統の絶縁構成を決定する基準となります。簡単に言うと、避雷器は、発電所や変電所や電信柱の変圧器などを、異常電圧から保護する装置です。低い電圧に対しては絶縁体として振る舞いますが、高い電圧に対しては、抵抗が急激に抵抗値が低くなり、放電するような装置です。異常電圧が発生する理由ですが、落雷、遮断器の作動、送電線の地絡事故などが挙げられます。落雷があると、異常電圧が発生し、それが送電線に伝播します。遮断器というのは、超大型のスイッチのようなもので、小さな回路でも、スイッチを点けたり離したりすると火花が飛びますが、大電力では電力を遮断するだけで、高度な技術を要します。大電力では、遮断しても、アークの続流が空気中を継続して流れ、これを切断するためには、強力な空気流を吹き付けるとか、磁場を掛けるとかして、吹き消さなければならないのです。実際、何十年も大型のスイッチ(遮断器)を開閉する技術を開発するため、毎日遮断機をつけたり離したりといった部門もありました。もちろん手動ではなく、遠隔操作です。大電力を無理やり遮断した時も異常電圧が発生します。送電線はもちろん金属ですし、大地も導体ですから、送電線と大地とは、大きな容量のコンデンサを形成し、大量の電荷を蓄えています。したがって、何かの原因で送電線が切れて、大地に接地すれば、電荷が放出され異常電圧が発生します。これらの異常電圧から、変電所などの設備を絶縁破壊から守るのが「避雷器」なのです。
  これだけのことをする装置ですから、さぞや高度で複雑な装置だろうと思われるかも知れませんが、実際は大型のバリスターと呼ばれる機能性セラミックを積み重ねた単純な装置です。小生はこのバリスターの、いろいろな特性を制御する仕事をやっていました。バリスターとは非直線抵抗体とも呼ばれ、オームの法則には従わない抵抗体です。電圧が低い状態では絶縁体として振舞うのですが、電圧が高くなるにつれて、急激に抵抗値が低くなっていくような、不思議な抵抗体です。主成分ZnOにBi2O3,Sb2O3,NiO,Co2O3,MnO,Cr2O3,SiO2、Al2O3,B2O3,Ag2Oなどを添加して作ります。10種類程度の酸化物の成分ですから、随分と複雑な系です。これらの成分の濃度を動かして、特性を制御していました。話としては単純に聞こえるかもしれませんが、労力のいる作業で、4〜5個の成分を動かした場合、成分間の相互作用があるので、計算機を使わないと解析できませんでした。この時、実験計画法というものを多用しました。(既に説明しましたね。)
  避雷器用のバリスターは、優れた電気的特性、課電寿命特性(長時間電圧が印加されても熱暴走しない)、放電耐量特性(大電流が流れても破壊しない)、が要求されます。電気的特性としては、なるべく非直線性の強いバリスターが求められます。避雷器には系統電圧が常時印加されるために、漏れ電流が流れるのですが、これが発熱原因となって、さらに抵抗が低くなり、更に発熱し、・・・と悪循環に陥り、熱暴走しないことが求められます。これが課電寿命特性です。また、大型のバリスターであるために、不均一になりがちで、抵抗の低いところに電流が集中し発熱することにより、高温を発し、周りに熱応力を生ずるために、大電流が流れた時に破壊してしまうバリスターもあります。これが、放電耐量特性です。なるべく均一性の高いバリスターを作る技術が求められます。
  以上が、大体、T社で従事していた仕事の内容です。私自身も理科系でありながら、入社するまで、「避雷器」なるものの存在さえ知りませんでした。理科系とは本当に広く深い世界だと思います。バリスター自身は、特に小型のものは、あらゆる機器に組み込まれているといっても過言ではありません。高い電圧に耐えられない部品の前には、必ずバリスターが使われます。



付論3:科学技術の営みの実際について

  不可知論とは、辞書によれば、「意識に与えられる感覚的経験の背後にある実在は論証的には認識できないという説。そういう実在を認める立場と、その有無も不確実とする立場がる。」とあります。不可知論が上記のようなものだとすれば、自然科学は全く正反対の方向で考えています。まず、素朴実在論を前提にしており、実在を論証しようとするわけではありません。そんなことが不可能なのは自明です。まず実在を無条件に認め、実在ないし、そこから派生する現象を把握し記述するのが自然科学であり、その知見を応用するのが技術です。
  不可知論が上記のもののようなものならば、観念論の一種であり、自然科学の実在論とは対立するものです。観念論と実在論は両立しません。どちらかを破棄しなければなりません。独我論、不可知論などの観念論を聞いて、理解できないわけではありませんが、現実離れした話にしか聞こえません。もしこのような主張ばかりならば、哲学は百害あって一利なしの、危険な学問でしょう。
  何故このようなことを言ったかというと、ある哲学系MLで、量子力学における観測問題を不可知論と勘違いした挙句、奇妙な問題提起がなされたからです。量子力学における観測問題はハイゼンベルクの不確定性原理から派生する現象で、数式で示すことができます。



付論4:シェファーのストローク(縦棒演算)について

 シェファー(H.M.Sheffer)は、1913年に、唯一つの論理記号を用いて、否定、論理積、論理和、含意、双条件を表す方法を導いた。p|qは、p、qがともに真のときにかぎって偽となる、天邪鬼な演算である。

        p  q   p|q
        1  1    0
        1  0    1
        0  1    1
        0  0    1

別の表現では

        p|q = ¬(p∧q) = ¬p∨¬q

シェファーのストロークを使うと

        否定は ¬p = p|p
        論理和は p∨q = (p|p)|(q|q)

となることは、真理表を使ってもわかるが、次のようにしても導くことができる。

        p|p = ¬p∨¬p = ¬p
        (p|p)|(q|q) = (¬p)|(¬q) = (¬¬p)∨(¬¬q) = p∨q

良く知られているように、論理積、含意、双条件は否定と論理和で表されるから、それらをシェファーのストロークで表すことができる。
 良く分からなかったかも知れないが、現代的な言葉で言えば、シェファーのストロークとはNAND回路のことである。上に書いたことは、昔の記号論理学の教科書に書いてあることである。上のことを現代的な言葉で言い直せば、次のようになる。NAND回路の入力側を一つにまとめてしまうとNOT回路になる。NAND回路の出力をNOT回路で反転すればAND回路になる。NAND回路一つとNOT回路二つでOR回路を作ることができる。論理回路を設計するときにはデジタルICを使うが、論理回路の種類が多いと、ICもその種類だけそろえなければならない。しかし、NAND回路のICが一種類あれば、AND回路やOR回路、NOT回路をNAND回路の組み合わせで構成でき、部品の種類が少なくて済み、とても便利である。
 このように、ある論理記号をもとにとって、他の論理演算、従って論理式を表すということは、論理的な問題であるとともに、計算機の製作の上でも重要な課題のひとつであった。
 シェファーのストロークに関しては、ヴィトゲンシュタインの「論理哲学論考」などにも言及がある。

論理哲学論考5・511
すべてを包括し、世界を反映する論理が、かくも特殊なかぎ針と運針でこと足りるのはなぜか。ひとえにこれらすべてが、限りなく精巧な網目細工へと、世界を映す巨大な鏡へと、編みあげられるからだ。



 任意の論理回路のNAND回路への変換は、下記のLisp関数で行える。再帰を用いている。



(defun rewrite (l)
  (cond ((atom l) l)
      ((equal (first l) 'NAND)
       (list 'NAND
          (rewrite (second l))
          (rewrite (third l))))
      ((equal (first l) 'NOT)
       (rewrite (list 'NAND (second l) t)))
      ((equal (first l) 'AND)
       (rewrite (list 'NOT
                (list 'NAND (second l) (third l)))))
      ((equal (first l) 'OR)
       (rewrite (list 'NAND
                (list 'NOT (second l))
                (list 'NOT (third l)))))
      ((equal (first l) 'XOR)
       (rewrite (list 'AND
                (list 'OR (second l) (third l))
                (list 'OR
                   (list 'NOT (second l))
                   (list 'NOT (third l))))))
      (t (list 'error l))))

 バッククォートを使うと、次のようにもっと簡潔簡明に書ける。

(defun rewrite (l)
  (cond ((atom l) l)
      ((equal (first l) 'NAND)
      `(NAND ,(rewrite (second l)) ,(rewrite (third l))))
      ((equal (first l) 'NOT)
       (rewrite `(NAND ,(second l) t)))
      ((equal (first l) 'AND)
       (rewrite `(NOT (NAND ,(second l) ,(third l)))))
      ((equal (first l) 'OR)
       (rewrite `(NAND (NOT ,(second l)) (NOT ,(third l)))))
      ((equal (first l) 'XOR)
       (rewrite `(AND (OR ,(second l) ,(third l))
                 (OR (NOT ,(second l)) (NOT ,(third l))))))
      (t `(error ,l))))


命題論理の定理の自動証明も次のように簡潔に記述される。

(defun and-or-not (s)
  (cond ((atom s) s)
      ((equal (first s) 'NOT)
      `(NOT ,(and-or-not (second s))))
      ((equal (first s) 'AND)
      `(AND ,(and-or-not (second s))
           ,(and-or-not (third s))))
      ((equal (first s) 'OR)
      `(OR ,(and-or-not (second s))
          ,(and-or-not (third s))))
      ((equal (first s) '->)
      `(OR (NOT ,(and-or-not (second s)))
              ,(and-or-not (third s))))))

(defun de-morgan (s)
  (cond ((atom s) s)
      ((equal (first s) 'NOT)
       (move-not (second s)))
      ((equal (first s) 'AND)
      `(AND ,(de-morgan (second s))
           ,(de-morgan (third s))))
      ((equal (first s) 'OR)
      `(OR ,(de-morgan (second s))
          ,(de-morgan (third s))))))

(defun move-not (s)
  (cond ((atom s) `(NOT ,s))
      ((equal (first s) 'NOT)
       (de-morgan (second s)))
      ((equal (first s) 'AND)
      `(OR ,(move-not (second s))
          ,(move-not (third s))))
      ((equal (first s) 'OR)
      `(AND ,(move-not (second s))
           ,(move-not (third s))))))

;;;
;;; (prove '(OR a (NOT a)) ===> (OR a (NOT a))
;;; (prove '(AND (-> a a) (-> b b))) ===> (AND (OR (NOT a) a) (OR (NOT b) b)))
;;;
(defun prove (s)
  (de-morgan (and-or-not s)))


付論5 ブール代数&神経回路網(ニューラルネットワーク)
以下、a,b,c,dは0または1の値をとる論理変数とする。また、次のように基底項を定義する。
n=2(変数の数が2の場合)の時
{a b ab}
n=3(変数の数が3の場合)の時
{a b c ab ac bc abc}
n=4(変数の数が4の場合)の時
{a b c d ab ac ad bc bd cd abc abd acd bcd abcd}
このように基底項を定義すると任意のブールの論理代数の論理関数は

      基底項の線形結合+定数項(1または0)

で表される。n=2の場合の例を以下に挙げる。

論理和 A∨B=a+b-ab
論理積 A∧B=ab
排他的論理和 A●B=a+b-2ab
否定論理積 A NAND B=-ab+1
否定論理和 A NOR B=¬(A∨B)=¬A∧¬B=(1-a)(1-b)=-a-b+ab+1
含意 A⇒B=¬A∨B=(1-a)+b-(1-a)b=-a+ab+1

n=3,n=4の場合の例をいくつか挙げると

A∨B∨C=a+b+c-ab-bc-ac+abc
A∨B∨C∨D=a+b+c+d-ab-ac-ad-bc-bd-cd+abc+acd+abd+bcd-abcd

A●B●C=a+b+c-2ab-2bc-2ac+4abc
A●B●C●D=a+b+c+d-2ab-2ac-2ad-2bc-2bd-2cd+4abc+4acd+4abd+4bcd-8abcd

A∧B∧C=abc
A∧B∧C∧D=abcd


ここで、基底項について説明する。n=4の時、基底項は

{(a b c d)(ab ac ad bc bd cd)(abc acd abd bcd)(abcd)}

となる。このうち(ab ac ad bc bd cd)は4つの変数(a b c d)から二つの異なる変数を選んだ場合の数で、全部で4から2個を選ぶ場合の数4C2=4!/2!2!=6通りある。同様に(abc acd abd bcd)は4つから3つを選ぶ場合の数で4!/3!=4通りある。

論理変数と神経細胞は同じではないが、共に0,1の値をとるものと抽象化することにより、類比的に考察することができる。即ち、神経細胞も0、1の値をとると仮定することができる。様々な論理関数が

      基底項の線形結合+定数項(0または1)

で表されることが分かったが、このうち、論理変数の積の形で現れる非線形項は何を表すのであろうか。有名なヘッブの規則によれば、神経細胞どうしで同時に発火する確率が高いほど、お互いの結合が強くなる。すなわち、非線形項はヘッブの規則を表したものと考えられる。例えば、ばらばらな神経細胞a,b,c,dがあったとすると、線形項と非線形項の組み合わせにより、様々なパターンの論理関数が現れる。最初に、ばらばらな神経細胞がいくつかあった時に、学習、連合、条件付け、環境との相互作用などにより、ヘッブの規則が適用され、非線形項が変化することにより、神経細胞のアンサンブルの挙動が変化していくのである。

神経細胞の集団の挙動には、分子の集団などの運動とは異なり、ヘッブの規則が適用され、非線形項の出現により、様々なパターンが現れるようである。

逆に、神経細胞が三つあるとする。それをa,b,cで表す。a,b,c個別ではそのまま出力し、ヘッブの法則によりa,bの結合、c,bの結合、a,b,cの結合が生まれ、全体としてそれらが抑制的に働くと仮定した場合の挙動を示すためには、

      a+b+c-ab-cb-abc

の計算をすることになる。具体的には

________a__b__c__-ab_-cb__-abc_______a+b+c-ab-cb-abc
________0__0__0___0_____0______0___________________0
________0__0__1___0_____0______0___________________1
________0__1__0___0_____0______0___________________1
________0__1__1___0____-1_____0___________________1
________1__0__0___0_____0______0___________________1
________1__0__1___0_____0______0___________________2
________1__1__0__-1____0______0___________________1
________1__1__1__-1___-1____-1___________________0

のように論理関数のような挙動を示す。このように「基底項の線形結合+定数項(1または0)」が全て論理関数になるわけではない。論理関数になるためには、抑制性と興奮性の結合のバランスが必要である。

a,b,c,dなどは神経細胞ひとつの出力として考えてきたが、a,b,c,dなどには、アンサンブルとして論理関数として振舞う集団を代入することができる。例えば、論理積A∧BのAに「P⇒Q]、Bに「Q⇒P」を代入すれば、双条件と呼ばれる論理関数が現れる。すなわち、

   A∧B=ab=(P⇒Q)∧(Q⇒P)=(-p+pq+1)(-q+pq+1)=pq-pq-p-pq+pq+pq-q+pq+1=-p-q+2pq+1=P⇔Q

論理変数ではなく、神経細胞の場合も類比的に考えることが可能である。ここで、p^2=p,q^2=qとなることに注意。

次に、最も基本的な推論形式 P∧(P⇒Q)⇒Q も次のように証明できる。

   「P∧(P⇒Q)⇒Q」=1-p(1-p+pq)+p(1-p+pq)q=1-(p-p+pq)+(p-p+pq)q
               =1-pq+pq=1

となり、この推論形式は恒真式(トートロジー)になることが分かる(三段論法・肯定式)。他の推論形式も同様に計算される。

 すべての大脳新皮質では神経細胞は層状に(I−VI層)配列されている。神経結合は主として層に対して垂直に形成されるが、結合の様式は層によって規定される。つまり、細胞がどの層にあるかによって、細胞が入力を受け、出力を送る部位が大局的に規定される。信号を送り出す細胞(遠心性細胞)はIII、V、VI層にあるが、III層は上位の大脳皮質に、V層は大脳以外の下位の神経核に、VI層は下位の大脳皮質と中継核にそれぞれ信号を送る。またIV層には中継核から信号を受ける細胞があり、他の層の細胞はIV層の細胞を経由して信号を間接的に受ける。
 たとえば映像の形と運動の情報をそれぞれ伝えるXとY系の視神経の興奮性視覚信号は単純型と複雑型に並列的に入力されることが示されている。また単純型から複雑型への直列的な抑制結合があることも示され、興奮性と抑制性神経回路の相互作用の結果として反応選択性が生れるとする考え方が提案されている(並列モデル)。


【ジョーク】脳の男女差
 男性の脳の重さが女性の脳の重さよりも重いと知った時、私は思わず「勝った!」と思ったが、イルカや象の例もあるので、脳の重さは決定打ではなさそうだ。右脳と左脳を連絡する脳梁や前交連という部分は、男性より女性のほうが大きいという。つまり、女性は右脳と左脳とで情報を男性よりも上手くやりとりし、脳全体としてのパフォーマンスを向上させ、容量を補っているらしい。分かりやすくするため、極端な式で表すと

    男脳パワー = 右脳パワー + 左脳パワー ー 0.06*(右脳パワー*左脳パワー)

    女脳パワー = 右脳パワー + 左脳パワー + 8956*(右脳パワー*左脳パワー)

くらいになっているようだ。大きく分けて言うと、右脳は感情、左脳は論理を司るので、女性がときとして見せる矛盾と不可解さも上の式で近似的に理解できるかもしれない。
 ノーベル章を受賞した根岸英一さんが、教育でも競争を重視するように提案したのも、女性を牽制してのことではなかろうか。競争に興味を示すのは女性よりも男性に多いから、競争を強調すれば、まだ男性が優位に立てるとの計算があるのではないか。それが証拠に、科学技術関連予算を巡る事業仕分けでも、「世界一じゃなくてはいけないんですか?」とふと本音を漏らした女性議員がいたではないか。いや、男である私自身も、「世界一」派ではなく「オンリーワン」派なので、世界一の連発はあまりよく分からないのだが。つまらないことでも、オンリーワンならば競わずしてナンバーワンだと思うのだが、ちと不精か。一面から見れば、あの仕分けは男性原理と女性原理の対立に見えた。
 女性の社会への進出は目覚しいものがある。その勢いで私のような人間は肩身の狭い思いをしなければならない世の中になった。一般的に言って男性が暮らしにくい世の中になったとは言えるようだ。


以上は、人工知能のコネクショニズムに近い考え方を述べてきた。以下では、古典的人工知能の基本的考え方について述べる。

記号はどこにあるのか?古典的記号主義、計算主義を巡って
 ゲーデルの数学的実在論と関係あるのだが、私が作った自動作曲システムを構成する、音楽で使われる記号、ひいては音楽の記号体系はどこにあるのだろうか?これらは、人間の脳内にあるのではない。あくまで、外界に実在するもので、記憶として一部脳内にあるに過ぎないのではないか。音楽自体も音楽の記号体系も、外界にあり、双方に対して、人間の脳は解釈系として機能する。
 世界内の存在を解釈する時に、人間は自分の知識に基いて解釈すると考え勝ちだが、あくまで、知識は人間の外界にある(あった)ものであり、人間の解釈対象は「存在自体」と「理論や知識」に二重化されているのではないか。存在を記号体系化したものが理論や知識であり、存在理解とは存在自体の記号体系に対する解釈である。記号体系は教育や観察・発見によってもたらされる。人間は存在を直に解釈するのではなく、存在を表すとされる記号体系を解釈するのではないか。そして、その記号体系は外界と記憶として脳内に存在する。
 Dijkstara(1972)の次の言葉がある。プログラミング言語Lispに関するものである。
 「Lispは冗談に『計算機を誤用するための最も賢い方法』であると言われてきた。この描写は大変な賛辞であると思う。この言葉によってLispの持つ完全に自由な雰囲気が伝わってくるからであるーーーーLispは、われわれの最も才能のある人々が、以前は不可能であった思考を行う手助けをしてきたのである。」
 Lispは、マッカーシーがリスト・データ構造の基本要素を極限まで簡略化し、その上の計算モデルを計算の理論で知られるラムダ計算に基いて構成し、設計したプログラミング言語である。いずれにせよ、記号の取り扱いや記号を組み合わせて複雑な知識を表現し、計算機上でそれらを操作するのに適した言語である。
 私は自分の作った自動作曲システムのことを言うのは、自慢するためではなく、他に経験も業績もないのと、今考えてみれば、古典的記号主義、計算主義に立ったシステムであるからである。私は自動作曲システムを作るのに、音楽を分析したのではなく、ジャズ理論の記号体系を分析し、それを応用したからである。私には音楽理論は分かるが、音楽が理解できるという自信はない。
 黒崎政男によると、ライプニッツは普遍記号学を構想し、ホッブスの「思考するとは計算することである」というテーゼを発展させ、「思考のアルファベット」たる少数の基本概念から、計算という記号操作によってすべての真理を演繹的の構築しようとしていた。つまりそれは、記号体系が特にうまく作られたならば、記号間の関係や秩序が、事物間の関係や秩序に対応する、という発想に基いており、記号の側の操作だけで事実や事象の知識に到達しようというものであった。この普遍記号学、およびこの記号主義と感覚、直感などの連関をめぐるライプニッツの思索は、今日のAI(人工知能)の計算主義をめぐる議論の原型をなしており、AIの根本問題に対する貴重な示唆を与えている。
  このライプニッツの説は、記号体系をジャズの理論体系とすれば、音楽という事象について、そのまま当てはまる。音楽を知らずとも、ジャズの理論で使われる記号を操作するだけで、作曲編曲なども可能であるということである。これは、記号操作の主体が、人間であろうと計算機であろうと、変わらない事実である。
 古典的人工知能の考え方は次のようなものである。
 心の構造を知識の構造と考え、さらに知識は記号の形式系として最もよく表現されると考える。認知は記号として表象された知識の上での形式的操作として理解される。古典的人工知能のパラダイムを特徴付けるためには計算主義に基く必要がある。
 古典的人工知能を特徴付ける計算主義では、知識は常にそれがどのように用いられるかという、処理過程の観点から扱われ、知識の表現ないし記述は、知識処理のアルゴリズムと不可分の関係にある。知識表現の方式として現在の人工知能で常用されている、意味ネットワーク、フレーム、プロダクション規則、論理式などいずれでも、知識を要素とその組み合わせからなる記号で表現し、それらを操作するための形式的規則/アルゴリズムを定義すると、知識の計算が実現する。記号で表現された要素が、心的構造においては概念、命題などに対応し、その上での操作(計算)が、認知、思考、推論、理解、記憶などに対応する。
 知識、ひいては心の本質は、形式的操作の対象となるような「記号」の概念でとらえることができる、という主張に対しては批判がある。その批判の多くは、人間の知識や認知のもつ状況依存性や身体性、イメージ性、アナログ性、技能性などに関わるもので、こうした批判を建設的に取り込んで、より豊かな記号概念にたつ古典的人工知能が十分に可能であると主張されている。
 古典的計算主義に対する克服は、コネクショニズムに基く計算観で試みられている。概念の分散表現の考え方は、記号なき知識表現を可能にするもので、古典的な知識観に対する改変をせまっている。





トップページに戻る  ご意見ご希望の掲示板