真理とは何か

25
真理とは何か @tsuda_ahr LTDD #21

Transcript of 真理とは何か

真理とは何か@tsuda_ahr

LTDD #21

これから真理について述べる。

真理値表

False True

False False False

True False True

False True

False False True

True True True

AND

OR

IT技術者にとっての真理ってこれだよね!

しかしこれは2値論理の場合

3値論理の場合の真理値表

False Unknown True

False False False False

Unknown False Unknown Unknown

True False Unknown True

AND

OR

False Unknown True

False False Unknown True

Unknown Unknown Unknown True

True True True True

3値論理とは

• 主に データベースとかで使用。

• True / False に加えて Unknown (≒ null) のある体系

確かめてみる (oracle)

• 比較• 真

select 1 from dual where ('1' = '1');

• 偽select 1 from dual where not('1' = '0');

• Unkhownselect 1 from dual where ('1' = null);

select 1 from dual where not('1' = null);

どちらもヒットしない

ヒットする

ヒットする

※上記は、http://sqlfiddle.com/ で Oracle 11g に設定して確認することができます。

確かめてみる (oracle)

• ANDselect 1 from dual

where (1 = 1) and (null = null);

select 1 from dual

where not((1 = 0) and (null = null));

• ORselect 1 from dual

where (1 = 1) or (null = null);

select 1 from dual

where not((1 = 0) or (null = null));

True

False

Unkown

※上記は、http://sqlfiddle.com/ で Oracle 11g に設定して確認することができます。

確かめてみる (oracle)

• ANDselect 1 from dual

where (1 = 1) and (null = null);

select 1 from dual

where not((1 = 0) and (null = null));

• ORselect 1 from dual

where (1 = 1) or (null = null);

select 1 from dual

where not((1 = 0) or (null = null));

ヒットしない [Unknown判定]

ヒットする [not(False)判定]

ヒットしない [Unknown判定]

ヒットする [True判定]

※上記は、http://sqlfiddle.com/ で Oracle 11g に設定して確認することができます。

3値論理の論理演算結果の覚え方

False (=0) Unknown (=1.5) True (=1)

False (=0) False False False

Unknown (=1.5) False Unknown Unknown

True (=1) False Unknown True

AND

OR

False (=0) Unknown (=1.5) True (=1)

False (=0) False Unknown True

Unknown (=1.5) Unknown Unknown True

True (=1) True True True

False < Unknown < True を満たす数値をてきとーに割り当てて、・AND は値のもっとも小さいもの・OR は値のもっとも大きいもの

が結果になります。

ちなみに null と NaN は違う (oracle)

create table test (

a BINARY_FLOAT

);

insert into test values (1000000.0);

insert into test values (0.0000001);

insert into test values (BINARY_FLOAT_INFINITY);

insert into test values (BINARY_FLOAT_NAN);

insert into test values (NULL);

select * from test where a > 0

※上記は、http://sqlfiddle.com/ で Oracle 11g に設定して確認することができます。

null はヒットしないが、NaN はヒットする

Order by だと null が最大になる?

• 処理系依存。• データベースによって異なる。

• 指定で変えられる。 (oracle)

• select * from test order by a nulls first

• select * from test order by a nulls last

3値論理は理解できただろうか?

それではこれから

9値論理について述べる

9値論理

Character 意味

'U' uninitialized 未初期化

'X' strong drive, unknown logic value 強い 不明

'0' strong drive, logic zero 強い 0

'1' strong drive, logic one 強い 1

'Z' high impedance ハイインピーダンス

'W' weak drive, unknown logic value 弱い 不明

'L' weak drive, logic zero 弱い 0

'H' weak drive, logic one 弱い 1

'-' don't care 不関知

なにこれ?

• VHDL という言語で定義されている論理型 (std_logic 型)

• IEEE1164 に定義されている。https://en.wikipedia.org/wiki/IEEE_1164

• 3値論理と違って数学的な論理ではなく、電気回路にとって都合がよいように定義している(のだと思う)

9値論理の場合の真理値

and

U X 0 1 Z W L H - /

U U 0 U U U 0 U U U

X 0 X X X 0 X X X

0 0 0 0 0 0 0 0

1 X X 0 1 X 1

X X 0 X X Z

X 0 X X W

0 0 0 L

1 X H

X -

or

U X 0 1 Z W L H - /

U U U 1 U U U 1 U U

X X 1 X X X 1 X X

0 1 X X 0 1 X 0

1 1 1 1 1 1 1

X X X 1 X Z

X X 1 X W

0 1 X L

1 1 H

X -

not

U X 0 1 Z W L H -

U X 1 0 X X 1 0 X

ところで「不明」は null っぽいとしても、「強い」「弱い」って何よ?

Character 意味

'U' uninitialized 未初期化

'X' strong drive, unknown logic value 強い 不明

'0' strong drive, logic zero 強い 0

'1' strong drive, logic one 強い 1

'Z' high impedance ハイインピーダンス

'W' weak drive, unknown logic value 弱い 不明

'L' weak drive, logic zero 弱い 0

'H' weak drive, logic one 弱い 1

'-' don't care 不関知

強い

弱い

答え。

• 強い信号と弱い信号が衝突した場合、強い信号が有効になる。

resolution

U X 0 1 Z W L H - /

U U U U U U U U U U

X X X X X X X X X

0 X 0 0 0 0 X 0

1 1 1 1 1 X 1

Z W L H X Z

W W W X W

L W X L

H X H

X -

解決関数という謎のしくみがある

なぜ、強い信号と弱い信号があるのか

• 多分、抵抗の存在を省略して、プルアップ回路やプルダウン回路を表現したかったから。

• 本当のところは知りません。だれか教えてください(汗

Vcc

GND

OUT

ここは「強い1」 ( =‘1’ )

ここは「弱い0」 ( =‘L’ )

解決関数の注意点

• ただ、実際のところ、マルチドライバー(複数の信号を一つの入力に割り当てる)は、FPGAデバイス実機に対しては有効でない。(少なくとも Spartan 3E は)

• テストベンチ用のコードなど、シミュレーションでは有効。

• 言語仕様上有効だからと言って、実際にデバイスに適用できるわけではない点に注意。

さて。

9値論理は理解できただろうか?

わけがわかりません(汗

ご清聴ありがとうごさいました