APL/J言語:分類(集合と命題)

APL/J言語:分類(集合と命題)

分類テーブルtに-.+./tを作用すると、完全分類表が作られる。下記の関数は従って、完全分類テーブルである。tabという関数はスカラーやベクトル引数を一行のテーブルとして扱うためのものである。

   c=: complete=: (] , (+./ {. ,:)@:-.@:(+./))@:tab
   tab=: ,:^:(0:>.2:-#@$)
   c 0 0 1,:0 1 0
0 0 1
0 1 0
1 0 0
   c 1 0 1,:0 1 0
1 0 1
0 1 0
   (c 1 0 1);(c c 1 0 1);(c 0);(c 1)
 +-----+-----+-+-+
 |1 0 1|1 0 1|0|1|
 |0 1 0|0 1 0|1| |
 +-----+-----+-+-+

ひとつの真偽リストを返す関数は命題と呼ばれる。その結果は集合と呼ばれる一方向の分類である。むろんこの分類は補助的な集合によて完全化される。(補集合により全体と一致する、という意味か?)

   p1=: 2&<: *. <&5           NB.インターバルによって定義された集合
   p1a=: (2:<:]) *. (]<5:)    NB.別の定義
   p2=: = <.                  NB.整数の集合
   a=: 2 %~ i. 11
   (],p1,p1a,p2,(p1+.p2),:(p1*.p2)) a
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
0   0 0   0 1   1 1   1 1   1 0
0   0 0   0 1   1 1   1 1   1 0
1   0 1   0 1   0 1   0 1   0 1
1   0 1   0 1   1 1   1 1   1 1
0   0 0   0 1   0 1   0 1   0 0                    
   list=: 1 : 'x # ]'         NB.集合の要素をリストする副詞
   ( (p1 list);(p2 list);( (p1*.p2)list)) a
 +-----------------+-----------+-----+
 |2 2.5 3 3.5 4 4.5|0 1 2 3 4 5|2 3 4|
 +-----------------+-----------+-----+