hard logic과 soft logic의 차이 - 프로그래밍 언어에서 논리의 중요성
1. 프로그래밍은 왜 어려운가?
프로그래밍 언어 문법과 라이브러리의 사용으로 인한 어려움
hard logic(논리)의 사용으로 인한 어려움
이들에 대해 사람들에게 알려진 정도와 받아들여진 정도가 다르다
1-1) 문법과 라이브러리
사람들에게 많이 알려진 어려운 점
이런 language를 배우지 않은 사람이나 초보자나 보면 무슨 소리인지 이해하지 못한다
이 프로그램이 한글자만 틀려도 제대로 돌아가지 않기 때문에 초보자들이 특히 많은 어려움을 겪는다
능숙해지기 위해 많은 훈련이 필요한 것은 사실
프로그래밍을 최초로 배울때 약간의 어려움이 있지만 훈련에 비례하여 실력이 느는 경향이 있다
일반 상식으로도 원래 알고 있는 것이 아니므로 훈련의 필요성에 반감이 없어서 실력 상승을 위해 많은 사람들이 공부함
1-2) 논리의 어려움
사람들에게 많이 알려져있지 않다
2. hard logic과 soft logic의 차이
2-1) 카드 문제
확인된 사실: 모든 카드의 한쪽에는 알파벳이, 다른 쪽에는 숫자가 써 있다
확인하고자 하는 주장: 한쪽이 D이면 반대쪽은 3이다
위와 같은 카드들이 주어질 때 주장이 사실인지 확인하고 싶다
그러기 위해 이 4장중에서 반드시 뒤집어야하는 카드는 몇 개이고 어느것인가?
-----------------------------------------------------------------------------------------------------------
나는 D랑 3을 선택했었다
왜냐하면 그냥 D 뒤에 3인지 확인해봐야할 것 같고 3 뒤에 D인지 확인해봐야할 것 같았거든
---------------------------------------------------------------------------------------------------------------
근데 정답은 D와 7이다. 생각보다 많은 사람들이 틀린다. 맞추더라도 시간을 많이 소요한다
D를 뒤집어야한다는 것은 많은 사람들이 동의하나
가끔 F를 뒤집어봐야한다고 주장하는 사람들이 있다고?
이런 사람들은 F 뒤에 3이 있으면 어떡하냐? 이것인데
'D가 있으면 반대가 3이다'라고만 했지 'D가 아니면 반대쪽은 3이 아니다' 이런 말은 안함
그래서 F 뒤에 3이 있든 3이 없든 아무런 문제가 없다
그리고 많은 사람들이 나처럼 3을 뒤집어봐야한다고 말을 한다
왜냐하면 3 뒤에는 D가 아닌 것이 있으면 안된다라고 생각하니까
하지만 3 뒤에 A가 있다고 가정하더라도 'D가 있으면 반대쪽이 3이다'와는 모순되지 않는다
'3이 있으면 반대쪽이 D이다'라는 주장과는 모순되겠지만..
엄격하게 p이면 q이다 이런 식으로 생각하지 않고 직관적으로 빠르게 대충 생각했기 때문임
하지만 7은 뒤집어봐야한다. 왜냐하면 7 뒤에 D가 있다고 생각하면.. 'D가 있으면 반대쪽이 3이다'와 모순된다
여기서 중요한 점은 어려운 논리 문제가 아닌데도 많은 사람들이 이 문제를 틀리고 생각하는데 많은 시간이 걸린다는 점
--------------------------------------------------------------------------------------------------------------------------------------------------
2-2)맥주집 문제
어느 맥주집의 규칙: 20세 이하인 사람은 맥주를 마실 수 없다
다음 4명의 사람이 나이 혹은 무엇을 마시고 있는지 알고 있다고 가정하자
이 규칙이 잘 지켜지고 있는지 확인하기 위해 나이를 알고 있으면 마시고 있는 것이 무엇이고 마시고 있는 것을 알고 있으면 나이가 얼마인지 확인해봐야하는 사람은 누구인가
이 문제는 별 어려움 없이 17세와 맥주를 선택한다
그냥 직관적으로 17세인 사람은 맥주를 마시면 안되니까. 맥주를 마시는 사람은 20세가 넘어야하니까 확인을 해보는거
31세인 사람은 무엇을 마시든 알 바 아니고 콜라를 마시는 사람은 나이가 몇살인지 알 바 아니다
------------------------------------------------------------------------------------------------------------
2-3) 두 문제의 비교
실제로 맥주집 문제가 풀기 쉽다
그러나 사실 두 문제는 완전히 같은 문제
심지어 4개의 케이스 배치까지도 동일하며 논리적인 구성도 동일하다
그러나 왜 맥주집 문제가 더 풀기 쉬운가?
논리구조가 동일하므로 맥주집 문제를 논리로 풀었다면 카드 문제도 동일한 논리로 풀수있다
그렇지만 나는 카드 문제는 틀렸기 때문에 맥주집 문제를 풀때도 논리를 사용하지 않았다는 것이다
---------------------------------------------------------------
20세 이하인 사람 > 맥주를 마실 수 없다
그러니까 20세 이하인 사람(p) > ~맥주(q)라는 논리를 생각하고 이것이 참인지 확인하기 위해서...
17세인 사람은 앞에 p가 참이니까 뒤에 q가 참인지 확인해봐야 p이면 q이다가 참인지 알 수 있고
31세인 사람은 앞에 p가 거짓이니까 확인하지 않아도 p이면 q이다는 무조건 참이다?
콜라인 사람은 뒤에 q가 참이니까 p가 참이든 거짓이든 알필요도 없이 무조건 p이면 q이다가 참이다
p이면 q이다는 대우로 ~q이면 ~p이다와 동일하니까 ~q=맥주이면 20세 초과이다(~p)이고..
이 명제가 참인지 확인하기 위해 ~p가 참인지 거짓인지 확인해봐야안다
혹은 대우하지 않아도 q가 거짓이니까 p가 참이면 p이면 q이다는 거짓이지만 p가 거짓이면 p이면 q이다는 참이니까 실제로 p를 확인해봐야한다
-----------------------------------------------------------------------------------------------------------
이러한 논리를 사용했다면 카드 문제도 동일한 방식으로 풀 수 있다
'D이면 3이다'는 p이면 q이다 방식으로 생각할 수 있고 실제로 이것이 참인지 알기 위해서..
D는 p가 참이니까 q가 참인지 거짓인지 확인해봐야 p이면 q이다가 참인지 알 수 있지만
F는 p가 거짓이니까 q가 참이든 거짓이든 p이면 q이다는 무조건 참이다
3은 q가 참이라서 p가 참이든 거짓이든 p이면 q이다는 반드시 참이다
7은 q가 거짓이므로 p가 참이면 p이면 q이다가 거짓이지만 p가 거짓이면 p이면 q이다가 참이므로 p가 참인지 거짓인지 확인해봐야 한다
-----------------------------------------------------------------------------------------------------------
2-4) 왜 맥주집 문제가 더 쉬웠는가?
맥주집 문제를 풀때는 직관을 사용했기 때문이다
직관은 논리적인 느낌을 주는 것
논리를 사용하지 않은 것은 아닌데 논리를 사용하면서 생각하는 과정이 굉장히 여러번 반복되어서 논리가 직관 수준으로 올라온 것
일상 생활에서 논리적인 문제를 풀때 직관을 사용해서 문제를 해결함
아주 어릴때는 논리를 직접 사용함 > 간단한 논리적 문제도 상당히 시간이 걸림 >이러한 훈련이 여러번 반복되어 지금은 직관을 사용해서 대부분의 문제를 해결함
직관은 익숙한 상황에서 매우 빠르다. 기분으로 결과를 알고있어서 즉시 답을 아니까 매우 빠르다
하지만 정확하지 않다. 익숙한 상황에서도 가끔은 틀린다
특히나 처음 보는 상황에서 직관이 자동으로 답을 내다가 잘못된 답을 내는 경우가 매우 많다
또한 감정적으로 답을 내므로 매우 강한 착각을 불러 일으킨다
실제로 카드 문제를 풀때 이런걸 느꼈지.. D랑 3 저게 왜 틀려? 이렇게 생각함
그래서 직관으로 프로그램과 논리 computational thinking를 이해하려고 하면 강한 착각으로 정확한 이해를 얻지 못한다
------------------------------------------------------------------------------------------------------------------------------
3. 직관과 진짜 논리를 구별해야하는 이유
3-1) 과자와 버스
너 과자 몇개 먹었니?
한개 먹었어요
실제로 확인해보니까 3개 먹었음
왜 거짓말하냐?라고 물어보니까
나는 거짓말한적은 없는데? 3개를 먹은건 맞지만 1개를 먹은 것도 사실인데?
--------------------
버스 타려고하는데 천원 있냐?
천원 있다
천원 받도 버스타서 그 친구가 돈이 실제로 얼마 있었는지 확인해보니까
천원보다 훨씬 많은 돈이 있었다
만약에 내가 그 친구한테 너 천원보다 훨씬 많으면서 왜 천원 있냐고 그랬냐?라고 하면 이상한 놈이라고 생각할 것
-------------------------
두 질문은 같은 언어적 표현을 하지만 동일한 대답을 했는데도 정상적인 대답이 아닌 이유가
과자 질문은 정확한 개수를 물어보고 버스 질문은 천원 이상이 있는지 물어보는 것
하지만 사람들은 일상생활 속에서 동일한 표현을 다른 뜻으로 직관적으로 해석해서 잘 사용하고 있고
심지어 다른 뜻이라는 것을 느끼지 못하고 있어도 잘 사용하고 있다
구체적인 논리적 내용이 사라지고 직관만 이용해서 논리를 일상생활에 적용하고 있다
-------------------------
3-2) 토플과 복권
회사 입사 자격에 '합격하려면 토플 500점 이상 혹은 토익 600점 이상이 필요하다'
내가 토플도 500점 이상이고 토익도 600점 이상이라 둘다 된다고 하면 회사는 당연히 떨어뜨리지 않는다
그런데 복권에 '당첨되면 자동차 혹은 천만원을 줍니다'라고 써있다
만약 내가 복권에 당첨이 돼서 자동차랑 천만원 다 주세요라고 하면 복권 발행인이 당황해 할 것이다
--------------------------------
같은 표현(혹은)을 사용하고 있지만 논리적인 내용이 다르다
회사 입사자격은 inclusive or로 A or B 둘 중 하나, 둘 다 모두 가능한 경우
복권은 exclusive or로 오직 둘 중 하나만.. 둘 다는 허용하지 않는 경우
하지만 일반적으로 저 두 표현을 보고 이러한 논리를 생각하지 않고도.. 전혀 느끼지 않고도 어떤 뜻인지 이해하고 정확히 대답하고 사용한다
3-3) soft logic과 hard logic
일상생활에서는 soft logic이 빠르기때문에 매우 유용하다
논리적으로 부정확한 표현을 사용하더라도 어떤 뜻인지 모든 사람이 이미 알고 있다고 생각을 함
하지만 프로그래밍에서는 hard logic을 사용한다
우리에게 익숙한 상황이 아니다
프로그래밍의 모든 표현은 전부 논리학에서 나옴
여기서 사용되는 수많은 알고리즘을 이해하기 위해 hard logic이 필요하다
그래서 직관으로 프로그래밍을 이해하려고 한다면 굉장히 어렵고 많은 경우 강한 착각을 불러일으킨다
실제로 다시 생각해보면 많은 경우 그렇긴해
코딩하면 왜 이게 틀렸지?라고 생각해서 정확하게 논리적으로 해보면 왜 틀린지 이해할 수 있는
4. 프로그래밍 언어 코딩에서 왜 착각을 하는가?
일상에서 직관으로 자리 잡은 soft logic으로 알고리즘을 이해하려고 하기 때문이다
알고리즘을 보고 또 봐도 이해하지 못하는 것은 '증명'을 보지 않았기 때문
증명을 봐도 이해하지 못하는 것은 '직관'으로 이해하려고 하기 때문
가끔 직관으로 이해할 수 있는 알고리즘이 있겠지만 정확한 이해를 얻으려면 직관을 넘은 hard logic이 필요
조금만 어려워지면 직관으로 완전히 이해하는 것은 사실상 불가능한 알고리즘들이 대부분
증명을 해서 연습해라 이런 말
5. 출처
https://swexpertacademy.com/main/main.do
'프로그래밍 > 프로그래밍 개론' 카테고리의 다른 글
증명하기 연습문제3 (0) | 2022.09.15 |
---|---|
증명하기 연습문제2 (0) | 2022.09.15 |
귀류법과 수학적 귀납법 정확히 알기 (0) | 2022.07.13 |
논리학 연습문제1 (0) | 2022.07.12 |
반드시 알아야하는 기초 논리학 - p가 거짓이면 'p이면 q이다'는 왜 참인가? (0) | 2022.07.11 |