|
2.6.8 条件子
Mathematicaでは,特定条件が満たされるときだけに特定の式を評価させるための指定を行うことができるようになっている.これは,次に示す方法で条件子を設定することで行う.

条件付き構成体
判定式はFalseを与える.このため,"else"に対応する式yが返される.
In[1]:= If[7 > 8, x, y]
Out[1]= 
この場合は,"else"式だけが評価される.
In[2]:= If[7 > 8, Print[x], Print[y]]

Mathematica言語によるプログラムの記述で分枝制御を行うには基本的に2つの方法を使う.その1つは,単一定義を作り,右辺にIf関数による選択肢を与える方法で,2つ目は,複数の定義を作り,各定義を適切な/;条件で制御する方法である.複数の定義を使った方が,プログラムを読みやすくでき,また,保守を容易にすることができる.
ステップ関数を定義する.値はx > 0のときに1で,それ以外は-1とする.
In[3]:= f[x_] := If[x > 0, 1, -1]
/;条件を使い,ステップ関数の正の部分を定義する.
In[4]:= g[x_] := 1 /; x > 0
これは,関数の負の部分を定義する.
In[5]:= g[x_] := -1 /; x <= 0
/;条件を使った定義をすべて表示させる.
In[6]:= ?g


選択肢が2つありどちらかを選択するには関数Ifを使うことができる.しかし,選択肢がさらにある場合もある.そのようなときの方法として,ネストさせた複数のIf関数を使うことが考えられる.しかし,普通は,If式にするより,WhichやSwitch等の関数を使う方がよい.
3つの定義域を持つ関数を定義する.第3条件をTrueとすることで,第1と第2定義域に入らないときのデフォルトを与えておく.
In[7]:= h[x_] := Which[x < 0, x^2, x > 5, x^3, True, 0]
これにはWhichの第1ケースが使われる.
In[8]:= h[-5]
Out[8]= 
第3ケースが使われる.
In[9]:= h[2]
Out[9]= 
3を法とした引数が取る値に応じて戻り値が変わる関数を定義する.
In[10]:= r[x_] := Switch[Mod[x, 3], 0, a, 1, b, 2, c]
Mod[7, 3]は1だから,Switchの第2ケースが使われる.
In[11]:= r[7]
Out[11]= 
17は0にも1にもマッチしない.しかし,パターン_にはマッチする.
In[12]:= Switch[17, 0, a, 1, b, _, q]
Out[12]= 
これは重要なことだが,Mathematicaのようなシンボル式の処理システムでは,条件によってはTrueにも,Falseにもならないことがある.したがって,例えば,条件x == yでは,xとyの両方の数値的な値が判明しない限り真偽の判定はつかない.
この場合,xとyはともに未知数なので,条件の真偽判定はつかない.このため,aとbのどちらも選択されず,If式は評価されない.
In[13]:= If[x == y, a, b]
Out[13]= 
If式に第4の引数を特別に加え,真偽判定がつかないときのデフォルト値を提供する.
In[14]:= If[x == y, a, b, c]
Out[14]= 

シンボル式による条件を扱うための関数
この式はシンボル的な代数式としてそのまま残される.
In[15]:= x == y
Out[15]= 
TrueQ[expr]において,exprが明らかにTrueにならなければ,exprはFalseであるものとみなされる.
In[16]:= TrueQ[x == y]
Out[16]= 
==と違い,===では,両辺が明示的に等しいかどうかが判定される.この場合は等しくない.
In[17]:= x === y
Out[17]= 
lhs === rhsとlhs == rhsの間には次の大きな相違点がある.前者は常に真か偽を返すが,後者はシンボル形式のまま入力を残すことがある(1.5.5を参照).===は,式の構造を判定したいときによく使われ,==は,数学的な等しさを判定したいときに使う.パターンマッチングを行うMathematicaの制御部では,実効的な===の機能が使われ,ある式が別の式に記述どおりにマッチするかどうかが判断される.
===を使い両辺の構造が同じか判定する.
In[18]:= Head[a + b + c] === Times
Out[18]= 
この場合,演算子==はあまり役に立つ結果を出してくれない.
In[19]:= Head[a + b + c] == Times
Out[19]= 
条件子の設定において, && && ... のような組合せ条件を使う必要がよくある.この組合せ条件で重要な点は,合わない条件項目 が1つでもあると判定結果はFalseになる,という点である.Mathematicaは,条件項目 を1つずつ評価し,1つでもFalseになると,その時点で判定が打ち切られる.

論理関係式の評価手順
2つの条件からなる関数を定義する.
In[20]:= t[x_] := (x != 0 && 1/x < 3)
この場合,両条件が評価される.
In[21]:= t[2]
Out[21]= 
最初の条件はFalseになるので,2番目の条件は判定されない.仮に判定したなら,1/0のゼロ割エラーが発生してしまう.
In[22]:= t[0]
Out[22]= 
Mathematicaでは,先の条件が満たされなければ後の条件は満足されないとする複数条件を並べた論理式を構築することができる.同様な処理手順がC言語のような言語でも見られるが,うまく利用すると各種プログラムを構築する上で便利になる.
|