言葉でのいい説明が思い浮かばないので、いくつか例を挙げて説明する
注:ゲーム内では全ての(ANDを使った)ルールは「S V C + 条件」という形に分割されて処理されることを念頭に置くこと
「BABA IS YOU AND MOVE AND MOVE」「BABA FEELING NOT WIN AND YOU AND MOVE IS WIN」
「FEELING NOT WIN AND YOU AND MOVE」の処理方法を述べる
- ルールリストを、次のように構成する
- 「BABA IS YOU」
- 「BABA IS MOVE」
- 「BABA IS MOVE」
- 「BABA IS WIN + 条件:FEELING NOT WIN AND YOU AND MOVE」
- 自分自身のルール「BABA IS WIN + 条件:FEELING NOT WIN AND YOU AND MOVE」にマークをする
- 引数の順番を並び替え、「NOT ◯◯」の形の引数を最後に移す
- 1つめの引数「YOU」に対して、「YOU」の使われているルールを順番に調べる
- 「BABA IS YOU」が見つかる
- 見つかったルールにマークがついていないので、そのルールにマークをつけて、次の処理へ進む
- 2つめの引数「MOVE」に対して、「MOVE」の使われているルールを順番に調べる
- 「BABA IS MOVE」が見つかる
- 見つかったルールにマークがついていないので、そのルールにマークをつけて、次の処理へ進む
- 3つめの引数「NOT WIN」に対して、「WIN」の使われていないルールを順番に調べる
- 「BABA IS MOVE」が見つかる
- 見つかったルールにマークがついていないので、そのルールにマークをつけて、次の処理へ進む
- 全ての引数「YOU・MOVE・NOT WIN」に対して該当するものが見つかったので、条件「FEELING NOT WIN AND YOU AND MOVE」が真となる
- 「BABA IS WIN」が成立する
「BABA FEELING MOVE IS YOU」「BABA FEELING YOU IS MOVE」「BABA IS YOU」
「FEELING MOVE」の処理方法を述べる
- ルールリストを次のように構成する
- 「BABA IS YOU + 条件:FEELING MOVE」
- 「BABA IS MOVE + 条件:FEELING YOU」
- 「BABA IS YOU」
- 自分自身のルール「BABA IS YOU + 条件:FEELING MOVE」にマークをする
- 引数「MOVE」に対して、「MOVE」の使われているルールを順番に調べる
- 「BABA IS MOVE + 条件:FEELING YOU」が見つかる
- 見つかったルールにマークがついていないので、そのルールにマークをつけて、条件を再帰的に処理する
- 引数「YOU」に対して、「YOU」の使われているルールを順番に調べる
- 「BABA IS YOU + 条件:FEELING MOVE」が見つかる
- このルールにはマークがついているので、次のルールを探す
- 「BABA IS YOU」が見つかる
- このルールにはマークがついていないので、マークをつけて次の処理へ進む
- 引数「YOU」に対して該当するものが見つかったので、条件「FEELING YOU」が真となる
- 「BABA IS MOVE」が成立する
- 引数「MOVE」に対して該当するものが見つかったので、条件「FEELING MOVE」が真となる
- 「BABA IS YOU」が成立する
「BABA NOT FEELING YOU IS YOU」
- ルールリストを次のように構成する
- 「BABA IS YOU + 条件:NOT FEELING YOU」
- 自分自身のルール「BABA IS YOU + 条件:NOT FEELING YOU」にマークをする
- 引数「YOU」に対して、「YOU」の使われていないルールを順番に調べる
- 「BABA IS YOU + 条件:NOT FEELING YOU」が見つかる
- このルールにはマークがついているので、次のルールを探す
- 引数「YOU」に対して1つも該当するものが見つからなかったので、条件「FEELING YOU」が偽となる
- 条件「NOT FEELING YOU」が真となる
- 「BABA IS YOU」が成立する
- 「BABA IS YOU」+「BABA FEELING YOU IS NOT YOU」は無限ループを引き起こすが、こちらは引き起こさない様子。
2×「BABA NOT FEELING NOT WIN IS YOU」
一方のルール(ルールA)の処理方法を述べる
- ルールリストを次のように構成する
- 「BABA IS YOU + 条件:NOT FEELING NOT WIN」…ルールAと表記する
- 「BABA IS YOU + 条件:NOT FEELING NOT WIN」…ルールBと表記する
- ルールAにマークをする
- 引数「NOT WIN」に対して、「WIN」の使われていないルールを順番に調べる
- ルールAが見つかる
- このルールにはマークがついているので、次のルールを探す
- ルールBが見つかる
- ルールBにはマークがついていないので、ルールBにマークをつけて、ルールBの条件を再帰的に処理する
- ルールBの引数「NOT WIN」に対して、「WIN」の使われていないルールを順番に調べる
- ルールAが見つかる
- このルールにはマークがついているので、次のルールを探す
- ルールBが見つかる
- このルールにはマークがついているので、次のルールを探す
- 1つも該当するものが見つからなかったので、条件「FEELING NOT WIN」が偽となる
- ルールBの条件「NOT FEELING NOT WIN」が真となる
- ルールBの「BABA IS YOU」が成立する
- この成立はルールAの判定のためだけの成立であって、実際に成立しているわけではない
- ルールAの引数「NOT WIN」に対して該当するものが見つかったので、条件「FEELING NOT WIN」が真となる
- ルールAの条件「NOT FEELING NOT WIN」が偽となる
- ルールAの「BABA IS YOU」が不成立となる
3×「BABA NOT FEELING NOT WIN IS YOU」
ルールAの処理方法を大雑把に述べる
- ルールリストを次のように構成する
- 「BABA IS YOU + 条件:NOT FEELING NOT WIN」…ルールAと表記する
- 「BABA IS YOU + 条件:NOT FEELING NOT WIN」…ルールBと表記する
- 「BABA IS YOU + 条件:NOT FEELING NOT WIN」…ルールCと表記する
- ルールAにマークをつける
- ルールBにマークをつけて、ルールBの条件を再帰的に処理する
- 注:ルールA,Bにマークがついた状態で、再帰処理が行われる
- (中略)ルールBが不成立となる
- ルールCにマークをつけて、ルールCの条件を再帰的に処理する
- 注:ルールA,B,Cにマークがついた状態で、再帰処理が行われる
- (中略)ルールCが成立する
- ルールAの引数「NOT WIN」に対して該当するものが見つかったので、条件「FEELING NOT WIN」が真となる
- ルールAの条件「NOT FEELING NOT WIN」が偽となる
- ルールAの「BABA IS YOU」が不成立となる
- 注:再帰処理時には、マークのリストのコピーが渡される。そのため、再帰処理の中で新たに付与されたマークは、再帰処理から抜けるとリセットされる。「WIN」以外のルールを順に調べていく過程では、マークのリストはリセットされない。
- これにより、2以上の奇数個の「BABA NOT FEELING NOT WIN IS YOU」が存在するとき、それらは全て不成立となる
「BABA IS YOU」「BABA FEELING NOT WIN IS NOT YOU」
- 内部で「BABA NOT FEELING NOT WIN IS YOU」というルールに変換される
- よって上で述べた処理より、「BABA IS YOU」は成立する
「BABA IS YOU AND YOU」「BABA FEELING NOT WIN IS NOT YOU」
- 内部で2×「BABA NOT FEELING NOT WIN IS YOU」というルールに変換される
- よって上で述べた処理より、「BABA IS YOU」は成立しない
「BABA IS YOU」「BABA FEELING YOU IS NOT YOU」
- ルール解析時に、「BABA NOT FEELING YOU IS YOU」を作るのではなく無限ループになるルールが存在すると解析され、無限ループ処理が発生する
- 無限ループの判定は、前置詞の処理とは全く別
|