最初のやり方
最初の場合わけ
match t1, t2, t3, t4, t5, t6, t7 with | Leaf, Leaf, Leaf, Leaf, Leaf, Leaf, s1 => f_1 s1 (* T *) | Leaf, Leaf, Leaf, Leaf, Leaf, (Node s1 s2), s3 => f_3 s1 s2 s3 (* T^3 *) | Leaf, Leaf, Leaf, Leaf, (Node s1 s2), s3, s4 => f_4 s1 s2 s3 s4 (* T^4 *) 略 | (Node s1 s2), s3, s4, s5, s6, s7, s8 => f_8 s1 s2 s3 s4 s5 s6 s7 s8 (* T^8 *) end
次の場合わけ
f_1 s1 := match s1 with | Leaf => f_1_0 (* 1 *) | Node u1 Leaf => f_1_1 u1 (* T *) | Node u1 (Node u2 Leaf) => f_1_2 u1 u2 (* T^2 *) 略 | Node u1 (Node u2 (Node u3 (Node u4 u5))) => f_1_5 u1 u2 u3 u4 u5 (* T^5 *) end.
構築
f_1_0 := Leaf (* 長さ0 *) f_1_1 u1 := Node u1 Leaf (* 長さ1 *) f_1_2 u1 u2 := Node u1 (Node u2 Leaf) (* 長さ2 *) f_1_3 u1 u2 u3 := Node u1 (Node u2 (Node u3 Leaf)) (* 長さ3 *) f_3_x s1 s2 s3 s4 := Node s1 (Node s2 (Node s3 (Node s4 Leaf))) (* 長さ4 *) f_3 s1 s2 s3 := f_3_x s1 s2 s3 Leaf (* 長さ4の長さ0 *) f_4 s1 s2 s3 s4 := f_3_x s1 s2 s3 (Node s4 Leaf) (* 長さ4の長さ1 *) f_5 s1 s2 s3 s4 s5 := f_3_x s1 s2 s3 (Node s4 (Node s5 Leaf)) (* 長さ4の長さ2 *) f_6 s1 s2 s3 s4 s5 s6 := f_3_x s1 s2 s3 (Node s4 (Node s5 (Node s6 Leaf))) (* 長さ4の長さ3 *) f_8 s1 s2 s3 s4 s5 s6 s7 s8 := f_3_x s1 s2 s3 (Node s4 (Node s5 (Node s6 (Node s7 s8)))) (* 長さ4の長さ4以上 *) f_1_5 u1 u2 u3 u4 u5 := Node u1 (Node u2 (Node u3 (Node u4 (Node u5 Leaf)))) (* 長さ5 *) f_7 s1 s2 s3 s4 s5 s6 s7 := Node u1 (Node u2 (Node u3 (Node u4 (Node u5 (Node s6 s7))))) (* 長さ6以上 *)
この場合わけを圧縮すると8通りぐらいにはなる。
やってみるとわかるが、の向きの場合わけはかなり圧縮が効く。
しかし、の向きの場合わけはさっぱり圧縮できない。