日本語とC#と論理記号
<真理値表>
| | | | \(A\wedge B\) | | | | | \(A \underline{\vee}B\) | \(A\vee B\) | | \(A\leftrightarrow B\) | | | \(\neg A\) | \(A\rightarrow B\) | | |
| | | | かつ | | | | | | または | | | | | でない | ならば | | |
| | | | AND | | | | | XOR | OR | NOR | | NOT | IMP | NOT | IMP | NAND | |
A | B | | false | A&&B | A&&!B | A | !A&&B | B | A!=B | A||B | !(A||B) | A==B | !B | A||!B | !A | !A||B | !(A&&B) | true |
1 | 1 | | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
1 | 0 | | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
0 | 1 | | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
0 | 0 | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1:真:True(トゥルー)
0:偽:False(フォールス)
AND(掛算)はOR(足算)より先に計算する事
回路図
各論理式は電池と電球それを伝える配線で表現できる
IMPも他の回路と同様に回路図式化できる
ベン図
集合の関係を表すための図。利用する際は領域を染めた領域を真とする
含意(がんい:IMPLIES)
\(A\Rightarrow B\) 日本語にするなら「AならばB」
論理学で利用される機会が多い「ならば」は「含意」に該当する
この「ならば」は含意を無理に日本語へ近似した結果であって正確に、その意味となる日本語は存在しない
真理値表の値の動きこそが、その働きを正確に表している。だからC#の\(!A||B\)と憶えるのが一番いい
- この結合子は必ず二項をつないだ状態で議論される
- AはBである為の十分条件
- BはAである為の必要条件
論理式では !A||B で表せる
\(インコ\Rightarrow 鳥\)
\(鳥\Rightarrow 動物\)
メモ:
AはBに含まれてる?だから"含"意??計算式で含まれてるって何?
\(n>\delta \Rightarrow \left| { a }_{ n }-\alpha \right| <\varepsilon \)
条件付き論理積の確認
C#のAND、「A ∧ B」を表現する&&などの論理演算が「条件付き論理積」である事を確認する
以下のコードで check を true にすると A という条件を満たしたので”Bが実行され評価される”
しかし false の場合、条件は満たされていないので、Bの実行すらオミットされ、Bが評価されることは無い
|| や == 等も同様、C#では条件付き論理演算子になっている。これはプログラムを組むうえで強く意識しておいた方が良い事項である
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
-
|
|
|
|
-
-
|
!
!
|
|
-
|
|
!
!
| using UnityEngine;
using System.Collections;
public class Logic2 : MonoBehaviour
{
public bool check;
void Start ()
{
if (check && Execute ()) {
print ("!");
}
}
bool Execute ()
{
print ("Exec");
return true;
}
}
|
実行結果
falseの場合、何も表示されない
trueの場合
Exec
!
と表示される
カルノー図
複数の論理式を出来うる限り少ない論理式の組み合わせに単純化する技術
命題数によって描くカルノー図は違う。それぞれ書式フォーマットがあるので、それに沿って描くと間違いがない
具体的な命題数による図は以下の例題(命題数2と3の例を作りました)を参照
4命題まではノートに書けるがそれ以上になると別の方法があるらしい
3ランプゲーム
赤、緑、青の3色ランプがある
以下のパターンの時、お化けが出てくる
- 赤が消えて青が光っている
- 緑と青が光っている
- 全てのランプが消えている
- 緑と青が消えて、赤が光る
これを論理式で考える。まず命題を作る
r:赤ランプが光る
g:緑ランプが光る
b:青ランプが光る
各事象を論理式化する
- !r&&b
- g&&b
- !r&&!g&&!b
- !g&&!b&&r
これをカルノー図にして論理式を整理する
コード化すると以下になる
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
-
!
-
|
|
|
-
-
|
-
-
|
-
|
!
|
!
!
|
|
-
|
|
|
!
!
| using UnityEngine;
using System.Collections;
public class Logic1 : MonoBehaviour
{
bool r, g, b, monster;
void Update ()
{
if (Input.GetKeyDown (KeyCode.Space)) {
ChangeFlag ();
if (!r && b || g && b || !r && !g && !b || !g && !b && r) {
monster = true;
} else {
monster = false;
}
print ("RED=" + r + " :GREEN=" + g + " :BLUE=" + b + " → MONSTER=" + monster);
}
}
void ChangeFlag ()
{
r = Random.value > 0.5f ? true : false;
g = Random.value > 0.5f ? true : false;
b = Random.value > 0.5f ? true : false;
}
}
|
2ランプゲーム
<2ランプゲームのルール>
次のいずれかのパターンになったらお化けが出てきます
- 青いランプは消えているが黄色いランプは光っている
- 青いランプは消えていて黄色いランプも消えている
- 青いランプは光っていて黄色いランプも光っている
Unity Web Player | ロジックモンスター)
(全ソース:GitHub_Osinko/Logic)
まず命題を考える。命題数は2になる
命題blue:「青いランプが光っている」
命題yellow:「黄色いランプが光っている」
この命題を使って各論理式を考える
- !blue&&yellow
- !blue&&!yellow
- blue&&yellow
これら3つを論理和でひとつにする
!blue && yellow | | !blue && !yellow | | blue && yellow
これをカルノー図で考えると・・・
これを利用すると
「 if (!blue && yellow | | !blue && !yellow | | blue && yellow) {~」と3つの論理和式になっている部分が
「if(!blue | | yellow)」とシンプルになる
ソース一部抜粋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
-
|
|
|
|
|
|
|
|
-
|
-
|
|
|
-
-
|
|
-
|
!
!
!
-
!
-
|
|
|
|
|
|
!
-
|
|
|
|
|
!
!
| using UnityEngine;
using System.Collections;
public class Lamp : MonoBehaviour
{
public Animator anim, monster;
public Light blueLight, yellowLight;
public float timeSpan;
float timeCount;
bool blue, yellow, button;
void Update ()
{
timeCount += Time.deltaTime;
if (timeCount > timeSpan) {
timeCount %= timeSpan;
ChangeLamp ();
if (!blue && yellow || !blue && !yellow || blue && yellow) {
anim.SetTrigger ("elevatorTrig");
StartCoroutine (MonsterCrouch ());
}
}
}
float startDelay = 0.2f;
float crouchStepDelay = 0.8f;
public IEnumerator MonsterCrouch ()
{
WaitForSeconds stdelay = new WaitForSeconds (startDelay);
WaitForSeconds delay = new WaitForSeconds (crouchStepDelay);
yield return stdelay;
monster.SetBool ("crouch", true);
yield return delay;
monster.SetBool ("crouch", false);
}
void ChangeLamp ()
{
blue = Random.value > 0.5f ? true : false;
yellow = Random.value > 0.5f ? true : false;
blueLight.enabled = blue;
yellowLight.enabled = yellow;
}
}
|