버트런드 러셀 (Bertrand Russel, 1872.05.18 ~ 1970.02.02)
: 큰 기쁨은 쓸데없는 지식을 얻을 때도 느낄 수 있다.
이 포스팅은 '수학리부트' 를 보며 공부한 내용입니다.
컴퓨터과학이 수학의 응용에서 시작되었음을 생각하면, 우리는 수학의 토대인 논리의 기초를 다질 필요가 있습니다.
참인지 거짓인지 판별할 수 있는 문장이나 수식. (대개 p,q,r 같은 영문자로 표시)
명제의 진리값 : 명제의 참·거짓. (참: T, 거짓: F)
숫자에 대한 기본적인 사칙연산을 통해 새로운 숫자가 만들어지는 것처럼, 명제에도 기본적인 연산이 몇 가지 존재합니다. 명제는 진리값을 다루므로 그에 대한 연산은 논리적인 성질을 가지고 있으며, 이러한 논리연산을 명제들에 적용하면 그 결과로 새로운 명제가 만들어집니다.
진리표 : 논리연산의 결과를 표 형태로 알아보기 쉽게 나타낸 것.
항진명제 : 항상 참인 명제. ex. p∨¬p
모순명제 : 항상 거짓인 명제. ex. p∧¬p
부정(NOT) 연산한 결과를 다시 부정 연산하면 원래 명제의 진리값으로 다시 돌아가게 됩니다.
OR 연산은 'p나 q 둘 중 하나라도 참이면' 결과가 참이니, OR을 부정했다면 그 반대로 'p와 q 둘 중 어떤 것도 참이 아니면' 연산의 결과가 참이 될 것입니다.
동치 : 같은 진리값을 가지는 두 명제. (기호: ≡)
위의 두 식의 진리값은 동일합니다. ➜ ¬(p∨q) ≡ ¬p∧¬q.
마찬가지로, 논리곱 연산을 부정 연산하면 ➜ ¬(p∧q) ≡ ¬p∨¬q.
이러한 두 개의 동치관계는 드 모르간의 법칙(De Morgan's law)이라고 부르며, 복잡한 논리식을 계산할 때 유용합니다.
숫자의 연산처럼 논리연산에도 몇 가지 기본적인 법칙이 성립합니다.
논리합(∨)은 덧셈과, 논리곱(∧)은 곱셈과 유사한 면이 있고, 진리값 T와 F는 각각 1, 0과 비슷한 성질을 가집니다.
하지만 진리값이 결국 숫자는 아니므로 두 부류의 연산은 엄연히 다르다는 점에 유의해야 함.
숫자의 연산에서 덧셈과 곱셈에 각각 0과 1이라는 항등원이 존재.
논리합에는 F, 논리곱에는 T이라는 항등원이 존재.
숫자와는 다르게, 자기 자신에 대한 논리합과 논리곱 연산은 다시 자신으로.
논리연산의 법칙
분배법칙은 논리연산과 숫자의 연산에 차이가 생깁니다.
숫자의 연산에서는 분배법칙이 a × (b + c) = (a × b) + (a × c)에만 성립하고, a + (b × c) 에는 성립하지 않습니다.
논리연산 중 배타적(exclusive) 논리합, 즉 XOR(⊕) 연산은 두 명제 중 어느 한쪽만 참일 때 결과가 참.
'배타적'이라는 성질을 가진 XOR 연산의 특이한 결과.
주목해야 할 점.
XOR 연산의 결과에서 원래 명제의 진리값으로 돌아갈 수 있습니다.
어떤 명제에 다른 명제를 두 번 연달아 XOR 연산하게 되면 원래의 결과로 돌아가게 됩니다.
명제 p에 q를 XOR 연산하고, 거기에 다시 q를 XOR 연산할 경우 결과
(p ⊕ q) ⊕ q ≡ p
이것은 결합법칙으로 간단하게 증명.
XOR 연산의 이러한 성질은 암호학을 비롯한 컴퓨터과학 분야에서 널리 활용됩니다.
논리연산자
만약 조건문에 참여하는 변수가 많거나 경우의 수가 복잡하다면 연산법칙으로 간략화할 수 있습니다.
ex. if ( (!cond1 || cond2) && !(cond1 && cond2) ) ➜ if ( !cond1 )
XOR는 논리연산보다는 비트단위(bitwise)의 데이터를 조작하는 데 주로 사용. (이때 T, F에 해당하는 것이 1, 0).
ex. 어떤 8비트 데이터를 담고 있는 변수 a의 모든 비트를 반대로 뒤집어 b라는 변수에 할당하는 C++/자바 코드.
a = 0×B5 // 1011 0101, unsigned 8-bit data
b = a ⌃ 0×FF // 1111 1111
// 이제 b는 0×4A(0100 1010)가 됩니다.
0×FF : 모든 비트가 1인 8비트 데이터.
0×FF과 a를 XOR(⌃) 연산해서 b에 담는데, p ⊕ T ≡ ¬p가 되어 부정연산처럼 동작하는 XOR의 성질을 이용한 것.