17.4.16 条件の組み合わせ

二次方程式 ax^2+bx+c=0 が解を2つ持つことの判断にtwo_rootsという名前を付けてみましょう。大小の判断も式の一種ですから、関数にすることができます。

# let two_roots (a, b, c) = discriminant (a, b, c) > eps;; return2 val two_roots : float * float * float -> bool = <fun> # two_roots (1.,-5.,6.) ;; return2 - : bool = true # two_roots (1.,2.,1.) ;; return2 - : bool = false # two_roots(1.,2.,2.) ;; return2 - : bool = false #

同様に解を1つも持たないことの判断にno_rootsという名前を付けます。

# let no_roots (a, b, c) = discriminant (a, b, c) < -.eps;; return2 val no_roots : float * float * float -> bool = <fun> #

重解を持つ判断は、解を2つもたず、かつ、「解を1つも持たない」ことがない場合です。このような場合、条件を組み合わせてより複雑な条件を書き表わすことができます。この判断にone_rootという名前を付けて定義すると、次のように書くことができます。

# let one_root (a, b, c) = return2   not (two_roots(a,b,c)) && not (no_roots(a,b,c)) ;; return2 val two_roots : float * float * float -> bool = <fun> #

ちょっと複雑な式が出てきますが、not (式)は否定つまり「でない」で、式1 && 式2は連言つまり「式1かつ式2」という意味だと知れば、それほど難しくはありませんね。つまり、

not (two_roots(a,b,c)) && not (no_roots(a,b,c))は「解を2つ持たない、かつ、解を1つか2つ持つ」つまり「解を1つ持つ」となるわけです。

ここで出てきた&&-.<などと同様に2つの式の値を使って計算をする記号(演算子)です。2つの式の選言、つまり「式1または式2」は||という記号を使って式1 || 式2と書くことができます。&&のかわりに||を使ってone_rootを定義することも可能で、その場合はnot (two_roots(a,b,c) || no_roots(a,b,c))のようになります。