ソフトウェアの品質を学びまくる

ソフトウェアの品質、ソフトウェアテストなどについて学んだことを記録するブログです。

パスワード要件で原因結果グラフを描いてみたけれど苦しい。

amortal

 完全にローカルメモ。

 dマガジンというサービスのパスワード要件に一瞬迷ったのですが、秋山さんから「原因結果グラフを描くのだ!」とのご神託を受けたので、トライしてみました。

 わたしは原因結果グラフ(CEG: Cause Effect Graph)が苦手です。「グラフが完成した」というゴールがわからず、いつも「どこか間違っているのではないか」という気分にさせられるからです。
 今回、秋山さんに模範解答をいただきましたが、自分では一発でそこまでたどり着けませんでした。なのでせめて、「どのようなロジックでそこにたどり着けるか」の理屈付けを考えてみました。

お題はコレ

f:id:kz_suzuki:20200303060925p:plain

 文字数、必須/任意、文字種 の3つの情報があるのですが、今回は文字種だけに注目します。単純そうですが、これだけでもけっこうやりがいあります。
 「英字のみ、数字のみ、記号のみ不可」というのは日本語がわかりづらいけれど、「英字のみの文字列は不可」「数字のみの文字列は不可」「記号のみの文字列は不可」のAND条件と見なします。また文字種は、英字・数字・記号の3つしかないということにします。

1. まずはそのままグラフを書く

 日本語をそのままノードにしてみます。3つの命題をAND条件で接続します。

f:id:kz_suzuki:20200303060928p:plain
f:id:kz_suzuki:20200303060908p:plain

2. ノードをシンプルにする。

 1.のデシジョンテーブルを見ると、原因ノードが「英字のみでない」と限定+否定形になっており、T/Fがややこしくなります。ノードの各命題を「裏」にして、「文字種に問題あり」という中間ノードをかませましょう。
 また、原因ノードになる3つは、1つ以下しかTになりえないので、EXCL制約をかけます。*1

f:id:kz_suzuki:20200303060933p:plain
f:id:kz_suzuki:20200303060911p:plain

3. 「確認したいこと」に近づける

 さて、2.でも間違ってはいないと思いますが、1点気になります。今回確認したいのは、「特定の文字種を含まない場合の挙動」なのですが、原因ノードがそうなっていません。
 そこで、3つの「含まない」を原因ノードにしてみます*2

 「英字のみである」は、そのまま読めば「数字を含まない」∧「記号を含まない」なのですが、暗黙の前提として「英字は含む」も意味しているので、「英字を含まない」からNOTの線を引きます。

f:id:kz_suzuki:20200303060937p:plain
f:id:kz_suzuki:20200303060915p:plain

4. 制約を付ける

 3.のデシジョンテーブルを見ると、#4は成立しないことがわかります。2つまではTになってもいいけれど、全部がTになるのはダメ。しかしこれを表現できる制約はありません。
 よって、また原因ノードを「裏」にしてから制約をかけることにします。

f:id:kz_suzuki:20200303060941p:plain
f:id:kz_suzuki:20200303060918p:plain

 これで一応完成(=秋山さんの解)です。
 ただやっぱり、自力で2.から3.に進める気がしない。秋山さんの解答案に近づけるための無理やり感がある。。

8,1,
文字種に問題あり
英字のみである
数字のみである
記号のみである
文字種に問題あり
英字を含む
数字を含む
記号を含む
362,630,126,20,obs,OR,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,,-1,
293,423,113,20,obs,AND,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,,-1,
361,420,113,20,obs,AND,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,1,,-1,
433,415,113,20,obs,AND,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,0,,-1,
363,819,126,20,obs,AND,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,,-1,
292,258,77,20,obs,,,-1,
365,257,77,20,obs,,,-1,
435,256,77,20,obs,,,-1,
INCL,371,142,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,,-1,
--
[Cause Node]
英字を含む=
数字を含む=
記号を含む=

[Middle Node]
文字種に問題あり=(英字のみである OR 数字のみである OR 記号のみである),
英字のみである=(英字を含む AND NOT 数字を含む AND NOT 記号を含む),
数字のみである=(NOT 英字を含む AND 数字を含む AND NOT 記号を含む),
記号のみである=(NOT 英字を含む AND NOT 数字を含む AND 記号を含む),

[Result Node]
文字種に問題あり=(NOT 文字種に問題あり),

[Constraint]
INCL(英字を含む 数字を含む 記号を含む),

まとめ

 ノードの導出から変形、制約の付け方についてもう少しロジカルな進め方があるはずなのですが、まだかなり曖昧です。他の問題も通じて、もう少し道筋をはっきりさせたいと思います。

おまけ

 以下のCEGは、「英字のみでない」を、「英字を含む」かつ「数字か記号を含む」のように表現したケースです
 デシジョンテーブルの#2と#5を見ると、原因ノードは同じTF組み合わせなのに、中間ノード「数字のみでない」のT/Fが違っていて気持ち悪い・・・。対称性もないし、不気味な結果となりました。
 おそらくCEGTestではなく、グラフ自体に矛盾が含まれているのだと思います・・・。

f:id:kz_suzuki:20200303060946p:plain
f:id:kz_suzuki:20200303060922p:plain

10,1,
文字種問題なし
英字のみでない
数字のみでない
記号のみでない
英字を含む
数字を含む
記号を含む
数字か記号を含む
記号か英字を含む
英字か数字を含む
344,648,113,20,obs,OR,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,-1,
236,443,113,20,obs,AND,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,,-1,
353,441,113,20,obs,AND,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,,-1,
475,452,113,20,obs,AND,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,,-1,
265,112,77,20,obs,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,-1,
355,111,77,20,obs,,,-1,
447,113,77,20,obs,,,-1,
191,276,126,20,obs,OR,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,,-1,
308,275,126,20,obs,OR,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,,-1,
420,278,126,20,obs,OR,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,-1,
INCL,355,15,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,,-1,
--
[Cause Node]
英字を含む=
数字を含む=
記号を含む=

[Middle Node]
英字のみでない=(英字を含む AND 数字か記号を含む),
数字のみでない=(数字を含む AND 記号か英字を含む),
記号のみでない=(記号を含む AND 英字か数字を含む),
数字か記号を含む=(数字を含む OR 記号を含む),
記号か英字を含む=(英字を含む OR 記号を含む),
英字か数字を含む=(英字を含む OR 数字を含む),

[Result Node]
文字種問題なし=(英字のみでない OR 数字のみでない OR 記号のみでない),

[Constraint]
INCL(英字を含む 数字を含む 記号を含む),

*1:中間ノードがOR条件なので、制約をかけてもかけなくても出てくるデシジョンテーブルは同じになった。

*2:ここに大きな論理の飛躍があると思う。適切な原因ノードの選び方のロジックを詰め切れていない。