1: 2015-08-20 (木) 19:51:15 osinko |
現: 2015-08-26 (水) 20:59:11 osinko |
| TITLE:論理2 | | TITLE:論理2 |
| + | #contents |
| + | #jsmath |
| **日本語とC#と論理記号 [#y474dce0] | | **日本語とC#と論理記号 [#y474dce0] |
| | | |
- | 「⇒」「ならば」は論理的にIMP(含意)に該当する点に注意する必要がある | + | <真理値表> |
| + | |CENTER:|CENTER:|CENTER:|CENTER:|BGCOLOR(#FFDDDD):CENTER:|CENTER:|CENTER:|CENTER:|CENTER:|CENTER:|BGCOLOR(#FFDDDD):CENTER:|CENTER:|CENTER:|CENTER:|CENTER:|BGCOLOR(#FFDDDD):CENTER:|BGCOLOR(#FFDDDD):CENTER:|CENTER:|CENTER:|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(足算)より先に計算する事 |
| + | |
| + | **回路図 [#sf204056] |
| + | |
| + | 各論理式は電池と電球それを伝える配線で表現できる |
| + | IMPも他の回路と同様に回路図式化できる |
| + | |
| + | &ref(kairo1.png); |
| + | |
| + | **ベン図 [#h141a031] |
| + | |
| + | &ref(f5ee6b5ef9c8329673ee530c59206f91.png); |
| + | 集合の関係を表すための図。利用する際は領域を染めた領域を真とする |
| + | |
| + | **含意(がんい:IMPLIES) [#o3f4e744] |
| + | \(A\Rightarrow B\) 日本語にするなら「AならばB」 |
| + | &font(Red){''論理学で利用される機会が多い「ならば」は「含意」に該当する''}; |
| + | この「ならば」は含意を無理に日本語へ近似した結果であって正確に、その意味となる日本語は存在しない |
| + | 真理値表の値の動きこそが、その働きを正確に表している。だからC#の\(!A||B\)と憶えるのが一番いい |
| + | |
| + | -この結合子は必ず二項をつないだ状態で議論される |
| + | -AはBである為の十分条件 |
| + | -BはAである為の必要条件 |
| + | &ref(imp.png); |
| + | |
| + | 論理式では &font(Red){!A||B}; で表せる |
| + | \(インコ\Rightarrow 鳥\) |
| + | \(鳥\Rightarrow 動物\) |
| + | |
| + | //|TLEFT:300|CENTER:|CENTER:|CENTER:|c |
| + | //|A|B|A⇒B すなわち !A||B| |
| + | //|1|1|1| |
| + | //|1|0|0| |
| + | //|0|1|1| |
| + | //|0|0|1| |
| + | //資料:[[含意の命題「ならば」をあらわす論理記号 A⇒B [数学についてのwebノート]):http://www.ne.jp/asahi/search-center/internationalrelation/mathWeb/meidai/Naraba.htm]] |
| + | |
| + | #hr |
| + | メモ: |
| + | AはBに含まれてる?だから"含"意??計算式で含まれてるって何? |
| + | \(n>\delta \Rightarrow \left| { a }_{ n }-\alpha \right| <\varepsilon \) |
| + | &ref(imp2.png); |
| + | |
| + | //-AもBもあるのはありえる |
| + | //-AがあってBが無いのはありえない |
| + | //-AがなくてBがあるのはありえる |
| + | //-AもBもないのはありえる |
| + | |
| + | #hr |
| + | |
| + | **条件付き論理積の確認 [#o520797c] |
| + | |
| + | C#のAND、「A ∧ B」を表現する&&などの論理演算が「条件付き論理積」である事を確認する |
| + | 以下のコードで check を true にすると A という条件を満たしたので”Bが実行され評価される” |
| + | しかし false の場合、条件は満たされていないので、&font(Red){Bの実行すらオミットされ、Bが評価されることは無い}; |
| + | |
| + | || や == 等も同様、C#では条件付き論理演算子になっている。これはプログラムを組むうえで強く意識しておいた方が良い事項である |
| + | |
| + | #code(csharp){{ |
| + | 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 |
| + | ! |
| + | |
| + | と表示される |
| + | |
| + | **カルノー図 [#d7982d95] |
| + | |
| + | 複数の論理式を出来うる限り少ない論理式の組み合わせに単純化する技術 |
| + | 命題数によって描くカルノー図は違う。それぞれ書式フォーマットがあるので、それに沿って描くと間違いがない |
| + | 具体的な命題数による図は以下の例題(命題数2と3の例を作りました)を参照 |
| + | |
| + | 4命題まではノートに書けるがそれ以上になると別の方法があるらしい |
| + | |
| + | |
| + | ***3ランプゲーム [#t6d24c79] |
| + | |
| + | 赤、緑、青の3色ランプがある |
| + | 以下のパターンの時、お化けが出てくる |
| + | |
| + | +赤が消えて青が光っている |
| + | +緑と青が光っている |
| + | +全てのランプが消えている |
| + | +緑と青が消えて、赤が光る |
| + | |
| + | これを論理式で考える。まず命題を作る |
| + | |
| + | r:赤ランプが光る |
| + | g:緑ランプが光る |
| + | b:青ランプが光る |
| + | |
| + | 各事象を論理式化する |
| + | |
| + | + !r&&b |
| + | + g&&b |
| + | + !r&&!g&&!b |
| + | + !g&&!b&&r |
| + | |
| + | これをカルノー図にして論理式を整理する |
| + | |
| + | &ref(karno1.png); |
| + | |
| + | コード化すると以下になる |
| + | #code(csharp){{ |
| + | using UnityEngine; |
| + | using System.Collections; |
| + | |
| + | //論理テスト |
| + | public class Logic1 : MonoBehaviour |
| + | { |
| + | bool r, g, b, monster; |
| + | |
| + | void Update () |
| + | { |
| + | if (Input.GetKeyDown (KeyCode.Space)) { |
| + | ChangeFlag (); |
| + | //if (!b && !g || g && b || !r && !g && b) { //カルノー図によって得た単純化された論理式 |
| + | 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ランプゲーム [#a41b773d] |
| + | |
| + | <2ランプゲームのルール> |
| + | 次のいずれかのパターンになったらお化けが出てきます |
| + | |
| + | +青いランプは消えているが黄色いランプは光っている |
| + | +青いランプは消えていて黄色いランプも消えている |
| + | +青いランプは光っていて黄色いランプも光っている |
| + | |
| + | [[Unity Web Player | ロジックモンスター):https://dl.dropboxusercontent.com/u/87271864/LogicMonster1/LogicMonster1.html]] |
| + | [[(全ソース:GitHub_Osinko/Logic):https://github.com/Osinko/Logic]] |
| + | |
| + | まず命題を考える。命題数は2になる |
| + | |
| + | 命題blue:「青いランプが光っている」 |
| + | 命題yellow:「黄色いランプが光っている」 |
| + | |
| + | この命題を使って各論理式を考える |
| + | +!blue&&yellow |
| + | +!blue&&!yellow |
| + | +blue&&yellow |
| + | |
| + | これら3つを論理和でひとつにする |
| + | |
| + | !blue && yellow | | !blue && !yellow | | blue && yellow |
| + | |
| + | これをカルノー図で考えると・・・ |
| + | &ref(karno2.png); |
| + | |
| + | これを利用すると |
| + | 「 if (!blue && yellow | | !blue && !yellow | | blue && yellow) {~」と3つの論理和式になっている部分が |
| + | 「if(!blue | | yellow)」とシンプルになる |
| + | |
| + | #hr |
| + | |
| + | ソース一部抜粋 |
| + | #code(csharp){{ |
| + | 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 ()); |
| + | //メカニムに設定したトリガーをstringで指定して起動する |
| + | //メカニム側はanyStateではなく新しく自分でつくったNewStateでトラジションを双方につなげ作る} |
| + | } |
| + | } |
| + | } |
| + | |
| + | //コルーチンで再生タイムを微調整 |
| + | 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; |
| + | } |
| + | } |
| + | }} |
| + | |
| + | #navi |